/ Hex Artifact Content
Login

Artifact 253de9f00311bd2b9898c93f22556a741e1a63310785c70356141326765fb64a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64  u.h".#endif.#ifd
0320: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0330: 5f 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74  _JSON1.int sqlit
0340: 65 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69  e3Json1Init(sqli
0350: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69  te3*);.#endif.#i
0360: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
0370: 4c 45 5f 46 54 53 35 0a 69 6e 74 20 73 71 6c 69  LE_FTS5.int sqli
0380: 74 65 33 46 74 73 35 49 6e 69 74 28 73 71 6c 69  te3Fts5Init(sqli
0390: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  te3*);.#endif..#
03a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d  ifndef SQLITE_AM
03b0: 41 4c 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d  ALGAMATION./* IM
03c0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
03d0: 20 52 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54   R-46656-45156 T
03e0: 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69  he sqlite3_versi
03f0: 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73  on[] string cons
0400: 74 61 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  tant.** contains
0410: 20 74 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c   the text of SQL
0420: 49 54 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72  ITE_VERSION macr
0430: 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  o. .*/.const cha
0440: 72 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  r sqlite3_versio
0450: 6e 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52  n[] = SQLITE_VER
0460: 53 49 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  SION;.#endif../*
0470: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0480: 4f 46 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37  OF: R-53536-4257
0490: 35 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  5 The sqlite3_li
04a0: 62 76 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74  bversion() funct
04b0: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61  ion returns.** a
04c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
04d0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  to the sqlite3_v
04e0: 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20  ersion[] string 
04f0: 63 6f 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f  constant. .*/.co
0500: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0510: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69  3_libversion(voi
0520: 64 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  d){ return sqlit
0530: 65 33 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f  e3_version; }../
0540: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
0550: 2d 4f 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33  -OF: R-63124-393
0560: 30 30 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73  00 The sqlite3_s
0570: 6f 75 72 63 65 69 64 28 29 20 66 75 6e 63 74 69  ourceid() functi
0580: 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20  on returns a.** 
0590: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
05a0: 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f  ing constant who
05b0: 73 65 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  se value is the 
05c0: 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53  same as the.** S
05d0: 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20  QLITE_SOURCE_ID 
05e0: 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d  C preprocessor m
05f0: 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20  acro. .*/.const 
0600: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f  char *sqlite3_so
0610: 75 72 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65  urceid(void){ re
0620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52  turn SQLITE_SOUR
0630: 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  CE_ID; }../* IMP
0640: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0650: 52 2d 33 35 32 31 30 2d 36 33 35 30 38 20 54 68  R-35210-63508 Th
0660: 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  e sqlite3_libver
0670: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75  sion_number() fu
0680: 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  nction.** return
0690: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75  s an integer equ
06a0: 61 6c 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52  al to SQLITE_VER
06b0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a  SION_NUMBER..*/.
06c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  int sqlite3_libv
06d0: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f  ersion_number(vo
06e0: 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  id){ return SQLI
06f0: 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
0700: 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  R; }../* IMPLEME
0710: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30  NTATION-OF: R-20
0720: 37 39 30 2d 31 34 30 32 35 20 54 68 65 20 73 71  790-14025 The sq
0730: 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65  lite3_threadsafe
0740: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
0750: 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61  rns.** zero if a
0760: 6e 64 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74  nd only if SQLit
0770: 65 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77  e was compiled w
0780: 69 74 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64  ith mutexing cod
0790: 65 20 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f  e omitted due to
07a0: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54  .** the SQLITE_T
07b0: 48 52 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c  HREADSAFE compil
07c0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65  e-time option be
07d0: 69 6e 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f  ing set to 0..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72  .int sqlite3_thr
07f0: 65 61 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72  eadsafe(void){ r
0800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52  eturn SQLITE_THR
0810: 45 41 44 53 41 46 45 3b 20 7d 0a 0a 2f 2a 0a 2a  EADSAFE; }../*.*
0820: 2a 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * When compiling
0830: 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72   the test fixtur
0840: 65 20 6f 72 20 77 69 74 68 20 64 65 62 75 67 67  e or with debugg
0850: 69 6e 67 20 65 6e 61 62 6c 65 64 20 28 6f 6e 20  ing enabled (on 
0860: 57 69 6e 33 32 29 2c 0a 2a 2a 20 74 68 69 73 20  Win32),.** this 
0870: 76 61 72 69 61 62 6c 65 20 62 65 69 6e 67 20 73  variable being s
0880: 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 77  et to non-zero w
0890: 69 6c 6c 20 63 61 75 73 65 20 4f 53 54 52 41 43  ill cause OSTRAC
08a0: 45 20 6d 61 63 72 6f 73 20 74 6f 20 65 6d 69 74  E macros to emit
08b0: 0a 2a 2a 20 65 78 74 72 61 20 64 69 61 67 6e 6f  .** extra diagno
08c0: 73 74 69 63 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  stic information
08d0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
08e0: 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
08f0: 0a 23 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  .# ifndef SQLITE
0900: 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 0a  _DEBUG_OS_TRACE.
0910: 23 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  #   define SQLIT
0920: 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45  E_DEBUG_OS_TRACE
0930: 20 30 0a 23 20 65 6e 64 69 66 0a 20 20 69 6e 74   0.# endif.  int
0940: 20 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 20   sqlite3OSTrace 
0950: 3d 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f  = SQLITE_DEBUG_O
0960: 53 5f 54 52 41 43 45 3b 0a 23 65 6e 64 69 66 0a  S_TRACE;.#endif.
0970: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0980: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
0990: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
09a0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
09b0: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E)./*.** If the 
09c0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
09d0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  on pointer is no
09e0: 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a 2a 2a  t NULL and if.**
09f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
0a00: 4f 54 52 41 43 45 20 69 73 20 65 6e 61 62 6c 65  OTRACE is enable
0a10: 64 2c 20 74 68 65 6e 20 6d 65 73 73 61 67 65 73  d, then messages
0a20: 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20 49   describing.** I
0a30: 2f 4f 20 61 63 74 69 76 65 20 61 72 65 20 77 72  /O active are wr
0a40: 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68 69 73  itten using this
0a50: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 73   function.  Thes
0a60: 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20 61 72  e messages.** ar
0a70: 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 64  e intended for d
0a80: 65 62 75 67 67 69 6e 67 20 61 63 74 69 76 69 74  ebugging activit
0a90: 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53 51 4c 49 54  y only..*/.SQLIT
0aa0: 45 5f 41 50 49 20 76 6f 69 64 20 28 53 51 4c 49  E_API void (SQLI
0ab0: 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74 65  TE_CDECL *sqlite
0ac0: 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20  3IoTrace)(const 
0ad0: 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b  char*, ...) = 0;
0ae0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
0af0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0b00: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
0b10: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
0b20: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  ng which is the.
0b30: 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  ** name of a dir
0b40: 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61  ectory, then tha
0b50: 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  t directory will
0b60: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
0b70: 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66  e.** temporary f
0b80: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  iles..**.** See 
0b90: 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41  also the "PRAGMA
0ba0: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
0bb0: 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61  ctory" SQL comma
0bc0: 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nd..*/.char *sql
0bd0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
0be0: 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ory = 0;../*.** 
0bf0: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0c00: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0c10: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0c20: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0c30: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0c40: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0c50: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0c60: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0c70: 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62 61  re.** all databa
0c80: 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66 69  se files specifi
0c90: 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ed with a relati
0ca0: 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a 0a  ve pathname..**.
0cb0: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  ** See also the 
0cc0: 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f  "PRAGMA data_sto
0cd0: 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53 51  re_directory" SQ
0ce0: 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68  L command..*/.ch
0cf0: 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74 61  ar *sqlite3_data
0d00: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  _directory = 0;.
0d10: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0d20: 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a 2a  e SQLite.  .**.*
0d30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0d40: 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ust be called to
0d50: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
0d60: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
0d70: 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20 6d  n,.** VFS, and m
0d80: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73 20  utex subsystems 
0d90: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61  prior to doing a
0da0: 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b 20  ny serious work 
0db0: 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e 20  with.** SQLite. 
0dc0: 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73 20   But as long as 
0dd0: 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70 69  you do not compi
0de0: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f  le with SQLITE_O
0df0: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a 20  MIT_AUTOINIT.** 
0e00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
0e10: 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74 6f  l be called auto
0e20: 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65 79  matically by key
0e30: 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20 61   routines such a
0e40: 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  s.** sqlite3_ope
0e50: 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  n().  .**.** Thi
0e60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
0e70: 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20 69  o-op except on i
0e80: 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63 61  ts very first ca
0e90: 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63 65  ll for the proce
0ea0: 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74 68  ss,.** or for th
0eb0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66 74  e first call aft
0ec0: 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
0ed0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a 2a  ite3_shutdown..*
0ee0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
0ef0: 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74 68  hread to call th
0f00: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
0f10: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
0f20: 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65 74  on to.** complet
0f30: 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71 75  ion.  If subsequ
0f40: 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c 6c  ent threads call
0f50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
0f60: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  fore the first.*
0f70: 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69 6e  * thread has fin
0f80: 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69 61  ished the initia
0f90: 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73  lization process
0fa0: 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73 65  , then the subse
0fb0: 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64 73  quent.** threads
0fc0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fd0: 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  l the first thre
0fe0: 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74 68  ad finishes with
0ff0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1000: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
1010: 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67 68  irst thread migh
1020: 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  t call this rout
1030: 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79 2e  ine recursively.
1040: 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20 63    Recursive.** c
1050: 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75  alls to this rou
1060: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tine should not 
1070: 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73 65  block, of course
1080: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
1090: 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  .** initializati
10a0: 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c 64  on process would
10b0: 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65 2e   never complete.
10c0: 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65 20  .**.** Let X be 
10d0: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  the first thread
10e0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 72   to enter this r
10f0: 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20 62  outine.  Let Y b
1100: 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  e some other.** 
1110: 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77 68  thread.  Then wh
1120: 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ile the initial 
1130: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  invocation of th
1140: 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58 20  is routine by X 
1150: 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74 65  is.** incomplete
1160: 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65 64  , it is required
1170: 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   that:.**.**    
1180: 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69 73  *  Calls to this
1190: 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59 20   routine from Y 
11a0: 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69 6c  must block until
11b0: 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74 0a   the outer-most.
11c0: 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62 79  **       call by
11d0: 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a 2a   X completes..**
11e0: 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72 73  .**    *  Recurs
11f0: 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68 69  ive calls to thi
1200: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
1210: 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20 69  hread X return i
1220: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
1230: 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f 63      without bloc
1240: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
1250: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1260: 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f 4c  void){.  MUTEX_L
1270: 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
1280: 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20  tex *pMaster; ) 
1290: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
12a0: 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a  n static mutex *
12b0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1300: 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69 6e  _EXTRA_INIT.  in
1310: 74 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20  t bRunExtraInit 
1320: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
1340: 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  tra initializati
1350: 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6e  on needed */.#en
1360: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1370: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63  TE_OMIT_WSD.  rc
1380: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
1390: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
13a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13b0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
13c0: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
13d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 6f 6c  .  /* If the fol
13e0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20  lowing assert() 
13f0: 66 61 69 6c 73 20 6f 6e 20 73 6f 6d 65 20 6f 62  fails on some ob
1400: 73 63 75 72 65 20 70 72 6f 63 65 73 73 6f 72 2f  scure processor/
1410: 63 6f 6d 70 69 6c 65 72 0a 20 20 2a 2a 20 63 6f  compiler.  ** co
1420: 6d 62 69 6e 61 74 69 6f 6e 2c 20 74 68 65 20 77  mbination, the w
1430: 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 74 6f  ork-around is to
1440: 20 73 65 74 20 74 68 65 20 63 6f 72 72 65 63 74   set the correct
1450: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 73 69   pointer.  ** si
1460: 7a 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ze at compile-ti
1470: 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  me using -DSQLIT
1480: 45 5f 50 54 52 53 49 5a 45 3d 6e 20 63 6f 6d 70  E_PTRSIZE=n comp
1490: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
14a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  */.  assert( SQL
14b0: 49 54 45 5f 50 54 52 53 49 5a 45 3d 3d 73 69 7a  ITE_PTRSIZE==siz
14c0: 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 0a 20  eof(char*) );.. 
14d0: 20 2f 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73   /* If SQLite is
14e0: 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c 65 74   already complet
14f0: 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  ely initialized,
1500: 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 0a   then this call.
1510: 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
1520: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 73 68 6f  initialize() sho
1530: 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20  uld be a no-op. 
1540: 20 42 75 74 20 74 68 65 20 69 6e 69 74 69 61 6c   But the initial
1550: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d 75 73  ization.  ** mus
1560: 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e 20 20  t be complete.  
1570: 53 6f 20 69 73 49 6e 69 74 20 6d 75 73 74 20 6e  So isInit must n
1580: 6f 74 20 62 65 20 73 65 74 20 75 6e 74 69 6c 20  ot be set until 
1590: 74 68 65 20 76 65 72 79 20 65 6e 64 0a 20 20 2a  the very end.  *
15a0: 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * of this routin
15b0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  e..  */.  if( sq
15c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15d0: 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72  g.isInit ) retur
15e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
15f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
1600: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
1610: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   is initialized.
1620: 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 0a    If unable to .
1630: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
1640: 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  the mutex subsys
1650: 74 65 6d 2c 20 72 65 74 75 72 6e 20 65 61 72 6c  tem, return earl
1660: 79 20 77 69 74 68 20 74 68 65 20 65 72 72 6f 72  y with the error
1670: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 79  ..  ** If the sy
1680: 73 74 65 6d 20 69 73 20 73 6f 20 73 69 63 6b 20  stem is so sick 
1690: 74 68 61 74 20 77 65 20 61 72 65 20 75 6e 61 62  that we are unab
16a0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  le to allocate a
16b0: 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20 74 68 65   mutex,.  ** the
16c0: 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 53  re is not much S
16d0: 51 4c 69 74 65 20 69 73 20 67 6f 69 6e 67 20 74  QLite is going t
16e0: 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 2e  o be able to do.
16f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d  .  **.  ** The m
1700: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 20 6d  utex subsystem m
1710: 75 73 74 20 74 61 6b 65 20 63 61 72 65 20 6f 66  ust take care of
1720: 20 73 65 72 69 61 6c 69 7a 69 6e 67 20 69 74 73   serializing its
1730: 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69 74 69 61   own.  ** initia
1740: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  lization..  */. 
1750: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 75 74   rc = sqlite3Mut
1760: 65 78 49 6e 69 74 28 29 3b 0a 20 20 69 66 28 20  exInit();.  if( 
1770: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1780: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1790: 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20 73 79   the malloc() sy
17a0: 73 74 65 6d 20 61 6e 64 20 74 68 65 20 72 65 63  stem and the rec
17b0: 75 72 73 69 76 65 20 70 49 6e 69 74 4d 75 74 65  ursive pInitMute
17c0: 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a 20 54 68  x mutex..  ** Th
17d0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  is operation is 
17e0: 70 72 6f 74 65 63 74 65 64 20 62 79 20 74 68 65  protected by the
17f0: 20 53 54 41 54 49 43 5f 4d 41 53 54 45 52 20 6d   STATIC_MASTER m
1800: 75 74 65 78 2e 20 20 4e 6f 74 65 20 74 68 61 74  utex.  Note that
1810: 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c 6c 6f 63  .  ** MutexAlloc
1820: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  () is called for
1830: 20 61 20 73 74 61 74 69 63 20 6d 75 74 65 78 20   a static mutex 
1840: 70 72 69 6f 72 20 74 6f 20 69 6e 69 74 69 61 6c  prior to initial
1850: 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6d  izing the.  ** m
1860: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20  alloc subsystem 
1870: 2d 20 74 68 69 73 20 69 6d 70 6c 69 65 73 20 74  - this implies t
1880: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
1890: 6f 6e 20 6f 66 20 61 20 73 74 61 74 69 63 0a 20  on of a static. 
18a0: 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74 20 6e   ** mutex must n
18b0: 6f 74 20 72 65 71 75 69 72 65 20 73 75 70 70 6f  ot require suppo
18c0: 72 74 20 66 72 6f 6d 20 74 68 65 20 6d 61 6c 6c  rt from the mall
18d0: 6f 63 20 73 75 62 73 79 73 74 65 6d 2e 0a 20 20  oc subsystem..  
18e0: 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  */.  MUTEX_LOGIC
18f0: 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69  ( pMaster = sqli
1900: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
1910: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1920: 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73  C_MASTER); ).  s
1930: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1940: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
1950: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1960: 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d  ig.isMutexInit =
1970: 20 31 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   1;.  if( !sqlit
1980: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1990: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
19a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
19b0: 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a 20 20 7d  allocInit();.  }
19c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
19e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
19f0: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 31  isMallocInit = 1
1a00: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
1a10: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1a20: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1a30: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1a40: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
1a50: 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 73  x =.           s
1a60: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1a70: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
1a80: 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20 20  CURSIVE);.      
1a90: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1aa0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
1ab0: 65 78 20 26 26 20 21 73 71 6c 69 74 65 33 47 6c  ex && !sqlite3Gl
1ac0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1ad0: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
1ae0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1af0: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
1b00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1b10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  {.    sqlite3Glo
1b30: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
1b40: 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20  itMutex++;.  }. 
1b50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1b60: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a  eave(pMaster);..
1b70: 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f    /* If rc is no
1b80: 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74  t SQLITE_OK at t
1b90: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
1ba0: 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f  either the mallo
1bb0: 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d  c.  ** subsystem
1bc0: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e   could not be in
1bd0: 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65  itialized or the
1be0: 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74   system failed t
1bf0: 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20  o allocate.  ** 
1c00: 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d  the pInitMutex m
1c10: 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20  utex. Return an 
1c20: 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20  error in either 
1c30: 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  case.  */.  if( 
1c40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c50: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1c60: 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65    }..  /* Do the
1c70: 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69   rest of the ini
1c80: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65  tialization unde
1c90: 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  r the recursive 
1ca0: 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68  mutex so.  ** th
1cb0: 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62  at we will be ab
1cc0: 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63  le to handle rec
1cd0: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74  ursive calls int
1ce0: 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69  o.  ** sqlite3_i
1cf0: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68  nitialize().  Th
1d00: 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1d10: 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20  s normally come 
1d20: 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c  through.  ** sql
1d30: 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77  ite3_os_init() w
1d40: 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73  hen it invokes s
1d50: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1d60: 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72  ter(), but other
1d70: 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20  .  ** recursive 
1d80: 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f  calls might also
1d90: 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20   be possible..  
1da0: 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
1db0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31  TATION-OF: R-001
1dc0: 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20  40-37445 SQLite 
1dd0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
1de0: 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20  rializes calls. 
1df0: 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74   ** to the xInit
1e00: 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20   method, so the 
1e10: 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65  xInit method nee
1e20: 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73  d not be threads
1e30: 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  afe..  **.  ** T
1e40: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74  he following mut
1e50: 65 78 20 69 73 20 77 68 61 74 20 73 65 72 69 61  ex is what seria
1e60: 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20  lizes access to 
1e70: 74 68 65 20 61 70 70 64 65 66 20 70 63 61 63 68  the appdef pcach
1e80: 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74  e xInit.  ** met
1e90: 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74  hods.  The sqlit
1ea0: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
1eb0: 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73  s.xInit() all is
1ec0: 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65   embedded in the
1ed0: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
1ee0: 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69  lite3PcacheIniti
1ef0: 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  alize()..  */.  
1f00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1f10: 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ter(sqlite3Globa
1f20: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
1f30: 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ex);.  if( sqlit
1f40: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1f50: 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69  sInit==0 && sqli
1f60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f70: 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b  inProgress==0 ){
1f80: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
1f90: 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72  alConfig.inProgr
1fa0: 65 73 73 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  ess = 1;.#ifdef 
1fb0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
1fc0: 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20 20 20 20 20  LLOG.    {.     
1fd0: 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c   extern void sql
1fe0: 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c 6f 67  ite3_init_sqllog
1ff0: 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 73 71  (void);.      sq
2000: 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c 6f  lite3_init_sqllo
2010: 67 28 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  g();.    }.#endi
2020: 66 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71  f.    memset(&sq
2030: 6c 69 74 65 33 42 75 69 6c 74 69 6e 46 75 6e 63  lite3BuiltinFunc
2040: 74 69 6f 6e 73 2c 20 30 2c 20 73 69 7a 65 6f 66  tions, 0, sizeof
2050: 28 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e 46  (sqlite3BuiltinF
2060: 75 6e 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20  unctions));.    
2070: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 42  sqlite3RegisterB
2080: 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28  uiltinFunctions(
2090: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
20a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
20b0: 73 50 43 61 63 68 65 49 6e 69 74 3d 3d 30 20 29  sPCacheInit==0 )
20c0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20d0: 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61  ite3PcacheInitia
20e0: 6c 69 7a 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20  lize();.    }.  
20f0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2100: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
2110: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2120: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2130: 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  1;.      rc = sq
2140: 6c 69 74 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20  lite3OsInit();. 
2150: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2160: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2170: 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63 68      sqlite3PCach
2180: 65 42 75 66 66 65 72 53 65 74 75 70 28 20 73 71  eBufferSetup( sq
2190: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
21a0: 67 2e 70 50 61 67 65 2c 20 0a 20 20 20 20 20 20  g.pPage, .      
21b0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
21c0: 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20  lConfig.szPage, 
21d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
21e0: 66 69 67 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20  fig.nPage);.    
21f0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2200: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 31  onfig.isInit = 1
2210: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2220: 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 20 20 20  EXTRA_INIT.     
2230: 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20 3d   bRunExtraInit =
2240: 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d   1;.#endif.    }
2250: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2260: 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72  alConfig.inProgr
2270: 65 73 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  ess = 0;.  }.  s
2280: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
2290: 76 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ve(sqlite3Global
22a0: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
22b0: 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63  x);..  /* Go bac
22c0: 6b 20 75 6e 64 65 72 20 74 68 65 20 73 74 61 74  k under the stat
22d0: 69 63 20 6d 75 74 65 78 20 61 6e 64 20 63 6c 65  ic mutex and cle
22e0: 61 6e 20 75 70 20 74 68 65 20 72 65 63 75 72 73  an up the recurs
22f0: 69 76 65 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74  ive.  ** mutex t
2300: 6f 20 70 72 65 76 65 6e 74 20 61 20 72 65 73 6f  o prevent a reso
2310: 75 72 63 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a  urce leak..  */.
2320: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2330: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
2340: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2350: 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75  onfig.nRefInitMu
2360: 74 65 78 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c  tex--;.  if( sql
2370: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2380: 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d  .nRefInitMutex<=
2390: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
23a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
23b0: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
23c0: 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ex==0 );.    sql
23d0: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
23e0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
23f0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b  fig.pInitMutex);
2400: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2410: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
2420: 74 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  tex = 0;.  }.  s
2430: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
2440: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20  ve(pMaster);..  
2450: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2460: 20 69 73 20 6a 75 73 74 20 61 20 73 61 6e 69 74   is just a sanit
2470: 79 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  y check to make 
2480: 73 75 72 65 20 53 51 4c 69 74 65 20 68 61 73 0a  sure SQLite has.
2490: 20 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c    ** been compil
24a0: 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49  ed correctly.  I
24b0: 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
24c0: 6f 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 2c  o run this code,
24d0: 20 62 75 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e   but.  ** we don
24e0: 27 74 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 69  't want to run i
24f0: 74 20 74 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20  t too often and 
2500: 73 6f 61 6b 20 75 70 20 43 50 55 20 63 79 63 6c  soak up CPU cycl
2510: 65 73 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72  es for no.  ** r
2520: 65 61 73 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75  eason.  So we ru
2530: 6e 20 69 74 20 6f 6e 63 65 20 64 75 72 69 6e 67  n it once during
2540: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e   initialization.
2550: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  .  */.#ifndef ND
2560: 45 42 55 47 0a 23 69 66 6e 64 65 66 20 53 51 4c  EBUG.#ifndef SQL
2570: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
2580: 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69  G_POINT.  /* Thi
2590: 73 20 73 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64  s section of cod
25a0: 65 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74  e's only "output
25b0: 22 20 69 73 20 76 69 61 20 61 73 73 65 72 74 28  " is via assert(
25c0: 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f  ) statements. */
25d0: 0a 20 20 69 66 20 28 20 72 63 3d 3d 53 51 4c 49  .  if ( rc==SQLI
25e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34  TE_OK ){.    u64
25f0: 20 78 20 3d 20 28 28 28 75 36 34 29 31 29 3c 3c   x = (((u64)1)<<
2600: 36 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c  63)-1;.    doubl
2610: 65 20 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e y;.    assert(
2620: 73 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20  sizeof(x)==8);. 
2630: 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66     assert(sizeof
2640: 28 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b  (x)==sizeof(y));
2650: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 79 2c 20  .    memcpy(&y, 
2660: 26 78 2c 20 38 29 3b 0a 20 20 20 20 61 73 73 65  &x, 8);.    asse
2670: 72 74 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  rt( sqlite3IsNaN
2680: 28 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  (y) );.  }.#endi
2690: 66 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  f.#endif..  /* D
26a0: 6f 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69  o extra initiali
26b0: 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 72 65 71  zation steps req
26c0: 75 65 73 74 65 64 20 62 79 20 74 68 65 20 53 51  uested by the SQ
26d0: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
26e0: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d    ** compile-tim
26f0: 65 20 6f 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  e option..  */.#
2700: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54  ifdef SQLITE_EXT
2710: 52 41 5f 49 4e 49 54 0a 20 20 69 66 28 20 62 52  RA_INIT.  if( bR
2720: 75 6e 45 78 74 72 61 49 6e 69 74 20 29 7b 0a 20  unExtraInit ){. 
2730: 20 20 20 69 6e 74 20 53 51 4c 49 54 45 5f 45 58     int SQLITE_EX
2740: 54 52 41 5f 49 4e 49 54 28 63 6f 6e 73 74 20 63  TRA_INIT(const c
2750: 68 61 72 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  har*);.    rc = 
2760: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2770: 54 28 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  T(0);.  }.#endif
2780: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2790: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65  ../*.** Undo the
27a0: 20 65 66 66 65 63 74 73 20 6f 66 20 73 71 6c 69   effects of sqli
27b0: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
27c0: 2e 20 20 4d 75 73 74 20 6e 6f 74 20 62 65 20 63  .  Must not be c
27d0: 61 6c 6c 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74  alled while.** t
27e0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
27f0: 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f  ding database co
2800: 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d  nnections or mem
2810: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ory allocations 
2820: 6f 72 0a 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20  or.** while any 
2830: 70 61 72 74 20 6f 66 20 53 51 4c 69 74 65 20 69  part of SQLite i
2840: 73 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75  s otherwise in u
2850: 73 65 20 69 6e 20 61 6e 79 20 74 68 72 65 61 64  se in any thread
2860: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
2870: 6e 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  ne is not thread
2880: 73 61 66 65 2e 20 20 42 75 74 20 69 74 20 69 73  safe.  But it is
2890: 20 73 61 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20   safe to invoke 
28a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
28b0: 6f 6e 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69  on when SQLite i
28c0: 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20 64  s already shut d
28d0: 6f 77 6e 2e 20 20 49 66 20 53 51 4c 69 74 65 20  own.  If SQLite 
28e0: 69 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20  is already shut 
28f0: 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69  down.** when thi
2900: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
2910: 6f 6b 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  oked, then this 
2920: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72  routine is a har
2930: 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  mless no-op..*/.
2940: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74  int sqlite3_shut
2950: 64 6f 77 6e 28 76 6f 69 64 29 7b 0a 23 69 66 64  down(void){.#ifd
2960: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2970: 53 44 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  SD.  int rc = sq
2980: 6c 69 74 65 33 5f 77 73 64 5f 69 6e 69 74 28 34  lite3_wsd_init(4
2990: 30 39 36 2c 20 32 34 29 3b 0a 20 20 69 66 28 20  096, 24);.  if( 
29a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
29c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
29d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
29e0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a  onfig.isInit ){.
29f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58  #ifdef SQLITE_EX
2a00: 54 52 41 5f 53 48 55 54 44 4f 57 4e 0a 20 20 20  TRA_SHUTDOWN.   
2a10: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 45 58 54   void SQLITE_EXT
2a20: 52 41 5f 53 48 55 54 44 4f 57 4e 28 76 6f 69 64  RA_SHUTDOWN(void
2a30: 29 3b 0a 20 20 20 20 53 51 4c 49 54 45 5f 45 58  );.    SQLITE_EX
2a40: 54 52 41 5f 53 48 55 54 44 4f 57 4e 28 29 3b 0a  TRA_SHUTDOWN();.
2a50: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
2a60: 65 33 5f 6f 73 5f 65 6e 64 28 29 3b 0a 20 20 20  e3_os_end();.   
2a70: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 5f 61   sqlite3_reset_a
2a80: 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28 29 3b  uto_extension();
2a90: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2aa0: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
2ab0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
2ac0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2ad0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20  ig.isPCacheInit 
2ae0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
2af0: 61 63 68 65 53 68 75 74 64 6f 77 6e 28 29 3b 0a  acheShutdown();.
2b00: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2b10: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
2b20: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
2b30: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2b40: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
2b50: 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Init ){.    sqli
2b60: 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a  te3MallocEnd();.
2b70: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2b80: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
2b90: 49 6e 69 74 20 3d 20 30 3b 0a 0a 23 69 66 6e 64  Init = 0;..#ifnd
2ba0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2bb0: 48 55 54 44 4f 57 4e 5f 44 49 52 45 43 54 4f 52  HUTDOWN_DIRECTOR
2bc0: 49 45 53 0a 20 20 20 20 2f 2a 20 54 68 65 20 68  IES.    /* The h
2bd0: 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 68 61  eap subsystem ha
2be0: 73 20 6e 6f 77 20 62 65 65 6e 20 73 68 75 74 64  s now been shutd
2bf0: 6f 77 6e 20 61 6e 64 20 74 68 65 73 65 20 76 61  own and these va
2c00: 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65  lues are suppose
2c10: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 4e  d.    ** to be N
2c20: 55 4c 4c 20 6f 72 20 70 6f 69 6e 74 20 74 6f 20  ULL or point to 
2c30: 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20  memory that was 
2c40: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2c50: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 0a  lite3_malloc(),.
2c60: 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f 75      ** which wou
2c70: 6c 64 20 72 65 6c 79 20 6f 6e 20 74 68 61 74 20  ld rely on that 
2c80: 68 65 61 70 20 73 75 62 73 79 73 74 65 6d 3b 20  heap subsystem; 
2c90: 74 68 65 72 65 66 6f 72 65 2c 20 6d 61 6b 65 20  therefore, make 
2ca0: 73 75 72 65 20 74 68 65 73 65 0a 20 20 20 20 2a  sure these.    *
2cb0: 2a 20 76 61 6c 75 65 73 20 63 61 6e 6e 6f 74 20  * values cannot 
2cc0: 72 65 66 65 72 20 74 6f 20 68 65 61 70 20 6d 65  refer to heap me
2cd0: 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20 6a 75  mory that was ju
2ce0: 73 74 20 69 6e 76 61 6c 69 64 61 74 65 64 20 77  st invalidated w
2cf0: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 68  hen the.    ** h
2d00: 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 77 61  eap subsystem wa
2d10: 73 20 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69  s shutdown.  Thi
2d20: 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 69  s is only done i
2d30: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61  f the current ca
2d40: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 69  ll to.    ** thi
2d50: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 75 6c  s function resul
2d60: 74 65 64 20 69 6e 20 74 68 65 20 68 65 61 70 20  ted in the heap 
2d70: 73 75 62 73 79 73 74 65 6d 20 61 63 74 75 61 6c  subsystem actual
2d80: 6c 79 20 62 65 69 6e 67 20 73 68 75 74 64 6f 77  ly being shutdow
2d90: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  n..    */.    sq
2da0: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
2db0: 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20 73 71  tory = 0;.    sq
2dc0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
2dd0: 74 6f 72 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66  tory = 0;.#endif
2de0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2df0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2e00: 73 4d 75 74 65 78 49 6e 69 74 20 29 7b 0a 20 20  sMutexInit ){.  
2e10: 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 45 6e    sqlite3MutexEn
2e20: 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d();.    sqlite3
2e30: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
2e40: 75 74 65 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20  utexInit = 0;.  
2e50: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
2e60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2e70: 54 68 69 73 20 41 50 49 20 61 6c 6c 6f 77 73 20  This API allows 
2e80: 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20  applications to 
2e90: 6d 6f 64 69 66 79 20 74 68 65 20 67 6c 6f 62 61  modify the globa
2ea0: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  l configuration 
2eb0: 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  of.** the SQLite
2ec0: 20 6c 69 62 72 61 72 79 20 61 74 20 72 75 6e 2d   library at run-
2ed0: 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  time..**.** This
2ee0: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
2ef0: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
2f00: 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
2f10: 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20   outstanding.** 
2f20: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2f30: 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61  ions or memory a
2f40: 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 69  llocations.  Thi
2f50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
2f60: 0a 2a 2a 20 74 68 72 65 61 64 73 61 66 65 2e 20  .** threadsafe. 
2f70: 20 46 61 69 6c 75 72 65 20 74 6f 20 68 65 65 64   Failure to heed
2f80: 20 74 68 65 73 65 20 77 61 72 6e 69 6e 67 73 20   these warnings 
2f90: 63 61 6e 20 6c 65 61 64 20 74 6f 20 75 6e 70 72  can lead to unpr
2fa0: 65 64 69 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68  edictable.** beh
2fb0: 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  avior..*/.int sq
2fc0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74  lite3_config(int
2fd0: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
2fe0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
2ff0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
3000: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e    /* sqlite3_con
3010: 66 69 67 28 29 20 73 68 61 6c 6c 20 72 65 74 75  fig() shall retu
3020: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
3030: 20 69 66 20 69 74 20 69 73 20 69 6e 76 6f 6b 65   if it is invoke
3040: 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65  d while.  ** the
3050: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
3060: 69 73 20 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20  is in use. */.  
3070: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
3080: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29  lConfig.isInit )
3090: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
30a0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76  ISUSE_BKPT;..  v
30b0: 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
30c0: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
30d0: 0a 0a 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 63  ..    /* Mutex c
30e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
30f0: 69 6f 6e 73 20 61 72 65 20 6f 6e 6c 79 20 61 76  ions are only av
3100: 61 69 6c 61 62 6c 65 20 69 6e 20 61 20 74 68 72  ailable in a thr
3110: 65 61 64 73 61 66 65 0a 20 20 20 20 2a 2a 20 63  eadsafe.    ** c
3120: 6f 6d 70 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 23  ompile..    */.#
3130: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3140: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
3150: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
3160: 46 45 3e 30 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  FE>0  /* IMP: R-
3170: 35 34 34 36 36 2d 34 36 37 35 36 20 2a 2f 0a 20  54466-46756 */. 
3180: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3190: 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45  ONFIG_SINGLETHRE
31a0: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  AD: {.      /* E
31b0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 32  VIDENCE-OF: R-02
31c0: 37 34 38 2d 31 39 30 39 36 20 54 68 69 73 20 6f  748-19096 This o
31d0: 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 74  ption sets the t
31e0: 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f  hreading mode to
31f0: 0a 20 20 20 20 20 20 2a 2a 20 53 69 6e 67 6c 65  .      ** Single
3200: 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20  -thread. */.    
3210: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3220: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
3230: 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c   = 0;  /* Disabl
3240: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65 20  e mutex on core 
3250: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3260: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
3270: 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a  llMutex = 0;  /*
3280: 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20 6f   Disable mutex o
3290: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  n connections */
32a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
32b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
32c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48  efined(SQLITE_TH
32d0: 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c  READSAFE) && SQL
32e0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
32f0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 30 35 32 30   /* IMP: R-20520
3300: 2d 35 34 30 38 36 20 2a 2f 0a 20 20 20 20 63 61  -54086 */.    ca
3310: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3320: 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a  _MULTITHREAD: {.
3330: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3340: 45 2d 4f 46 3a 20 52 2d 31 34 33 37 34 2d 34 32  E-OF: R-14374-42
3350: 34 36 38 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  468 This option 
3360: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
3370: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3380: 20 2a 2a 20 4d 75 6c 74 69 2d 74 68 72 65 61 64   ** Multi-thread
3390: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
33a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
33b0: 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20  CoreMutex = 1;  
33c0: 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20  /* Enable mutex 
33d0: 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20  on core */.     
33e0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
33f0: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
3400: 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65  = 0;  /* Disable
3410: 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63   mutex on connec
3420: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62  tions */.      b
3430: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
3440: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
3450: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
3460: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
3470: 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a  ADSAFE>0 /* IMP:
3480: 20 52 2d 35 39 35 39 33 2d 32 31 38 31 30 20 2a   R-59593-21810 *
3490: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
34a0: 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49  E_CONFIG_SERIALI
34b0: 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ZED: {.      /* 
34c0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
34d0: 31 32 32 30 2d 35 31 38 30 30 20 54 68 69 73 20  1220-51800 This 
34e0: 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  option sets the 
34f0: 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20 74  threading mode t
3500: 6f 0a 20 20 20 20 20 20 2a 2a 20 53 65 72 69 61  o.      ** Seria
3510: 6c 69 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  lized. */.      
3520: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3530: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d  fig.bCoreMutex =
3540: 20 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d   1;  /* Enable m
3550: 75 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a  utex on core */.
3560: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3570: 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
3580: 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e  utex = 1;  /* En
3590: 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f  able mutex on co
35a0: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  nnections */.   
35b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
35c0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
35d0: 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ed(SQLITE_THREAD
35e0: 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f  SAFE) && SQLITE_
35f0: 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a 20  THREADSAFE>0 /* 
3600: 49 4d 50 3a 20 52 2d 36 33 36 36 36 2d 34 38 37  IMP: R-63666-487
3610: 35 35 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  55 */.    case S
3620: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54  QLITE_CONFIG_MUT
3630: 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53  EX: {.      /* S
3640: 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e  pecify an altern
3650: 61 74 69 76 65 20 6d 75 74 65 78 20 69 6d 70 6c  ative mutex impl
3660: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
3670: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3680: 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20  lConfig.mutex = 
3690: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
36a0: 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64  te3_mutex_method
36b0: 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  s*);.      break
36c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
36d0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
36e0: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
36f0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
3700: 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 31  FE>0 /* IMP: R-1
3710: 34 34 35 30 2d 33 37 35 39 37 20 2a 2f 0a 20 20  4450-37597 */.  
3720: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3730: 4e 46 49 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b  NFIG_GETMUTEX: {
3740: 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65  .      /* Retrie
3750: 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  ve the current m
3760: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
3770: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61  ion */.      *va
3780: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3790: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29  _mutex_methods*)
37a0: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
37b0: 43 6f 6e 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20  Config.mutex;.  
37c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
37d0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
37e0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
37f0: 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20  MALLOC: {.      
3800: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
3810: 52 2d 35 35 35 39 34 2d 32 31 30 33 30 20 54 68  R-55594-21030 Th
3820: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3830: 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61  MALLOC option ta
3840: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
3850: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
3860: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
3870: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
3880: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
3890: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
38a0: 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20  hods structure. 
38b0: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 73 70 65  The argument spe
38c0: 63 69 66 69 65 73 20 61 6c 74 65 72 6e 61 74 69  cifies alternati
38d0: 76 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 2d  ve.      ** low-
38e0: 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c  level memory all
38f0: 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73  ocation routines
3900: 20 74 6f 20 62 65 20 75 73 65 64 20 69 6e 20 70   to be used in p
3910: 6c 61 63 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f  lace of the memo
3920: 72 79 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  ry.      ** allo
3930: 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  cation routines 
3940: 62 75 69 6c 74 20 69 6e 74 6f 20 53 51 4c 69 74  built into SQLit
3950: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e. */.      sqli
3960: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3970: 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  m = *va_arg(ap, 
3980: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3990: 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ods*);.      bre
39a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
39b0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
39c0: 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  _GETMALLOC: {.  
39d0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
39e0: 4f 46 3a 20 52 2d 35 31 32 31 33 2d 34 36 34 31  OF: R-51213-4641
39f0: 34 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  4 The SQLITE_CON
3a00: 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 20 6f 70  FIG_GETMALLOC op
3a10: 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20  tion takes a.   
3a20: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67     ** single arg
3a30: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61  ument which is a
3a40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
3a50: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 0a 20  nstance of the. 
3a60: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
3a70: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75  mem_methods stru
3a80: 63 74 75 72 65 2e 20 54 68 65 20 73 71 6c 69 74  cture. The sqlit
3a90: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73  e3_mem_methods s
3aa0: 74 72 75 63 74 75 72 65 20 69 73 0a 20 20 20 20  tructure is.    
3ab0: 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
3ac0: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
3ad0: 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 61 6c  efined memory al
3ae0: 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65  location routine
3af0: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  s. */.      if( 
3b00: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3b10: 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30  fig.m.xMalloc==0
3b20: 20 29 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74   ) sqlite3MemSet
3b30: 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20  Default();.     
3b40: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
3b50: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
3b60: 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  *) = sqlite3Glob
3b70: 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20  alConfig.m;.    
3b80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3b90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3ba0: 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a  ONFIG_MEMSTATUS:
3bb0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3bc0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 32 37 35  ENCE-OF: R-61275
3bd0: 2d 33 35 31 35 37 20 54 68 65 20 53 51 4c 49 54  -35157 The SQLIT
3be0: 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54  E_CONFIG_MEMSTAT
3bf0: 55 53 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a  US option takes.
3c00: 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
3c10: 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 79 70 65  argument of type
3c20: 20 69 6e 74 2c 20 69 6e 74 65 72 70 72 65 74 65   int, interprete
3c30: 64 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 2c 20  d as a boolean, 
3c40: 77 68 69 63 68 20 65 6e 61 62 6c 65 73 0a 20 20  which enables.  
3c50: 20 20 20 20 2a 2a 20 6f 72 20 64 69 73 61 62 6c      ** or disabl
3c60: 65 73 20 74 68 65 20 63 6f 6c 6c 65 63 74 69 6f  es the collectio
3c70: 6e 20 6f 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  n of memory allo
3c80: 63 61 74 69 6f 6e 20 73 74 61 74 69 73 74 69 63  cation statistic
3c90: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  s. */.      sqli
3ca0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3cb0: 62 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72  bMemstat = va_ar
3cc0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3cd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3ce0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3cf0: 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b  ONFIG_SCRATCH: {
3d00: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
3d10: 43 45 2d 4f 46 3a 20 52 2d 30 38 34 30 34 2d 36  CE-OF: R-08404-6
3d20: 30 38 38 37 20 54 68 65 72 65 20 61 72 65 20 74  0887 There are t
3d30: 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74  hree arguments t
3d40: 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  o.      ** SQLIT
3d50: 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43 48  E_CONFIG_SCRATCH
3d60: 3a 20 41 20 70 6f 69 6e 74 65 72 20 61 6e 20 38  : A pointer an 8
3d70: 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d 65  -byte aligned me
3d80: 6d 6f 72 79 20 62 75 66 66 65 72 20 66 72 6f 6d  mory buffer from
3d90: 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20  .      ** which 
3da0: 74 68 65 20 73 63 72 61 74 63 68 20 61 6c 6c 6f  the scratch allo
3db0: 63 61 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20  cations will be 
3dc0: 64 72 61 77 6e 2c 20 74 68 65 20 73 69 7a 65 20  drawn, the size 
3dd0: 6f 66 20 65 61 63 68 20 73 63 72 61 74 63 68 0a  of each scratch.
3de0: 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
3df0: 69 6f 6e 20 28 73 7a 29 2c 20 61 6e 64 20 74 68  ion (sz), and th
3e00: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
3e10: 20 6f 66 20 73 63 72 61 74 63 68 20 61 6c 6c 6f   of scratch allo
3e20: 63 61 74 69 6f 6e 73 20 28 4e 29 2e 20 2a 2f 0a  cations (N). */.
3e30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3e40: 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74  balConfig.pScrat
3e50: 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ch = va_arg(ap, 
3e60: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
3e70: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3e80: 67 2e 73 7a 53 63 72 61 74 63 68 20 3d 20 76 61  g.szScratch = va
3e90: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
3ea0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3eb0: 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63  alConfig.nScratc
3ec0: 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  h = va_arg(ap, i
3ed0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3ee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3ef0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
3f00: 41 47 45 43 41 43 48 45 3a 20 7b 0a 20 20 20 20  AGECACHE: {.    
3f10: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3f20: 3a 20 52 2d 31 38 37 36 31 2d 33 36 36 30 31 20  : R-18761-36601 
3f30: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
3f40: 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
3f50: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     ** SQLITE_CON
3f60: 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 41  FIG_PAGECACHE: A
3f70: 20 70 6f 69 6e 74 65 72 20 74 6f 20 38 2d 62 79   pointer to 8-by
3f80: 74 65 20 61 6c 69 67 6e 65 64 20 6d 65 6d 6f 72  te aligned memor
3f90: 79 20 28 70 4d 65 6d 29 2c 0a 20 20 20 20 20 20  y (pMem),.      
3fa0: 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 65  ** the size of e
3fb0: 61 63 68 20 70 61 67 65 20 63 61 63 68 65 20 6c  ach page cache l
3fc0: 69 6e 65 20 28 73 7a 29 2c 20 61 6e 64 20 74 68  ine (sz), and th
3fd0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  e number of cach
3fe0: 65 20 6c 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a  e lines.      **
3ff0: 20 28 4e 29 2e 20 2a 2f 0a 20 20 20 20 20 20 73   (N). */.      s
4000: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4010: 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f 61 72  ig.pPage = va_ar
4020: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
4030: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4040: 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d  lConfig.szPage =
4050: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4060: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4070: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67  lobalConfig.nPag
4080: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
4090: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
40a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
40b0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
40c0: 43 41 43 48 45 5f 48 44 52 53 5a 3a 20 7b 0a 20  CACHE_HDRSZ: {. 
40d0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
40e0: 2d 4f 46 3a 20 52 2d 33 39 31 30 30 2d 32 37 33  -OF: R-39100-273
40f0: 31 37 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  17 The SQLITE_CO
4100: 4e 46 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53  NFIG_PCACHE_HDRS
4110: 5a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a 20  Z option takes. 
4120: 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65       ** a single
4130: 20 70 61 72 61 6d 65 74 65 72 20 77 68 69 63 68   parameter which
4140: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4150: 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20   an integer and 
4160: 77 72 69 74 65 73 20 69 6e 74 6f 0a 20 20 20 20  writes into.    
4170: 20 20 2a 2a 20 74 68 61 74 20 69 6e 74 65 67 65    ** that intege
4180: 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  r the number of 
4190: 65 78 74 72 61 20 62 79 74 65 73 20 70 65 72 20  extra bytes per 
41a0: 70 61 67 65 20 72 65 71 75 69 72 65 64 20 66 6f  page required fo
41b0: 72 20 65 61 63 68 20 70 61 67 65 0a 20 20 20 20  r each page.    
41c0: 20 20 2a 2a 20 69 6e 20 53 51 4c 49 54 45 5f 43    ** in SQLITE_C
41d0: 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 2e  ONFIG_PAGECACHE.
41e0: 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72   */.      *va_ar
41f0: 67 28 61 70 2c 20 69 6e 74 2a 29 20 3d 20 0a 20  g(ap, int*) = . 
4200: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4210: 48 65 61 64 65 72 53 69 7a 65 42 74 72 65 65 28  HeaderSizeBtree(
4220: 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ) +.          sq
4230: 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 50  lite3HeaderSizeP
4240: 63 61 63 68 65 28 29 20 2b 0a 20 20 20 20 20 20  cache() +.      
4250: 20 20 20 20 73 71 6c 69 74 65 33 48 65 61 64 65      sqlite3Heade
4260: 72 53 69 7a 65 50 63 61 63 68 65 31 28 29 3b 0a  rSizePcache1();.
4270: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4280: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
4290: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48  ITE_CONFIG_PCACH
42a0: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  E: {.      /* no
42b0: 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  -op */.      bre
42c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
42d0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
42e0: 5f 47 45 54 50 43 41 43 48 45 3a 20 7b 0a 20 20  _GETPCACHE: {.  
42f0: 20 20 20 20 2f 2a 20 6e 6f 77 20 61 6e 20 65 72      /* now an er
4300: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ror */.      rc 
4310: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
4320: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4330: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
4340: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48  ITE_CONFIG_PCACH
4350: 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  E2: {.      /* E
4360: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33  VIDENCE-OF: R-63
4370: 33 32 35 2d 34 38 33 37 38 20 54 68 65 20 53 51  325-48378 The SQ
4380: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43  LITE_CONFIG_PCAC
4390: 48 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73  HE2 option takes
43a0: 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
43b0: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
43c0: 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  h is a pointer t
43d0: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 70 63 61  o an sqlite3_pca
43e0: 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20  che_methods2.   
43f0: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 54 68     ** object. Th
4400: 69 73 20 6f 62 6a 65 63 74 20 73 70 65 63 69 66  is object specif
4410: 69 65 73 20 74 68 65 20 69 6e 74 65 72 66 61 63  ies the interfac
4420: 65 20 74 6f 20 61 20 63 75 73 74 6f 6d 20 70 61  e to a custom pa
4430: 67 65 20 63 61 63 68 65 0a 20 20 20 20 20 20 2a  ge cache.      *
4440: 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
4450: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
4460: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
4470: 63 61 63 68 65 32 20 3d 20 2a 76 61 5f 61 72 67  cache2 = *va_arg
4480: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61  (ap, sqlite3_pca
4490: 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29 3b 0a  che_methods2*);.
44a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
44b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
44c0: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41  TE_CONFIG_GETPCA
44d0: 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CHE2: {.      /*
44e0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
44f0: 32 32 30 33 35 2d 34 36 31 38 32 20 54 68 65 20  22035-46182 The 
4500: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
4510: 54 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20  TPCACHE2 option 
4520: 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a  takes a.      **
4530: 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
4540: 20 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e   which is a poin
4550: 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
4560: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
4570: 32 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63  2.      ** objec
4580: 74 2e 20 53 51 4c 69 74 65 20 63 6f 70 69 65 73  t. SQLite copies
4590: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
45a0: 70 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c 65  page cache imple
45b0: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 6f 0a 20  mentation into. 
45c0: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 62 6a       ** that obj
45d0: 65 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ect. */.      if
45e0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
45f0: 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 2e 78 49  onfig.pcache2.xI
4600: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nit==0 ){.      
4610: 20 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 53    sqlite3PCacheS
4620: 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20  etDefault();.   
4630: 20 20 20 7d 0a 20 20 20 20 20 20 2a 76 61 5f 61     }.      *va_a
4640: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70  rg(ap, sqlite3_p
4650: 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29  cache_methods2*)
4660: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
4670: 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 3b 0a  Config.pcache2;.
4680: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4690: 20 7d 0a 0a 2f 2a 20 45 56 49 44 45 4e 43 45 2d   }../* EVIDENCE-
46a0: 4f 46 3a 20 52 2d 30 36 36 32 36 2d 31 32 39 31  OF: R-06626-1291
46b0: 31 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  1 The SQLITE_CON
46c0: 46 49 47 5f 48 45 41 50 20 6f 70 74 69 6f 6e 20  FIG_HEAP option 
46d0: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  is only.** avail
46e0: 61 62 6c 65 20 69 66 20 53 51 4c 69 74 65 20 69  able if SQLite i
46f0: 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  s compiled with 
4700: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 45 4e  either SQLITE_EN
4710: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20 6f 72 0a  ABLE_MEMSYS3 or.
4720: 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ** SQLITE_ENABLE
4730: 5f 4d 45 4d 53 59 53 35 20 61 6e 64 20 72 65 74  _MEMSYS5 and ret
4740: 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 52 52 4f  urns SQLITE_ERRO
4750: 52 20 69 66 20 69 6e 76 6f 6b 65 64 20 6f 74 68  R if invoked oth
4760: 65 72 77 69 73 65 2e 20 2a 2f 0a 23 69 66 20 64  erwise. */.#if d
4770: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
4780: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c  ABLE_MEMSYS3) ||
4790: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
47a0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a  ENABLE_MEMSYS5).
47b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
47c0: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20  CONFIG_HEAP: {. 
47d0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
47e0: 2d 4f 46 3a 20 52 2d 31 39 38 35 34 2d 34 32 31  -OF: R-19854-421
47f0: 32 36 20 54 68 65 72 65 20 61 72 65 20 74 68 72  26 There are thr
4800: 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  ee arguments to.
4810: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
4820: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 41 6e 20  CONFIG_HEAP: An 
4830: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 70  8-byte aligned p
4840: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6d 65  ointer to the me
4850: 6d 6f 72 79 2c 20 74 68 65 0a 20 20 20 20 20 20  mory, the.      
4860: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  ** number of byt
4870: 65 73 20 69 6e 20 74 68 65 20 6d 65 6d 6f 72 79  es in the memory
4880: 20 62 75 66 66 65 72 2c 20 61 6e 64 20 74 68 65   buffer, and the
4890: 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 63 61 74   minimum allocat
48a0: 69 6f 6e 20 73 69 7a 65 2e 0a 20 20 20 20 20 20  ion size..      
48b0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
48c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
48d0: 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
48e0: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
48f0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4900: 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67  g.nHeap = va_arg
4910: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4920: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4930: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f  nfig.mnReq = va_
4940: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20  arg(ap, int);.. 
4950: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
4960: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52  GlobalConfig.mnR
4970: 65 71 3c 31 20 29 7b 0a 20 20 20 20 20 20 20 20  eq<1 ){.        
4980: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4990: 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20  fig.mnReq = 1;. 
49a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
49b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
49c0: 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29  ig.mnReq>(1<<12)
49d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63   ){.        /* c
49e0: 61 70 20 6d 69 6e 20 72 65 71 75 65 73 74 20 73  ap min request s
49f0: 69 7a 65 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20  ize at 2^12 */. 
4a00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
4a10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71  obalConfig.mnReq
4a20: 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20   = (1<<12);.    
4a30: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73    }..      if( s
4a40: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4a50: 69 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20  ig.pHeap==0 ){. 
4a60: 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
4a70: 43 45 2d 4f 46 3a 20 52 2d 34 39 39 32 30 2d 36  CE-OF: R-49920-6
4a80: 30 31 38 39 20 49 66 20 74 68 65 20 66 69 72 73  0189 If the firs
4a90: 74 20 70 6f 69 6e 74 65 72 20 28 74 68 65 20 6d  t pointer (the m
4aa0: 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 29 0a 20  emory pointer). 
4ab0: 20 20 20 20 20 20 20 2a 2a 20 69 73 20 4e 55 4c         ** is NUL
4ac0: 4c 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 72  L, then SQLite r
4ad0: 65 76 65 72 74 73 20 74 6f 20 75 73 69 6e 67 20  everts to using 
4ae0: 69 74 73 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f  its default memo
4af0: 72 79 20 61 6c 6c 6f 63 61 74 6f 72 0a 20 20 20  ry allocator.   
4b00: 20 20 20 20 20 2a 2a 20 28 74 68 65 20 73 79 73       ** (the sys
4b10: 74 65 6d 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70  tem malloc() imp
4b20: 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 2c 20 75 6e  lementation), un
4b30: 64 6f 69 6e 67 20 61 6e 79 20 70 72 69 6f 72 20  doing any prior 
4b40: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 0a 20 20  invocation of.  
4b50: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
4b60: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2e 0a 20  CONFIG_MALLOC.. 
4b70: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
4b80: 20 20 2a 2a 20 53 65 74 74 69 6e 67 20 73 71 6c    ** Setting sql
4b90: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4ba0: 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 20  .m to all zeros 
4bb0: 77 69 6c 6c 20 63 61 75 73 65 20 6d 61 6c 6c 6f  will cause mallo
4bc0: 63 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  c to.        ** 
4bd0: 72 65 76 65 72 74 20 74 6f 20 69 74 73 20 64 65  revert to its de
4be0: 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61  fault implementa
4bf0: 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65  tion when sqlite
4c00: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69  3_initialize() i
4c10: 73 20 72 75 6e 0a 20 20 20 20 20 20 20 20 2a 2f  s run.        */
4c20: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
4c30: 26 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  &sqlite3GlobalCo
4c40: 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f  nfig.m, 0, sizeo
4c50: 66 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  f(sqlite3GlobalC
4c60: 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20  onfig.m));.     
4c70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4c80: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4c90: 52 2d 36 31 30 30 36 2d 30 38 39 31 38 20 49 66  R-61006-08918 If
4ca0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e   the memory poin
4cb0: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ter is not NULL 
4cc0: 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  then the.       
4cd0: 20 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20   ** alternative 
4ce0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  memory allocator
4cf0: 20 69 73 20 65 6e 67 61 67 65 64 20 74 6f 20 68   is engaged to h
4d00: 61 6e 64 6c 65 20 61 6c 6c 20 6f 66 20 53 51 4c  andle all of SQL
4d10: 69 74 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ites.        ** 
4d20: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
4d30: 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a 23 69 66 64  n needs. */.#ifd
4d40: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4d50: 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20 20  _MEMSYS3.       
4d60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4d70: 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65  nfig.m = *sqlite
4d80: 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28 29  3MemGetMemsys3()
4d90: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
4da0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
4db0: 4d 53 59 53 35 0a 20 20 20 20 20 20 20 20 73 71  MSYS5.        sq
4dc0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4dd0: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
4de0: 6d 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23  mGetMemsys5();.#
4df0: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
4e00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4e10: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
4e20: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4e30: 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20  LOOKASIDE: {.   
4e40: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4e50: 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69  Config.szLookasi
4e60: 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  de = va_arg(ap, 
4e70: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4e80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4e90: 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f  nLookaside = va_
4ea0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
4eb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4ec0: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 52 65 63  .    .    /* Rec
4ed0: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
4ee0: 20 74 68 65 20 6c 6f 67 67 65 72 20 66 75 6e 63   the logger func
4ef0: 74 69 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72  tion and its fir
4f00: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  st argument..   
4f10: 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   ** The default 
4f20: 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e  is NULL.  Loggin
4f30: 67 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 66  g is disabled if
4f40: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f   the function po
4f50: 69 6e 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20  inter is.    ** 
4f60: 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
4f70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4f80: 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20  FIG_LOG: {.     
4f90: 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b   /* MSVC is pick
4fa0: 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20  y about pulling 
4fb0: 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76  func ptrs from v
4fc0: 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a  a lists..      *
4fd0: 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74  * http://support
4fe0: 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b  .microsoft.com/k
4ff0: 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a  b/47961.      **
5000: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5010: 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61  nfig.xLog = va_a
5020: 72 67 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76  rg(ap, void(*)(v
5030: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63  oid*,int,const c
5040: 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f  har*));.      */
5050: 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76  .      typedef v
5060: 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28  oid(*LOGFUNC_t)(
5070: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
5080: 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71  char*);.      sq
5090: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
50a0: 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28  g.xLog = va_arg(
50b0: 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a  ap, LOGFUNC_t);.
50c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
50d0: 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72  balConfig.pLogAr
50e0: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  g = va_arg(ap, v
50f0: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  oid*);.      bre
5100: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
5110: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5120: 2d 35 35 35 34 38 2d 33 33 38 31 37 20 54 68 65  -55548-33817 The
5130: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 73 65   compile-time se
5140: 74 74 69 6e 67 20 66 6f 72 20 55 52 49 20 66 69  tting for URI fi
5150: 6c 65 6e 61 6d 65 73 0a 20 20 20 20 2a 2a 20 63  lenames.    ** c
5160: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 74  an be changed at
5170: 20 73 74 61 72 74 2d 74 69 6d 65 20 75 73 69 6e   start-time usin
5180: 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c  g the.    ** sql
5190: 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
51a0: 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 31 29  TE_CONFIG_URI,1)
51b0: 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   or.    ** sqlit
51c0: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
51d0: 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 30 29 20 63  _CONFIG_URI,0) c
51e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 61 6c  onfiguration cal
51f0: 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ls..    */.    c
5200: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
5210: 47 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 2f  G_URI: {.      /
5220: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5230: 2d 32 35 34 35 31 2d 36 31 31 32 35 20 54 68 65  -25451-61125 The
5240: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55   SQLITE_CONFIG_U
5250: 52 49 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  RI option takes 
5260: 61 20 73 69 6e 67 6c 65 0a 20 20 20 20 20 20 2a  a single.      *
5270: 2a 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 79  * argument of ty
5280: 70 65 20 69 6e 74 2e 20 49 66 20 6e 6f 6e 2d 7a  pe int. If non-z
5290: 65 72 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61  ero, then URI ha
52a0: 6e 64 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c  ndling is global
52b0: 6c 79 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62  ly.      ** enab
52c0: 6c 65 64 2e 20 49 66 20 74 68 65 20 70 61 72 61  led. If the para
52d0: 6d 65 74 65 72 20 69 73 20 7a 65 72 6f 2c 20 74  meter is zero, t
52e0: 68 65 6e 20 55 52 49 20 68 61 6e 64 6c 69 6e 67  hen URI handling
52f0: 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a 20 20 20   is globally.   
5300: 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 64 2e 20     ** disabled. 
5310: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
5320: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70  GlobalConfig.bOp
5330: 65 6e 55 72 69 20 3d 20 76 61 5f 61 72 67 28 61  enUri = va_arg(a
5340: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
5350: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
5360: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
5370: 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44  FIG_COVERING_IND
5380: 45 58 5f 53 43 41 4e 3a 20 7b 0a 20 20 20 20 20  EX_SCAN: {.     
5390: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
53a0: 20 52 2d 33 36 35 39 32 2d 30 32 37 37 32 20 54   R-36592-02772 T
53b0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
53c0: 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f  _COVERING_INDEX_
53d0: 53 43 41 4e 0a 20 20 20 20 20 20 2a 2a 20 6f 70  SCAN.      ** op
53e0: 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e  tion takes a sin
53f0: 67 6c 65 20 69 6e 74 65 67 65 72 20 61 72 67 75  gle integer argu
5400: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 69 6e  ment which is in
5410: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 0a 20  terpreted as a. 
5420: 20 20 20 20 20 2a 2a 20 62 6f 6f 6c 65 61 6e 20       ** boolean 
5430: 69 6e 20 6f 72 64 65 72 20 74 6f 20 65 6e 61 62  in order to enab
5440: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
5450: 65 20 75 73 65 20 6f 66 20 63 6f 76 65 72 69 6e  e use of coverin
5460: 67 20 69 6e 64 69 63 65 73 20 66 6f 72 0a 20 20  g indices for.  
5470: 20 20 20 20 2a 2a 20 66 75 6c 6c 20 74 61 62 6c      ** full tabl
5480: 65 20 73 63 61 6e 73 20 69 6e 20 74 68 65 20 71  e scans in the q
5490: 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 2e 20  uery optimizer. 
54a0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
54b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
54c0: 65 43 69 73 20 3d 20 76 61 5f 61 72 67 28 61 70  eCis = va_arg(ap
54d0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
54e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  eak;.    }..#ifd
54f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5500: 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65  _SQLLOG.    case
5510: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
5520: 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74  QLLOG: {.      t
5530: 79 70 65 64 65 66 20 76 6f 69 64 28 2a 53 51 4c  ypedef void(*SQL
5540: 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a  LOGFUNC_t)(void*
5550: 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73  , sqlite3*, cons
5560: 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20  t char*, int);. 
5570: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
5580: 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
5590: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 53 51   = va_arg(ap, SQ
55a0: 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20  LLOGFUNC_t);.   
55b0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
55c0: 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
55d0: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  g = va_arg(ap, v
55e0: 6f 69 64 20 2a 29 3b 0a 20 20 20 20 20 20 62 72  oid *);.      br
55f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5600: 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  f..    case SQLI
5610: 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53  TE_CONFIG_MMAP_S
5620: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  IZE: {.      /* 
5630: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
5640: 38 30 36 33 2d 33 38 32 35 38 20 53 51 4c 49 54  8063-38258 SQLIT
5650: 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49  E_CONFIG_MMAP_SI
5660: 5a 45 20 74 61 6b 65 73 20 74 77 6f 20 36 34 2d  ZE takes two 64-
5670: 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74  bit.      ** int
5680: 65 67 65 72 20 28 73 71 6c 69 74 65 33 5f 69 6e  eger (sqlite3_in
5690: 74 36 34 29 20 76 61 6c 75 65 73 20 74 68 61 74  t64) values that
56a0: 20 61 72 65 20 74 68 65 20 64 65 66 61 75 6c 74   are the default
56b0: 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d 69 74   mmap size limit
56c0: 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20 64  .      ** (the d
56d0: 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 20 66  efault setting f
56e0: 6f 72 20 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73  or PRAGMA mmap_s
56f0: 69 7a 65 29 20 61 6e 64 20 74 68 65 20 6d 61 78  ize) and the max
5700: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 0a 20 20 20  imum allowed.   
5710: 20 20 20 2a 2a 20 6d 6d 61 70 20 73 69 7a 65 20     ** mmap size 
5720: 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20  limit. */.      
5730: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
5740: 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Mmap = va_arg(ap
5750: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  , sqlite3_int64)
5760: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5770: 69 6e 74 36 34 20 6d 78 4d 6d 61 70 20 3d 20 76  int64 mxMmap = v
5780: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
5790: 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20 20 20  3_int64);.      
57a0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
57b0: 52 2d 35 33 33 36 37 2d 34 33 31 39 30 20 49 66  R-53367-43190 If
57c0: 20 65 69 74 68 65 72 20 61 72 67 75 6d 65 6e 74   either argument
57d0: 20 74 6f 20 74 68 69 73 20 6f 70 74 69 6f 6e 20   to this option 
57e0: 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e 65 67 61  is.      ** nega
57f0: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 61 74 20  tive, then that 
5800: 61 72 67 75 6d 65 6e 74 20 69 73 20 63 68 61 6e  argument is chan
5810: 67 65 64 20 74 6f 20 69 74 73 20 63 6f 6d 70 69  ged to its compi
5820: 6c 65 2d 74 69 6d 65 20 64 65 66 61 75 6c 74 2e  le-time default.
5830: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
5840: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
5850: 52 2d 33 34 39 39 33 2d 34 35 30 33 31 20 54 68  R-34993-45031 Th
5860: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
5870: 64 20 6d 6d 61 70 20 73 69 7a 65 20 77 69 6c 6c  d mmap size will
5880: 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 73 69 6c   be.      ** sil
5890: 65 6e 74 6c 79 20 74 72 75 6e 63 61 74 65 64 20  ently truncated 
58a0: 69 66 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20  if necessary so 
58b0: 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
58c0: 20 65 78 63 65 65 64 20 74 68 65 0a 20 20 20 20   exceed the.    
58d0: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d    ** compile-tim
58e0: 65 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  e maximum mmap s
58f0: 69 7a 65 20 73 65 74 20 62 79 20 74 68 65 20 53  ize set by the S
5900: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
5910: 49 5a 45 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  IZE.      ** com
5920: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
5930: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
5940: 20 69 66 28 20 6d 78 4d 6d 61 70 3c 30 20 7c 7c   if( mxMmap<0 ||
5950: 20 6d 78 4d 6d 61 70 3e 53 51 4c 49 54 45 5f 4d   mxMmap>SQLITE_M
5960: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 20 29 7b 0a  AX_MMAP_SIZE ){.
5970: 20 20 20 20 20 20 20 20 6d 78 4d 6d 61 70 20 3d          mxMmap =
5980: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
5990: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _SIZE;.      }. 
59a0: 20 20 20 20 20 69 66 28 20 73 7a 4d 6d 61 70 3c       if( szMmap<
59b0: 30 20 29 20 73 7a 4d 6d 61 70 20 3d 20 53 51 4c  0 ) szMmap = SQL
59c0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50  ITE_DEFAULT_MMAP
59d0: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 66 28  _SIZE;.      if(
59e0: 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d 61 70 29 20   szMmap>mxMmap) 
59f0: 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b  szMmap = mxMmap;
5a00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
5a10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
5a20: 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  p = mxMmap;.    
5a30: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5a40: 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 20 3d 20 73  onfig.szMmap = s
5a50: 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 62 72 65  zMmap;.      bre
5a60: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 53  ak;.    }..#if S
5a70: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 26 26 20  QLITE_OS_WIN && 
5a80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
5a90: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29 20 2f 2a 20  IN32_MALLOC) /* 
5aa0: 49 4d 50 3a 20 52 2d 30 34 37 38 30 2d 35 35 38  IMP: R-04780-558
5ab0: 31 35 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  15 */.    case S
5ac0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e  QLITE_CONFIG_WIN
5ad0: 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b 0a 20  32_HEAPSIZE: {. 
5ae0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5af0: 2d 4f 46 3a 20 52 2d 33 34 39 32 36 2d 30 33 33  -OF: R-34926-033
5b00: 36 30 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  60 SQLITE_CONFIG
5b10: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 20  _WIN32_HEAPSIZE 
5b20: 74 61 6b 65 73 20 61 20 33 32 2d 62 69 74 0a 20  takes a 32-bit. 
5b30: 20 20 20 20 20 2a 2a 20 75 6e 73 69 67 6e 65 64       ** unsigned
5b40: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 74   integer value t
5b50: 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68  hat specifies th
5b60: 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f  e maximum size o
5b70: 66 20 74 68 65 20 63 72 65 61 74 65 64 0a 20 20  f the created.  
5b80: 20 20 20 20 2a 2a 20 68 65 61 70 2e 20 2a 2f 0a      ** heap. */.
5b90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5ba0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20  balConfig.nHeap 
5bb0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5bc0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5bd0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
5be0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5bf0: 4e 46 49 47 5f 50 4d 41 53 5a 3a 20 7b 0a 20 20  NFIG_PMASZ: {.  
5c00: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
5c10: 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d 61 20 3d 20  lConfig.szPma = 
5c20: 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67  va_arg(ap, unsig
5c30: 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ned int);.      
5c40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
5c50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5c60: 4e 46 49 47 5f 53 54 4d 54 4a 52 4e 4c 5f 53 50  NFIG_STMTJRNL_SP
5c70: 49 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ILL: {.      sql
5c80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5c90: 2e 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 76 61  .nStmtSpill = va
5ca0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
5cb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5cc0: 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  }..    default: 
5cd0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
5ce0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
5cf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5d00: 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
5d10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5d20: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65  /*.** Set up the
5d30: 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65   lookaside buffe
5d40: 72 73 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  rs for a databas
5d50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
5d60: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
5d70: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a  K on success.  .
5d80: 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20  ** If lookaside 
5d90: 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
5da0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
5db0: 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  _BUSY..**.** The
5dc0: 20 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73   sz parameter is
5dd0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
5de0: 79 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f  ytes in each loo
5df0: 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20  kaside slot..** 
5e00: 54 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65  The cnt paramete
5e10: 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  r is the number 
5e20: 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53  of slots.  If pS
5e30: 74 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65  tart is NULL the
5e40: 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68  .** space for th
5e50: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  e lookaside memo
5e60: 72 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ry is obtained f
5e70: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
5e80: 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61  oc()..** If pSta
5e90: 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  rt is not NULL t
5ea0: 68 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74  hen it is sz*cnt
5eb0: 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
5ec0: 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74   to use for.** t
5ed0: 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  he lookaside mem
5ee0: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
5ef0: 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64  nt setupLookasid
5f00: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76  e(sqlite3 *db, v
5f10: 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73  oid *pBuf, int s
5f20: 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 23 69 66  z, int cnt){.#if
5f30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5f40: 5f 4c 4f 4f 4b 41 53 49 44 45 0a 20 20 76 6f 69  _LOOKASIDE.  voi
5f50: 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28  d *pStart;.  if(
5f60: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
5f70: 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Out ){.    retur
5f80: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
5f90: 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79   }.  /* Free any
5fa0: 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73   existing lookas
5fb0: 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20 74  ide buffer for t
5fc0: 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72  his handle befor
5fd0: 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e  e.  ** allocatin
5fe0: 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77  g a new one so w
5ff0: 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20  e don't have to 
6000: 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a  have space for .
6010: 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65    ** both at the
6020: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f   same time..  */
6030: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
6040: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
6050: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
6060: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
6070: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
6080: 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  /* The size of a
6090: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20   lookaside slot 
60a0: 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38  after ROUNDDOWN8
60b0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72   needs to be lar
60c0: 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20  ger.  ** than a 
60d0: 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73  pointer to be us
60e0: 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20  eful..  */.  sz 
60f0: 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29  = ROUNDDOWN8(sz)
6100: 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30  ;  /* IMP: R-330
6110: 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66  38-09382 */.  if
6120: 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  ( sz<=(int)sizeo
6130: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
6140: 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66  ) ) sz = 0;.  if
6150: 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20  ( cnt<0 ) cnt = 
6160: 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c  0;.  if( sz==0 |
6170: 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  | cnt==0 ){.    
6180: 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61  sz = 0;.    pSta
6190: 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  rt = 0;.  }else 
61a0: 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20  if( pBuf==0 ){. 
61b0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
61c0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
61d0: 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69     pStart = sqli
61e0: 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e  te3Malloc( sz*cn
61f0: 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  t );  /* IMP: R-
6200: 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20  61949-35727 */. 
6210: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
6220: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
6230: 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63 6e   if( pStart ) cn
6240: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
6250: 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a  cSize(pStart)/sz
6260: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6270: 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20  Start = pBuf;.  
6280: 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  }.  db->lookasid
6290: 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61 72  e.pStart = pStar
62a0: 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  t;.  db->lookasi
62b0: 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20  de.pFree = 0;.  
62c0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a  db->lookaside.sz
62d0: 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66   = (u16)sz;.  if
62e0: 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
62f0: 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61  int i;.    Looka
6300: 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20  sideSlot *p;.   
6310: 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69   assert( sz > (i
6320: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
6330: 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20  ideSlot*) );.   
6340: 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53   p = (LookasideS
6350: 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20  lot*)pStart;.   
6360: 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e   for(i=cnt-1; i>
6370: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; i--){.      
6380: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c  p->pNext = db->l
6390: 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a  ookaside.pFree;.
63a0: 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73        db->lookas
63b0: 69 64 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20  ide.pFree = p;. 
63c0: 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73       p = (Lookas
63d0: 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29  ideSlot*)&((u8*)
63e0: 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20  p)[sz];.    }.  
63f0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6400: 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62  pEnd = p;.    db
6410: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73  ->lookaside.bDis
6420: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
6430: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
6440: 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20  loced = pBuf==0 
6450: 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ?1:0;.  }else{. 
6460: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
6470: 2e 70 53 74 61 72 74 20 3d 20 64 62 3b 0a 20 20  .pStart = db;.  
6480: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6490: 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20 64  pEnd = db;.    d
64a0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
64b0: 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 64  sable = 1;.    d
64c0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
64d0: 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  lloced = 0;.  }.
64e0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
64f0: 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 20  _OMIT_LOOKASIDE 
6500: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  */.  return SQLI
6510: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6520: 52 65 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78  Return the mutex
6530: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6540: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
6550: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74  ection..*/.sqlit
6560: 65 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65  e3_mutex *sqlite
6570: 33 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74  3_db_mutex(sqlit
6580: 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20  e3 *db){.#ifdef 
6590: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
65a0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
65b0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
65c0: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
65d0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
65e0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
65f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
6600: 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d  f.  return db->m
6610: 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  utex;.}../*.** F
6620: 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d  ree up as much m
6630: 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20  emory as we can 
6640: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64  from the given d
6650: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
6660: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
6670: 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
6680: 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20  _memory(sqlite3 
6690: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  *db){.  int i;..
66a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
66b0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
66c0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
66d0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
66e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
66f0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
6700: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
6710: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
6720: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
6730: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
6740: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
6750: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
6760: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
6770: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
6780: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
6790: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
67a0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
67b0: 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
67c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72   sqlite3PagerShr
67d0: 69 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ink(pPager);.   
67e0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
67f0: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
6800: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
6810: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
6820: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
6830: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6840: 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 69 72 74  * Flush any dirt
6850: 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
6860: 61 67 65 72 2d 63 61 63 68 65 20 66 6f 72 20 61  ager-cache for a
6870: 6e 79 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ny attached data
6880: 62 61 73 65 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e  base.** to disk.
6890: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
68a0: 64 62 5f 63 61 63 68 65 66 6c 75 73 68 28 73 71  db_cacheflush(sq
68b0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
68c0: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
68d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
68e0: 20 62 53 65 65 6e 42 75 73 79 20 3d 20 30 3b 0a   bSeenBusy = 0;.
68f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6900: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
6910: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
6920: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
6930: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
6940: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
6950: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
6960: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
6970: 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  tex);.  sqlite3B
6980: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
6990: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
69a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
69b0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
69c0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
69d0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
69e0: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73      if( pBt && s
69f0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
6a00: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
6a10: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
6a20: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
6a30: 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
6a40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6a50: 65 72 46 6c 75 73 68 28 70 50 61 67 65 72 29 3b  erFlush(pPager);
6a60: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
6a70: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
6a80: 20 20 20 20 20 20 62 53 65 65 6e 42 75 73 79 20        bSeenBusy 
6a90: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 1;.        rc 
6aa0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
6ab0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6ac0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
6ad0: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
6ae0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6af0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
6b00: 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49  eturn ((rc==SQLI
6b10: 54 45 5f 4f 4b 20 26 26 20 62 53 65 65 6e 42 75  TE_OK && bSeenBu
6b20: 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  sy) ? SQLITE_BUS
6b30: 59 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Y : rc);.}../*.*
6b40: 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
6b50: 73 65 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20  settings for an 
6b60: 69 6e 64 69 76 69 64 75 61 6c 20 64 61 74 61 62  individual datab
6b70: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
6b80: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
6b90: 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20  _config(sqlite3 
6ba0: 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e  *db, int op, ...
6bb0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
6bc0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f  .  int rc;.  va_
6bd0: 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20  start(ap, op);. 
6be0: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
6bf0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6c00: 42 43 4f 4e 46 49 47 5f 4d 41 49 4e 44 42 4e 41  BCONFIG_MAINDBNA
6c10: 4d 45 3a 20 7b 0a 20 20 20 20 20 20 64 62 2d 3e  ME: {.      db->
6c20: 61 44 62 5b 30 5d 2e 7a 44 62 53 4e 61 6d 65 20  aDb[0].zDbSName 
6c30: 3d 20 76 61 5f 61 72 67 28 61 70 2c 63 68 61 72  = va_arg(ap,char
6c40: 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  *);.      rc = S
6c50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
6c60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6c70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
6c80: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
6c90: 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
6ca0: 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Buf = va_arg(ap,
6cb0: 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a   void*); /* IMP:
6cc0: 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a   R-26835-10964 *
6cd0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  /.      int sz =
6ce0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
6cf0: 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  ;       /* IMP: 
6d00: 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f  R-47871-25994 */
6d10: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
6d20: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
6d30: 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ;      /* IMP: R
6d40: 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a  -04460-53386 */.
6d50: 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75 70        rc = setup
6d60: 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42  Lookaside(db, pB
6d70: 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20  uf, sz, cnt);.  
6d80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6d90: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
6da0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
6db0: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
6dc0: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
6dd0: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a   /* The opcode *
6de0: 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d 61  /.        u32 ma
6df0: 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  sk;    /* Mask o
6e00: 66 20 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c  f the bit in sql
6e10: 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65  ite3.flags to se
6e20: 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20  t/clear */.     
6e30: 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b   } aFlagOp[] = {
6e40: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
6e50: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
6e60: 45 5f 46 4b 45 59 2c 20 20 20 20 20 20 20 20 20  E_FKEY,         
6e70: 20 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e    SQLITE_Foreign
6e80: 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20 20 20 20  Keys    },.     
6e90: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
6ea0: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47  NFIG_ENABLE_TRIG
6eb0: 47 45 52 2c 20 20 20 20 20 20 20 20 53 51 4c 49  GER,        SQLI
6ec0: 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72  TE_EnableTrigger
6ed0: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53    },.        { S
6ee0: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
6ef0: 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e  NABLE_FTS3_TOKEN
6f00: 49 5a 45 52 2c 20 53 51 4c 49 54 45 5f 46 74 73  IZER, SQLITE_Fts
6f10: 33 54 6f 6b 65 6e 69 7a 65 72 20 20 7d 2c 0a 20  3Tokenizer  },. 
6f20: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
6f30: 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
6f40: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 20  LOAD_EXTENSION, 
6f50: 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e  SQLITE_LoadExten
6f60: 73 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20 20 20  sion  },.       
6f70: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
6f80: 49 47 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c  IG_NO_CKPT_ON_CL
6f90: 4f 53 45 2c 20 20 20 20 20 20 53 51 4c 49 54 45  OSE,      SQLITE
6fa0: 5f 4e 6f 43 6b 70 74 4f 6e 43 6c 6f 73 65 20 20  _NoCkptOnClose  
6fb0: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c  },.        { SQL
6fc0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 46 55 4c  ITE_DBCONFIG_FUL
6fd0: 4c 5f 45 51 50 2c 20 20 20 20 20 20 20 20 20 20  L_EQP,          
6fe0: 20 20 20 20 53 51 4c 49 54 45 5f 46 75 6c 6c 45      SQLITE_FullE
6ff0: 51 50 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  QP  },.      };.
7000: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
7010: 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt i;.      rc =
7020: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
7030: 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32  * IMP: R-42790-2
7040: 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f  3372 */.      fo
7050: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
7060: 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b  ze(aFlagOp); i++
7070: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
7080: 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70  FlagOp[i].op==op
7090: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
70a0: 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67  t onoff = va_arg
70b0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
70c0: 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d       int *pRes =
70d0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
70e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
70f0: 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e   oldFlags = db->
7100: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
7110: 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a   if( onoff>0 ){.
7120: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
7130: 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70  flags |= aFlagOp
7140: 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  [i].mask;.      
7150: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
7160: 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  off==0 ){.      
7170: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
7180: 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  &= ~aFlagOp[i].m
7190: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ask;.          }
71a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
71b0: 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61  ldFlags!=db->fla
71c0: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gs ){.          
71d0: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
71e0: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
71f0: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
7200: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
7210: 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20   pRes ){.       
7220: 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62       *pRes = (db
7230: 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f  ->flags & aFlagO
7240: 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20  p[i].mask)!=0;. 
7250: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7260: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
7270: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  _OK;.          b
7280: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
7290: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
72a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
72b0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
72c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
72d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
72e0: 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b  if the buffer z[
72f0: 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  0..n-1] contains
7300: 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a   all spaces..*/.
7310: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70  static int allSp
7320: 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20  aces(const char 
7330: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68  *z, int n){.  wh
7340: 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
7350: 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20  1]==' ' ){ n--; 
7360: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b  }.  return n==0;
7370: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
7380: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  s the default co
7390: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
73a0: 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20   named "BINARY" 
73b0: 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a  which is always.
73c0: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ** available..**
73d0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c  .** If the padFl
73e0: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ag argument is n
73f0: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61  ot NULL then spa
7400: 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68  ce padding at th
7410: 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69  e end.** of stri
7420: 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ngs is ignored. 
7430: 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73   This implements
7440: 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61   the RTRIM colla
7450: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
7460: 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28  int binCollFunc(
7470: 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67  .  void *padFlag
7480: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
7490: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
74a0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
74b0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
74c0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b  .){.  int rc, n;
74d0: 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65  .  n = nKey1<nKe
74e0: 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65  y2 ? nKey1 : nKe
74f0: 79 32 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  y2;.  /* EVIDENC
7500: 45 2d 4f 46 3a 20 52 2d 36 35 30 33 33 2d 32 38  E-OF: R-65033-28
7510: 34 34 39 20 54 68 65 20 62 75 69 6c 74 2d 69 6e  449 The built-in
7520: 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f   BINARY collatio
7530: 6e 20 63 6f 6d 70 61 72 65 73 0a 20 20 2a 2a 20  n compares.  ** 
7540: 73 74 72 69 6e 67 73 20 62 79 74 65 20 62 79 20  strings byte by 
7550: 62 79 74 65 20 75 73 69 6e 67 20 74 68 65 20 6d  byte using the m
7560: 65 6d 63 6d 70 28 29 20 66 75 6e 63 74 69 6f 6e  emcmp() function
7570: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
7580: 72 64 20 43 0a 20 20 2a 2a 20 6c 69 62 72 61 72  rd C.  ** librar
7590: 79 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6d 65 6d  y. */.  rc = mem
75a0: 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32  cmp(pKey1, pKey2
75b0: 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , n);.  if( rc==
75c0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64  0 ){.    if( pad
75d0: 46 6c 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c  Flag.     && all
75e0: 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70  Spaces(((char*)p
75f0: 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e  Key1)+n, nKey1-n
7600: 29 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61  ).     && allSpa
7610: 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79  ces(((char*)pKey
7620: 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20  2)+n, nKey2-n). 
7630: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45     ){.      /* E
7640: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31  VIDENCE-OF: R-31
7650: 36 32 34 2d 32 34 37 33 37 20 52 54 52 49 4d 20  624-24737 RTRIM 
7660: 69 73 20 6c 69 6b 65 20 42 49 4e 41 52 59 20 65  is like BINARY e
7670: 78 63 65 70 74 20 74 68 61 74 20 65 78 74 72 61  xcept that extra
7680: 0a 20 20 20 20 20 20 2a 2a 20 73 70 61 63 65 73  .      ** spaces
7690: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
76a0: 69 74 68 65 72 20 73 74 72 69 6e 67 20 64 6f 20  ither string do 
76b0: 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 72  not change the r
76c0: 65 73 75 6c 74 2e 20 49 6e 20 6f 74 68 65 72 0a  esult. In other.
76d0: 20 20 20 20 20 20 2a 2a 20 77 6f 72 64 73 2c 20        ** words, 
76e0: 73 74 72 69 6e 67 73 20 77 69 6c 6c 20 63 6f 6d  strings will com
76f0: 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 6f 6e  pare equal to on
7700: 65 20 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f 6e  e another as lon
7710: 67 20 61 73 20 74 68 65 79 0a 20 20 20 20 20 20  g as they.      
7720: 2a 2a 20 64 69 66 66 65 72 20 6f 6e 6c 79 20 69  ** differ only i
7730: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
7740: 73 70 61 63 65 73 20 61 74 20 74 68 65 20 65 6e  spaces at the en
7750: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
7760: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
7770: 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b  = nKey1 - nKey2;
7780: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
7790: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
77a0: 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69   Another built-i
77b0: 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  n collating sequ
77c0: 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a  ence: NOCASE. .*
77d0: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74  *.** This collat
77e0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
77f0: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
7800: 73 65 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e  sed for "case in
7810: 64 65 70 65 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d  dependent.** com
7820: 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65  parison". SQLite
7830: 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20  's knowledge of 
7840: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
7850: 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73  case equivalents
7860: 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79  .** extends only
7870: 20 74 6f 20 74 68 65 20 32 36 20 63 68 61 72 61   to the 26 chara
7880: 63 74 65 72 73 20 75 73 65 64 20 69 6e 20 74 68  cters used in th
7890: 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  e English langua
78a0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65  ge..**.** At the
78b0: 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73   moment there is
78c0: 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d   only a UTF-8 im
78d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f  plementation..*/
78e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61  .static int noca
78f0: 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28  seCollatingFunc(
7900: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
7910: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
7920: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
7930: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
7940: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
7950: 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71  .){.  int r = sq
7960: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20  lite3StrNICmp(. 
7970: 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72       (const char
7980: 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74   *)pKey1, (const
7990: 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28   char *)pKey2, (
79a0: 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65  nKey1<nKey2)?nKe
79b0: 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55  y1:nKey2);.  UNU
79c0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
79d0: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d  tUsed);.  if( 0=
79e0: 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b  =r ){.    r = nK
79f0: 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20  ey1-nKey2;.  }. 
7a00: 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a   return r;.}../*
7a10: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52  .** Return the R
7a20: 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74  OWID of the most
7a30: 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a   recent insert.*
7a40: 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73  /.sqlite_int64 s
7a50: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
7a60: 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33  rt_rowid(sqlite3
7a70: 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
7a80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
7a90: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
7aa0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
7ab0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
7ac0: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
7ad0: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
7ae0: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
7af0: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73    return db->las
7b00: 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tRowid;.}../*.**
7b10: 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 72   Set the value r
7b20: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73  eturned by the s
7b30: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
7b40: 72 74 5f 72 6f 77 69 64 28 29 20 41 50 49 20 66  rt_rowid() API f
7b50: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  unction..*/.void
7b60: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 6c 61 73   sqlite3_set_las
7b70: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73  t_insert_rowid(s
7b80: 71 6c 69 74 65 33 20 2a 64 62 2c 20 73 71 6c 69  qlite3 *db, sqli
7b90: 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64  te3_int64 iRowid
7ba0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
7bb0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
7bc0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
7bd0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
7be0: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
7bf0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
7c00: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
7c10: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
7c20: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
7c30: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
7c40: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 69 52  ->lastRowid = iR
7c50: 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  owid;.  sqlite3_
7c60: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
7c70: 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mutex);.}../*.**
7c80: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
7c90: 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e  er of changes in
7ca0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
7cb0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
7cc0: 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _exec()..*/.int 
7cd0: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
7ce0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
7cf0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7d00: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
7d10: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
7d20: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
7d30: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
7d40: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
7d50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7d60: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
7d70: 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a  db->nChange;.}..
7d80: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7d90: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67   number of chang
7da0: 65 73 20 73 69 6e 63 65 20 74 68 65 20 64 61 74  es since the dat
7db0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73  abase handle was
7dc0: 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20   opened..*/.int 
7dd0: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
7de0: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
7df0: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
7e00: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
7e10: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
7e20: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
7e30: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
7e40: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
7e50: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
7e60: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
7e70: 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c  eturn db->nTotal
7e80: 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
7e90: 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20   Close all open 
7ea0: 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69 73  savepoints. This
7eb0: 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d   function only m
7ec0: 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c 64  anipulates field
7ed0: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  s of the.** data
7ee0: 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65  base handle obje
7ef0: 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ct, it does not 
7f00: 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70 6f  close any savepo
7f10: 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62 65  ints that may be
7f20: 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20   open.** at the 
7f30: 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65 76  b-tree/pager lev
7f40: 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  el..*/.void sqli
7f50: 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
7f60: 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
7f70: 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53  .  while( db->pS
7f80: 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
7f90: 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20  Savepoint *pTmp 
7fa0: 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74  = db->pSavepoint
7fb0: 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70  ;.    db->pSavep
7fc0: 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65  oint = pTmp->pNe
7fd0: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  xt;.    sqlite3D
7fe0: 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b  bFree(db, pTmp);
7ff0: 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65  .  }.  db->nSave
8000: 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  point = 0;.  db-
8010: 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
8020: 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63  .  db->isTransac
8030: 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  tionSavepoint = 
8040: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  0;.}../*.** Invo
8050: 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
8060: 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63  r function assoc
8070: 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63 44  iated with FuncD
8080: 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45 78  ef p, if any. Ex
8090: 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73  cept,.** if this
80a0: 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74   is not the last
80b0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75 6e   copy of the fun
80c0: 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e  ction, do not in
80d0: 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c  voke it. Multipl
80e0: 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 61  e.** copies of a
80f0: 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e   single function
8100: 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68 65   are created whe
8110: 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  n create_functio
8120: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  n() is called.**
8130: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e 59   with SQLITE_ANY
8140: 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
8150: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8160: 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79   functionDestroy
8170: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75  (sqlite3 *db, Fu
8180: 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e  ncDef *p){.  Fun
8190: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65  cDestructor *pDe
81a0: 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 75 2e  structor = p->u.
81b0: 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69  pDestructor;.  i
81c0: 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29  f( pDestructor )
81d0: 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f  {.    pDestructo
81e0: 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  r->nRef--;.    i
81f0: 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e  f( pDestructor->
8200: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
8210: 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44   pDestructor->xD
8220: 65 73 74 72 6f 79 28 70 44 65 73 74 72 75 63 74  estroy(pDestruct
8230: 6f 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a  or->pUserData);.
8240: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8250: 72 65 65 28 64 62 2c 20 70 44 65 73 74 72 75 63  ree(db, pDestruc
8260: 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tor);.    }.  }.
8270: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e  }../*.** Disconn
8280: 65 63 74 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f  ect all sqlite3_
8290: 76 74 61 62 20 6f 62 6a 65 63 74 73 20 74 68 61  vtab objects tha
82a0: 74 20 62 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61  t belong to data
82b0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
82c0: 2a 2a 20 64 62 2e 20 54 68 69 73 20 69 73 20 63  ** db. This is c
82d0: 61 6c 6c 65 64 20 77 68 65 6e 20 64 62 20 69 73  alled when db is
82e0: 20 62 65 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a   being closed..*
82f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
8300: 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28  sconnectAllVtab(
8310: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
8320: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8330: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
8340: 20 69 6e 74 20 69 3b 0a 20 20 48 61 73 68 45 6c   int i;.  HashEl
8350: 65 6d 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  em *p;.  sqlite3
8360: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
8370: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
8380: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
8390: 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
83a0: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ma = db->aDb[i].
83b0: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28  pSchema;.    if(
83c0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68   db->aDb[i].pSch
83d0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ema ){.      for
83e0: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
83f0: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  st(&pSchema->tbl
8400: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
8410: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
8420: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
8430: 54 61 62 20 3d 20 28 54 61 62 6c 65 20 2a 29 73  Tab = (Table *)s
8440: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29  qliteHashData(p)
8450: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  ;.        if( Is
8460: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
8470: 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63 6f  sqlite3VtabDisco
8480: 6e 6e 65 63 74 28 64 62 2c 20 70 54 61 62 29 3b  nnect(db, pTab);
8490: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
84a0: 20 7d 0a 20 20 66 6f 72 28 70 3d 73 71 6c 69 74   }.  for(p=sqlit
84b0: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
84c0: 61 4d 6f 64 75 6c 65 29 3b 20 70 3b 20 70 3d 73  aModule); p; p=s
84d0: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29  qliteHashNext(p)
84e0: 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70  ){.    Module *p
84f0: 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29  Mod = (Module *)
8500: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
8510: 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d  );.    if( pMod-
8520: 3e 70 45 70 6f 54 61 62 20 29 7b 0a 20 20 20 20  >pEpoTab ){.    
8530: 20 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73    sqlite3VtabDis
8540: 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 4d 6f 64  connect(db, pMod
8550: 2d 3e 70 45 70 6f 54 61 62 29 3b 0a 20 20 20 20  ->pEpoTab);.    
8560: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
8570: 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62  tabUnlockList(db
8580: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
8590: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 23  eLeaveAll(db);.#
85a0: 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
85b0: 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 23 65 6e  RAMETER(db);.#en
85c0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
85d0: 75 72 6e 20 54 52 55 45 20 69 66 20 64 61 74 61  urn TRUE if data
85e0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
85f0: 64 62 20 68 61 73 20 75 6e 66 69 6e 61 6c 69 7a  db has unfinaliz
8600: 65 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73  ed prepared.** s
8610: 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66  tatements or unf
8620: 69 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f  inished sqlite3_
8630: 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 2e 20  backup objects. 
8640: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
8650: 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79  connectionIsBusy
8660: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
8670: 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74   int j;.  assert
8680: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
8690: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
86a0: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64  );.  if( db->pVd
86b0: 62 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  be ) return 1;. 
86c0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e   for(j=0; j<db->
86d0: 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42  nDb; j++){.    B
86e0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
86f0: 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[j].pBt;.    
8700: 69 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74  if( pBt && sqlit
8710: 65 33 42 74 72 65 65 49 73 49 6e 42 61 63 6b 75  e3BtreeIsInBacku
8720: 70 28 70 42 74 29 20 29 20 72 65 74 75 72 6e 20  p(pBt) ) return 
8730: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
8740: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  0;.}../*.** Clos
8750: 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 53 51  e an existing SQ
8760: 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2f  Lite database.*/
8770: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
8780: 74 65 33 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  te3Close(sqlite3
8790: 20 2a 64 62 2c 20 69 6e 74 20 66 6f 72 63 65 5a   *db, int forceZ
87a0: 6f 6d 62 69 65 29 7b 0a 20 20 69 66 28 20 21 64  ombie){.  if( !d
87b0: 62 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  b ){.    /* EVID
87c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 32 35 37  ENCE-OF: R-63257
87d0: 2d 31 31 37 34 30 20 43 61 6c 6c 69 6e 67 20 73  -11740 Calling s
87e0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 6f  qlite3_close() o
87f0: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
8800: 5f 63 6c 6f 73 65 5f 76 32 28 29 20 77 69 74 68  _close_v2() with
8810: 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
8820: 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 68 61  argument is a ha
8830: 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f  rmless no-op. */
8840: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8850: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
8860: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
8870: 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
8880: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8890: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
88a0: 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  T;.  }.  sqlite3
88b0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
88c0: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64  >mutex);.  if( d
88d0: 62 2d 3e 6d 54 72 61 63 65 20 26 20 53 51 4c 49  b->mTrace & SQLI
88e0: 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 20 29  TE_TRACE_CLOSE )
88f0: 7b 0a 20 20 20 20 64 62 2d 3e 78 54 72 61 63 65  {.    db->xTrace
8900: 28 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43 4c  (SQLITE_TRACE_CL
8910: 4f 53 45 2c 20 64 62 2d 3e 70 54 72 61 63 65 41  OSE, db->pTraceA
8920: 72 67 2c 20 64 62 2c 20 30 29 3b 0a 20 20 7d 0a  rg, db, 0);.  }.
8930: 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73  .  /* Force xDis
8940: 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e  connect calls on
8950: 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62   all virtual tab
8960: 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e  les */.  disconn
8970: 65 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a  ectAllVtab(db);.
8980: 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73  .  /* If a trans
8990: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20  action is open, 
89a0: 74 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c  the disconnectAl
89b0: 6c 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f  lVtab() call abo
89c0: 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ve.  ** will not
89d0: 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65   have called the
89e0: 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d   xDisconnect() m
89f0: 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72  ethod on any vir
8a00: 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73  tual.  ** tables
8a10: 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72   in the db->aVTr
8a20: 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65  ans[] array. The
8a30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
8a40: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29  e3VtabRollback()
8a50: 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20  .  ** call will 
8a60: 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74  do so. We need t
8a70: 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65  o do this before
8a80: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
8a90: 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73  ctive.  ** SQL s
8aa0: 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c  tatements below,
8ab0: 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20   as the v-table 
8ac0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
8ad0: 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20  ay be storing.  
8ae0: 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64  ** some prepared
8af0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65   statements inte
8b00: 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73  rnally..  */.  s
8b10: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
8b20: 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65  ck(db);..  /* Le
8b30: 67 61 63 79 20 62 65 68 61 76 69 6f 72 20 28 73  gacy behavior (s
8b40: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62  qlite3_close() b
8b50: 65 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72  ehavior) is to r
8b60: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
8b70: 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 63 6f  E_BUSY if the co
8b80: 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74  nnection can not
8b90: 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64   be closed immed
8ba0: 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  iately..  */.  i
8bb0: 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20  f( !forceZombie 
8bc0: 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  && connectionIsB
8bd0: 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73  usy(db) ){.    s
8be0: 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
8bf0: 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  sg(db, SQLITE_BU
8c00: 53 59 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 63  SY, "unable to c
8c10: 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69  lose due to unfi
8c20: 6e 61 6c 69 7a 65 64 20 22 0a 20 20 20 20 20 20  nalized ".      
8c30: 20 22 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20   "statements or 
8c40: 75 6e 66 69 6e 69 73 68 65 64 20 62 61 63 6b 75  unfinished backu
8c50: 70 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ps");.    sqlite
8c60: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
8c70: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65  ->mutex);.    re
8c80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
8c90: 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  ;.  }..#ifdef SQ
8ca0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
8cb0: 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  OG.  if( sqlite3
8cc0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
8cd0: 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 43  llog ){.    /* C
8ce0: 6c 6f 73 69 6e 67 20 74 68 65 20 68 61 6e 64 6c  losing the handl
8cf0: 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65  e. Fourth parame
8d00: 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74 68  ter is passed th
8d10: 65 20 76 61 6c 75 65 20 32 2e 20 2a 2f 0a 20 20  e value 2. */.  
8d20: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
8d30: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 73 71  onfig.xSqllog(sq
8d40: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
8d50: 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 64 62  g.pSqllogArg, db
8d60: 2c 20 30 2c 20 32 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 2);.  }.#en
8d70: 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72  dif..  /* Conver
8d80: 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  t the connection
8d90: 20 69 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20 61   into a zombie a
8da0: 6e 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74  nd then close it
8db0: 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61 67  ..  */.  db->mag
8dc0: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
8dd0: 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c 69  C_ZOMBIE;.  sqli
8de0: 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64  te3LeaveMutexAnd
8df0: 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29 3b  CloseZombie(db);
8e00: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
8e10: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77  _OK;.}../*.** Tw
8e20: 6f 20 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20  o variations on 
8e30: 74 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65 72  the public inter
8e40: 66 61 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67  face for closing
8e50: 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63   a database.** c
8e60: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 73  onnection. The s
8e70: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 76  qlite3_close() v
8e80: 65 72 73 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  ersion returns S
8e90: 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a  QLITE_BUSY and.*
8ea0: 2a 20 6c 65 61 76 65 73 20 74 68 65 20 63 6f 6e  * leaves the con
8eb0: 6e 65 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20 69  nection option i
8ec0: 66 20 74 68 65 72 65 20 61 72 65 20 75 6e 66 69  f there are unfi
8ed0: 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64  nalized prepared
8ee0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  .** statements o
8ef0: 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c  r unfinished sql
8f00: 69 74 65 33 5f 62 61 63 6b 75 70 73 2e 20 20 54  ite3_backups.  T
8f10: 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  he sqlite3_close
8f20: 5f 76 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f 6e  _v2().** version
8f30: 20 66 6f 72 63 65 73 20 74 68 65 20 63 6f 6e 6e   forces the conn
8f40: 65 63 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d 65  ection to become
8f50: 20 61 20 7a 6f 6d 62 69 65 20 69 66 20 74 68 65   a zombie if the
8f60: 72 65 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f 73  re are.** unclos
8f70: 65 64 20 72 65 73 6f 75 72 63 65 73 2c 20 61 6e  ed resources, an
8f80: 64 20 61 72 72 61 6e 67 65 73 20 66 6f 72 20 64  d arranges for d
8f90: 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65 6e  eallocation when
8fa0: 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72 65   the last.** pre
8fb0: 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74 20 6f  pare statement o
8fc0: 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  r sqlite3_backup
8fd0: 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74 20   closes..*/.int 
8fe0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 71  sqlite3_close(sq
8ff0: 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75  lite3 *db){ retu
9000: 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28  rn sqlite3Close(
9010: 64 62 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71 6c  db,0); }.int sql
9020: 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73 71  ite3_close_v2(sq
9030: 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75  lite3 *db){ retu
9040: 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28  rn sqlite3Close(
9050: 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a  db,1); }.../*.**
9060: 20 43 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78   Close the mutex
9070: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e   on database con
9080: 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a  nection db..**.*
9090: 2a 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 69  * Furthermore, i
90a0: 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  f database conne
90b0: 63 74 69 6f 6e 20 64 62 20 69 73 20 61 20 7a 6f  ction db is a zo
90c0: 6d 62 69 65 20 28 6d 65 61 6e 69 6e 67 20 74 68  mbie (meaning th
90d0: 61 74 20 74 68 65 72 65 0a 2a 2a 20 68 61 73 20  at there.** has 
90e0: 62 65 65 6e 20 61 20 70 72 69 6f 72 20 63 61 6c  been a prior cal
90f0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f  l to sqlite3_clo
9100: 73 65 28 64 62 29 20 6f 72 20 73 71 6c 69 74 65  se(db) or sqlite
9110: 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29 29 20  3_close_v2(db)) 
9120: 61 6e 64 0a 2a 2a 20 65 76 65 72 79 20 73 71 6c  and.** every sql
9130: 69 74 65 33 5f 73 74 6d 74 20 68 61 73 20 6e 6f  ite3_stmt has no
9140: 77 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64  w been finalized
9150: 20 61 6e 64 20 65 76 65 72 79 20 73 71 6c 69 74   and every sqlit
9160: 65 33 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a 2a  e3_backup has.**
9170: 20 66 69 6e 69 73 68 65 64 2c 20 74 68 65 6e 20   finished, then 
9180: 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63  free all resourc
9190: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
91a0: 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64  te3LeaveMutexAnd
91b0: 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c 69  CloseZombie(sqli
91c0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73 68  te3 *db){.  Hash
91d0: 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20 20 20  Elem *i;        
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
91f0: 61 73 68 20 74 61 62 6c 65 20 69 74 65 72 61 74  ash table iterat
9200: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a  or */.  int j;..
9210: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
9220: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 73 71  e outstanding sq
9230: 6c 69 74 65 33 5f 73 74 6d 74 20 6f 72 20 73 71  lite3_stmt or sq
9240: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a  lite3_backup obj
9250: 65 63 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66 20  ects.  ** or if 
9260: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  the connection h
9270: 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
9280: 63 6c 6f 73 65 64 20 62 79 20 73 71 6c 69 74 65  closed by sqlite
9290: 33 5f 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20 20  3_close_v2(),.  
92a0: 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20 6c 65 61  ** then just lea
92b0: 76 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64  ve the mutex and
92c0: 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20   return..  */.  
92d0: 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53  if( db->magic!=S
92e0: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42  QLITE_MAGIC_ZOMB
92f0: 49 45 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f 6e  IE || connection
9300: 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20  IsBusy(db) ){.  
9310: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9320: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
9330: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
9340: 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  }..  /* If we re
9350: 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
9360: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
9370: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
9380: 63 74 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20 63  ction has.  ** c
9390: 6c 6f 73 65 64 20 61 6c 6c 20 73 71 6c 69 74 65  losed all sqlite
93a0: 33 5f 73 74 6d 74 20 61 6e 64 20 73 71 6c 69 74  3_stmt and sqlit
93b0: 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  e3_backup object
93c0: 73 20 61 6e 64 20 68 61 73 20 62 65 65 6e 0a 20  s and has been. 
93d0: 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 73 71   ** passed to sq
93e0: 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65 61  lite3_close (mea
93f0: 6e 69 6e 67 20 74 68 61 74 20 69 74 20 69 73 20  ning that it is 
9400: 61 20 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65 72  a zombie).  Ther
9410: 65 66 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20 61  efore,.  ** go a
9420: 68 65 61 64 20 61 6e 64 20 66 72 65 65 20 61 6c  head and free al
9430: 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 2a  l resources..  *
9440: 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61  /..  /* If a tra
9450: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
9460: 2c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  , roll it back. 
9470: 54 68 69 73 20 61 6c 73 6f 20 65 6e 73 75 72 65  This also ensure
9480: 73 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 61  s that if.  ** a
9490: 6e 79 20 64 61 74 61 62 61 73 65 20 73 63 68 65  ny database sche
94a0: 6d 61 73 20 68 61 76 65 20 62 65 65 6e 20 6d 6f  mas have been mo
94b0: 64 69 66 69 65 64 20 62 79 20 61 6e 20 75 6e 63  dified by an unc
94c0: 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63  ommitted transac
94d0: 74 69 6f 6e 0a 20 20 2a 2a 20 74 68 65 79 20 61  tion.  ** they a
94e0: 72 65 20 72 65 73 65 74 2e 20 41 6e 64 20 74 68  re reset. And th
94f0: 61 74 20 74 68 65 20 72 65 71 75 69 72 65 64 20  at the required 
9500: 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
9510: 68 65 6c 64 20 74 6f 20 6d 61 6b 65 0a 20 20 2a  held to make.  *
9520: 2a 20 74 68 65 20 70 61 67 65 72 20 72 6f 6c 6c  * the pager roll
9530: 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20  back and schema 
9540: 72 65 73 65 74 20 61 6e 20 61 74 6f 6d 69 63 20  reset an atomic 
9550: 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  operation. */.  
9560: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
9570: 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  ll(db, SQLITE_OK
9580: 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e  );..  /* Free an
9590: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61  y outstanding Sa
95a0: 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72  vepoint structur
95b0: 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  es. */.  sqlite3
95c0: 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
95d0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  db);..  /* Close
95e0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f   all database co
95f0: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 66  nnections */.  f
9600: 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44  or(j=0; j<db->nD
9610: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72  b; j++){.    str
9620: 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64  uct Db *pDb = &d
9630: 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69  b->aDb[j];.    i
9640: 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20  f( pDb->pBt ){. 
9650: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
9660: 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74 29  eClose(pDb->pBt)
9670: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42 74  ;.      pDb->pBt
9680: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
9690: 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  j!=1 ){.        
96a0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30  pDb->pSchema = 0
96b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
96c0: 20 20 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74    }.  /* Clear t
96d0: 68 65 20 54 45 4d 50 20 73 63 68 65 6d 61 20 73  he TEMP schema s
96e0: 65 70 61 72 61 74 65 6c 79 20 61 6e 64 20 6c 61  eparately and la
96f0: 73 74 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  st */.  if( db->
9700: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
9710: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63 68  {.    sqlite3Sch
9720: 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62  emaClear(db->aDb
9730: 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20  [1].pSchema);.  
9740: 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  }.  sqlite3VtabU
9750: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a  nlockList(db);..
9760: 20 20 2f 2a 20 46 72 65 65 20 75 70 20 74 68 65    /* Free up the
9770: 20 61 72 72 61 79 20 6f 66 20 61 75 78 69 6c 69   array of auxili
9780: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 2a 2f  ary databases */
9790: 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70  .  sqlite3Collap
97a0: 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28  seDatabaseArray(
97b0: 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  db);.  assert( d
97c0: 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61  b->nDb<=2 );.  a
97d0: 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d  ssert( db->aDb==
97e0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b  db->aDbStatic );
97f0: 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20  ..  /* Tell the 
9800: 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63  code in notify.c
9810: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63   that the connec
9820: 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68  tion no longer h
9830: 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f  olds any.  ** lo
9840: 63 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  cks and does not
9850: 20 72 65 71 75 69 72 65 20 61 6e 79 20 66 75 72   require any fur
9860: 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69  ther unlock-noti
9870: 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20  fy callbacks..  
9880: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  */.  sqlite3Conn
9890: 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29  ectionClosed(db)
98a0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  ;..  for(i=sqlit
98b0: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
98c0: 61 46 75 6e 63 29 3b 20 69 3b 20 69 3d 73 71 6c  aFunc); i; i=sql
98d0: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
98e0: 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 4e  .    FuncDef *pN
98f0: 65 78 74 2c 20 2a 70 3b 0a 20 20 20 20 70 20 3d  ext, *p;.    p =
9900: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
9910: 69 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  i);.    do{.    
9920: 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f    functionDestro
9930: 79 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  y(db, p);.      
9940: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
9950: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
9960: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
9970: 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20      p = pNext;. 
9980: 20 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a     }while( p );.
9990: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73    }.  sqlite3Has
99a0: 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 46 75 6e  hClear(&db->aFun
99b0: 63 29 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  c);.  for(i=sqli
99c0: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
99d0: 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69  >aCollSeq); i; i
99e0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
99f0: 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  i)){.    CollSeq
9a00: 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53   *pColl = (CollS
9a10: 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  eq *)sqliteHashD
9a20: 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49  ata(i);.    /* I
9a30: 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75  nvoke any destru
9a40: 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64  ctors registered
9a50: 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   for collation s
9a60: 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74  equence user dat
9a70: 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d  a. */.    for(j=
9a80: 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<3; j++){.  
9a90: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d      if( pColl[j]
9aa0: 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20  .xDel ){.       
9ab0: 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70   pColl[j].xDel(p
9ac0: 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a  Coll[j].pUser);.
9ad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9ae0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9af0: 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a  db, pColl);.  }.
9b00: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
9b10: 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  ar(&db->aCollSeq
9b20: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
9b30: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
9b40: 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  BLE.  for(i=sqli
9b50: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
9b60: 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d  >aModule); i; i=
9b70: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
9b80: 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a  )){.    Module *
9b90: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a  pMod = (Module *
9ba0: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
9bb0: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64  i);.    if( pMod
9bc0: 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  ->xDestroy ){.  
9bd0: 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72      pMod->xDestr
9be0: 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a  oy(pMod->pAux);.
9bf0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9c00: 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61  3VtabEponymousTa
9c10: 62 6c 65 43 6c 65 61 72 28 64 62 2c 20 70 4d 6f  bleClear(db, pMo
9c20: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  d);.    sqlite3D
9c30: 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29 3b  bFree(db, pMod);
9c40: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
9c50: 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d 6f  shClear(&db->aMo
9c60: 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  dule);.#endif.. 
9c70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
9c80: 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 20 2f 2a  , SQLITE_OK); /*
9c90: 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e 79   Deallocates any
9ca0: 20 63 61 63 68 65 64 20 65 72 72 6f 72 20 73 74   cached error st
9cb0: 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  rings. */.  sqli
9cc0: 74 65 33 56 61 6c 75 65 46 72 65 65 28 64 62 2d  te3ValueFree(db-
9cd0: 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65  >pErr);.  sqlite
9ce0: 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73  3CloseExtensions
9cf0: 28 64 62 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  (db);.#if SQLITE
9d00: 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
9d10: 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f 66  TION.  sqlite3_f
9d20: 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75  ree(db->auth.zAu
9d30: 74 68 55 73 65 72 29 3b 0a 20 20 73 71 6c 69 74  thUser);.  sqlit
9d40: 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74 68  e3_free(db->auth
9d50: 2e 7a 41 75 74 68 50 57 29 3b 0a 23 65 6e 64 69  .zAuthPW);.#endi
9d60: 66 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  f..  db->magic =
9d70: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52   SQLITE_MAGIC_ER
9d80: 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74  ROR;..  /* The t
9d90: 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63 68  emp-database sch
9da0: 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ema is allocated
9db0: 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f   differently fro
9dc0: 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63 68 65  m the other sche
9dd0: 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20  ma.  ** objects 
9de0: 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c  (using sqliteMal
9df0: 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c 20  loc() directly, 
9e00: 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69 74  instead of sqlit
9e10: 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 29 29  e3BtreeSchema())
9e20: 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65  ..  ** So it nee
9e30: 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 68  ds to be freed h
9e40: 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e  ere. Todo: Why n
9e50: 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70  ot roll the temp
9e60: 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a   schema into.  *
9e70: 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69 74  * the same sqlit
9e80: 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68 65  eMalloc() as the
9e90: 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63 61   one that alloca
9ea0: 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  tes the database
9eb0: 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65   .  ** structure
9ec0: 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ?.  */.  sqlite3
9ed0: 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61  DbFree(db, db->a
9ee0: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a  Db[1].pSchema);.
9ef0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9f00: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
9f10: 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ;.  db->magic = 
9f20: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
9f30: 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  SED;.  sqlite3_m
9f40: 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75  utex_free(db->mu
9f50: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
9f60: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
9f70: 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46 61 69  ut==0 );  /* Fai
9f80: 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69 64  ls on a lookasid
9f90: 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 2a 2f  e memory leak */
9fa0: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
9fb0: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
9fc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
9fd0: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
9fe0: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
9ff0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29  sqlite3_free(db)
a000: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
a010: 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ack all database
a020: 20 66 69 6c 65 73 2e 20 20 49 66 20 74 72 69 70   files.  If trip
a030: 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49  Code is not SQLI
a040: 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61  TE_OK, then.** a
a050: 6e 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ny write cursors
a060: 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
a070: 20 28 22 74 72 69 70 70 65 64 22 20 2d 20 61 73   ("tripped" - as
a080: 20 69 6e 20 22 74 72 69 70 70 69 6e 67 20 61 20   in "tripping a 
a090: 63 69 72 63 75 69 74 0a 2a 2a 20 62 72 65 61 6b  circuit.** break
a0a0: 65 72 22 29 20 61 6e 64 20 6d 61 64 65 20 74 6f  er") and made to
a0b0: 20 72 65 74 75 72 6e 20 74 72 69 70 43 6f 64 65   return tripCode
a0c0: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
a0d0: 79 20 66 75 72 74 68 65 72 0a 2a 2a 20 61 74 74  y further.** att
a0e0: 65 6d 70 74 73 20 74 6f 20 75 73 65 20 74 68 61  empts to use tha
a0f0: 74 20 63 75 72 73 6f 72 2e 20 20 52 65 61 64 20  t cursor.  Read 
a100: 63 75 72 73 6f 72 73 20 72 65 6d 61 69 6e 20 6f  cursors remain o
a110: 70 65 6e 20 61 6e 64 20 76 61 6c 69 64 0a 2a 2a  pen and valid.**
a120: 20 62 75 74 20 61 72 65 20 22 73 61 76 65 64 22   but are "saved"
a130: 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 61 62   in case the tab
a140: 6c 65 20 70 61 67 65 73 20 61 72 65 20 6d 6f 76  le pages are mov
a150: 65 64 20 61 72 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f  ed around..*/.vo
a160: 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
a170: 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64  ckAll(sqlite3 *d
a180: 62 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29  b, int tripCode)
a190: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
a1a0: 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20   inTrans = 0;.  
a1b0: 69 6e 74 20 73 63 68 65 6d 61 43 68 61 6e 67 65  int schemaChange
a1c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
a1d0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
a1e0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
a1f0: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
a200: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a  nMalloc();..  /*
a210: 20 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72   Obtain all b-tr
a220: 65 65 20 6d 75 74 65 78 65 73 20 62 65 66 6f 72  ee mutexes befor
a230: 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c  e making any cal
a240: 6c 73 20 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62  ls to BtreeRollb
a250: 61 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69  ack(). .  ** Thi
a260: 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69  s is important i
a270: 6e 20 63 61 73 65 20 74 68 65 20 74 72 61 6e 73  n case the trans
a280: 61 63 74 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c  action being rol
a290: 6c 65 64 20 62 61 63 6b 20 68 61 73 0a 20 20 2a  led back has.  *
a2a0: 2a 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64  * modified the d
a2b0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
a2c0: 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  If the b-tree mu
a2d0: 74 65 78 65 73 20 61 72 65 20 6e 6f 74 20 74 61  texes are not ta
a2e0: 6b 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74  ken.  ** here, t
a2f0: 68 65 6e 20 61 6e 6f 74 68 65 72 20 73 68 61 72  hen another shar
a300: 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65 63 74  ed-cache connect
a310: 69 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61 6b 20  ion might sneak 
a320: 69 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20  in between.  ** 
a330: 74 68 65 20 64 61 74 61 62 61 73 65 20 72 6f 6c  the database rol
a340: 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61  lback and schema
a350: 20 72 65 73 65 74 2c 20 77 68 69 63 68 20 63 61   reset, which ca
a360: 6e 20 63 61 75 73 65 20 66 61 6c 73 65 0a 20 20  n cause false.  
a370: 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 72 65  ** corruption re
a380: 70 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20 63 61  ports in some ca
a390: 73 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ses.  */.  sqlit
a3a0: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
a3b0: 64 62 29 3b 0a 20 20 73 63 68 65 6d 61 43 68 61  db);.  schemaCha
a3c0: 6e 67 65 20 3d 20 64 62 2d 3e 62 49 6e 74 65 72  nge = db->bInter
a3d0: 6e 43 68 61 6e 67 65 73 20 26 26 20 64 62 2d 3e  nChanges && db->
a3e0: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 3b 0a 0a 20  init.busy==0;.. 
a3f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
a400: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
a410: 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44  tree *p = db->aD
a420: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
a430: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ( p ){.      if(
a440: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
a450: 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20  nTrans(p) ){.   
a460: 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 31       inTrans = 1
a470: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a480: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
a490: 62 61 63 6b 28 70 2c 20 74 72 69 70 43 6f 64 65  back(p, tripCode
a4a0: 2c 20 21 73 63 68 65 6d 61 43 68 61 6e 67 65 29  , !schemaChange)
a4b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
a4c0: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
a4d0: 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  k(db);.  sqlite3
a4e0: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
a4f0: 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 62 49  );..  if( db->bI
a500: 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 26 26 20  nternChanges && 
a510: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
a520: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
a530: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
a540: 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20  tements(db);.   
a550: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
a560: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
a570: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73  ion(db);.  }.  s
a580: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
a590: 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41  All(db);..  /* A
a5a0: 6e 79 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  ny deferred cons
a5b0: 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e  traint violation
a5c0: 73 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  s have now been 
a5d0: 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64  resolved. */.  d
a5e0: 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
a5f0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66   = 0;.  db->nDef
a600: 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30  erredImmCons = 0
a610: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
a620: 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b   ~SQLITE_DeferFK
a630: 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20  s;..  /* If one 
a640: 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75  has been configu
a650: 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  red, invoke the 
a660: 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61  rollback-hook ca
a670: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  llback */.  if( 
a680: 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
a690: 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72 61 6e  lback && (inTran
a6a0: 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f  s || !db->autoCo
a6b0: 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64 62 2d  mmit) ){.    db-
a6c0: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
a6d0: 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  ck(db->pRollback
a6e0: 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Arg);.  }.}../*.
a6f0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74  ** Return a stat
a700: 69 63 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69  ic string contai
a710: 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 63 6f  ning the name co
a720: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
a730: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  he error code.**
a740: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
a750: 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  e argument..*/.#
a760: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
a770: 45 5f 4e 45 45 44 5f 45 52 52 5f 4e 41 4d 45 29  E_NEED_ERR_NAME)
a780: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
a790: 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 20  ite3ErrName(int 
a7a0: 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rc){.  const cha
a7b0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
a7c0: 69 6e 74 20 69 2c 20 6f 72 69 67 52 63 20 3d 20  int i, origRc = 
a7d0: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
a7e0: 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20  <2 && zName==0; 
a7f0: 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66 66 29  i++, rc &= 0xff)
a800: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 72 63  {.    switch( rc
a810: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53   ){.      case S
a820: 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20  QLITE_OK:       
a830: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a840: 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20  = "SQLITE_OK";  
a850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
a860: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a870: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20  SQLITE_ERROR:   
a880: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a890: 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52   = "SQLITE_ERROR
a8a0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
a8b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a8c0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
a8d0: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
a8e0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45  e = "SQLITE_INTE
a8f0: 52 4e 41 4c 22 3b 20 20 20 20 20 20 20 20 20 20  RNAL";          
a900: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a910: 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20  e SQLITE_PERM:  
a920: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
a930: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45 52  me = "SQLITE_PER
a940: 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  M";             
a950: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a960: 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a  se SQLITE_ABORT:
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
a980: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42  ame = "SQLITE_AB
a990: 4f 52 54 22 3b 20 20 20 20 20 20 20 20 20 20 20  ORT";           
a9a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a9b0: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
a9c0: 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a  _ROLLBACK:     z
a9d0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41  Name = "SQLITE_A
a9e0: 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20  BORT_ROLLBACK"; 
a9f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
aa00: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59  case SQLITE_BUSY
aa10: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
aa20: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
aa30: 42 55 53 59 22 3b 20 20 20 20 20 20 20 20 20 20  BUSY";          
aa40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
aa50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53   case SQLITE_BUS
aa60: 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 20 20 20  Y_RECOVERY:     
aa70: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
aa80: 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 22 3b  _BUSY_RECOVERY";
aa90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aaa0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
aab0: 53 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20 20  SY_SNAPSHOT:    
aac0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
aad0: 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 22  E_BUSY_SNAPSHOT"
aae0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
aaf0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
ab00: 4f 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20 20  OCKED:          
ab10: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ab20: 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20  TE_LOCKED";     
ab30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ab40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ab50: 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
ab60: 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  HE: zName = "SQL
ab70: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
ab80: 44 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20  DCACHE";break;. 
ab90: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
aba0: 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 20  _NOMEM:         
abb0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
abc0: 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20  LITE_NOMEM";    
abd0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
abe0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
abf0: 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20  E_READONLY:     
ac00: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ac10: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b  QLITE_READONLY";
ac20: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
ac30: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ac40: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f  TE_READONLY_RECO
ac50: 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  VERY:  zName = "
ac60: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
ac70: 52 45 43 4f 56 45 52 59 22 3b 20 62 72 65 61 6b  RECOVERY"; break
ac80: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ac90: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e  ITE_READONLY_CAN
aca0: 54 4c 4f 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20  TLOCK:  zName = 
acb0: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
acc0: 5f 43 41 4e 54 4c 4f 43 4b 22 3b 20 62 72 65 61  _CANTLOCK"; brea
acd0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ace0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f  LITE_READONLY_RO
acf0: 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d  LLBACK:  zName =
ad00: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
ad10: 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65  Y_ROLLBACK"; bre
ad20: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ad30: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44  QLITE_READONLY_D
ad40: 42 4d 4f 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20  BMOVED:   zName 
ad50: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
ad60: 4c 59 5f 44 42 4d 4f 56 45 44 22 3b 20 20 62 72  LY_DBMOVED";  br
ad70: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ad80: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
ad90: 3a 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  :          zName
ada0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52   = "SQLITE_INTER
adb0: 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 62  RUPT";         b
adc0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
add0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20   SQLITE_IOERR:  
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
adf0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
ae00: 52 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  R";             
ae10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ae20: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  e SQLITE_IOERR_R
ae30: 45 41 44 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  EAD:         zNa
ae40: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
ae50: 52 52 5f 52 45 41 44 22 3b 20 20 20 20 20 20 20  RR_READ";       
ae60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ae70: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
ae80: 53 48 4f 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e  SHORT_READ:   zN
ae90: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
aea0: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b  ERR_SHORT_READ";
aeb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
aec0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
aed0: 5f 57 52 49 54 45 3a 20 20 20 20 20 20 20 20 7a  _WRITE:        z
aee0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
aef0: 4f 45 52 52 5f 57 52 49 54 45 22 3b 20 20 20 20  OERR_WRITE";    
af00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
af10: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
af20: 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 20 20 20  R_FSYNC:        
af30: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
af40: 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20 20 20  IOERR_FSYNC";   
af50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
af60: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
af70: 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20 20  RR_DIR_FSYNC:   
af80: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
af90: 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
afa0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
afb0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
afc0: 45 52 52 5f 54 52 55 4e 43 41 54 45 3a 20 20 20  ERR_TRUNCATE:   
afd0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
afe0: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
aff0: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
b000: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b010: 4f 45 52 52 5f 46 53 54 41 54 3a 20 20 20 20 20  OERR_FSTAT:     
b020: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b030: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 22 3b  TE_IOERR_FSTAT";
b040: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b050: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b060: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20  IOERR_UNLOCK:   
b070: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b080: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
b090: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
b0a0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b0b0: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20  _IOERR_RDLOCK:  
b0c0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b0d0: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
b0e0: 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K";      break;.
b0f0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b100: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20  E_IOERR_DELETE: 
b110: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b120: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
b130: 54 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  TE";      break;
b140: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b150: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20  TE_IOERR_NOMEM: 
b160: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b170: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
b180: 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  EM";       break
b190: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b1a0: 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
b1b0: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
b1c0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43  "SQLITE_IOERR_AC
b1d0: 43 45 53 53 22 3b 20 20 20 20 20 20 62 72 65 61  CESS";      brea
b1e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b1f0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
b200: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20  RESERVEDLOCK:.  
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
b230: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b240: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
b250: 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20  DLOCK"; break;. 
b260: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b270: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20  _IOERR_LOCK:    
b280: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b290: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22  LITE_IOERR_LOCK"
b2a0: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
b2b0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b2c0: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20  E_IOERR_CLOSE:  
b2d0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b2e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
b2f0: 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  E";       break;
b300: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b310: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f  TE_IOERR_DIR_CLO
b320: 53 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  SE:    zName = "
b330: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
b340: 5f 43 4c 4f 53 45 22 3b 20 20 20 62 72 65 61 6b  _CLOSE";   break
b350: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b360: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
b370: 4e 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  N:      zName = 
b380: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
b390: 4d 4f 50 45 4e 22 3b 20 20 20 20 20 62 72 65 61  MOPEN";     brea
b3a0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b3b0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
b3c0: 5a 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ZE:      zName =
b3d0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
b3e0: 48 4d 53 49 5a 45 22 3b 20 20 20 20 20 62 72 65  HMSIZE";     bre
b3f0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b400: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c  QLITE_IOERR_SHML
b410: 4f 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  OCK:      zName 
b420: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b430: 53 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72  SHMLOCK";     br
b440: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b450: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b460: 4d 41 50 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  MAP:       zName
b470: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b480: 5f 53 48 4d 4d 41 50 22 3b 20 20 20 20 20 20 62  _SHMMAP";      b
b490: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b4a0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45   SQLITE_IOERR_SE
b4b0: 45 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  EK:         zNam
b4c0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b4d0: 52 5f 53 45 45 4b 22 3b 20 20 20 20 20 20 20 20  R_SEEK";        
b4e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b4f0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
b500: 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61  ELETE_NOENT: zNa
b510: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b520: 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22  RR_DELETE_NOENT"
b530: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
b540: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b550: 4d 4d 41 50 3a 20 20 20 20 20 20 20 20 20 7a 4e  MMAP:         zN
b560: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b570: 45 52 52 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20  ERR_MMAP";      
b580: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b590: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b5a0: 5f 47 45 54 54 45 4d 50 50 41 54 48 3a 20 20 7a  _GETTEMPPATH:  z
b5b0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b5c0: 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
b5d0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
b5e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b5f0: 52 5f 43 4f 4e 56 50 41 54 48 3a 20 20 20 20 20  R_CONVPATH:     
b600: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b610: 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 22 3b  IOERR_CONVPATH";
b620: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b630: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52   case SQLITE_COR
b640: 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 20  RUPT:           
b650: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b660: 5f 43 4f 52 52 55 50 54 22 3b 20 20 20 20 20 20  _CORRUPT";      
b670: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b680: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
b690: 52 52 55 50 54 5f 56 54 41 42 3a 20 20 20 20 20  RRUPT_VTAB:     
b6a0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b6b0: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 22 3b  E_CORRUPT_VTAB";
b6c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b6d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
b6e0: 4f 54 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20  OTFOUND:        
b6f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b700: 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20  TE_NOTFOUND";   
b710: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b720: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b730: 46 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20  FULL:           
b740: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b750: 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20  ITE_FULL";      
b760: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b770: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b780: 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20  _CANTOPEN:      
b790: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b7a0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20  LITE_CANTOPEN"; 
b7b0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b7c0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b7d0: 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d  E_CANTOPEN_NOTEM
b7e0: 50 44 49 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  PDIR: zName = "S
b7f0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e  QLITE_CANTOPEN_N
b800: 4f 54 45 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b  OTEMPDIR";break;
b810: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b820: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
b830: 52 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  R:     zName = "
b840: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
b850: 49 53 44 49 52 22 3b 20 20 20 20 62 72 65 61 6b  ISDIR";    break
b860: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b870: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
b880: 4c 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20  LPATH:  zName = 
b890: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
b8a0: 5f 46 55 4c 4c 50 41 54 48 22 3b 20 62 72 65 61  _FULLPATH"; brea
b8b0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b8c0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f  LITE_CANTOPEN_CO
b8d0: 4e 56 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d  NVPATH:  zName =
b8e0: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
b8f0: 4e 5f 43 4f 4e 56 50 41 54 48 22 3b 20 62 72 65  N_CONVPATH"; bre
b900: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b910: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20  QLITE_PROTOCOL: 
b920: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b930: 3d 20 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  = "SQLITE_PROTOC
b940: 4f 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  OL";          br
b950: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b960: 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20  SQLITE_EMPTY:   
b970: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b980: 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59   = "SQLITE_EMPTY
b990: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
b9a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b9b0: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20   SQLITE_SCHEMA: 
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b9d0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45  e = "SQLITE_SCHE
b9e0: 4d 41 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  MA";            
b9f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ba00: 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a  e SQLITE_TOOBIG:
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
ba20: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f  me = "SQLITE_TOO
ba30: 42 49 47 22 3b 20 20 20 20 20 20 20 20 20 20 20  BIG";           
ba40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ba50: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
ba60: 41 49 4e 54 3a 20 20 20 20 20 20 20 20 20 7a 4e  AINT:         zN
ba70: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
ba80: 4e 53 54 52 41 49 4e 54 22 3b 20 20 20 20 20 20  NSTRAINT";      
ba90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
baa0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
bab0: 52 41 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a  RAINT_UNIQUE:  z
bac0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
bad0: 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
bae0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
baf0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
bb00: 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 3a 20  TRAINT_TRIGGER: 
bb10: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bb20: 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
bb30: 45 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  ER";break;.     
bb40: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
bb50: 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
bb60: 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY:.            
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb80: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bb90: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
bba0: 4f 52 45 49 47 4e 4b 45 59 22 3b 20 20 20 62 72  OREIGNKEY";   br
bbb0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bbc0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
bbd0: 54 5f 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65  T_CHECK:   zName
bbe0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
bbf0: 52 41 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62  RAINT_CHECK";  b
bc00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bc10: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
bc20: 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20  NT_PRIMARYKEY:. 
bc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
bc50: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
bc60: 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
bc70: 59 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a  YKEY";   break;.
bc80: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bc90: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54  E_CONSTRAINT_NOT
bca0: 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  NULL: zName = "S
bcb0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
bcc0: 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b  _NOTNULL";break;
bcd0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bce0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f  TE_CONSTRAINT_CO
bcf0: 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20  MMITHOOK:.      
bd00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd10: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bd20: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
bd30: 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22  AINT_COMMITHOOK"
bd40: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
bd50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
bd60: 53 54 52 41 49 4e 54 5f 56 54 41 42 3a 20 20 20  STRAINT_VTAB:   
bd70: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bd80: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42  _CONSTRAINT_VTAB
bd90: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
bda0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
bdb0: 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f  NSTRAINT_FUNCTIO
bdc0: 4e 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  N:.             
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bde0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bdf0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55  TE_CONSTRAINT_FU
be00: 4e 43 54 49 4f 4e 22 3b 20 20 20 20 20 62 72 65  NCTION";     bre
be10: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
be20: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
be30: 5f 52 4f 57 49 44 3a 20 20 20 7a 4e 61 6d 65 20  _ROWID:   zName 
be40: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
be50: 41 49 4e 54 5f 52 4f 57 49 44 22 3b 20 20 62 72  AINT_ROWID";  br
be60: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
be70: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a  SQLITE_MISMATCH:
be80: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
be90: 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41   = "SQLITE_MISMA
bea0: 54 43 48 22 3b 20 20 20 20 20 20 20 20 20 20 62  TCH";          b
beb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bec0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20   SQLITE_MISUSE: 
bed0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
bee0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 55  e = "SQLITE_MISU
bef0: 53 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  SE";            
bf00: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bf10: 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20  e SQLITE_NOLFS: 
bf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
bf30: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c  me = "SQLITE_NOL
bf40: 46 53 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  FS";            
bf50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bf60: 73 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20  se SQLITE_AUTH: 
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
bf80: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55  ame = "SQLITE_AU
bf90: 54 48 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  TH";            
bfa0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bfb0: 61 73 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41  ase SQLITE_FORMA
bfc0: 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  T:             z
bfd0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
bfe0: 4f 52 4d 41 54 22 3b 20 20 20 20 20 20 20 20 20  ORMAT";         
bff0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c000: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47  case SQLITE_RANG
c010: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E:              
c020: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c030: 52 41 4e 47 45 22 3b 20 20 20 20 20 20 20 20 20  RANGE";         
c040: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c050: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
c060: 41 44 42 3a 20 20 20 20 20 20 20 20 20 20 20 20  ADB:            
c070: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c080: 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20 20 20 20  _NOTADB";       
c090: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c0a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f    case SQLITE_RO
c0b0: 57 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W:              
c0c0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c0d0: 45 5f 52 4f 57 22 3b 20 20 20 20 20 20 20 20 20  E_ROW";         
c0e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c0f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
c100: 4f 54 49 43 45 3a 20 20 20 20 20 20 20 20 20 20  OTICE:          
c110: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c120: 54 45 5f 4e 4f 54 49 43 45 22 3b 20 20 20 20 20  TE_NOTICE";     
c130: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c140: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c150: 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57  NOTICE_RECOVER_W
c160: 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  AL: zName = "SQL
c170: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
c180: 45 52 5f 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20  ER_WAL";break;. 
c190: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c1a0: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
c1b0: 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20  ROLLBACK:.      
c1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1d0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
c1e0: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  = "SQLITE_NOTICE
c1f0: 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43  _RECOVER_ROLLBAC
c200: 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K"; break;.     
c210: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52   case SQLITE_WAR
c220: 4e 49 4e 47 3a 20 20 20 20 20 20 20 20 20 20 20  NING:           
c230: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c240: 5f 57 41 52 4e 49 4e 47 22 3b 20 20 20 20 20 20  _WARNING";      
c250: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c260: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41    case SQLITE_WA
c270: 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a  RNING_AUTOINDEX:
c280: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c290: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
c2a0: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
c2b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
c2c0: 4f 4e 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  ONE:            
c2d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c2e0: 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20  TE_DONE";       
c2f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c300: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e    }.  }.  if( zN
c310: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  ame==0 ){.    st
c320: 61 74 69 63 20 63 68 61 72 20 7a 42 75 66 5b 35  atic char zBuf[5
c330: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
c340: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
c350: 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 53 51  zBuf), zBuf, "SQ
c360: 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29  LITE_UNKNOWN(%d)
c370: 22 2c 20 6f 72 69 67 52 63 29 3b 0a 20 20 20 20  ", origRc);.    
c380: 7a 4e 61 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20  zName = zBuf;.  
c390: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
c3a0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
c3b0: 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69  * Return a stati
c3c0: 63 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  c string that de
c3d0: 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64  scribes the kind
c3e0: 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66   of error specif
c3f0: 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ied in the.** ar
c400: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74  gument..*/.const
c410: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72   char *sqlite3Er
c420: 72 53 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20  rStr(int rc){.  
c430: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
c440: 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20  r* const aMsg[] 
c450: 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  = {.    /* SQLIT
c460: 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f  E_OK          */
c470: 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c   "not an error",
c480: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45  .    /* SQLITE_E
c490: 52 52 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53  RROR       */ "S
c4a0: 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f  QL logic error o
c4b0: 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61  r missing databa
c4c0: 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  se",.    /* SQLI
c4d0: 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a  TE_INTERNAL    *
c4e0: 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  / 0,.    /* SQLI
c4f0: 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a  TE_PERM        *
c500: 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d 69 73  / "access permis
c510: 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20  sion denied",.  
c520: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52    /* SQLITE_ABOR
c530: 54 20 20 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c  T       */ "call
c540: 62 61 63 6b 20 72 65 71 75 65 73 74 65 64 20 71  back requested q
c550: 75 65 72 79 20 61 62 6f 72 74 22 2c 0a 20 20 20  uery abort",.   
c560: 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20   /* SQLITE_BUSY 
c570: 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62         */ "datab
c580: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ase is locked",.
c590: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f      /* SQLITE_LO
c5a0: 43 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61  CKED      */ "da
c5b0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
c5c0: 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20  locked",.    /* 
c5d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20  SQLITE_NOMEM    
c5e0: 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65     */ "out of me
c5f0: 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51  mory",.    /* SQ
c600: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20  LITE_READONLY   
c610: 20 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20   */ "attempt to 
c620: 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79  write a readonly
c630: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
c640: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  /* SQLITE_INTERR
c650: 55 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72  UPT   */ "interr
c660: 75 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  upted",.    /* S
c670: 51 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20  QLITE_IOERR     
c680: 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65    */ "disk I/O e
c690: 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rror",.    /* SQ
c6a0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20  LITE_CORRUPT    
c6b0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64 69   */ "database di
c6c0: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
c6d0: 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ormed",.    /* S
c6e0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20  QLITE_NOTFOUND  
c6f0: 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70    */ "unknown op
c700: 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a  eration",.    /*
c710: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20   SQLITE_FULL    
c720: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
c730: 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c   or disk is full
c740: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c750: 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20  _CANTOPEN    */ 
c760: 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
c770: 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a  database file",.
c780: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52      /* SQLITE_PR
c790: 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f  OTOCOL    */ "lo
c7a0: 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c  cking protocol",
c7b0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45  .    /* SQLITE_E
c7c0: 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20 22 74  MPTY       */ "t
c7d0: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  able contains no
c7e0: 20 64 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53   data",.    /* S
c7f0: 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20  QLITE_SCHEMA    
c800: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73    */ "database s
c810: 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65  chema has change
c820: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
c830: 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f  E_TOOBIG      */
c840: 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62   "string or blob
c850: 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f   too big",.    /
c860: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  * SQLITE_CONSTRA
c870: 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61  INT  */ "constra
c880: 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20  int failed",.   
c890: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41   /* SQLITE_MISMA
c8a0: 54 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74  TCH    */ "datat
c8b0: 79 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20  ype mismatch",. 
c8c0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53     /* SQLITE_MIS
c8d0: 55 53 45 20 20 20 20 20 20 2a 2f 20 22 6c 69 62  USE      */ "lib
c8e0: 72 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c  rary routine cal
c8f0: 6c 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65  led out of seque
c900: 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  nce",.    /* SQL
c910: 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20  ITE_NOLFS       
c920: 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73  */ "large file s
c930: 75 70 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c  upport is disabl
c940: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c950: 54 45 5f 41 55 54 48 20 20 20 20 20 20 20 20 2a  TE_AUTH        *
c960: 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  / "authorization
c970: 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a   denied",.    /*
c980: 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20   SQLITE_FORMAT  
c990: 20 20 20 20 2a 2f 20 22 61 75 78 69 6c 69 61 72      */ "auxiliar
c9a0: 79 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61  y database forma
c9b0: 74 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a  t error",.    /*
c9c0: 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20 20 20   SQLITE_RANGE   
c9d0: 20 20 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20      */ "bind or 
c9e0: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74  column index out
c9f0: 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20   of range",.    
ca00: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  /* SQLITE_NOTADB
ca10: 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69        */ "file i
ca20: 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69  s encrypted or i
ca30: 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65  s not a database
ca40: 22 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20  ",.  };.  const 
ca50: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e  char *zErr = "un
ca60: 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20  known error";.  
ca70: 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20  switch( rc ){.  
ca80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
ca90: 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a  ORT_ROLLBACK: {.
caa0: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 61 62        zErr = "ab
cab0: 6f 72 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42  ort due to ROLLB
cac0: 41 43 4b 22 3b 0a 20 20 20 20 20 20 62 72 65 61  ACK";.      brea
cad0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
cae0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63  ault: {.      rc
caf0: 20 26 3d 20 30 78 66 66 3b 0a 20 20 20 20 20 20   &= 0xff;.      
cb00: 69 66 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30  if( ALWAYS(rc>=0
cb10: 29 20 26 26 20 72 63 3c 41 72 72 61 79 53 69 7a  ) && rc<ArraySiz
cb20: 65 28 61 4d 73 67 29 20 26 26 20 61 4d 73 67 5b  e(aMsg) && aMsg[
cb30: 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  rc]!=0 ){.      
cb40: 20 20 7a 45 72 72 20 3d 20 61 4d 73 67 5b 72 63    zErr = aMsg[rc
cb50: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
cb60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
cb70: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72 3b  }.  return zErr;
cb80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
cb90: 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
cba0: 73 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63  s a busy callbac
cbb0: 6b 20 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e  k that sleeps an
cbc0: 64 20 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e  d tries.** again
cbd0: 20 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74   until a timeout
cbe0: 20 76 61 6c 75 65 20 69 73 20 72 65 61 63 68 65   value is reache
cbf0: 64 2e 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20  d.  The timeout 
cc00: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69  value is.** an i
cc10: 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
cc20: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61   milliseconds pa
cc30: 73 73 65 64 20 69 6e 20 61 73 20 74 68 65 20 66  ssed in as the f
cc40: 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  irst.** argument
cc50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cc60: 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73  sqliteDefaultBus
cc70: 79 43 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64  yCallback(. void
cc80: 20 2a 70 74 72 2c 20 20 20 20 20 20 20 20 20 20   *ptr,          
cc90: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
cca0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
ccb0: 69 6e 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20  int count       
ccc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ccd0: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c  er of times tabl
cce0: 65 20 68 61 73 20 62 65 65 6e 20 62 75 73 79 20  e has been busy 
ccf0: 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  */.){.#if SQLITE
cd00: 5f 4f 53 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f  _OS_WIN || HAVE_
cd10: 55 53 4c 45 45 50 0a 20 20 73 74 61 74 69 63 20  USLEEP.  static 
cd20: 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b  const u8 delays[
cd30: 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c  ] =.     { 1, 2,
cd40: 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20   5, 10, 15, 20, 
cd50: 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30  25, 25,  25,  50
cd60: 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20  ,  50, 100 };.  
cd70: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
cd80: 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20  totals[] =.     
cd90: 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31  { 0, 1, 3,  8, 1
cda0: 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31  8, 33, 53, 78, 1
cdb0: 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32  03, 128, 178, 22
cdc0: 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44  8 };.# define ND
cdd0: 45 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28 64  ELAY ArraySize(d
cde0: 65 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33  elays).  sqlite3
cdf0: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
ce00: 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d  *)ptr;.  int tim
ce10: 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54  eout = db->busyT
ce20: 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65  imeout;.  int de
ce30: 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61  lay, prior;..  a
ce40: 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20  ssert( count>=0 
ce50: 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c  );.  if( count <
ce60: 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64   NDELAY ){.    d
ce70: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f  elay = delays[co
ce80: 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20  unt];.    prior 
ce90: 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b  = totals[count];
cea0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65  .  }else{.    de
ceb0: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45  lay = delays[NDE
cec0: 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f  LAY-1];.    prio
ced0: 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41  r = totals[NDELA
cee0: 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f  Y-1] + delay*(co
cef0: 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b  unt-(NDELAY-1));
cf00: 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72  .  }.  if( prior
cf10: 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f   + delay > timeo
cf20: 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20  ut ){.    delay 
cf30: 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f  = timeout - prio
cf40: 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79  r;.    if( delay
cf50: 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  <=0 ) return 0;.
cf60: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
cf70: 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64  leep(db->pVfs, d
cf80: 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65  elay*1000);.  re
cf90: 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20  turn 1;.#else.  
cfa0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73  sqlite3 *db = (s
cfb0: 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20  qlite3 *)ptr;.  
cfc0: 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28  int timeout = ((
cfd0: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e  sqlite3 *)ptr)->
cfe0: 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69  busyTimeout;.  i
cff0: 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30  f( (count+1)*100
d000: 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20  0 > timeout ){. 
d010: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
d020: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
d030: 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30  p(db->pVfs, 1000
d040: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
d050: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
d060: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
d070: 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e  en busy handler.
d080: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
d090: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
d0a0: 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  en an operation 
d0b0: 66 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f  failed with a lo
d0c0: 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72  ck..** If this r
d0d0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e  outine returns n
d0e0: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
d0f0: 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49  k is retried.  I
d100: 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20  f it.** returns 
d110: 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  0, the operation
d120: 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20   aborts with an 
d130: 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
d140: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
d150: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
d160: 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  er(BusyHandler *
d170: 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
d180: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
d190: 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c  || p->xFunc==0 |
d1a0: 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72  | p->nBusy<0 ) r
d1b0: 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20  eturn 0;.  rc = 
d1c0: 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67  p->xFunc(p->pArg
d1d0: 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69  , p->nBusy);.  i
d1e0: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
d1f0: 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20  p->nBusy = -1;. 
d200: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e   }else{.    p->n
d210: 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  Busy++;.  }.  re
d220: 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a  turn rc; .}../*.
d230: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d240: 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61  sets the busy ca
d250: 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71  llback for an Sq
d260: 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f  lite database to
d270: 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61   the.** given ca
d280: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
d290: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61  with the given a
d2a0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
d2b0: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
d2c0: 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20  dler(.  sqlite3 
d2d0: 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75  *db,.  int (*xBu
d2e0: 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a  sy)(void*,int),.
d2f0: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
d300: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d310: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
d320: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
d330: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
d340: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
d350: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
d360: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
d370: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
d380: 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  ex);.  db->busyH
d390: 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78  andler.xFunc = x
d3a0: 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79  Busy;.  db->busy
d3b0: 48 61 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70  Handler.pArg = p
d3c0: 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  Arg;.  db->busyH
d3d0: 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
d3e0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65  ;.  db->busyTime
d3f0: 6f 75 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  out = 0;.  sqlit
d400: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
d410: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
d420: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d430: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d440: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
d450: 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68  ALLBACK./*.** Th
d460: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
d470: 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  the progress cal
d480: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
d490: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
d4a0: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
d4b0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
d4c0: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
d4d0: 67 75 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67  gument. The prog
d4e0: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69  ress callback wi
d4f0: 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ll.** be invoked
d500: 20 65 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f   every nOps opco
d510: 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  des..*/.void sql
d520: 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61  ite3_progress_ha
d530: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ndler(.  sqlite3
d540: 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70   *db, .  int nOp
d550: 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67  s,.  int (*xProg
d560: 72 65 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20  ress)(void*), . 
d570: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23   void *pArg.){.#
d580: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d590: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
d5a0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
d5b0: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
d5c0: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
d5d0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
d5e0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
d5f0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
d600: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
d610: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f  mutex);.  if( nO
d620: 70 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  ps>0 ){.    db->
d630: 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f  xProgress = xPro
d640: 67 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e  gress;.    db->n
d650: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 28 75  ProgressOps = (u
d660: 6e 73 69 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20  nsigned)nOps;.  
d670: 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41    db->pProgressA
d680: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c  rg = pArg;.  }el
d690: 73 65 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f  se{.    db->xPro
d6a0: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 64  gress = 0;.    d
d6b0: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
d6c0: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72  = 0;.    db->pPr
d6d0: 6f 67 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20  ogressArg = 0;. 
d6e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
d6f0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
d700: 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ex);.}.#endif...
d710: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
d720: 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65  ne installs a de
d730: 66 61 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c  fault busy handl
d740: 65 72 20 74 68 61 74 20 77 61 69 74 73 20 66 6f  er that waits fo
d750: 72 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  r the.** specifi
d760: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  ed number of mil
d770: 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65  liseconds before
d780: 20 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f   returning 0..*/
d790: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73  .int sqlite3_bus
d7a0: 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65  y_timeout(sqlite
d7b0: 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a  3 *db, int ms){.
d7c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d7d0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
d7e0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
d7f0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
d800: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
d810: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
d820: 69 66 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b  if.  if( ms>0 ){
d830: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
d840: 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71  y_handler(db, sq
d850: 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43  liteDefaultBusyC
d860: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29  allback, (void*)
d870: 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73  db);.    db->bus
d880: 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20  yTimeout = ms;. 
d890: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
d8a0: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
d8b0: 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  (db, 0, 0);.  }.
d8c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d8d0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75  OK;.}../*.** Cau
d8e0: 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f  se any pending o
d8f0: 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70  peration to stop
d900: 20 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74   at its earliest
d910: 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f   opportunity..*/
d920: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e  .void sqlite3_in
d930: 74 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20  terrupt(sqlite3 
d940: 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *db){.#ifdef SQL
d950: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
d960: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
d970: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
d980: 28 64 62 29 20 26 26 20 28 64 62 3d 3d 30 20 7c  (db) && (db==0 |
d990: 7c 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c  | db->magic!=SQL
d9a0: 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45  ITE_MAGIC_ZOMBIE
d9b0: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
d9c0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
d9d0: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
d9e0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e   }.#endif.  db->
d9f0: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
da00: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
da10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
da20: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
da30: 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65  e as sqlite3_cre
da40: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  ate_function(), 
da50: 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69  except.** that i
da60: 74 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  t is designed to
da70: 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e   be called by in
da80: 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65  ternal code. The
da90: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a   difference is.*
daa0: 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c  * that if a mall
dab0: 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71  oc() fails in sq
dac0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
dad0: 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f  ction(), an erro
dae0: 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74  r code.** is ret
daf0: 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61  urned and the ma
db00: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
db10: 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74  cleared. .*/.int
db20: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
db30: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nc(.  sqlite3 *d
db40: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
db50: 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a  *zFunctionName,.
db60: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
db70: 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70  t enc,.  void *p
db80: 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64  UserData,.  void
db90: 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74   (*xSFunc)(sqlit
dba0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
dbb0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
dbc0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
dbd0: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
dbe0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
dbf0: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
dc00: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
dc10: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20  te3_context*),. 
dc20: 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20   FuncDestructor 
dc30: 2a 70 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a  *pDestructor.){.
dc40: 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20    FuncDef *p;.  
dc50: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74  int nName;.  int
dc60: 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20   extraFlags;..  
dc70: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
dc80: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
dc90: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a  utex) );.  if( z
dca0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20  FunctionName==0 
dcb0: 7c 7c 0a 20 20 20 20 20 20 28 78 53 46 75 6e 63  ||.      (xSFunc
dcc0: 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78   && (xFinal || x
dcd0: 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20  Step)) || .     
dce0: 20 28 21 78 53 46 75 6e 63 20 26 26 20 28 78 46   (!xSFunc && (xF
dcf0: 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29 29  inal && !xStep))
dd00: 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 53 46 75   ||.      (!xSFu
dd10: 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26  nc && (!xFinal &
dd20: 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20  & xStep)) ||.   
dd30: 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e     (nArg<-1 || n
dd40: 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46  Arg>SQLITE_MAX_F
dd50: 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a  UNCTION_ARG) ||.
dd60: 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d        (255<(nNam
dd70: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
dd80: 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  n30( zFunctionNa
dd90: 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74  me))) ){.    ret
dda0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
ddb0: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 61  E_BKPT;.  }..  a
ddc0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
ddd0: 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c  NC_CONSTANT==SQL
dde0: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
ddf0: 43 20 29 3b 0a 20 20 65 78 74 72 61 46 6c 61 67  C );.  extraFlag
de00: 73 20 3d 20 65 6e 63 20 26 20 20 53 51 4c 49 54  s = enc &  SQLIT
de10: 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 3b  E_DETERMINISTIC;
de20: 0a 20 20 65 6e 63 20 26 3d 20 28 53 51 4c 49 54  .  enc &= (SQLIT
de30: 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53  E_FUNC_ENCMASK|S
de40: 51 4c 49 54 45 5f 41 4e 59 29 3b 0a 20 20 0a 23  QLITE_ANY);.  .#
de50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
de60: 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66  IT_UTF16.  /* If
de70: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
de80: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
de90: 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
dea0: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
deb0: 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
dec0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
ded0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
dee0: 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
def0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
df00: 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
df10: 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
df20: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
df30: 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54  **.  ** If SQLIT
df40: 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66 69  E_ANY is specifi
df50: 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76 65  ed, add three ve
df60: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75  rsions of the fu
df70: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74  nction.  ** to t
df80: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20  he hash table.. 
df90: 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53   */.  if( enc==S
dfa0: 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20  QLITE_UTF16 ){. 
dfb0: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
dfc0: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
dfd0: 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51  else if( enc==SQ
dfe0: 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20  LITE_ANY ){.    
dff0: 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  int rc;.    rc =
e000: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
e010: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
e020: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
e030: 54 45 5f 55 54 46 38 7c 65 78 74 72 61 46 6c 61  TE_UTF8|extraFla
e040: 67 73 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73  gs,.         pUs
e050: 65 72 44 61 74 61 2c 20 78 53 46 75 6e 63 2c 20  erData, xSFunc, 
e060: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70  xStep, xFinal, p
e070: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
e080: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e090: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
e0a0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
e0b0: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
e0c0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
e0d0: 54 45 5f 55 54 46 31 36 4c 45 7c 65 78 74 72 61  TE_UTF16LE|extra
e0e0: 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
e0f0: 20 70 55 73 65 72 44 61 74 61 2c 20 78 53 46 75   pUserData, xSFu
e100: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
e110: 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b  l, pDestructor);
e120: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
e130: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
e140: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
e150: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d  .    }.    enc =
e160: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b   SQLITE_UTF16BE;
e170: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63  .  }.#else.  enc
e180: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
e190: 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43  #endif.  .  /* C
e1a0: 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74  heck if an exist
e1b0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ing function is 
e1c0: 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e  being overridden
e1d0: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20   or deleted. If 
e1e0: 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  so,.  ** and the
e1f0: 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d  re are active VM
e200: 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53  s, then return S
e210: 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61  QLITE_BUSY. If a
e220: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
e230: 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64  s being overridd
e240: 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74  en/deleted but t
e250: 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69  here are no acti
e260: 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68  ve VMs, allow th
e270: 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  e.  ** operation
e280: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74   to continue but
e290: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
e2a0: 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  precompiled stat
e2b0: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70  ements..  */.  p
e2c0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
e2d0: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63  nction(db, zFunc
e2e0: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  tionName, nArg, 
e2f0: 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69  (u8)enc, 0);.  i
e300: 66 28 20 70 20 26 26 20 28 70 2d 3e 66 75 6e 63  f( p && (p->func
e310: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
e320: 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 3d 3d 65 6e  UNC_ENCMASK)==en
e330: 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41  c && p->nArg==nA
e340: 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  rg ){.    if( db
e350: 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b  ->nVdbeActive ){
e360: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
e370: 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53  rorWithMsg(db, S
e380: 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20  QLITE_BUSY, .   
e390: 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
e3a0: 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73  delete/modify us
e3b0: 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20  er-function due 
e3c0: 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  to active statem
e3d0: 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73  ents");.      as
e3e0: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
e3f0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
e400: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
e410: 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  USY;.    }else{.
e420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e430: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
e440: 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 7d  ments(db);.    }
e450: 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69  .  }..  p = sqli
e460: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
e470: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
e480: 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63  e, nArg, (u8)enc
e490: 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70  , 1);.  assert(p
e4a0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
e4b0: 69 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20  iled);.  if( !p 
e4c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
e4d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
e4e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
e4f0: 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20 6f   older version o
e500: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77  f the function w
e510: 69 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65 64  ith a configured
e520: 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 20   destructor is. 
e530: 20 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61 63   ** being replac
e540: 65 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65  ed invoke the de
e550: 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f  structor functio
e560: 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75 6e  n here. */.  fun
e570: 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c  ctionDestroy(db,
e580: 20 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65 73   p);..  if( pDes
e590: 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70  tructor ){.    p
e5a0: 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66  Destructor->nRef
e5b0: 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 75 2e 70  ++;.  }.  p->u.p
e5c0: 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44 65  Destructor = pDe
e5d0: 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66  structor;.  p->f
e5e0: 75 6e 63 46 6c 61 67 73 20 3d 20 28 70 2d 3e 66  uncFlags = (p->f
e5f0: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
e600: 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 20  E_FUNC_ENCMASK) 
e610: 7c 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 20 20  | extraFlags;.  
e620: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 75 6e  testcase( p->fun
e630: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
e640: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b  DETERMINISTIC );
e650: 0a 20 20 70 2d 3e 78 53 46 75 6e 63 20 3d 20 78  .  p->xSFunc = x
e660: 53 46 75 6e 63 20 3f 20 78 53 46 75 6e 63 20 3a  SFunc ? xSFunc :
e670: 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69   xStep;.  p->xFi
e680: 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b  nalize = xFinal;
e690: 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20  .  p->pUserData 
e6a0: 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20 70  = pUserData;.  p
e6b0: 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29 6e 41  ->nArg = (u16)nA
e6c0: 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  rg;.  return SQL
e6d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
e6e0: 20 43 72 65 61 74 65 20 6e 65 77 20 75 73 65 72   Create new user
e6f0: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69   functions..*/.i
e700: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
e710: 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  e_function(.  sq
e720: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
e730: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a  st char *zFunc,.
e740: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
e750: 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70  t enc,.  void *p
e760: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e  ,.  void (*xSFun
e770: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
e780: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
e790: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
e7a0: 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74  d (*xStep)(sqlit
e7b0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
e7c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
e7d0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
e7e0: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
e7f0: 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72  ext*).){.  retur
e800: 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  n sqlite3_create
e810: 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c  _function_v2(db,
e820: 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e   zFunc, nArg, en
e830: 63 2c 20 70 2c 20 78 53 46 75 6e 63 2c 20 78 53  c, p, xSFunc, xS
e840: 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tep,.           
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e860: 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c           xFinal,
e870: 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69   0);.}..int sqli
e880: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
e890: 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
e8a0: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
e8b0: 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e  har *zFunc,.  in
e8c0: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
e8d0: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
e8e0: 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73  void (*xSFunc)(s
e8f0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
e900: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
e910: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
e920: 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63  xStep)(sqlite3_c
e930: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
e940: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
e950: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
e960: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
e970: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73  ),.  void (*xDes
e980: 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b  troy)(void *).){
e990: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e9a0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63  TE_ERROR;.  Func
e9b0: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67  Destructor *pArg
e9c0: 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51   = 0;..#ifdef SQ
e9d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
e9e0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
e9f0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
ea00: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
ea10: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
ea20: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
ea30: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
ea40: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
ea50: 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65 73 74  ex);.  if( xDest
ea60: 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72 67 20  roy ){.    pArg 
ea70: 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f  = (FuncDestructo
ea80: 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  r *)sqlite3DbMal
ea90: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
eaa0: 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f  of(FuncDestructo
eab0: 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 41  r));.    if( !pA
eac0: 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44 65 73  rg ){.      xDes
ead0: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20 20 67  troy(p);.      g
eae0: 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  oto out;.    }. 
eaf0: 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74 72 6f     pArg->xDestro
eb00: 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a 20 20  y = xDestroy;.  
eb10: 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44 61 74    pArg->pUserDat
eb20: 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 63 20  a = p;.  }.  rc 
eb30: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
eb40: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e  unc(db, zFunc, n
eb50: 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 53 46  Arg, enc, p, xSF
eb60: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
eb70: 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66 28  al, pArg);.  if(
eb80: 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6e   pArg && pArg->n
eb90: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Ref==0 ){.    as
eba0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
ebb0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73 74  _OK );.    xDest
ebc0: 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  roy(p);.    sqli
ebd0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 41  te3DbFree(db, pA
ebe0: 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a  rg);.  }.. out:.
ebf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
ec00: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
ec10: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
ec20: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
ec30: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ec40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ec50: 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73  OMIT_UTF16.int s
ec60: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
ec70: 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69  nction16(.  sqli
ec80: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
ec90: 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e   void *zFunction
eca0: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
ecb0: 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70  ,.  int eTextRep
ecc0: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
ecd0: 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71  oid (*xSFunc)(sq
ece0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
ecf0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
ed00: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
ed10: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
ed20: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
ed30: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
ed40: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
ed50: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
ed60: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
ed70: 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69 66  ar *zFunc8;..#if
ed80: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ed90: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
eda0: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
edb0: 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a  CheckOk(db) || z
edc0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20  FunctionName==0 
edd0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ede0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
edf0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
ee00: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
ee10: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
ee20: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
ee30: 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20  d );.  zFunc8 = 
ee40: 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28  sqlite3Utf16to8(
ee50: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
ee60: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
ee70: 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63  F16NATIVE);.  rc
ee80: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
ee90: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c  Func(db, zFunc8,
eea0: 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c   nArg, eTextRep,
eeb0: 20 70 2c 20 78 53 46 75 6e 63 2c 78 53 74 65 70   p, xSFunc,xStep
eec0: 2c 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71  ,xFinal,0);.  sq
eed0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
eee0: 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20  zFunc8);.  rc = 
eef0: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
ef00: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
ef10: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
ef20: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
ef30: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
ef40: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20  ../*.** Declare 
ef50: 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  that a function 
ef60: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61  has been overloa
ef70: 64 65 64 20 62 79 20 61 20 76 69 72 74 75 61 6c  ded by a virtual
ef80: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
ef90: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c   the function al
efa0: 72 65 61 64 79 20 65 78 69 73 74 73 20 61 73 20  ready exists as 
efb0: 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c  a regular global
efc0: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a   function, then.
efd0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
efe0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20  is a no-op.  If 
eff0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
f000: 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
f010: 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65  n create.** a ne
f020: 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77 61 79  w one that alway
f030: 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e 2d 74  s throws a run-t
f040: 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a  ime error.  .**.
f050: 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61 6c 20  ** When virtual 
f060: 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f  tables intend to
f070: 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76 65 72   provide an over
f080: 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c  loaded function,
f090: 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20   they.** should 
f0a0: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
f0b0: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
f0c0: 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  he global functi
f0d0: 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20  on exists..** A 
f0e0: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20  global function 
f0f0: 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20 6f 72  must exist in or
f100: 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72 65 73  der for name res
f110: 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a  olution to work.
f120: 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a  ** properly..*/.
f130: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76 65 72  int sqlite3_over
f140: 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  load_function(. 
f150: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
f160: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
f170: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b  e,.  int nArg.){
f180: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
f190: 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53  TE_OK;..#ifdef S
f1a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
f1b0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
f1c0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
f1d0: 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d  Ok(db) || zName=
f1e0: 3d 30 20 7c 7c 20 6e 41 72 67 3c 2d 32 20 29 7b  =0 || nArg<-2 ){
f1f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f200: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
f210: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
f220: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
f230: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
f240: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75  f( sqlite3FindFu
f250: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  nction(db, zName
f260: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
f270: 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20  TF8, 0)==0 ){.  
f280: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
f290: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 4e 61  eateFunc(db, zNa
f2a0: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
f2b0: 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20  _UTF8,.         
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2d0: 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e 76 61    0, sqlite3Inva
f2e0: 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  lidFunction, 0, 
f2f0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20  0, 0);.  }.  rc 
f300: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
f310: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
f320: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f330: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
f340: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
f350: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f360: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69  TRACE./*.** Regi
f370: 73 74 65 72 20 61 20 74 72 61 63 65 20 66 75 6e  ster a trace fun
f380: 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67  ction.  The pArg
f390: 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
f3a0: 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  usly registered 
f3b0: 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65 74 75  trace.** is retu
f3c0: 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20  rned.  .**.** A 
f3d0: 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e 63 74  NULL trace funct
f3e0: 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ion means that n
f3f0: 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65 78 65  o tracing is exe
f400: 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55  cutes.  A non-NU
f410: 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73 20 61  LL.** trace is a
f420: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
f430: 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69  nction that is i
f440: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 73 74  nvoked at the st
f450: 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 53  art of each.** S
f460: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  QL statement..*/
f470: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f480: 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
f490: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 74 72  void *sqlite3_tr
f4a0: 61 63 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ace(sqlite3 *db,
f4b0: 20 76 6f 69 64 28 2a 78 54 72 61 63 65 29 28 76   void(*xTrace)(v
f4c0: 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
f4d0: 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  ), void *pArg){.
f4e0: 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23    void *pOld;..#
f4f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f500: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
f510: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
f520: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
f530: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
f540: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
f550: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f560: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
f570: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
f580: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64  ->mutex);.  pOld
f590: 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67   = db->pTraceArg
f5a0: 3b 0a 20 20 64 62 2d 3e 6d 54 72 61 63 65 20 3d  ;.  db->mTrace =
f5b0: 20 78 54 72 61 63 65 20 3f 20 53 51 4c 49 54 45   xTrace ? SQLITE
f5c0: 5f 54 52 41 43 45 5f 4c 45 47 41 43 59 20 3a 20  _TRACE_LEGACY : 
f5d0: 30 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20  0;.  db->xTrace 
f5e0: 3d 20 28 69 6e 74 28 2a 29 28 75 33 32 2c 76 6f  = (int(*)(u32,vo
f5f0: 69 64 2a 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 29  id*,void*,void*)
f600: 29 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70  )xTrace;.  db->p
f610: 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b  TraceArg = pArg;
f620: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f630: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
f640: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
f650: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
f660: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
f670: 41 54 45 44 20 2a 2f 0a 0a 2f 2a 20 52 65 67 69  ATED */../* Regi
f680: 73 74 65 72 20 61 20 74 72 61 63 65 20 63 61 6c  ster a trace cal
f690: 6c 62 61 63 6b 20 75 73 69 6e 67 20 74 68 65 20  lback using the 
f6a0: 76 65 72 73 69 6f 6e 2d 32 20 69 6e 74 65 72 66  version-2 interf
f6b0: 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ace..*/.int sqli
f6c0: 74 65 33 5f 74 72 61 63 65 5f 76 32 28 0a 20 20  te3_trace_v2(.  
f6d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
f700: 61 63 65 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  ace this connect
f710: 69 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ion */.  unsigne
f720: 64 20 6d 54 72 61 63 65 2c 20 20 20 20 20 20 20  d mTrace,       
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f740: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
f750: 76 65 6e 74 73 20 74 6f 20 62 65 20 74 72 61 63  vents to be trac
f760: 65 64 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 54 72  ed */.  int(*xTr
f770: 61 63 65 29 28 75 6e 73 69 67 6e 65 64 2c 76 6f  ace)(unsigned,vo
f780: 69 64 2a 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 29  id*,void*,void*)
f790: 2c 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 74  ,  /* Callback t
f7a0: 6f 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20 76 6f  o invoke */.  vo
f7b0: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74           /* Cont
f7e0: 65 78 74 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66  ext */.){.#ifdef
f7f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
f800: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
f810: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
f820: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
f830: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
f840: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
f850: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
f860: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
f870: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6d 54  mutex);.  if( mT
f880: 72 61 63 65 3d 3d 30 20 29 20 78 54 72 61 63 65  race==0 ) xTrace
f890: 20 3d 20 30 3b 0a 20 20 69 66 28 20 78 54 72 61   = 0;.  if( xTra
f8a0: 63 65 3d 3d 30 20 29 20 6d 54 72 61 63 65 20 3d  ce==0 ) mTrace =
f8b0: 20 30 3b 0a 20 20 64 62 2d 3e 6d 54 72 61 63 65   0;.  db->mTrace
f8c0: 20 3d 20 6d 54 72 61 63 65 3b 0a 20 20 64 62 2d   = mTrace;.  db-
f8d0: 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63 65  >xTrace = xTrace
f8e0: 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72  ;.  db->pTraceAr
f8f0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
f900: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f910: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
f920: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f930: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
f940: 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
f950: 44 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  D./*.** Register
f960: 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74   a profile funct
f970: 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66  ion.  The pArg f
f980: 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
f990: 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 0a 2a  ly registered .*
f9a0: 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  * profile functi
f9b0: 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  on is returned. 
f9c0: 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70   .**.** A NULL p
f9d0: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20  rofile function 
f9e0: 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 70 72  means that no pr
f9f0: 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65 63 75  ofiling is execu
fa00: 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c  tes.  A non-NULL
fa10: 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73 20 61  .** profile is a
fa20: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
fa30: 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69  nction that is i
fa40: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
fa50: 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65  nclusion of.** e
fa60: 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ach SQL statemen
fa70: 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a  t that is run..*
fa80: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
fa90: 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69 74  profile(.  sqlit
faa0: 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28  e3 *db,.  void (
fab0: 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a  *xProfile)(void*
fac0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c  ,const char*,sql
fad0: 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76  ite_uint64),.  v
fae0: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76  oid *pArg.){.  v
faf0: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64  oid *pOld;..#ifd
fb00: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
fb10: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
fb20: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
fb30: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
fb40: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
fb50: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
fb60: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
fb70: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
fb80: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
fb90: 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  utex);.  pOld = 
fba0: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 3b  db->pProfileArg;
fbb0: 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20  .  db->xProfile 
fbc0: 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64 62  = xProfile;.  db
fbd0: 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20 3d 20  ->pProfileArg = 
fbe0: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
fbf0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
fc00: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
fc10: 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20   pOld;.}.#endif 
fc20: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
fc30: 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 23 65 6e  EPRECATED */.#en
fc40: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
fc50: 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a  IT_TRACE */../*.
fc60: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 66 75  ** Register a fu
fc70: 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76  nction to be inv
fc80: 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e  oked when a tran
fc90: 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e  saction commits.
fca0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b  .** If the invok
fcb0: 65 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ed function retu
fcc0: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
fcd0: 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65  en the commit be
fce0: 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62  comes a.** rollb
fcf0: 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ack..*/.void *sq
fd00: 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f  lite3_commit_hoo
fd10: 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
fd20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
fd30: 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
fd40: 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  k to this databa
fd50: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43  se */.  int (*xC
fd60: 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c  allback)(void*),
fd70: 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f    /* Function to
fd80: 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20   invoke on each 
fd90: 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64  commit */.  void
fda0: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
fdb0: 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
fdc0: 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
fdd0: 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  n */.){.  void *
fde0: 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51  pOld;..#ifdef SQ
fdf0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
fe00: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
fe10: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
fe20: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
fe30: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
fe40: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
fe50: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
fe60: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
fe70: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
fe80: 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70  ;.  pOld = db->p
fe90: 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d  CommitArg;.  db-
fea0: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b  >xCommitCallback
feb0: 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
fec0: 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d  db->pCommitArg =
fed0: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
fee0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
fef0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
ff00: 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pOld;.}../*.**
ff10: 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c   Register a call
ff20: 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b  back to be invok
ff30: 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 72  ed each time a r
ff40: 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a  ow is updated,.*
ff50: 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65  * inserted or de
ff60: 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68 69 73  leted using this
ff70: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
ff80: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
ff90: 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f  qlite3_update_ho
ffa0: 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
ffb0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
ffc0: 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
ffd0: 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ok to this datab
ffe0: 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ase */.  void (*
fff0: 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  xCallback)(void*
10000 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 20  ,int,char const 
10010 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73  *,char const *,s
10020 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20  qlite_int64),.  
10030 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
10040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
10050 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
10060 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ction */.){.  vo
10070 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65  id *pRet;..#ifde
10080 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10090 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
100a0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
100b0 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
100c0 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
100d0 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
100e0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
100f0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
10100 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
10110 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
10120 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20  b->pUpdateArg;. 
10130 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c   db->xUpdateCall
10140 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
10150 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41  ;.  db->pUpdateA
10160 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
10170 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10180 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
10190 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
101a0 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
101b0 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
101c0 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
101d0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
101e0 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  s rolled.** back
101f0 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
10200 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
10210 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72  .void *sqlite3_r
10220 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20  ollback_hook(.  
10230 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
10240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
10250 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
10260 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
10270 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62  .  void (*xCallb
10280 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20  ack)(void*), /* 
10290 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  Callback functio
102a0 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  n */.  void *pAr
102b0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
102c0 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
102d0 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
102e0 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b  ){.  void *pRet;
102f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
10300 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
10310 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
10320 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
10330 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
10340 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
10350 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
10360 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
10370 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
10380 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
10390 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62  Ret = db->pRollb
103a0 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52  ackArg;.  db->xR
103b0 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20  ollbackCallback 
103c0 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
103d0 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20  b->pRollbackArg 
103e0 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
103f0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
10400 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
10410 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 64  rn pRet;.}..#ifd
10420 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10430 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a  _PREUPDATE_HOOK.
10440 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
10450 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
10460 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
10470 65 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74  e a row is updat
10480 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20  ed,.** inserted 
10490 6f 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  or deleted using
104a0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
104b0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
104c0 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 65 75  id *sqlite3_preu
104d0 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71  pdate_hook(.  sq
104e0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
104f0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
10500 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
10510 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
10520 20 76 6f 69 64 28 2a 78 43 61 6c 6c 62 61 63 6b   void(*xCallback
10530 29 28 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  )(         /* Ca
10540 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
10550 2a 2f 0a 20 20 20 20 76 6f 69 64 2a 2c 73 71 6c  */.    void*,sql
10560 69 74 65 33 2a 2c 69 6e 74 2c 63 68 61 72 20 63  ite3*,int,char c
10570 6f 6e 73 74 2a 2c 63 68 61 72 20 63 6f 6e 73 74  onst*,char const
10580 2a 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c  *,sqlite3_int64,
10590 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 2c 0a  sqlite3_int64),.
105a0 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
105b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
105c0 69 72 73 74 20 63 61 6c 6c 62 61 63 6b 20 61 72  irst callback ar
105d0 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 76  gument */.){.  v
105e0 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
105f0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
10600 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
10610 52 65 74 20 3d 20 64 62 2d 3e 70 50 72 65 55 70  Ret = db->pPreUp
10620 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  dateArg;.  db->x
10630 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63  PreUpdateCallbac
10640 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
10650 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41   db->pPreUpdateA
10660 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
10670 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10680 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
10690 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
106a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
106b0 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
106c0 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  HOOK */..#ifndef
106d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
106e0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  ./*.** The sqlit
106f0 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61  e3_wal_hook() ca
10700 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65  llback registere
10710 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77 61 6c  d by sqlite3_wal
10720 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
10730 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c  )..** Invoke sql
10740 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
10750 69 6e 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65  int if the numbe
10760 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74  r of frames in t
10770 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69  he log file.** i
10780 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 73  s greater than s
10790 71 6c 69 74 65 33 2e 70 57 61 6c 41 72 67 20 63  qlite3.pWalArg c
107a0 61 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ast to an intege
107b0 72 20 28 74 68 65 20 76 61 6c 75 65 20 63 6f 6e  r (the value con
107c0 66 69 67 75 72 65 64 20 62 79 0a 2a 2a 20 77 61  figured by.** wa
107d0 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
107e0 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c  ())..*/ .int sql
107f0 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f  ite3WalDefaultHo
10800 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69  ok(.  void *pCli
10810 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20  entData,     /* 
10820 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71  Argument */.  sq
10830 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
10840 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
10850 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
10860 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f  ar *zDb,       /
10870 2a 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  * Database */.  
10880 69 6e 74 20 6e 46 72 61 6d 65 20 20 20 20 20 20  int nFrame      
10890 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
108a0 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66  f WAL */.){.  if
108b0 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45  ( nFrame>=SQLITE
108c0 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69  _PTR_TO_INT(pCli
108d0 65 6e 74 44 61 74 61 29 20 29 7b 0a 20 20 20 20  entData) ){.    
108e0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
108f0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
10900 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
10910 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b  kpoint(db, zDb);
10920 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
10930 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
10940 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
10950 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
10960 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
10970 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  AL */../*.** Con
10980 66 69 67 75 72 65 20 61 6e 20 73 71 6c 69 74 65  figure an sqlite
10990 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c  3_wal_hook() cal
109a0 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74  lback to automat
109b0 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e  ically checkpoin
109c0 74 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20  t.** a database 
109d0 61 66 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67  after committing
109e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
109f0 66 20 74 68 65 72 65 20 61 72 65 20 6e 46 72 61  f there are nFra
10a00 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72  me or.** more fr
10a10 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20  ames in the log 
10a20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a 65  file. Passing ze
10a30 72 6f 20 6f 72 20 61 20 6e 65 67 61 74 69 76 65  ro or a negative
10a40 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a   value as the.**
10a50 20 6e 46 72 61 6d 65 20 70 61 72 61 6d 65 74 65   nFrame paramete
10a60 72 20 64 69 73 61 62 6c 65 73 20 61 75 74 6f 6d  r disables autom
10a70 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 73  atic checkpoints
10a80 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a   entirely..**.**
10a90 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65   The callback re
10aa0 67 69 73 74 65 72 65 64 20 62 79 20 74 68 69 73  gistered by this
10ab0 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63   function replac
10ac0 65 73 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  es any existing 
10ad0 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69  callback.** regi
10ae0 73 74 65 72 65 64 20 75 73 69 6e 67 20 73 71 6c  stered using sql
10af0 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e  ite3_wal_hook().
10b00 20 4c 69 6b 65 77 69 73 65 2c 20 72 65 67 69 73   Likewise, regis
10b10 74 65 72 69 6e 67 20 61 20 63 61 6c 6c 62 61 63  tering a callbac
10b20 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74  k.** using sqlit
10b30 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69  e3_wal_hook() di
10b40 73 61 62 6c 65 73 20 74 68 65 20 61 75 74 6f 6d  sables the autom
10b50 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 20  atic checkpoint 
10b60 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e  mechanism.** con
10b70 66 69 67 75 72 65 64 20 62 79 20 74 68 69 73 20  figured by this 
10b80 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
10b90 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
10ba0 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69  ocheckpoint(sqli
10bb0 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72  te3 *db, int nFr
10bc0 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ame){.#ifdef SQL
10bd0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55  ITE_OMIT_WAL.  U
10be0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
10bf0 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  db);.  UNUSED_PA
10c00 52 41 4d 45 54 45 52 28 6e 46 72 61 6d 65 29 3b  RAMETER(nFrame);
10c10 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 53 51  .#else.#ifdef SQ
10c20 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
10c30 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
10c40 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
10c50 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
10c60 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
10c70 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  T;.#endif.  if( 
10c80 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20  nFrame>0 ){.    
10c90 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
10ca0 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44  (db, sqlite3WalD
10cb0 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49  efaultHook, SQLI
10cc0 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46  TE_INT_TO_PTR(nF
10cd0 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  rame));.  }else{
10ce0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
10cf0 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b  _hook(db, 0, 0);
10d00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
10d10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10d20 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
10d30 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
10d40 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
10d50 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
10d60 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  on is written.**
10d70 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d   into the write-
10d80 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69  ahead-log by thi
10d90 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
10da0 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
10db0 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
10dc0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10de0 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
10df0 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
10e00 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  b handle */.  in
10e10 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f  t(*xCallback)(vo
10e20 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  id *, sqlite3*, 
10e30 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
10e40 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  ),.  void *pArg 
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e60 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
10e70 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
10e80 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a   xCallback() */.
10e90 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
10ea0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69  E_OMIT_WAL.  voi
10eb0 64 20 2a 70 52 65 74 3b 0a 23 69 66 64 65 66 20  d *pRet;.#ifdef 
10ec0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
10ed0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
10ee0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
10ef0 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
10f00 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
10f10 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
10f20 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
10f30 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
10f40 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
10f50 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
10f60 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e  >pWalArg;.  db->
10f70 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78  xWalCallback = x
10f80 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
10f90 70 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a  pWalArg = pArg;.
10fa0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10fb0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
10fc0 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
10fd0 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
10fe0 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
10ff0 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61  ** Checkpoint da
11000 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69  tabase zDb..*/.i
11010 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  nt sqlite3_wal_c
11020 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20  heckpoint_v2(.  
11030 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
11040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11050 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
11060 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
11070 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20  ar *zDb,        
11080 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
11090 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61  of attached data
110a0 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  base (or NULL) *
110b0 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20  /.  int eMode,  
110c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110d0 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48      /* SQLITE_CH
110e0 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65  ECKPOINT_* value
110f0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67   */.  int *pnLog
11100 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11110 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69        /* OUT: Si
11120 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e  ze of WAL log in
11130 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74   frames */.  int
11140 20 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20   *pnCkpt        
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11160 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65  OUT: Total numbe
11170 72 20 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63  r of frames chec
11180 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23  kpointed */.){.#
11190 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
111a0 54 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53  T_WAL.  return S
111b0 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a  QLITE_OK;.#else.
111c0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
111d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
111f0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20   */.  int iDb = 
11200 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
11210 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33  HED;  /* sqlite3
11220 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20  .aDb[] index of 
11230 64 62 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74  db to checkpoint
11240 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
11250 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
11260 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
11270 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
11280 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
11290 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
112a0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e  .#endif..  /* In
112b0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74  itialize the out
112c0 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f  put variables to
112d0 20 2d 31 20 69 6e 20 63 61 73 65 20 61 6e 20 65   -1 in case an e
112e0 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
112f0 20 20 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70    if( pnLog ) *p
11300 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28  nLog = -1;.  if(
11310 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70   pnCkpt ) *pnCkp
11320 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72  t = -1;..  asser
11330 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
11340 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30 20  OINT_PASSIVE==0 
11350 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
11360 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
11370 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ULL==1 );.  asse
11380 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
11390 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32  POINT_RESTART==2
113a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
113b0 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
113c0 54 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 20  TRUNCATE==3 );. 
113d0 20 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54   if( eMode<SQLIT
113e0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
113f0 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51  SIVE || eMode>SQ
11400 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
11410 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20  TRUNCATE ){.    
11420 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
11430 52 2d 30 33 39 39 36 2d 31 32 30 38 38 20 54 68  R-03996-12088 Th
11440 65 20 4d 20 70 61 72 61 6d 65 74 65 72 20 6d 75  e M parameter mu
11450 73 74 20 62 65 20 61 20 76 61 6c 69 64 20 63 68  st be a valid ch
11460 65 63 6b 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20  eckpoint.    ** 
11470 6d 6f 64 65 3a 20 2a 2f 0a 20 20 20 20 72 65 74  mode: */.    ret
11480 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
11490 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  E;.  }..  sqlite
114a0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
114b0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
114c0 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b  zDb && zDb[0] ){
114d0 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
114e0 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c  e3FindDbName(db,
114f0 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28   zDb);.  }.  if(
11500 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63   iDb<0 ){.    rc
11510 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
11520 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
11530 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c  rWithMsg(db, SQL
11540 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e  ITE_ERROR, "unkn
11550 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73  own database: %s
11560 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65  ", zDb);.  }else
11570 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 48 61  {.    db->busyHa
11580 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b  ndler.nBusy = 0;
11590 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
115a0 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  3Checkpoint(db, 
115b0 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f  iDb, eMode, pnLo
115c0 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20  g, pnCkpt);.    
115d0 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
115e0 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   rc);.  }.  rc =
115f0 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
11600 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 49  db, rc);..  /* I
11610 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61  f there are no a
11620 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
11630 2c 20 63 6c 65 61 72 20 74 68 65 20 69 6e 74 65  , clear the inte
11640 72 72 75 70 74 20 66 6c 61 67 20 61 74 20 74 68  rrupt flag at th
11650 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 20  is.  ** point.  
11660 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 56 64  */.  if( db->nVd
11670 62 65 41 63 74 69 76 65 3d 3d 30 20 29 7b 0a 20  beActive==0 ){. 
11680 20 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65     db->u1.isInte
11690 72 72 75 70 74 65 64 20 3d 20 30 3b 0a 20 20 7d  rrupted = 0;.  }
116a0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
116b0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
116c0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
116d0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
116e0 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74  * Checkpoint dat
116f0 61 62 61 73 65 20 7a 44 62 2e 20 49 66 20 7a 44  abase zDb. If zD
11700 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66  b is NULL, or if
11710 20 74 68 65 20 62 75 66 66 65 72 20 7a 44 62 20   the buffer zDb 
11720 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e  points.** to con
11730 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e  tains a zero-len
11740 67 74 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20  gth string, all 
11750 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
11760 65 73 20 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b  es are .** check
11770 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  pointed..*/.int 
11780 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
11790 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a  kpoint(sqlite3 *
117a0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
117b0 7a 44 62 29 7b 0a 20 20 2f 2a 20 45 56 49 44 45  zDb){.  /* EVIDE
117c0 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 36 31 33 2d  NCE-OF: R-41613-
117d0 32 30 35 35 33 20 54 68 65 20 73 71 6c 69 74 65  20553 The sqlite
117e0 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
117f0 28 44 2c 58 29 20 69 73 20 65 71 75 69 76 61 6c  (D,X) is equival
11800 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69  ent to.  ** sqli
11810 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
11820 6e 74 5f 76 32 28 44 2c 58 2c 53 51 4c 49 54 45  nt_v2(D,X,SQLITE
11830 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
11840 49 56 45 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20 72  IVE,0,0). */.  r
11850 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 77 61  eturn sqlite3_wa
11860 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
11870 64 62 2c 7a 44 62 2c 53 51 4c 49 54 45 5f 43 48  db,zDb,SQLITE_CH
11880 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
11890 2c 30 2c 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  ,0,0);.}..#ifnde
118a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
118b0 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68  L./*.** Run a ch
118c0 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61  eckpoint on data
118d0 62 61 73 65 20 69 44 62 2e 20 54 68 69 73 20 69  base iDb. This i
118e0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74  s a no-op if dat
118f0 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a 20  abase iDb is.** 
11900 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  not currently op
11910 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a  en in WAL mode..
11920 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
11930 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f  action is open o
11940 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
11950 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65  eing checkpointe
11960 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  d, this .** func
11970 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
11980 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61  ITE_LOCKED and a
11990 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e   checkpoint is n
119a0 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49 66  ot attempted. If
119b0 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63   .** an error oc
119c0 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69  curs while runni
119d0 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  ng the checkpoin
119e0 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  t, an SQLite err
119f0 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
11a00 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53 51  eturned (i.e. SQ
11a10 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68  LITE_IOERR). Oth
11a20 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
11a30 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  K..**.** The mut
11a40 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ex on database h
11a50 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64 20  andle db should 
11a60 62 65 20 68 65 6c 64 20 62 79 20 74 68 65 20 63  be held by the c
11a70 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65 78  aller. The mutex
11a80 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
11a90 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 63  ith the specific
11aa0 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63 68   b-tree being ch
11ab0 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74 61  eckpointed is ta
11ac0 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20 66  ken by.** this f
11ad0 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68  unction while th
11ae0 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  e checkpoint is 
11af0 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  running..**.** I
11b00 66 20 69 44 62 20 69 73 20 70 61 73 73 65 64 20  f iDb is passed 
11b10 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
11b20 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74  HED, then all at
11b30 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
11b40 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69   are.** checkpoi
11b50 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  nted. If an erro
11b60 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
11b70 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20   it is returned 
11b80 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a  immediately -.**
11b90 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   no attempt is m
11ba0 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e  ade to checkpoin
11bb0 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20  t any remaining 
11bc0 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a  databases..**.**
11bd0 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
11be0 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   is one of SQLIT
11bf0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
11c00 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20 52 45  SIVE, FULL or RE
11c10 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  START..*/.int sq
11c20 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
11c30 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
11c40 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c   iDb, int eMode,
11c50 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74   int *pnLog, int
11c60 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74   *pnCkpt){.  int
11c70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11c90 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
11ca0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cc0 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
11cd0 61 74 65 20 74 68 72 6f 75 67 68 20 61 74 74 61  ate through atta
11ce0 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e  ched dbs */.  in
11cf0 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20 20  t bBusy = 0;    
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11d10 20 54 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f   True if SQLITE_
11d20 42 55 53 59 20 68 61 73 20 62 65 65 6e 20 65 6e  BUSY has been en
11d30 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20  countered */..  
11d40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11d50 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
11d60 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
11d70 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e  t( !pnLog || *pn
11d80 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73  Log==-1 );.  ass
11d90 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20  ert( !pnCkpt || 
11da0 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a  *pnCkpt==-1 );..
11db0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
11dc0 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c 49  >nDb && rc==SQLI
11dd0 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
11de0 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69   if( i==iDb || i
11df0 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41  Db==SQLITE_MAX_A
11e00 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20 20  TTACHED ){.     
11e10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
11e20 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d  eeCheckpoint(db-
11e30 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f  >aDb[i].pBt, eMo
11e40 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70  de, pnLog, pnCkp
11e50 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20  t);.      pnLog 
11e60 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70  = 0;.      pnCkp
11e70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
11e80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
11e90 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75 73   ){.        bBus
11ea0 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  y = 1;.        r
11eb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11ec0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
11ed0 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
11ee0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42 75  SQLITE_OK && bBu
11ef0 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  sy) ? SQLITE_BUS
11f00 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  Y : rc;.}.#endif
11f10 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
11f20 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  WAL */../*.** Th
11f30 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
11f40 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69 6e  rns true if main
11f50 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62  -memory should b
11f60 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  e used instead o
11f70 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  f.** a temporary
11f80 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73 69   file for transi
11f90 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73 20  ent pager files 
11fa0 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  and statement jo
11fb0 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76  urnals..** The v
11fc0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64 65  alue returned de
11fd0 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
11fe0 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73  ue of db->temp_s
11ff0 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a  tore (runtime.**
12000 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64 20   parameter) and 
12010 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  the compile time
12020 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45   value of SQLITE
12030 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65  _TEMP_STORE. The
12040 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  .** following ta
12050 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
12060 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62  e relationship b
12070 65 74 77 65 65 6e 20 74 68 65 73 65 20 74 77 6f  etween these two
12080 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74   values.** and t
12090 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  his functions re
120a0 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  turn value..**.*
120b0 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  *   SQLITE_TEMP_
120c0 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65  STORE     db->te
120d0 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63  mp_store     Loc
120e0 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61  ation of tempora
120f0 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  ry database.**  
12100 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
12110 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
12120 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
12130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12140 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20  --------.**   0 
12150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12160 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
12170 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
12180 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
12190 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
121a0 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
121b0 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
121c0 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
121d0 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
121e0 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
12200 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
12210 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
12220 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12240 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
12250 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 0).**   2     
12260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12270 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
12280 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
12290 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20  turn 0).**   2  
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122b0 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
122c0 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
122d0 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
122e0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
122f0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
12300 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
12310 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
12320 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
12330 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20           any    
12340 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
12350 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
12360 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
12370 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73  empInMemory(cons
12380 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t sqlite3 *db){.
12390 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
123a0 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75 72  STORE==1.  retur
123b0 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
123c0 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a  re==2 );.#endif.
123d0 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
123e0 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75 72  STORE==2.  retur
123f0 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
12400 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a  re!=1 );.#endif.
12410 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
12420 53 54 4f 52 45 3d 3d 33 0a 20 20 55 4e 55 53 45  STORE==3.  UNUSE
12430 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b  D_PARAMETER(db);
12440 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
12450 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  dif.#if SQLITE_T
12460 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53  EMP_STORE<1 || S
12470 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
12480 3e 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  >3.  UNUSED_PARA
12490 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65 74  METER(db);.  ret
124a0 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
124b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
124c0 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c  F-8 encoded Engl
124d0 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
124e0 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  lanation of the 
124f0 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65  most recent.** e
12500 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  rror..*/.const c
12510 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  har *sqlite3_err
12520 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29  msg(sqlite3 *db)
12530 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
12540 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
12550 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
12560 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
12570 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d  NOMEM_BKPT);.  }
12580 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
12590 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
125a0 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
125b0 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53  turn sqlite3ErrS
125c0 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  tr(SQLITE_MISUSE
125d0 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73 71  _BKPT);.  }.  sq
125e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
125f0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
12600 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
12610 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20  iled ){.    z = 
12620 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
12630 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29  LITE_NOMEM_BKPT)
12640 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
12650 65 73 74 63 61 73 65 28 20 64 62 2d 3e 70 45 72  estcase( db->pEr
12660 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7a 20 3d 20  r==0 );.    z = 
12670 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
12680 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70 45  alue_text(db->pE
12690 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rr);.    assert(
126a0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
126b0 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  ed );.    if( z=
126c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  =0 ){.      z = 
126d0 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62  sqlite3ErrStr(db
126e0 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20 20  ->errCode);.    
126f0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
12700 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
12710 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
12720 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   z;.}..#ifndef S
12730 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
12740 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
12750 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e 67  F-16 encoded Eng
12760 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
12770 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  planation of the
12780 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20   most recent.** 
12790 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  error..*/.const 
127a0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65 72  void *sqlite3_er
127b0 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20 2a  rmsg16(sqlite3 *
127c0 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  db){.  static co
127d0 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d  nst u16 outOfMem
127e0 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20  [] = {.    'o', 
127f0 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 27  'u', 't', ' ', '
12800 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27 6d  o', 'f', ' ', 'm
12810 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27  ', 'e', 'm', 'o'
12820 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20 20  , 'r', 'y', 0.  
12830 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
12840 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d  t u16 misuse[] =
12850 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69 27 2c   {.    'l', 'i',
12860 20 27 62 27 2c 20 27 72 27 2c 20 27 61 27 2c 20   'b', 'r', 'a', 
12870 27 72 27 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a  'r', 'y', ' ', .
12880 20 20 20 20 27 72 27 2c 20 27 6f 27 2c 20 27 75      'r', 'o', 'u
12890 27 2c 20 27 74 27 2c 20 27 69 27 2c 20 27 6e 27  ', 't', 'i', 'n'
128a0 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'e', ' ', .   
128b0 20 27 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20   'c', 'a', 'l', 
128c0 27 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c 20 27  'l', 'e', 'd', '
128d0 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 75   ', .    'o', 'u
128e0 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a 20 20  ', 't', ' ', .  
128f0 20 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c    'o', 'f', ' ',
12900 20 0a 20 20 20 20 27 73 27 2c 20 27 65 27 2c 20   .    's', 'e', 
12910 27 71 27 2c 20 27 75 27 2c 20 27 65 27 2c 20 27  'q', 'u', 'e', '
12920 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c 20 30 0a  n', 'c', 'e', 0.
12930 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f    };..  const vo
12940 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62  id *z;.  if( !db
12950 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
12960 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b  void *)outOfMem;
12970 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
12980 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
12990 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
129a0 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a    return (void *
129b0 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73  )misuse;.  }.  s
129c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
129d0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
129e0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
129f0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d  ailed ){.    z =
12a00 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65   (void *)outOfMe
12a10 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  m;.  }else{.    
12a20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
12a30 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72  e_text16(db->pEr
12a40 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  r);.    if( z==0
12a50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12a60 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
12a70 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20 73  , db->errCode, s
12a80 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d  qlite3ErrStr(db-
12a90 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20 20 20 20  >errCode));.    
12aa0 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
12ab0 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70  lue_text16(db->p
12ac0 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Err);.    }.    
12ad0 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61  /* A malloc() ma
12ae0 79 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 69  y have failed wi
12af0 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f  thin the call to
12b00 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
12b10 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61  ext16().    ** a
12b20 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69 73  bove. If this is
12b30 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
12b40 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  the db->mallocFa
12b50 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20  iled flag needs 
12b60 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65  to.    ** be cle
12b70 61 72 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  ared before retu
12b80 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64  rning. Do this d
12b90 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64  irectly, instead
12ba0 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73   of via.    ** s
12bb0 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 29 2c  qlite3ApiExit(),
12bc0 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e   to avoid settin
12bd0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  g the database h
12be0 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73  andle error mess
12bf0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
12c00 73 71 6c 69 74 65 33 4f 6f 6d 43 6c 65 61 72 28  sqlite3OomClear(
12c10 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  db);.  }.  sqlit
12c20 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
12c30 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
12c40 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn z;.}.#endif 
12c50 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
12c60 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
12c70 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72  eturn the most r
12c80 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  ecent error code
12c90 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e   generated by an
12ca0 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e   SQLite routine.
12cb0 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70   If NULL is.** p
12cc0 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
12cd0 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d  nction, we assum
12ce0 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  e a malloc() fai
12cf0 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74  led during sqlit
12d00 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e  e3_open()..*/.in
12d10 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  t sqlite3_errcod
12d20 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
12d30 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c    if( db && !sql
12d40 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
12d50 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
12d60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12d70 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
12d80 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64  }.  if( !db || d
12d90 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
12da0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12db0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
12dc0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62  .  }.  return db
12dd0 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e  ->errCode & db->
12de0 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73  errMask;.}.int s
12df0 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
12e00 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20  errcode(sqlite3 
12e10 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26  *db){.  if( db &
12e20 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  & !sqlite3Safety
12e30 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
12e40 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
12e50 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
12e60 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64  PT;.  }.  if( !d
12e70 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  b || db->mallocF
12e80 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
12e90 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
12ea0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
12eb0 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b  urn db->errCode;
12ec0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  .}.int sqlite3_s
12ed0 79 73 74 65 6d 5f 65 72 72 6e 6f 28 73 71 6c 69  ystem_errno(sqli
12ee0 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75  te3 *db){.  retu
12ef0 72 6e 20 64 62 20 3f 20 64 62 2d 3e 69 53 79 73  rn db ? db->iSys
12f00 45 72 72 6e 6f 20 3a 20 30 3b 0a 7d 20 20 0a 0a  Errno : 0;.}  ..
12f10 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
12f20 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
12f30 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66  ibes the kind of
12f40 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64   error specified
12f50 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d   in the.** argum
12f60 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 74  ent.  For now, t
12f70 68 69 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c 73  his simply calls
12f80 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 71   the internal sq
12f90 6c 69 74 65 33 45 72 72 53 74 72 28 29 0a 2a 2a  lite3ErrStr().**
12fa0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f   function..*/.co
12fb0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
12fc0 33 5f 65 72 72 73 74 72 28 69 6e 74 20 72 63 29  3_errstr(int rc)
12fd0 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
12fe0 65 33 45 72 72 53 74 72 28 72 63 29 3b 0a 7d 0a  e3ErrStr(rc);.}.
12ff0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
13000 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  new collating fu
13010 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62  nction for datab
13020 61 73 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e  ase "db".  The n
13030 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20  ame is zName.** 
13040 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  and the encoding
13050 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74   is enc..*/.stat
13060 69 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c  ic int createCol
13070 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  lation(.  sqlite
13080 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3* db,.  const c
13090 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75  har *zName, .  u
130a0 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70  8 enc,.  void* p
130b0 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
130c0 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
130d0 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
130e0 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20  const void*),.  
130f0 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64  void(*xDel)(void
13100 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  *).){.  CollSeq 
13110 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e  *pColl;.  int en
13120 63 32 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  c2;.  .  assert(
13130 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
13140 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
13150 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54  ;..  /* If SQLIT
13160 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69  E_UTF16 is speci
13170 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f  fied as the enco
13180 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73  ding type, trans
13190 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74  form this.  ** t
131a0 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  o one of SQLITE_
131b0 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54  UTF16LE or SQLIT
131c0 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20  E_UTF16BE using 
131d0 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
131e0 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72  UTF16NATIVE macr
131f0 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  o. SQLITE_UTF16 
13200 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65  is not used inte
13210 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65  rnally..  */.  e
13220 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73  nc2 = enc;.  tes
13230 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c  tcase( enc2==SQL
13240 49 54 45 5f 55 54 46 31 36 20 29 3b 0a 20 20 74  ITE_UTF16 );.  t
13250 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53  estcase( enc2==S
13260 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
13270 4e 45 44 20 29 3b 0a 20 20 69 66 28 20 65 6e 63  NED );.  if( enc
13280 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20  2==SQLITE_UTF16 
13290 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  || enc2==SQLITE_
132a0 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b  UTF16_ALIGNED ){
132b0 0a 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49  .    enc2 = SQLI
132c0 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
132d0 20 20 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c 53    }.  if( enc2<S
132e0 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e  QLITE_UTF8 || en
132f0 63 32 3e 53 51 4c 49 54 45 5f 55 54 46 31 36 42  c2>SQLITE_UTF16B
13300 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  E ){.    return 
13310 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
13320 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  PT;.  }..  /* Ch
13330 65 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c  eck if this call
13340 20 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20   is removing or 
13350 72 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69  replacing an exi
13360 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20  sting collation 
13370 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20  .  ** sequence. 
13380 49 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65  If so, and there
13390 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c   are active VMs,
133a0 20 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66   return busy. If
133b0 20 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20   there.  ** are 
133c0 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69  no active VMs, i
133d0 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72  nvalidate any pr
133e0 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  e-compiled state
133f0 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43  ments..  */.  pC
13400 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
13410 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38  dCollSeq(db, (u8
13420 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29  )enc2, zName, 0)
13430 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26  ;.  if( pColl &&
13440 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a   pColl->xCmp ){.
13450 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62      if( db->nVdb
13460 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20  eActive ){.     
13470 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
13480 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  hMsg(db, SQLITE_
13490 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22  BUSY, .        "
134a0 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
134b0 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f  /modify collatio
134c0 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65 20 74  n sequence due t
134d0 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  o active stateme
134e0 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74  nts");.      ret
134f0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
13500 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
13510 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
13520 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
13530 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61  .    /* If colla
13540 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43  tion sequence pC
13550 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  oll was created 
13560 64 69 72 65 63 74 6c 79 20 62 79 20 61 20 63 61  directly by a ca
13570 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
13580 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
13590 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67  ation, and not g
135a0 65 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e 74  enerated by synt
135b0 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20  hCollSeq(),.    
135c0 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69  ** then any copi
135d0 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68  es made by synth
135e0 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74  CollSeq() need t
135f0 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  o be invalidated
13600 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63  ..    ** Also, c
13610 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63  ollation destruc
13620 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44  tor - CollSeq.xD
13630 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20  el() - function 
13640 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  may need.    ** 
13650 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20  to be called..  
13660 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70    */ .    if( (p
13670 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c  Coll->enc & ~SQL
13680 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
13690 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20  D)==enc2 ){.    
136a0 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c    CollSeq *aColl
136b0 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
136c0 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  nd(&db->aCollSeq
136d0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
136e0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
136f0 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
13700 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
13710 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b   *p = &aColl[j];
13720 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
13730 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20  enc==pColl->enc 
13740 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
13750 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20   p->xDel ){.    
13760 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28          p->xDel(
13770 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20  p->pUser);.     
13780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
13790 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20   p->xCmp = 0;.  
137a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
137b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f      }.  }..  pCo
137c0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
137d0 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
137e0 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b  enc2, zName, 1);
137f0 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20  .  if( pColl==0 
13800 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
13810 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 70 43  NOMEM_BKPT;.  pC
13820 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d  oll->xCmp = xCom
13830 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70  pare;.  pColl->p
13840 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 70  User = pCtx;.  p
13850 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65  Coll->xDel = xDe
13860 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20  l;.  pColl->enc 
13870 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20 28 65  = (u8)(enc2 | (e
13880 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31  nc & SQLITE_UTF1
13890 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20 73  6_ALIGNED));.  s
138a0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
138b0 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 72 65  SQLITE_OK);.  re
138c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
138d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  }.../*.** This a
138e0 72 72 61 79 20 64 65 66 69 6e 65 73 20 68 61 72  rray defines har
138f0 64 20 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f  d upper bounds o
13900 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20  n limit values. 
13910 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69   The.** initiali
13920 7a 65 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74  zer must be kept
13930 20 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68   in sync with th
13940 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a  e SQLITE_LIMIT_*
13950 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20  .** #defines in 
13960 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74  sqlite3.h..*/.st
13970 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61  atic const int a
13980 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a  HardLimit[] = {.
13990 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e    SQLITE_MAX_LEN
139a0 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
139b0 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20  X_SQL_LENGTH,.  
139c0 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
139d0 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  N,.  SQLITE_MAX_
139e0 45 58 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51  EXPR_DEPTH,.  SQ
139f0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
13a00 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49  D_SELECT,.  SQLI
13a10 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a  TE_MAX_VDBE_OP,.
13a20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e    SQLITE_MAX_FUN
13a30 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c  CTION_ARG,.  SQL
13a40 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
13a50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ,.  SQLITE_MAX_L
13a60 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
13a70 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
13a80 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
13a90 2c 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ,      /* IMP: R
13aa0 2d 33 38 30 39 31 2d 33 32 33 35 32 20 2a 2f 0a  -38091-32352 */.
13ab0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49    SQLITE_MAX_TRI
13ac0 47 47 45 52 5f 44 45 50 54 48 2c 0a 20 20 53 51  GGER_DEPTH,.  SQ
13ad0 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
13ae0 54 48 52 45 41 44 53 2c 0a 7d 3b 0a 0a 2f 2a 0a  THREADS,.};../*.
13af0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
13b00 20 68 61 72 64 20 6c 69 6d 69 74 73 20 61 72 65   hard limits are
13b10 20 73 65 74 20 74 6f 20 72 65 61 73 6f 6e 61 62   set to reasonab
13b20 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66  le values.*/.#if
13b30 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
13b40 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53  TH<100.# error S
13b50 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
13b60 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
13b70 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66  t 100.#endif.#if
13b80 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
13b90 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72  LENGTH<100.# err
13ba0 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  or SQLITE_MAX_SQ
13bb0 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65  L_LENGTH must be
13bc0 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65   at least 100.#e
13bd0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
13be0 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53  MAX_SQL_LENGTH>S
13bf0 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
13c00 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
13c10 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d  MAX_SQL_LENGTH m
13c20 75 73 74 20 6e 6f 74 20 62 65 20 67 72 65 61 74  ust not be great
13c30 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d  er than SQLITE_M
13c40 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66  AX_LENGTH.#endif
13c50 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
13c60 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c  COMPOUND_SELECT<
13c70 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  2.# error SQLITE
13c80 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
13c90 4c 45 43 54 20 6d 75 73 74 20 62 65 20 61 74 20  LECT must be at 
13ca0 6c 65 61 73 74 20 32 0a 23 65 6e 64 69 66 0a 23  least 2.#endif.#
13cb0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  if SQLITE_MAX_VD
13cc0 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72  BE_OP<40.# error
13cd0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
13ce0 5f 4f 50 20 6d 75 73 74 20 62 65 20 61 74 20 6c  _OP must be at l
13cf0 65 61 73 74 20 34 30 0a 23 65 6e 64 69 66 0a 23  east 40.#endif.#
13d00 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  if SQLITE_MAX_FU
13d10 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20  NCTION_ARG<0 || 
13d20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
13d30 49 4f 4e 5f 41 52 47 3e 31 32 37 0a 23 20 65 72  ION_ARG>127.# er
13d40 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  ror SQLITE_MAX_F
13d50 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74  UNCTION_ARG must
13d60 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
13d70 64 20 31 32 37 0a 23 65 6e 64 69 66 0a 23 69 66  d 127.#endif.#if
13d80 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
13d90 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45  CHED<0 || SQLITE
13da0 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3e 31 32  _MAX_ATTACHED>12
13db0 35 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  5.# error SQLITE
13dc0 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75  _MAX_ATTACHED mu
13dd0 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  st be between 0 
13de0 61 6e 64 20 31 32 35 0a 23 65 6e 64 69 66 0a 23  and 125.#endif.#
13df0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  if SQLITE_MAX_LI
13e00 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
13e10 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  H<1.# error SQLI
13e20 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
13e30 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  ERN_LENGTH must 
13e40 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65  be at least 1.#e
13e50 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
13e60 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37  MAX_COLUMN>32767
13e70 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
13e80 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20  MAX_COLUMN must 
13e90 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37 36 37  not exceed 32767
13ea0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
13eb0 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
13ec0 45 50 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53  EPTH<1.# error S
13ed0 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
13ee0 52 5f 44 45 50 54 48 20 6d 75 73 74 20 62 65 20  R_DEPTH must be 
13ef0 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69  at least 1.#endi
13f00 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
13f10 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3c  _WORKER_THREADS<
13f20 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  0 || SQLITE_MAX_
13f30 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 35  WORKER_THREADS>5
13f40 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
13f50 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
13f60 41 44 53 20 6d 75 73 74 20 62 65 20 62 65 74 77  ADS must be betw
13f70 65 65 6e 20 30 20 61 6e 64 20 35 30 0a 23 65 6e  een 0 and 50.#en
13f80 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
13f90 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
13fa0 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74  a limit.  Report
13fb0 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a   the old value..
13fc0 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64  ** If an invalid
13fd0 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20   limit index is 
13fe0 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74  supplied, report
13ff0 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20   -1..** Make no 
14000 63 68 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c  changes but stil
14010 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64  l report the old
14020 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a   value if the.**
14030 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65   new limit is ne
14040 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  gative..**.** A 
14050 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20  new lower limit 
14060 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20  does not shrink 
14070 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75  existing constru
14080 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c  cts..** It merel
14090 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63  y prevents new c
140a0 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74 20 65  onstructs that e
140b0 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a  xceed the limit.
140c0 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e  ** from forming.
140d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
140e0 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  limit(sqlite3 *d
140f0 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20  b, int limitId, 
14100 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20  int newLimit){. 
14110 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a   int oldLimit;..
14120 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
14130 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
14140 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
14150 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
14160 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
14170 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
14180 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
14190 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
141a0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
141b0 30 31 38 39 2d 35 34 30 39 37 20 46 6f 72 20 65  0189-54097 For e
141c0 61 63 68 20 6c 69 6d 69 74 20 63 61 74 65 67 6f  ach limit catego
141d0 72 79 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  ry SQLITE_LIMIT_
141e0 4e 41 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65 20  NAME.  ** there 
141f0 69 73 20 61 20 68 61 72 64 20 75 70 70 65 72 20  is a hard upper 
14200 62 6f 75 6e 64 20 73 65 74 20 61 74 20 63 6f 6d  bound set at com
14210 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43  pile-time by a C
14220 20 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 20 20   preprocessor.  
14230 2a 2a 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20  ** macro called 
14240 53 51 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e  SQLITE_MAX_NAME.
14250 20 28 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20   (The "_LIMIT_" 
14260 69 6e 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63  in the name is c
14270 68 61 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22  hanged to.  ** "
14280 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20  _MAX_".).  */.  
14290 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
142a0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
142b0 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  LENGTH]==SQLITE_
142c0 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  MAX_LENGTH );.  
142d0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
142e0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
142f0 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c  SQL_LENGTH]==SQL
14300 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
14310 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
14320 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
14330 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d  E_LIMIT_COLUMN]=
14340 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55  =SQLITE_MAX_COLU
14350 4d 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  MN );.  assert( 
14360 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
14370 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
14380 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
14390 45 58 50 52 5f 44 45 50 54 48 20 29 3b 0a 20 20  EXPR_DEPTH );.  
143a0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
143b0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
143c0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d  COMPOUND_SELECT]
143d0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  ==SQLITE_MAX_COM
143e0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20  POUND_SELECT);. 
143f0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
14400 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
14410 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54  _VDBE_OP]==SQLIT
14420 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b  E_MAX_VDBE_OP );
14430 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
14440 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
14450 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d  IT_FUNCTION_ARG]
14460 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  ==SQLITE_MAX_FUN
14470 43 54 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61  CTION_ARG );.  a
14480 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
14490 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41  t[SQLITE_LIMIT_A
144a0 54 54 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45  TTACHED]==SQLITE
144b0 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 3b  _MAX_ATTACHED );
144c0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
144d0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
144e0 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
144f0 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20  LENGTH]==.      
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14520 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
14530 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
14540 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
14550 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
14560 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
14570 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53  IABLE_NUMBER]==S
14580 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
14590 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73  LE_NUMBER);.  as
145a0 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
145b0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52  [SQLITE_LIMIT_TR
145c0 49 47 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51  IGGER_DEPTH]==SQ
145d0 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
145e0 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
145f0 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
14600 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
14610 45 52 5f 54 48 52 45 41 44 53 5d 3d 3d 53 51 4c  ER_THREADS]==SQL
14620 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
14630 48 52 45 41 44 53 20 29 3b 0a 20 20 61 73 73 65  HREADS );.  asse
14640 72 74 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  rt( SQLITE_LIMIT
14650 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3d  _WORKER_THREADS=
14660 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54  =(SQLITE_N_LIMIT
14670 2d 31 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c  -1) );...  if( l
14680 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69  imitId<0 || limi
14690 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49  tId>=SQLITE_N_LI
146a0 4d 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  MIT ){.    retur
146b0 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c  n -1;.  }.  oldL
146c0 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69  imit = db->aLimi
146d0 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66  t[limitId];.  if
146e0 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b  ( newLimit>=0 ){
146f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14700 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34     /* IMP: R-524
14710 37 36 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20 20  76-28732 */.    
14720 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61  if( newLimit>aHa
14730 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  rdLimit[limitId]
14740 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d   ){.      newLim
14750 69 74 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b  it = aHardLimit[
14760 6c 69 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d  limitId];  /* IM
14770 50 3a 20 52 2d 35 31 34 36 33 2d 32 35 36 33 34  P: R-51463-25634
14780 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 62   */.    }.    db
14790 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ->aLimit[limitId
147a0 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20  ] = newLimit;.  
147b0 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69  }.  return oldLi
147c0 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
147d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
147e0 20 52 2d 35 33 33 34 31 2d 33 35 34 31 39 20 2a   R-53341-35419 *
147f0 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  /.}../*.** This 
14800 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
14810 20 74 6f 20 70 61 72 73 65 20 62 6f 74 68 20 55   to parse both U
14820 52 49 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20  RIs and non-URI 
14830 66 69 6c 65 6e 61 6d 65 73 20 70 61 73 73 65 64  filenames passed
14840 20 62 79 20 74 68 65 0a 2a 2a 20 75 73 65 72 20   by the.** user 
14850 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73  to API functions
14860 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20   sqlite3_open() 
14870 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  or sqlite3_open_
14880 76 32 28 29 2c 20 61 6e 64 20 66 6f 72 20 64 61  v2(), and for da
14890 74 61 62 61 73 65 0a 2a 2a 20 55 52 49 73 20 73  tabase.** URIs s
148a0 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74  pecified as part
148b0 20 6f 66 20 41 54 54 41 43 48 20 73 74 61 74 65   of ATTACH state
148c0 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ments..**.** The
148d0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
148e0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
148f0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
14900 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 28  the VFS to use (
14910 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20  or.** a NULL to 
14920 73 69 67 6e 69 66 79 20 74 68 65 20 64 65 66 61  signify the defa
14930 75 6c 74 20 56 46 53 29 20 69 66 20 74 68 65 20  ult VFS) if the 
14940 55 52 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  URI does not con
14950 74 61 69 6e 20 61 20 22 76 66 73 3d 78 78 78 22  tain a "vfs=xxx"
14960 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65  .** query parame
14970 74 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ter. The second 
14980 61 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e  argument contain
14990 73 20 74 68 65 20 55 52 49 20 28 6f 72 20 6e 6f  s the URI (or no
149a0 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a  n-URI filename).
149b0 2a 2a 20 69 74 73 65 6c 66 2e 20 57 68 65 6e 20  ** itself. When 
149c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
149d0 20 63 61 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c   called the *pFl
149e0 61 67 73 20 76 61 72 69 61 62 6c 65 20 73 68 6f  ags variable sho
149f0 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74  uld contain.** t
14a00 68 65 20 64 65 66 61 75 6c 74 20 66 6c 61 67 73  he default flags
14a10 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74   to open the dat
14a20 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 69 74  abase handle wit
14a30 68 2e 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f  h. The value sto
14a40 72 65 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67  red in.** *pFlag
14a50 73 20 6d 61 79 20 62 65 20 75 70 64 61 74 65 64  s may be updated
14a60 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
14a70 67 20 69 66 20 74 68 65 20 55 52 49 20 66 69 6c  g if the URI fil
14a80 65 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a  ename contains .
14a90 2a 2a 20 22 63 61 63 68 65 3d 78 78 78 22 20 6f  ** "cache=xxx" o
14aa0 72 20 22 6d 6f 64 65 3d 78 78 78 22 20 71 75 65  r "mode=xxx" que
14ab0 72 79 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a  ry parameters..*
14ac0 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
14ad0 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
14ae0 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
14af0 69 73 20 63 61 73 65 20 2a 70 70 56 66 73 20 69  is case *ppVfs i
14b00 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
14b10 6f 0a 2a 2a 20 74 68 65 20 56 46 53 20 74 68 61  o.** the VFS tha
14b20 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
14b30 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74   to open the dat
14b40 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46  abase file. *pzF
14b50 69 6c 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  ile is set to.**
14b60 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
14b70 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
14b80 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
14b90 6c 65 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69  le to open. It i
14ba0 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e  s the .** respon
14bb0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
14bc0 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
14bd0 61 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74 65  ally call sqlite
14be0 33 5f 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65  3_free() to rele
14bf0 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66  ase.** this buff
14c00 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  er..**.** If an 
14c10 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
14c20 65 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  en an SQLite err
14c30 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
14c40 6e 65 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73  ned and *pzErrMs
14c50 67 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20  g.** may be set 
14c60 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
14c70 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
14c80 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  an English langu
14c90 61 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65  age error .** me
14ca0 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65  ssage. It is the
14cb0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
14cc0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
14cd0 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
14ce0 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66  ase.** this buff
14cf0 65 72 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  er by calling sq
14d00 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
14d10 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 72 73  .int sqlite3Pars
14d20 65 55 72 69 28 0a 20 20 63 6f 6e 73 74 20 63 68  eUri(.  const ch
14d30 61 72 20 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c  ar *zDefaultVfs,
14d40 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74          /* VFS t
14d50 6f 20 75 73 65 20 69 66 20 6e 6f 20 22 76 66 73  o use if no "vfs
14d60 3d 78 78 78 22 20 71 75 65 72 79 20 6f 70 74 69  =xxx" query opti
14d70 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
14d80 61 72 20 2a 7a 55 72 69 2c 20 20 20 20 20 20 20  ar *zUri,       
14d90 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74          /* Nul-t
14da0 65 72 6d 69 6e 61 74 65 64 20 55 52 49 20 74 6f  erminated URI to
14db0 20 70 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69   parse */.  unsi
14dc0 67 6e 65 64 20 69 6e 74 20 2a 70 46 6c 61 67 73  gned int *pFlags
14dd0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
14de0 4e 2f 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50  N/OUT: SQLITE_OP
14df0 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  EN_XXX flags */.
14e00 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a    sqlite3_vfs **
14e10 70 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  ppVfs,          
14e20 20 20 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f    /* OUT: VFS to
14e30 20 75 73 65 20 2a 2f 20 0a 20 20 63 68 61 72 20   use */ .  char 
14e40 2a 2a 70 7a 46 69 6c 65 2c 20 20 20 20 20 20 20  **pzFile,       
14e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
14e60 54 3a 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70  T: Filename comp
14e70 6f 6e 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a  onent of URI */.
14e80 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
14e90 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
14ea0 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
14eb0 6d 65 73 73 61 67 65 20 28 69 66 20 72 63 21 3d  message (if rc!=
14ec0 53 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b  SQLITE_OK) */.){
14ed0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14ee0 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65  TE_OK;.  unsigne
14ef0 64 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70  d int flags = *p
14f00 46 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63  Flags;.  const c
14f10 68 61 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66  har *zVfs = zDef
14f20 61 75 6c 74 56 66 73 3b 0a 20 20 63 68 61 72 20  aultVfs;.  char 
14f30 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 63  *zFile;.  char c
14f40 3b 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 73  ;.  int nUri = s
14f50 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
14f60 55 72 69 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  Uri);..  assert(
14f70 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b   *pzErrMsg==0 );
14f80 0a 0a 20 20 69 66 28 20 28 28 66 6c 61 67 73 20  ..  if( ((flags 
14f90 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
14fa0 49 29 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  I)             /
14fb0 2a 20 49 4d 50 3a 20 52 2d 34 38 37 32 35 2d 33  * IMP: R-48725-3
14fc0 32 32 30 36 20 2a 2f 0a 20 20 20 20 20 20 20 20  2206 */.        
14fd0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c      || sqlite3Gl
14fe0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e  obalConfig.bOpen
14ff0 55 72 69 29 20 2f 2a 20 49 4d 50 3a 20 52 2d 35  Uri) /* IMP: R-5
15000 31 36 38 39 2d 34 36 35 34 38 20 2a 2f 0a 20 20  1689-46548 */.  
15010 20 26 26 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d   && nUri>=5 && m
15020 65 6d 63 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c  emcmp(zUri, "fil
15030 65 3a 22 2c 20 35 29 3d 3d 30 20 2f 2a 20 49 4d  e:", 5)==0 /* IM
15040 50 3a 20 52 2d 35 37 38 38 34 2d 33 37 34 39 36  P: R-57884-37496
15050 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 63 68 61   */.  ){.    cha
15060 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74  r *zOpt;.    int
15070 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
15080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
15090 72 73 65 72 20 73 74 61 74 65 20 77 68 65 6e 20  rser state when 
150a0 70 61 72 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20  parsing URI */. 
150b0 20 20 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 20     int iIn;     
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150d0 20 2f 2a 20 49 6e 70 75 74 20 63 68 61 72 61 63   /* Input charac
150e0 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ter index */.   
150f0 20 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20   int iOut = 0;  
15100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15110 2a 20 4f 75 74 70 75 74 20 63 68 61 72 61 63 74  * Output charact
15120 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  er index */.    
15130 75 36 34 20 6e 42 79 74 65 20 3d 20 6e 55 72 69  u64 nByte = nUri
15140 2b 32 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  +2;           /*
15150 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
15160 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a  to allocate */..
15170 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
15180 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   the SQLITE_OPEN
15190 5f 55 52 49 20 66 6c 61 67 20 69 73 20 73 65 74  _URI flag is set
151a0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 6f 20   to indicate to 
151b0 74 68 65 20 56 46 53 20 78 4f 70 65 6e 20 0a 20  the VFS xOpen . 
151c0 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61     ** method tha
151d0 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65  t there may be e
151e0 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 73 20  xtra parameters 
151f0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69  following the fi
15200 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20  le-name.  */.   
15210 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
15220 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20  _OPEN_URI;..    
15230 66 6f 72 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e  for(iIn=0; iIn<n
15240 55 72 69 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74  Uri; iIn++) nByt
15250 65 20 2b 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d  e += (zUri[iIn]=
15260 3d 27 26 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65  ='&');.    zFile
15270 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
15280 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 20 20  c64(nByte);.    
15290 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74  if( !zFile ) ret
152a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
152b0 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 69 49 6e 20  _BKPT;..    iIn 
152c0 3d 20 35 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 5;.#ifdef SQLI
152d0 54 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54  TE_ALLOW_URI_AUT
152e0 48 4f 52 49 54 59 0a 20 20 20 20 69 66 28 20 73  HORITY.    if( s
152f0 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20 22  trncmp(zUri+5, "
15300 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20  ///", 3)==0 ){. 
15310 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20       iIn = 7;.  
15320 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
15330 77 69 6e 67 20 63 6f 6e 64 69 74 69 6f 6e 20 63  wing condition c
15340 61 75 73 65 73 20 55 52 49 73 20 77 69 74 68 20  auses URIs with 
15350 66 69 76 65 20 6c 65 61 64 69 6e 67 20 2f 20 63  five leading / c
15360 68 61 72 61 63 74 65 72 73 0a 20 20 20 20 20 20  haracters.      
15370 2a 2a 20 6c 69 6b 65 20 66 69 6c 65 3a 2f 2f 2f  ** like file:///
15380 2f 2f 68 6f 73 74 2f 70 61 74 68 20 74 6f 20 62  //host/path to b
15390 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
153a0 20 55 4e 43 73 20 6c 69 6b 65 20 2f 2f 68 6f 73   UNCs like //hos
153b0 74 2f 70 61 74 68 2e 0a 20 20 20 20 20 20 2a 2a  t/path..      **
153c0 20 54 68 65 20 63 6f 72 72 65 63 74 20 55 52 49   The correct URI
153d0 20 66 6f 72 20 74 68 61 74 20 55 4e 43 20 68 61   for that UNC ha
153e0 73 20 6f 6e 6c 79 20 74 77 6f 20 6f 72 20 66 6f  s only two or fo
153f0 75 72 20 6c 65 61 64 69 6e 67 20 2f 20 63 68 61  ur leading / cha
15400 72 61 63 74 65 72 73 0a 20 20 20 20 20 20 2a 2a  racters.      **
15410 20 66 69 6c 65 3a 2f 2f 68 6f 73 74 2f 70 61 74   file://host/pat
15420 68 20 6f 72 20 66 69 6c 65 3a 2f 2f 2f 2f 68 6f  h or file:////ho
15430 73 74 2f 70 61 74 68 2e 20 20 42 75 74 20 35 20  st/path.  But 5 
15440 6c 65 61 64 69 6e 67 20 73 6c 61 73 68 65 73 20  leading slashes 
15450 69 73 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63  is a .      ** c
15460 6f 6d 6d 6f 6e 20 65 72 72 6f 72 2c 20 77 65 20  ommon error, we 
15470 61 72 65 20 74 6f 6c 64 2c 20 73 6f 20 77 65 20  are told, so we 
15480 68 61 6e 64 6c 65 20 69 74 20 61 73 20 61 20 73  handle it as a s
15490 70 65 63 69 61 6c 20 63 61 73 65 2e 20 2a 2f 0a  pecial case. */.
154a0 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
154b0 70 28 7a 55 72 69 2b 37 2c 20 22 2f 2f 2f 22 2c  p(zUri+7, "///",
154c0 20 33 29 3d 3d 30 20 29 7b 20 69 49 6e 2b 2b 3b   3)==0 ){ iIn++;
154d0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
154e0 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c   strncmp(zUri+5,
154f0 20 22 2f 2f 6c 6f 63 61 6c 68 6f 73 74 2f 22 2c   "//localhost/",
15500 20 31 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   12)==0 ){.     
15510 20 69 49 6e 20 3d 20 31 36 3b 0a 20 20 20 20 7d   iIn = 16;.    }
15520 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 44 69  .#else.    /* Di
15530 73 63 61 72 64 20 74 68 65 20 73 63 68 65 6d 65  scard the scheme
15540 20 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73   and authority s
15550 65 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55  egments of the U
15560 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  RI. */.    if( z
15570 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a  Uri[5]=='/' && z
15580 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20  Uri[6]=='/' ){. 
15590 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20       iIn = 7;.  
155a0 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b      while( zUri[
155b0 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e  iIn] && zUri[iIn
155c0 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a  ]!='/' ) iIn++;.
155d0 20 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37        if( iIn!=7
155e0 20 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20   && (iIn!=16 || 
155f0 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73  memcmp("localhos
15600 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29  t", &zUri[7], 9)
15610 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a  ) ){.        *pz
15620 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
15630 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69  _mprintf("invali
15640 64 20 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a  d uri authority:
15650 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20   %.*s", .       
15660 20 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72       iIn-7, &zUr
15670 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  i[7]);.        r
15680 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
15690 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
156a0 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20  arse_uri_out;.  
156b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
156c0 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  if..    /* Copy 
156d0 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  the filename and
156e0 20 61 6e 79 20 71 75 65 72 79 20 70 61 72 61 6d   any query param
156f0 65 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 7a  eters into the z
15700 46 69 6c 65 20 62 75 66 66 65 72 2e 20 0a 20 20  File buffer. .  
15710 20 20 2a 2a 20 44 65 63 6f 64 65 20 25 48 48 20    ** Decode %HH 
15720 65 73 63 61 70 65 20 63 6f 64 65 73 20 61 6c 6f  escape codes alo
15730 6e 67 20 74 68 65 20 77 61 79 2e 20 0a 20 20 20  ng the way. .   
15740 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 69   **.    ** Withi
15750 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72  n this loop, var
15760 69 61 62 6c 65 20 65 53 74 61 74 65 20 6d 61 79  iable eState may
15770 20 62 65 20 73 65 74 20 74 6f 20 30 2c 20 31 20   be set to 0, 1 
15780 6f 72 20 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a  or 2, depending.
15790 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61      ** on the pa
157a0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41  rsing context. A
157b0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
157c0 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20 50 61  *.    **   0: Pa
157d0 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e  rsing file-name.
157e0 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20 50 61 72  .    **   1: Par
157f0 73 69 6e 67 20 6e 61 6d 65 20 73 65 63 74 69 6f  sing name sectio
15800 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75  n of a name=valu
15810 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  e query paramete
15820 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20 50  r..    **   2: P
15830 61 72 73 69 6e 67 20 76 61 6c 75 65 20 73 65 63  arsing value sec
15840 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76  tion of a name=v
15850 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d  alue query param
15860 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eter..    */.   
15870 20 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20   eState = 0;.   
15880 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72   while( (c = zUr
15890 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21  i[iIn])!=0 && c!
158a0 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69 49  ='#' ){.      iI
158b0 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63  n++;.      if( c
158c0 3d 3d 27 25 27 20 0a 20 20 20 20 20 20 20 26 26  =='%' .       &&
158d0 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74   sqlite3Isxdigit
158e0 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20  (zUri[iIn]) .   
158f0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73      && sqlite3Is
15900 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b  xdigit(zUri[iIn+
15910 31 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  1]) .      ){.  
15920 20 20 20 20 20 20 69 6e 74 20 6f 63 74 65 74 20        int octet 
15930 3d 20 28 73 71 6c 69 74 65 33 48 65 78 54 6f 49  = (sqlite3HexToI
15940 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20  nt(zUri[iIn++]) 
15950 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6f  << 4);.        o
15960 63 74 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 48  ctet += sqlite3H
15970 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e  exToInt(zUri[iIn
15980 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 61  ++]);..        a
15990 73 73 65 72 74 28 20 6f 63 74 65 74 3e 3d 30 20  ssert( octet>=0 
159a0 26 26 20 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a  && octet<256 );.
159b0 20 20 20 20 20 20 20 20 69 66 28 20 6f 63 74 65          if( octe
159c0 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  t==0 ){.#ifndef 
159d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 52  SQLITE_ENABLE_UR
159e0 49 5f 30 30 5f 45 52 52 4f 52 0a 20 20 20 20 20  I_00_ERROR.     
159f0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
15a00 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
15a10 6e 20 22 25 30 30 22 20 61 70 70 65 61 72 73 20  n "%00" appears 
15a20 77 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20  within the URI. 
15a30 49 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  In this.        
15a40 20 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e    ** case we ign
15a50 6f 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20  ore all text in 
15a60 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
15a70 20 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20   the path, name 
15a80 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
15a90 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20  value currently 
15aa0 62 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f  being parsed. So
15ab0 20 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72   ignore the curr
15ac0 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20 20  ent character.  
15ad0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73          ** and s
15ae0 6b 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  kip to the next 
15af0 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c  "?", "=" or "&",
15b00 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
15b10 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68   */.          wh
15b20 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69  ile( (c = zUri[i
15b30 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23  In])!=0 && c!='#
15b40 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
15b50 20 26 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c   && (eState!=0 |
15b60 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20  | c!='?').      
15b70 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
15b80 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27  te!=1 || (c!='='
15b90 20 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20   && c!='&')).   
15ba0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65             && (e
15bb0 53 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27  State!=2 || c!='
15bc0 26 27 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  &').          ){
15bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e  .            iIn
15be0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
15bf0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
15c00 75 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  ue;.#else.      
15c10 20 20 20 20 2f 2a 20 49 66 20 45 4e 41 42 4c 45      /* If ENABLE
15c20 5f 55 52 49 5f 30 30 5f 45 52 52 4f 52 20 69 73  _URI_00_ERROR is
15c30 20 64 65 66 69 6e 65 64 2c 20 22 25 30 30 22 20   defined, "%00" 
15c40 69 6e 20 61 20 55 52 49 20 69 73 20 61 6e 20 65  in a URI is an e
15c50 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  rror. */.       
15c60 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
15c70 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
15c80 75 6e 65 78 70 65 63 74 65 64 20 25 25 30 30 20  unexpected %%00 
15c90 69 6e 20 75 72 69 22 29 3b 0a 20 20 20 20 20 20  in uri");.      
15ca0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15cb0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
15cc0 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
15cd0 6f 75 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  out;.#endif.    
15ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20      }.        c 
15cf0 3d 20 6f 63 74 65 74 3b 0a 20 20 20 20 20 20 7d  = octet;.      }
15d00 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 3d  else if( eState=
15d10 3d 31 20 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c  =1 && (c=='&' ||
15d20 20 63 3d 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20   c=='=') ){.    
15d30 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f      if( zFile[iO
15d40 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ut-1]==0 ){.    
15d50 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74        /* An empt
15d60 79 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49  y option name. I
15d70 67 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f  gnore this optio
15d80 6e 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f  n altogether. */
15d90 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
15da0 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a  ( zUri[iIn] && z
15db0 55 72 69 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26  Uri[iIn]!='#' &&
15dc0 20 7a 55 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26   zUri[iIn-1]!='&
15dd0 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20  ' ) iIn++;.     
15de0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
15df0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15e00 20 69 66 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20   if( c=='&' ){. 
15e10 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 5b 69           zFile[i
15e20 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20  Out++] = '\0';. 
15e30 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
15e40 20 20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d          eState =
15e50 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   2;.        }.  
15e60 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
15e70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 65 53     }else if( (eS
15e80 74 61 74 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f  tate==0 && c=='?
15e90 27 29 20 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32  ') || (eState==2
15ea0 20 26 26 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20   && c=='&') ){. 
15eb0 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20         c = 0;.  
15ec0 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 31        eState = 1
15ed0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15ee0 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
15ef0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
15f00 20 65 53 74 61 74 65 3d 3d 31 20 29 20 7a 46 69   eState==1 ) zFi
15f10 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30  le[iOut++] = '\0
15f20 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75  ';.    zFile[iOu
15f30 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  t++] = '\0';.   
15f40 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
15f50 20 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43   '\0';..    /* C
15f60 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 77 65  heck if there we
15f70 72 65 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73  re any options s
15f80 70 65 63 69 66 69 65 64 20 74 68 61 74 20 73 68  pecified that sh
15f90 6f 75 6c 64 20 62 65 20 69 6e 74 65 72 70 72 65  ould be interpre
15fa0 74 65 64 20 0a 20 20 20 20 2a 2a 20 68 65 72 65  ted .    ** here
15fb0 2e 20 4f 70 74 69 6f 6e 73 20 74 68 61 74 20 61  . Options that a
15fc0 72 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 68  re interpreted h
15fd0 65 72 65 20 69 6e 63 6c 75 64 65 20 22 76 66 73  ere include "vfs
15fe0 22 20 61 6e 64 20 74 68 6f 73 65 20 74 68 61 74  " and those that
15ff0 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f  .    ** correspo
16000 6e 64 20 74 6f 20 66 6c 61 67 73 20 74 68 61 74  nd to flags that
16010 20 6d 61 79 20 62 65 20 70 61 73 73 65 64 20 74   may be passed t
16020 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 70  o the sqlite3_op
16030 65 6e 5f 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d  en_v2().    ** m
16040 65 74 68 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f  ethod. */.    zO
16050 70 74 20 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69  pt = &zFile[sqli
16060 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
16070 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65  e)+1];.    while
16080 28 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20  ( zOpt[0] ){.   
16090 20 20 20 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71     int nOpt = sq
160a0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f  lite3Strlen30(zO
160b0 70 74 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  pt);.      char 
160c0 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f  *zVal = &zOpt[nO
160d0 70 74 2b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74  pt+1];.      int
160e0 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 53   nVal = sqlite3S
160f0 74 72 6c 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a  trlen30(zVal);..
16100 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d        if( nOpt==
16110 33 20 26 26 20 6d 65 6d 63 6d 70 28 22 76 66 73  3 && memcmp("vfs
16120 22 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29  ", zOpt, 3)==0 )
16130 7b 0a 20 20 20 20 20 20 20 20 7a 56 66 73 20 3d  {.        zVfs =
16140 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c   zVal;.      }el
16150 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75  se{.        stru
16160 63 74 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20  ct OpenMode {.  
16170 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
16180 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20  ar *z;.         
16190 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20   int mode;.     
161a0 20 20 20 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b     } *aMode = 0;
161b0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
161c0 4d 6f 64 65 54 79 70 65 20 3d 20 30 3b 0a 20 20  ModeType = 0;.  
161d0 20 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d        int mask =
161e0 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
161f0 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20  limit = 0;..    
16200 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20      if( nOpt==5 
16210 26 26 20 6d 65 6d 63 6d 70 28 22 63 61 63 68 65  && memcmp("cache
16220 22 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29  ", zOpt, 5)==0 )
16230 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
16240 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f  ic struct OpenMo
16250 64 65 20 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20  de aCacheMode[] 
16260 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  = {.            
16270 7b 20 22 73 68 61 72 65 64 22 2c 20 20 53 51 4c  { "shared",  SQL
16280 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
16290 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20  ACHE },.        
162a0 20 20 20 20 7b 20 22 70 72 69 76 61 74 65 22 2c      { "private",
162b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49   SQLITE_OPEN_PRI
162c0 56 41 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20  VATECACHE },.   
162d0 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20           { 0, 0 
162e0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a  }.          };..
162f0 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d            mask =
16300 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
16310 52 45 44 43 41 43 48 45 7c 53 51 4c 49 54 45 5f  REDCACHE|SQLITE_
16320 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
16330 45 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f  E;.          aMo
16340 64 65 20 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b  de = aCacheMode;
16350 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74  .          limit
16360 20 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20   = mask;.       
16370 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22     zModeType = "
16380 63 61 63 68 65 22 3b 0a 20 20 20 20 20 20 20 20  cache";.        
16390 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f  }.        if( nO
163a0 70 74 3d 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28  pt==4 && memcmp(
163b0 22 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29  "mode", zOpt, 4)
163c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
163d0 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f   static struct O
163e0 70 65 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64  penMode aOpenMod
163f0 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
16400 20 20 20 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c      { "ro",  SQL
16410 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
16420 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Y },.           
16430 20 7b 20 22 72 77 22 2c 20 20 53 51 4c 49 54 45   { "rw",  SQLITE
16440 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
16450 7d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  }, .            
16460 7b 20 22 72 77 63 22 2c 20 53 51 4c 49 54 45 5f  { "rwc", SQLITE_
16470 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
16480 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
16490 41 54 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  ATE },.         
164a0 20 20 20 7b 20 22 6d 65 6d 6f 72 79 22 2c 20 53     { "memory", S
164b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
164c0 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Y },.           
164d0 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20   { 0, 0 }.      
164e0 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20      };..        
164f0 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f    mask = SQLITE_
16500 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20  OPEN_READONLY | 
16510 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16520 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 20 20  WRITE.          
16530 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
16540 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20  E_OPEN_CREATE | 
16550 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
16560 52 59 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d  RY;.          aM
16570 6f 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b  ode = aOpenMode;
16580 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74  .          limit
16590 20 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b   = mask & flags;
165a0 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65  .          zMode
165b0 54 79 70 65 20 3d 20 22 61 63 63 65 73 73 22 3b  Type = "access";
165c0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
165d0 20 20 20 20 69 66 28 20 61 4d 6f 64 65 20 29 7b      if( aMode ){
165e0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
165f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
16600 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  mode = 0;.      
16610 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f      for(i=0; aMo
16620 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20  de[i].z; i++){. 
16630 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
16640 20 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65   char *z = aMode
16650 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20  [i].z;.         
16660 20 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c     if( nVal==sql
16670 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
16680 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61  && 0==memcmp(zVa
16690 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20  l, z, nVal) ){. 
166a0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64               mod
166b0 65 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64  e = aMode[i].mod
166c0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
166d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
166e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
166f0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
16700 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mode==0 ){.     
16710 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67         *pzErrMsg
16720 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
16730 74 66 28 22 6e 6f 20 73 75 63 68 20 25 73 20 6d  tf("no such %s m
16740 6f 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54  ode: %s", zModeT
16750 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20  ype, zVal);.    
16760 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
16770 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
16780 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73         goto pars
16790 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20  e_uri_out;.     
167a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
167b0 20 69 66 28 20 28 6d 6f 64 65 20 26 20 7e 53 51   if( (mode & ~SQ
167c0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
167d0 29 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  )>limit ){.     
167e0 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67         *pzErrMsg
167f0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
16800 74 66 28 22 25 73 20 6d 6f 64 65 20 6e 6f 74 20  tf("%s mode not 
16810 61 6c 6c 6f 77 65 64 3a 20 25 73 22 2c 0a 20 20  allowed: %s",.  
16820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16840 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 2c        zModeType,
16850 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20   zVal);.        
16860 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16870 50 45 52 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  PERM;.          
16880 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69    goto parse_uri
16890 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20  _out;.          
168a0 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  }.          flag
168b0 73 20 3d 20 28 66 6c 61 67 73 20 26 20 7e 6d 61  s = (flags & ~ma
168c0 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20 20 20 20  sk) | mode;.    
168d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
168e0 20 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 56 61       zOpt = &zVa
168f0 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d  l[nVal+1];.    }
16900 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ..  }else{.    z
16910 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
16920 61 6c 6c 6f 63 36 34 28 6e 55 72 69 2b 32 29 3b  alloc64(nUri+2);
16930 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20  .    if( !zFile 
16940 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
16950 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
16960 69 66 28 20 6e 55 72 69 20 29 7b 0a 20 20 20 20  if( nUri ){.    
16970 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20    memcpy(zFile, 
16980 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20  zUri, nUri);.   
16990 20 7d 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72   }.    zFile[nUr
169a0 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a  i] = '\0';.    z
169b0 46 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27  File[nUri+1] = '
169c0 5c 30 27 3b 0a 20 20 20 20 66 6c 61 67 73 20 26  \0';.    flags &
169d0 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  = ~SQLITE_OPEN_U
169e0 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66  RI;.  }..  *ppVf
169f0 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  s = sqlite3_vfs_
16a00 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66  find(zVfs);.  if
16a10 28 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20  ( *ppVfs==0 ){. 
16a20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
16a30 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
16a40 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73 22  no such vfs: %s"
16a50 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20  , zVfs);.    rc 
16a60 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
16a70 20 20 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f    }. parse_uri_o
16a80 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
16a90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
16aa0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c  qlite3_free(zFil
16ab0 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20  e);.    zFile = 
16ac0 30 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73  0;.  }.  *pFlags
16ad0 20 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46   = flags;.  *pzF
16ae0 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72  ile = zFile;.  r
16af0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
16b00 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
16b10 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f   does the work o
16b20 66 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61  f opening a data
16b30 62 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f  base on behalf o
16b40 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  f.** sqlite3_ope
16b50 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  n() and sqlite3_
16b60 6f 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61  open16(). The da
16b70 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
16b80 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a  "zFilename"  .**
16b90 20 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65   is UTF-8 encode
16ba0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
16bb0 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20   openDatabase(. 
16bc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
16bd0 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62  lename, /* Datab
16be0 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46  ase filename UTF
16bf0 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20  -8 encoded */.  
16c00 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20  sqlite3 **ppDb, 
16c10 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
16c20 65 74 75 72 6e 65 64 20 64 61 74 61 62 61 73 65  eturned database
16c30 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73   handle */.  uns
16c40 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c  igned int flags,
16c50 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e      /* Operation
16c60 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  al flags */.  co
16c70 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
16c80 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
16c90 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a  the VFS to use *
16ca0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
16cb0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
16cc0 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
16cd0 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65  allocated handle
16ce0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72   here */.  int r
16cf0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
16d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
16d10 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
16d20 6e 74 20 69 73 54 68 72 65 61 64 73 61 66 65 3b  nt isThreadsafe;
16d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16d40 2a 20 54 72 75 65 20 66 6f 72 20 74 68 72 65 61  * True for threa
16d50 64 73 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  dsafe connection
16d60 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70  s */.  char *zOp
16d70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  en = 0;         
16d80 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61         /* Filena
16d90 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70  me argument to p
16da0 61 73 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e  ass to BtreeOpen
16db0 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  () */.  char *zE
16dc0 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20  rrMsg = 0;      
16dd0 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
16de0 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71   message from sq
16df0 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 29 20  lite3ParseUri() 
16e00 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
16e10 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
16e20 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30  OR.  if( ppDb==0
16e30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
16e40 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
16e50 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30  ndif.  *ppDb = 0
16e60 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
16e70 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
16e80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e   rc = sqlite3_in
16e90 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66  itialize();.  if
16ea0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
16eb0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f  ;.#endif..  /* O
16ec0 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62  nly allow sensib
16ed0 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  le combinations 
16ee0 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 66  of bits in the f
16ef0 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 2e 20 20  lags argument.  
16f00 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65  .  ** Throw an e
16f10 72 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d  rror if any non-
16f20 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f  sense combinatio
16f30 6e 20 69 73 20 75 73 65 64 2e 20 20 49 66 20 77  n is used.  If w
16f40 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c  e.  ** do not bl
16f50 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62  ock illegal comb
16f60 69 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c 20 69  inations here, i
16f70 74 20 63 6f 75 6c 64 20 74 72 69 67 67 65 72 0a  t could trigger.
16f80 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 73 74    ** assert() st
16f90 61 74 65 6d 65 6e 74 73 20 69 6e 20 64 65 65 70  atements in deep
16fa0 65 72 20 6c 61 79 65 72 73 2e 20 20 53 65 6e 73  er layers.  Sens
16fb0 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ible combination
16fc0 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a  s.  ** are:.  **
16fd0 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54  .  **  1:  SQLIT
16fe0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a  E_OPEN_READONLY.
16ff0 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54 45    **  2:  SQLITE
17000 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a  _OPEN_READWRITE.
17010 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54 45    **  6:  SQLITE
17020 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
17030 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
17040 45 41 54 45 0a 20 20 2a 2f 0a 20 20 61 73 73 65  EATE.  */.  asse
17050 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  rt( SQLITE_OPEN_
17060 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78 30  READONLY  == 0x0
17070 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  1 );.  assert( S
17080 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
17090 52 49 54 45 20 3d 3d 20 30 78 30 32 20 29 3b 0a  RITE == 0x02 );.
170a0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
170b0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 20 20 20  _OPEN_CREATE    
170c0 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20 74 65 73  == 0x04 );.  tes
170d0 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67  tcase( (1<<(flag
170e0 73 26 37 29 29 3d 3d 30 78 30 32 20 29 3b 20 2f  s&7))==0x02 ); /
170f0 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20  * READONLY */.  
17100 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
17110 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 34 20 29  lags&7))==0x04 )
17120 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 2a  ; /* READWRITE *
17130 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31  /.  testcase( (1
17140 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78  <<(flags&7))==0x
17150 34 30 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49  40 ); /* READWRI
17160 54 45 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a 20  TE | CREATE */. 
17170 20 69 66 28 20 28 28 31 3c 3c 28 66 6c 61 67 73   if( ((1<<(flags
17180 26 37 29 29 20 26 20 30 78 34 36 29 3d 3d 30 20  &7)) & 0x46)==0 
17190 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
171a0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
171b0 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 35 34  ;  /* IMP: R-654
171c0 39 37 2d 34 34 35 39 34 20 2a 2f 0a 20 20 7d 0a  97-44594 */.  }.
171d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
171e0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
171f0 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Mutex==0 ){.    
17200 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30  isThreadsafe = 0
17210 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
17220 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
17230 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20  N_NOMUTEX ){.   
17240 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
17250 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  0;.  }else if( f
17260 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
17270 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a  EN_FULLMUTEX ){.
17280 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
17290 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
172a0 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
172b0 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
172c0 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
172d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
172e0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
172f0 50 52 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a  PRIVATECACHE ){.
17300 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
17310 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
17320 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69  CACHE;.  }else i
17330 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
17340 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
17350 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20  heEnabled ){.   
17360 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
17370 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
17380 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d  E;.  }..  /* Rem
17390 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73  ove harmful bits
173a0 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20   from the flags 
173b0 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20  parameter.  **. 
173c0 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f   ** The SQLITE_O
173d0 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20  PEN_NOMUTEX and 
173e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
173f0 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65 72 65  MUTEX flags were
17400 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68  .  ** dealt with
17410 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
17420 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65   code block.  Be
17430 73 69 64 65 73 20 74 68 65 73 65 2c 20 74 68 65  sides these, the
17440 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64   only.  ** valid
17450 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72   input flags for
17460 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
17470 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50  () are SQLITE_OP
17480 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a  EN_READONLY,.  *
17490 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  * SQLITE_OPEN_RE
174a0 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f  ADWRITE, SQLITE_
174b0 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c  OPEN_CREATE, SQL
174c0 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
174d0 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54  ACHE,.  ** SQLIT
174e0 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
174f0 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65  CHE, and some re
17500 73 65 72 76 65 64 20 62 69 74 73 2e 20 20 53 69  served bits.  Si
17510 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a  lently mask.  **
17520 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66   off all other f
17530 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61  lags..  */.  fla
17540 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45  gs &=  ~( SQLITE
17550 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
17560 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  OSE |.          
17570 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
17580 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20  _EXCLUSIVE |.   
17590 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
175a0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
175b0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
175c0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
175d0 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20  P_DB | .        
175e0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
175f0 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
17600 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
17610 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
17620 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  IN_JOURNAL | .  
17630 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
17640 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
17650 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20  URNAL | .       
17660 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
17670 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c  PEN_SUBJOURNAL |
17680 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
17690 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53   SQLITE_OPEN_MAS
176a0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20  TER_JOURNAL |.  
176b0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
176c0 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
176d0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
176e0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55    SQLITE_OPEN_FU
176f0 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20  LLMUTEX |.      
17700 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
17710 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20  OPEN_WAL.       
17720 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41        );..  /* A
17730 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
17740 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  te data structur
17750 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69  e */.  db = sqli
17760 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
17770 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29  izeof(sqlite3) )
17780 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20  ;.  if( db==0 ) 
17790 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
177a0 0a 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73  .  if( isThreads
177b0 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  afe ){.    db->m
177c0 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
177d0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
177e0 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29  MUTEX_RECURSIVE)
177f0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75  ;.    if( db->mu
17800 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
17810 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29  sqlite3_free(db)
17820 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a  ;.      db = 0;.
17830 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64        goto opend
17840 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  b_out;.    }.  }
17850 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
17860 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
17870 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b  );.  db->errMask
17880 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e   = 0xff;.  db->n
17890 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61  Db = 2;.  db->ma
178a0 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
178b0 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61  IC_BUSY;.  db->a
178c0 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74  Db = db->aDbStat
178d0 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ic;..  assert( s
178e0 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74  izeof(db->aLimit
178f0 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c  )==sizeof(aHardL
17900 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70  imit) );.  memcp
17910 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48  y(db->aLimit, aH
17920 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66  ardLimit, sizeof
17930 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20  (db->aLimit));. 
17940 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
17950 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
17960 54 48 52 45 41 44 53 5d 20 3d 20 53 51 4c 49 54  THREADS] = SQLIT
17970 45 5f 44 45 46 41 55 4c 54 5f 57 4f 52 4b 45 52  E_DEFAULT_WORKER
17980 5f 54 48 52 45 41 44 53 3b 0a 20 20 64 62 2d 3e  _THREADS;.  db->
17990 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
179a0 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61    db->nextAutova
179b0 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a  c = -1;.  db->sz
179c0 4d 6d 61 70 20 3d 20 73 71 6c 69 74 65 33 47 6c  Mmap = sqlite3Gl
179d0 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61  obalConfig.szMma
179e0 70 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67  p;.  db->nextPag
179f0 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d  esize = 0;.  db-
17a00 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20  >nMaxSorterMmap 
17a10 3d 20 30 78 37 46 46 46 46 46 46 46 3b 0a 20 20  = 0x7FFFFFFF;.  
17a20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
17a30 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
17a40 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c  s | SQLITE_Enabl
17a50 65 54 72 69 67 67 65 72 20 7c 20 53 51 4c 49 54  eTrigger | SQLIT
17a60 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a 23 69 66  E_CacheSpill.#if
17a70 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
17a80 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54  _DEFAULT_AUTOMAT
17a90 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51 4c  IC_INDEX) || SQL
17aa0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
17ab0 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20  MATIC_INDEX.    
17ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
17ad0 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a  QLITE_AutoIndex.
17ae0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
17af0 45 5f 44 45 46 41 55 4c 54 5f 43 4b 50 54 46 55  E_DEFAULT_CKPTFU
17b00 4c 4c 46 53 59 4e 43 0a 20 20 20 20 20 20 20 20  LLFSYNC.        
17b10 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
17b20 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63 0a  E_CkptFullFSync.
17b30 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
17b40 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46  E_DEFAULT_FILE_F
17b50 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20  ORMAT<4.        
17b60 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
17b70 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a  E_LegacyFileFmt.
17b80 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
17b90 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44  LITE_ENABLE_LOAD
17ba0 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20  _EXTENSION.     
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
17bc0 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69  LITE_LoadExtensi
17bd0 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  on.#endif.#if SQ
17be0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43  LITE_DEFAULT_REC
17bf0 55 52 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a  URSIVE_TRIGGERS.
17c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c10 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69   | SQLITE_RecTri
17c20 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66  ggers.#endif.#if
17c30 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
17c40 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f  DEFAULT_FOREIGN_
17c50 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f  KEYS) && SQLITE_
17c60 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f  DEFAULT_FOREIGN_
17c70 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20 20 20  KEYS.           
17c80 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46        | SQLITE_F
17c90 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69  oreignKeys.#endi
17ca0 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
17cb0 4c 49 54 45 5f 52 45 56 45 52 53 45 5f 55 4e 4f  LITE_REVERSE_UNO
17cc0 52 44 45 52 45 44 5f 53 45 4c 45 43 54 53 29 0a  RDERED_SELECTS).
17cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ce0 20 7c 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73   | SQLITE_Revers
17cf0 65 4f 72 64 65 72 0a 23 65 6e 64 69 66 0a 23 69  eOrder.#endif.#i
17d00 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
17d10 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
17d20 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20  _CELL_CHECK).   
17d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
17d40 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43  SQLITE_CellSizeC
17d50 6b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  k.#endif.#if def
17d60 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
17d70 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45  LE_FTS3_TOKENIZE
17d80 52 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  R).             
17d90 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 74 73      | SQLITE_Fts
17da0 33 54 6f 6b 65 6e 69 7a 65 72 0a 23 65 6e 64 69  3Tokenizer.#endi
17db0 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69  f.      ;.  sqli
17dc0 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d  te3HashInit(&db-
17dd0 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e  >aCollSeq);.#ifn
17de0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17df0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73  VIRTUALTABLE.  s
17e00 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
17e10 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65  db->aModule);.#e
17e20 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74  ndif..  /* Add t
17e30 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
17e40 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49  tion sequence BI
17e50 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72  NARY. BINARY wor
17e60 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d  ks for both UTF-
17e70 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31  8.  ** and UTF-1
17e80 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72 73  6, so add a vers
17e90 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20  ion for each to 
17ea0 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65  avoid any unnece
17eb0 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65  ssary.  ** conve
17ec0 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79  rsions. The only
17ed0 20 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20   error that can 
17ee0 6f 63 63 75 72 20 68 65 72 65 20 69 73 20 61 20  occur here is a 
17ef0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
17f00 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 56 49 44  ..  **.  ** EVID
17f10 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32 37 38 36  ENCE-OF: R-52786
17f20 2d 34 34 38 37 38 20 53 51 4c 69 74 65 20 64 65  -44878 SQLite de
17f30 66 69 6e 65 73 20 74 68 72 65 65 20 62 75 69 6c  fines three buil
17f40 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20  t-in collating. 
17f50 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 20   ** functions:. 
17f60 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c   */.  createColl
17f70 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65  ation(db, sqlite
17f80 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51 4c 49  3StrBINARY, SQLI
17f90 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43  TE_UTF8, 0, binC
17fa0 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
17fb0 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
17fc0 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e  b, sqlite3StrBIN
17fd0 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  ARY, SQLITE_UTF1
17fe0 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46  6BE, 0, binCollF
17ff0 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
18000 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73  eCollation(db, s
18010 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c  qlite3StrBINARY,
18020 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
18030 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c   0, binCollFunc,
18040 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
18050 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41  lation(db, "NOCA
18060 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  SE", SQLITE_UTF8
18070 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61  , 0, nocaseColla
18080 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 20 20  tingFunc, 0);.  
18090 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
180a0 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c  db, "RTRIM", SQL
180b0 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a  ITE_UTF8, (void*
180c0 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c  )1, binCollFunc,
180d0 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   0);.  if( db->m
180e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
180f0 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
18100 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20 45 56 49  ut;.  }.  /* EVI
18110 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 33 30  DENCE-OF: R-0830
18120 38 2d 31 37 32 32 34 20 54 68 65 20 64 65 66 61  8-17224 The defa
18130 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  ult collating fu
18140 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 0a 20  nction for all. 
18150 20 2a 2a 20 73 74 72 69 6e 67 73 20 69 73 20 42   ** strings is B
18160 49 4e 41 52 59 2e 20 0a 20 20 2a 2f 0a 20 20 64  INARY. .  */.  d
18170 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73  b->pDfltColl = s
18180 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
18190 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46  q(db, SQLITE_UTF
181a0 38 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e  8, sqlite3StrBIN
181b0 41 52 59 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ARY, 0);.  asser
181c0 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  t( db->pDfltColl
181d0 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72  !=0 );..  /* Par
181e0 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f  se the filename/
181f0 55 52 49 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f  URI argument. */
18200 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73  .  db->openFlags
18210 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63 20 3d   = flags;.  rc =
18220 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69   sqlite3ParseUri
18230 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (zVfs, zFilename
18240 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70  , &flags, &db->p
18250 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45  Vfs, &zOpen, &zE
18260 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63  rrMsg);.  if( rc
18270 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18280 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18290 45 5f 4e 4f 4d 45 4d 20 29 20 73 71 6c 69 74 65  E_NOMEM ) sqlite
182a0 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20  3OomFault(db);. 
182b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
182c0 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 7a  ithMsg(db, rc, z
182d0 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20  ErrMsg ? "%s" : 
182e0 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  0, zErrMsg);.   
182f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
18300 72 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f 74 6f  rrMsg);.    goto
18310 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
18320 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
18330 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61 73 65  backend database
18340 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72 63 20   driver */.  rc 
18350 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  = sqlite3BtreeOp
18360 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a 4f 70  en(db->pVfs, zOp
18370 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61 44 62  en, db, &db->aDb
18380 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20 20 20  [0].pBt, 0,.    
18390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183a0 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51 4c 49      flags | SQLI
183b0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
183c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
183d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
183e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
183f0 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  R_NOMEM ){.     
18400 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
18410 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
18420 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
18430 64 62 2c 20 72 63 29 3b 0a 20 20 20 20 67 6f 74  db, rc);.    got
18440 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
18450 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
18460 45 6e 74 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d  Enter(db->aDb[0]
18470 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62  .pBt);.  db->aDb
18480 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71  [0].pSchema = sq
18490 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64  lite3SchemaGet(d
184a0 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  b, db->aDb[0].pB
184b0 74 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  t);.  if( !db->m
184c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 45 4e  allocFailed ) EN
184d0 43 28 64 62 29 20 3d 20 53 43 48 45 4d 41 5f 45  C(db) = SCHEMA_E
184e0 4e 43 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  NC(db);.  sqlite
184f0 33 42 74 72 65 65 4c 65 61 76 65 28 64 62 2d 3e  3BtreeLeave(db->
18500 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64  aDb[0].pBt);.  d
18510 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
18520 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  a = sqlite3Schem
18530 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a 20 20  aGet(db, 0);..  
18540 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73  /* The default s
18550 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20  afety_level for 
18560 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
18570 65 20 69 73 20 46 55 4c 4c 3b 20 66 6f 72 20 74  e is FULL; for t
18580 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74  he temp.  ** dat
18590 61 62 61 73 65 20 69 74 20 69 73 20 4f 46 46 2e  abase it is OFF.
185a0 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
185b0 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64 65  e pager layer de
185c0 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20  faults.  .  */. 
185d0 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62 53   db->aDb[0].zDbS
185e0 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  Name = "main";. 
185f0 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65   db->aDb[0].safe
18600 74 79 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54  ty_level = SQLIT
18610 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52  E_DEFAULT_SYNCHR
18620 4f 4e 4f 55 53 2b 31 3b 0a 20 20 64 62 2d 3e 61  ONOUS+1;.  db->a
18630 44 62 5b 31 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d  Db[1].zDbSName =
18640 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61   "temp";.  db->a
18650 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76  Db[1].safety_lev
18660 65 6c 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 48  el = PAGER_SYNCH
18670 52 4f 4e 4f 55 53 5f 4f 46 46 3b 0a 0a 20 20 64  RONOUS_OFF;..  d
18680 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
18690 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20  E_MAGIC_OPEN;.  
186a0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
186b0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
186c0 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
186d0 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  ..  /* Register 
186e0 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e  all built-in fun
186f0 63 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e  ctions, but do n
18700 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ot attempt to re
18710 61 64 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  ad the.  ** data
18720 62 61 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e  base schema yet.
18730 20 54 68 69 73 20 69 73 20 64 65 6c 61 79 65 64   This is delayed
18740 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
18750 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61   time the databa
18760 73 65 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73  se.  ** is acces
18770 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  sed..  */.  sqli
18780 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
18790 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74  ITE_OK);.  sqlit
187a0 65 33 52 65 67 69 73 74 65 72 50 65 72 43 6f 6e  e3RegisterPerCon
187b0 6e 65 63 74 69 6f 6e 42 75 69 6c 74 69 6e 46 75  nectionBuiltinFu
187c0 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 20 20 72  nctions(db);.  r
187d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
187e0 6f 64 65 28 64 62 29 3b 0a 0a 23 69 66 64 65 66  ode(db);..#ifdef
187f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
18800 54 53 35 0a 20 20 2f 2a 20 52 65 67 69 73 74 65  TS5.  /* Registe
18810 72 20 61 6e 79 20 62 75 69 6c 74 2d 69 6e 20 46  r any built-in F
18820 54 53 35 20 6d 6f 64 75 6c 65 20 62 65 66 6f 72  TS5 module befor
18830 65 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 61 75  e loading the au
18840 74 6f 6d 61 74 69 63 0a 20 20 2a 2a 20 65 78 74  tomatic.  ** ext
18850 65 6e 73 69 6f 6e 73 2e 20 54 68 69 73 20 61 6c  ensions. This al
18860 6c 6f 77 73 20 61 75 74 6f 6d 61 74 69 63 20 65  lows automatic e
18870 78 74 65 6e 73 69 6f 6e 73 20 74 6f 20 72 65 67  xtensions to reg
18880 69 73 74 65 72 20 46 54 53 35 20 0a 20 20 2a 2a  ister FTS5 .  **
18890 20 74 6f 6b 65 6e 69 7a 65 72 73 20 61 6e 64 20   tokenizers and 
188a0 61 75 78 69 6c 69 61 72 79 20 66 75 6e 63 74 69  auxiliary functi
188b0 6f 6e 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21  ons.  */.  if( !
188c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
188d0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
188e0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
188f0 6c 69 74 65 33 46 74 73 35 49 6e 69 74 28 64 62  lite3Fts5Init(db
18900 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
18910 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74   /* Load automat
18920 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20  ic extensions - 
18930 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20  extensions that 
18940 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73 74  have been regist
18950 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20  ered.  ** using 
18960 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f  the sqlite3_auto
18970 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28  matic_extension(
18980 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 69 66  ) API..  */.  if
18990 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
189a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75  ){.    sqlite3Au
189b0 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73  toLoadExtensions
189c0 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  (db);.    rc = s
189d0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
189e0 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  b);.    if( rc!=
189f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18a00 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
18a10 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  ut;.    }.  }..#
18a20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
18a30 42 4c 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21  BLE_FTS1.  if( !
18a40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18a50 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69   ){.    extern i
18a60 6e 74 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e  nt sqlite3Fts1In
18a70 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  it(sqlite3*);.  
18a80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
18a90 73 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s1Init(db);.  }.
18aa0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
18ab0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
18ac0 32 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  2.  if( !db->mal
18ad0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
18ae0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18af0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
18b00 69 74 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c  ite3Fts2Init(sql
18b10 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d  ite3*);.    rc =
18b20 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74   sqlite3Fts2Init
18b30 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
18b40 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
18b50 45 4e 41 42 4c 45 5f 46 54 53 33 20 2f 2a 20 61  ENABLE_FTS3 /* a
18b60 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 66  utomatically def
18b70 69 6e 65 64 20 62 79 20 53 51 4c 49 54 45 5f 45  ined by SQLITE_E
18b80 4e 41 42 4c 45 5f 46 54 53 34 20 2a 2f 0a 20 20  NABLE_FTS4 */.  
18b90 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
18ba0 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
18bb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
18bc0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e   = sqlite3Fts3In
18bd0 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
18be0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
18bf0 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69  E_ENABLE_ICU.  i
18c00 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
18c10 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
18c20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
18c30 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74  = sqlite3IcuInit
18c40 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
18c50 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
18c60 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20 69  ENABLE_RTREE.  i
18c70 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
18c80 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
18c90 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d  TE_OK){.    rc =
18ca0 20 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69   sqlite3RtreeIni
18cb0 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
18cc0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
18cd0 5f 45 4e 41 42 4c 45 5f 44 42 53 54 41 54 5f 56  _ENABLE_DBSTAT_V
18ce0 54 41 42 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TAB.  if( !db->m
18cf0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
18d00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20  c==SQLITE_OK){. 
18d10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 44     rc = sqlite3D
18d20 62 73 74 61 74 52 65 67 69 73 74 65 72 28 64 62  bstatRegister(db
18d30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
18d40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
18d50 42 4c 45 5f 4a 53 4f 4e 31 0a 20 20 69 66 28 20  BLE_JSON1.  if( 
18d60 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
18d70 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
18d80 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  OK){.    rc = sq
18d90 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28 64  lite3Json1Init(d
18da0 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
18db0 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45    /* -DSQLITE_DE
18dc0 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
18dd0 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55  DE=1 makes EXCLU
18de0 53 49 56 45 20 74 68 65 20 64 65 66 61 75 6c 74  SIVE the default
18df0 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f   locking.  ** mo
18e00 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45  de.  -DSQLITE_DE
18e10 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
18e20 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c  DE=0 make NORMAL
18e30 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   the default loc
18e40 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20  king.  ** mode. 
18e50 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61   Doing nothing a
18e60 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73  t all also makes
18e70 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61   NORMAL the defa
18e80 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ult..  */.#ifdef
18e90 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
18ea0 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64  LOCKING_MODE.  d
18eb0 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20  b->dfltLockMode 
18ec0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
18ed0 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20  _LOCKING_MODE;. 
18ee0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
18ef0 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33  kingMode(sqlite3
18f00 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61  BtreePager(db->a
18f10 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20  Db[0].pBt),.    
18f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f30 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46        SQLITE_DEF
18f40 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
18f50 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  E);.#endif..  if
18f60 28 20 72 63 20 29 20 73 71 6c 69 74 65 33 45 72  ( rc ) sqlite3Er
18f70 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20  ror(db, rc);..  
18f80 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f  /* Enable the lo
18f90 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73  okaside-malloc s
18fa0 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65  ubsystem */.  se
18fb0 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c  tupLookaside(db,
18fc0 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   0, sqlite3Globa
18fd0 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73  lConfig.szLookas
18fe0 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
19000 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
19010 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20  .nLookaside);.. 
19020 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
19030 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  ocheckpoint(db, 
19040 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
19050 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e  AL_AUTOCHECKPOIN
19060 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a  T);..opendb_out:
19070 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20  .  if( db ){.   
19080 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74   assert( db->mut
19090 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61  ex!=0 || isThrea
190a0 64 73 61 66 65 3d 3d 30 0a 20 20 20 20 20 20 20  dsafe==0.       
190b0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c      || sqlite3Gl
190c0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
190d0 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Mutex==0 );.    
190e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
190f0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
19100 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
19110 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
19120 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
19130 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
19140 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  MEM );.  if( rc=
19150 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
19160 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
19170 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d  se(db);.    db =
19180 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
19190 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
191a0 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
191b0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49   SQLITE_MAGIC_SI
191c0 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20  CK;.  }.  *ppDb 
191d0 3d 20 64 62 3b 0a 23 69 66 64 65 66 20 53 51 4c  = db;.#ifdef SQL
191e0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
191f0 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  G.  if( sqlite3G
19200 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
19210 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  log ){.    /* Op
19220 65 6e 69 6e 67 20 61 20 64 62 20 68 61 6e 64 6c  ening a db handl
19230 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65  e. Fourth parame
19240 74 65 72 20 69 73 20 70 61 73 73 65 64 20 30 2e  ter is passed 0.
19250 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 41   */.    void *pA
19260 72 67 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  rg = sqlite3Glob
19270 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
19280 41 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Arg;.    sqlite3
19290 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
192a0 6c 6c 6f 67 28 70 41 72 67 2c 20 64 62 2c 20 7a  llog(pArg, db, z
192b0 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  Filename, 0);.  
192c0 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
192d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f  ined(SQLITE_HAS_
192e0 43 4f 44 45 43 29 0a 20 20 69 66 28 20 72 63 3d  CODEC).  if( rc=
192f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19300 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b    const char *zK
19310 65 79 3b 0a 20 20 20 20 69 66 28 20 28 7a 4b 65  ey;.    if( (zKe
19320 79 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  y = sqlite3_uri_
19330 70 61 72 61 6d 65 74 65 72 28 7a 4f 70 65 6e 2c  parameter(zOpen,
19340 20 22 68 65 78 6b 65 79 22 29 29 21 3d 30 20 26   "hexkey"))!=0 &
19350 26 20 7a 4b 65 79 5b 30 5d 20 29 7b 3b 0a 20 20  & zKey[0] ){;.  
19360 20 20 20 20 75 38 20 69 42 79 74 65 3b 0a 20 20      u8 iByte;.  
19370 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
19380 20 63 68 61 72 20 7a 44 65 63 6f 64 65 64 5b 34   char zDecoded[4
19390 30 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0];.      for(i=
193a0 30 2c 20 69 42 79 74 65 3d 30 3b 20 69 3c 73 69  0, iByte=0; i<si
193b0 7a 65 6f 66 28 7a 44 65 63 6f 64 65 64 29 2a 32  zeof(zDecoded)*2
193c0 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69   && sqlite3Isxdi
193d0 67 69 74 28 7a 4b 65 79 5b 69 5d 29 3b 20 69 2b  git(zKey[i]); i+
193e0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 42 79 74  +){.        iByt
193f0 65 20 3d 20 28 69 42 79 74 65 3c 3c 34 29 20 2b  e = (iByte<<4) +
19400 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74   sqlite3HexToInt
19410 28 7a 4b 65 79 5b 69 5d 29 3b 0a 20 20 20 20 20  (zKey[i]);.     
19420 20 20 20 69 66 28 20 28 69 26 31 29 21 3d 30 20     if( (i&1)!=0 
19430 29 20 7a 44 65 63 6f 64 65 64 5b 69 2f 32 5d 20  ) zDecoded[i/2] 
19440 3d 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 7d  = iByte;.      }
19450 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b  .      sqlite3_k
19460 65 79 5f 76 32 28 64 62 2c 20 30 2c 20 7a 44 65  ey_v2(db, 0, zDe
19470 63 6f 64 65 64 2c 20 69 2f 32 29 3b 0a 20 20 20  coded, i/2);.   
19480 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 4b 65 79   }else if( (zKey
19490 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
194a0 61 72 61 6d 65 74 65 72 28 7a 4f 70 65 6e 2c 20  arameter(zOpen, 
194b0 22 6b 65 79 22 29 29 21 3d 30 20 29 7b 0a 20 20  "key"))!=0 ){.  
194c0 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f      sqlite3_key_
194d0 76 32 28 64 62 2c 20 30 2c 20 7a 4b 65 79 2c 20  v2(db, 0, zKey, 
194e0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
194f0 7a 4b 65 79 29 29 3b 0a 20 20 20 20 7d 0a 20 20  zKey));.    }.  
19500 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
19510 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b 0a  e3_free(zOpen);.
19520 20 20 72 65 74 75 72 6e 20 72 63 20 26 20 30 78    return rc & 0x
19530 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  ff;.}../*.** Ope
19540 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
19550 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
19560 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20  sqlite3_open(.  
19570 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
19580 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65  ename, .  sqlite
19590 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72  3 **ppDb .){.  r
195a0 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61  eturn openDataba
195b0 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70  se(zFilename, pp
195c0 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
195d0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
195e0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
195f0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
19600 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  EATE, 0);.}.int 
19610 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
19620 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
19630 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61  ilename,   /* Da
19640 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
19650 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c  (UTF-8) */.  sql
19660 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20  ite3 **ppDb,    
19670 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c       /* OUT: SQL
19680 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f  ite db handle */
19690 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
196a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
196b0 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ags */.  const c
196c0 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20  har *zVfs       
196d0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20   /* Name of VFS 
196e0 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f  module to use */
196f0 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  .){.  return ope
19700 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e 61  nDatabase(filena
19710 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e 73 69 67  me, ppDb, (unsig
19720 6e 65 64 20 69 6e 74 29 66 6c 61 67 73 2c 20 7a  ned int)flags, z
19730 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Vfs);.}..#ifndef
19740 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
19750 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  16./*.** Open a 
19760 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e  new database han
19770 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
19780 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f  te3_open16(.  co
19790 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e  nst void *zFilen
197a0 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20  ame, .  sqlite3 
197b0 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61 72  **ppDb.){.  char
197c0 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d   const *zFilenam
197d0 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61  e8;   /* zFilena
197e0 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54  me encoded in UT
197f0 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20 55  F-8 instead of U
19800 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74  TF-16 */.  sqlit
19810 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
19820 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65    int rc;..#ifde
19830 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
19840 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
19850 70 70 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  ppDb==0 ) return
19860 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
19870 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70  KPT;.#endif.  *p
19880 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  pDb = 0;.#ifndef
19890 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
198a0 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c  OINIT.  rc = sql
198b0 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
198c0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
198d0 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
198e0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
198f0 3d 30 20 29 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  =0 ) zFilename =
19900 20 22 5c 30 30 30 5c 30 30 30 22 3b 0a 20 20 70   "\000\000";.  p
19910 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
19920 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69  ueNew(0);.  sqli
19930 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
19940 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  Val, -1, zFilena
19950 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  me, SQLITE_UTF16
19960 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53  NATIVE, SQLITE_S
19970 54 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e  TATIC);.  zFilen
19980 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61  ame8 = sqlite3Va
19990 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51  lueText(pVal, SQ
199a0 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66  LITE_UTF8);.  if
199b0 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a  ( zFilename8 ){.
199c0 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74      rc = openDat
199d0 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38  abase(zFilename8
199e0 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20  , ppDb,.        
199f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
19a00 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
19a10 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
19a20 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20  N_CREATE, 0);.  
19a30 20 20 61 73 73 65 72 74 28 20 2a 70 70 44 62 20    assert( *ppDb 
19a40 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
19a50 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72  MEM );.    if( r
19a60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
19a70 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a  !DbHasProperty(*
19a80 70 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65  ppDb, 0, DB_Sche
19a90 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20  maLoaded) ){.   
19aa0 20 20 20 53 43 48 45 4d 41 5f 45 4e 43 28 2a 70     SCHEMA_ENC(*p
19ab0 70 44 62 29 20 3d 20 45 4e 43 28 2a 70 70 44 62  pDb) = ENC(*ppDb
19ac0 29 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ) = SQLITE_UTF16
19ad0 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20 20  NATIVE;.    }.  
19ae0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
19af0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
19b00 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  T;.  }.  sqlite3
19b10 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
19b20 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 20 26 20  ..  return rc & 
19b30 30 78 66 66 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  0xff;.}.#endif /
19b40 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
19b50 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
19b60 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
19b70 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
19b80 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
19b90 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
19ba0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
19bb0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  te_collation(.  
19bc0 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
19bd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
19be0 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  e, .  int enc, .
19bf0 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
19c00 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
19c10 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
19c20 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
19c30 6f 69 64 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72  oid*).){.  retur
19c40 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  n sqlite3_create
19c50 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62  _collation_v2(db
19c60 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20 70 43  , zName, enc, pC
19c70 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29  tx, xCompare, 0)
19c80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
19c90 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
19ca0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
19cb0 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
19cc0 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
19cd0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
19ce0 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20  collation_v2(.  
19cf0 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
19d00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
19d10 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  e, .  int enc, .
19d20 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
19d30 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
19d40 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
19d50 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
19d60 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78  oid*),.  void(*x
19d70 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20  Del)(void*).){. 
19d80 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66   int rc;..#ifdef
19d90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
19da0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
19db0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
19dc0 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d  ckOk(db) || zNam
19dd0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
19de0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
19df0 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
19e00 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
19e10 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
19e20 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
19e30 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d  Failed );.  rc =
19e40 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
19e50 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29  (db, zName, (u8)
19e60 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
19e70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63  are, xDel);.  rc
19e80 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
19e90 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
19ea0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
19eb0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
19ec0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
19ed0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19ee0 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67  _UTF16./*.** Reg
19ef0 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
19f00 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
19f10 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
19f20 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
19f30 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
19f40 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20  e_collation16(. 
19f50 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
19f60 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61   const void *zNa
19f70 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  me,.  int enc, .
19f80 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
19f90 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
19fa0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
19fb0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
19fc0 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  oid*).){.  int r
19fd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19fe0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 0a   char *zName8;..
19ff0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1a000 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1a010 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1a020 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c  etyCheckOk(db) |
1a030 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  | zName==0 ) ret
1a040 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
1a050 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
1a060 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1a070 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1a080 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
1a090 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1a0a0 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74    zName8 = sqlit
1a0b0 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a  e3Utf16to8(db, z
1a0c0 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
1a0d0 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
1a0e0 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20   if( zName8 ){. 
1a0f0 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f     rc = createCo
1a100 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
1a110 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74  e8, (u8)enc, pCt
1a120 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b  x, xCompare, 0);
1a130 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1a140 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a  ee(db, zName8);.
1a150 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
1a160 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
1a170 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
1a180 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1a190 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
1a1a0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
1a1b0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
1a1c0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  */../*.** Regist
1a1d0 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  er a collation s
1a1e0 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20  equence factory 
1a1f0 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68  callback with th
1a200 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
1a210 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65  e.** db. Replace
1a220 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20   any previously 
1a230 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74  installed collat
1a240 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
1a250 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tory..*/.int sql
1a260 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
1a270 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33  eeded(.  sqlite3
1a280 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *db, .  void *p
1a290 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a  CollNeededArg, .
1a2a0 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65    void(*xCollNee
1a2b0 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74  ded)(void*,sqlit
1a2c0 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70  e3*,int eTextRep
1a2d0 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b  ,const char*).){
1a2e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1a2f0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1a300 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1a310 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1a320 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1a330 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
1a340 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
1a350 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1a360 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  tex);.  db->xCol
1a370 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e  lNeeded = xCollN
1a380 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f  eeded;.  db->xCo
1a390 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a  llNeeded16 = 0;.
1a3a0 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
1a3b0 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
1a3c0 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  edArg;.  sqlite3
1a3d0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1a3e0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1a3f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1a400 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a410 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
1a420 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61  Register a colla
1a430 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
1a440 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77  ctory callback w
1a450 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
1a460 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52   handle.** db. R
1a470 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69  eplace any previ
1a480 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20  ously installed 
1a490 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1a4a0 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69  ce factory..*/.i
1a4b0 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61  nt sqlite3_colla
1a4c0 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20  tion_needed16(. 
1a4d0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
1a4e0 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64   void *pCollNeed
1a4f0 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a  edArg, .  void(*
1a500 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76  xCollNeeded16)(v
1a510 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e  oid*,sqlite3*,in
1a520 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74  t eTextRep,const
1a530 20 76 6f 69 64 2a 29 0a 29 7b 0a 23 69 66 64 65   void*).){.#ifde
1a540 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1a550 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1a560 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1a570 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
1a580 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
1a590 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
1a5a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1a5b0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1a5c0 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
1a5d0 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f  d = 0;.  db->xCo
1a5e0 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43 6f  llNeeded16 = xCo
1a5f0 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64 62  llNeeded16;.  db
1a600 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
1a610 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72   = pCollNeededAr
1a620 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
1a630 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1a640 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
1a650 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
1a660 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1a670 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64  _UTF16 */..#ifnd
1a680 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
1a690 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20  EPRECATED./*.** 
1a6a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1a6b0 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e   now an anachron
1a6c0 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f 20  ism. It used to 
1a6d0 62 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f 76  be used to recov
1a6e0 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c  er from a.** mal
1a6f0 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20 62  loc() failure, b
1a700 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f  ut SQLite now do
1a710 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74 69  es this automati
1a720 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cally..*/.int sq
1a730 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63  lite3_global_rec
1a740 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72 65  over(void){.  re
1a750 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a760 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1a770 54 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74  Test to see whet
1a780 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 64  her or not the d
1a790 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1a7a0 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d  on is in autocom
1a7b0 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65  mit.** mode.  Re
1a7c0 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
1a7d0 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20  is and FALSE if 
1a7e0 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74  not.  Autocommit
1a7f0 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62   mode is on.** b
1a800 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74 6f  y default.  Auto
1a810 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62 6c  commit is disabl
1a820 65 64 20 62 79 20 61 20 42 45 47 49 4e 20 73 74  ed by a BEGIN st
1a830 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e  atement and reen
1a840 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  abled.** by the 
1a850 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52  next COMMIT or R
1a860 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69 6e 74 20  OLLBACK..*/.int 
1a870 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
1a880 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  commit(sqlite3 *
1a890 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
1a8a0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1a8b0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1a8c0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1a8d0 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
1a8e0 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
1a8f0 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
1a900 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
1a910 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43  return db->autoC
1a920 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ommit;.}../*.** 
1a930 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
1a940 75 74 69 6e 65 73 20 61 72 65 20 73 75 62 73 74  utines are subst
1a950 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74  itutes for const
1a960 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  ants SQLITE_CORR
1a970 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  UPT,.** SQLITE_M
1a980 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41  ISUSE, SQLITE_CA
1a990 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 4e  NTOPEN, SQLITE_N
1a9a0 4f 4d 45 4d 20 61 6e 64 20 70 6f 73 73 69 62 6c  OMEM and possibl
1a9b0 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a  y other error.**
1a9c0 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65   constants.  The
1a9d0 79 20 73 65 72 76 65 20 74 77 6f 20 70 75 72 70  y serve two purp
1a9e0 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e  oses:.**.**   1.
1a9f0 20 20 53 65 72 76 65 20 61 73 20 61 20 63 6f 6e    Serve as a con
1aa00 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f  venient place to
1aa10 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e   set a breakpoin
1aa20 74 20 69 6e 20 61 20 64 65 62 75 67 67 65 72 0a  t in a debugger.
1aa30 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74 65  **       to dete
1aa40 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e 20  ct when version 
1aa50 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73  error conditions
1aa60 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20   occurs..**.**  
1aa70 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69   2.  Invoke sqli
1aa80 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f  te3_log() to pro
1aa90 76 69 64 65 20 74 68 65 20 73 6f 75 72 63 65 20  vide the source 
1aaa0 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68  code location wh
1aab0 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c  ere.**       a l
1aac0 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 69  ow-level error i
1aad0 73 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64  s first detected
1aae0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1aaf0 72 65 70 6f 72 74 45 72 72 6f 72 28 69 6e 74 20  reportError(int 
1ab00 69 45 72 72 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f  iErr, int lineno
1ab10 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
1ab20 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ype){.  sqlite3_
1ab30 6c 6f 67 28 69 45 72 72 2c 20 22 25 73 20 61 74  log(iErr, "%s at
1ab40 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31   line %d of [%.1
1ab50 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  0s]",.          
1ab60 20 20 20 20 7a 54 79 70 65 2c 20 6c 69 6e 65 6e      zType, linen
1ab70 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f  o, 20+sqlite3_so
1ab80 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74  urceid());.  ret
1ab90 75 72 6e 20 69 45 72 72 3b 0a 7d 0a 69 6e 74 20  urn iErr;.}.int 
1aba0 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45 72  sqlite3CorruptEr
1abb0 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
1abc0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
1abd0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1abe0 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65  .xLog!=0 );.  re
1abf0 74 75 72 6e 20 72 65 70 6f 72 74 45 72 72 6f 72  turn reportError
1ac00 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c  (SQLITE_CORRUPT,
1ac10 20 6c 69 6e 65 6e 6f 2c 20 22 64 61 74 61 62 61   lineno, "databa
1ac20 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 22 29 3b  se corruption");
1ac30 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69  .}.int sqlite3Mi
1ac40 73 75 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69  suseError(int li
1ac50 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
1ac60 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
1ac70 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
1ac80 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 70 6f 72  ;.  return repor
1ac90 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4d 49  tError(SQLITE_MI
1aca0 53 55 53 45 2c 20 6c 69 6e 65 6e 6f 2c 20 22 6d  SUSE, lineno, "m
1acb0 69 73 75 73 65 22 29 3b 0a 7d 0a 69 6e 74 20 73  isuse");.}.int s
1acc0 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72  qlite3CantopenEr
1acd0 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
1ace0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
1acf0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ad00 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65  .xLog!=0 );.  re
1ad10 74 75 72 6e 20 72 65 70 6f 72 74 45 72 72 6f 72  turn reportError
1ad20 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
1ad30 2c 20 6c 69 6e 65 6e 6f 2c 20 22 63 61 6e 6e 6f  , lineno, "canno
1ad40 74 20 6f 70 65 6e 20 66 69 6c 65 22 29 3b 0a 7d  t open file");.}
1ad50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1ad60 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33  EBUG.int sqlite3
1ad70 4e 6f 6d 65 6d 45 72 72 6f 72 28 69 6e 74 20 6c  NomemError(int l
1ad80 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61  ineno){.  testca
1ad90 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  se( sqlite3Globa
1ada0 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20  lConfig.xLog!=0 
1adb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 70 6f  );.  return repo
1adc0 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4e  rtError(SQLITE_N
1add0 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 4f  OMEM, lineno, "O
1ade0 4f 4d 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  OM");.}.int sqli
1adf0 74 65 33 49 6f 65 72 72 6e 6f 6d 65 6d 45 72 72  te3IoerrnomemErr
1ae00 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
1ae10 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1ae20 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1ae30 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74  xLog!=0 );.  ret
1ae40 75 72 6e 20 72 65 70 6f 72 74 45 72 72 6f 72 28  urn reportError(
1ae50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1ae60 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 49 2f 4f  EM, lineno, "I/O
1ae70 20 4f 4f 4d 20 65 72 72 6f 72 22 29 3b 0a 7d 0a   OOM error");.}.
1ae80 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
1ae90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
1aea0 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69  ECATED./*.** Thi
1aeb0 73 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e  s is a convenien
1aec0 63 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  ce routine that 
1aed0 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20  makes sure that 
1aee0 61 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69  all thread-speci
1aef0 66 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20  fic.** data for 
1af00 74 68 69 73 20 74 68 72 65 61 64 20 68 61 73 20  this thread has 
1af10 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64  been deallocated
1af20 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e  ..**.** SQLite n
1af30 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68  o longer uses th
1af40 72 65 61 64 2d 73 70 65 63 69 66 69 63 20 64 61  read-specific da
1af50 74 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  ta so this routi
1af60 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e  ne is now a.** n
1af70 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74  o-op.  It is ret
1af80 61 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72  ained for histor
1af90 69 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69  ical compatibili
1afa0 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ty..*/.void sqli
1afb0 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e  te3_thread_clean
1afc0 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64  up(void){.}.#end
1afd0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
1afe0 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
1aff0 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63 69 66  n about a specif
1b000 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64  ic column of a d
1b010 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a  atabase table..*
1b020 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e  * See comment in
1b030 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69   sqlite3.h (sqli
1b040 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74  te.h.in) for det
1b050 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ails..*/.int sql
1b060 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
1b070 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71  n_metadata(.  sq
1b080 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1b090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
1b0a0 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a  nection handle *
1b0b0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1b0c0 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20  zDbName,        
1b0d0 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65  /* Database name
1b0e0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f   or NULL */.  co
1b0f0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
1b100 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62  Name,     /* Tab
1b110 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e  le name */.  con
1b120 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e  st char *zColumn
1b130 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75  Name,    /* Colu
1b140 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61  mn name */.  cha
1b150 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61  r const **pzData
1b160 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50  Type,    /* OUTP
1b170 55 54 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74  UT: Declared dat
1b180 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72  a type */.  char
1b190 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53   const **pzCollS
1b1a0 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55  eq,     /* OUTPU
1b1b0 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  T: Collation seq
1b1c0 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  uence name */.  
1b1d0 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20  int *pNotNull,  
1b1e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1b1f0 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e  UTPUT: True if N
1b200 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69  OT NULL constrai
1b210 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69  nt exists */.  i
1b220 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c  nt *pPrimaryKey,
1b230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1b240 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f  TPUT: True if co
1b250 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20  lumn part of PK 
1b260 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69  */.  int *pAutoi
1b270 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nc              
1b280 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65   /* OUTPUT: True
1b290 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75   if column is au
1b2a0 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a  to-increment */.
1b2b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
1b2c0 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
1b2d0 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  ;.  Table *pTab 
1b2e0 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  = 0;.  Column *p
1b2f0 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Col = 0;.  int i
1b300 43 6f 6c 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Col = 0;.  char 
1b310 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70 65  const *zDataType
1b320 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
1b330 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30  st *zCollSeq = 0
1b340 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20  ;.  int notnull 
1b350 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61  = 0;.  int prima
1b360 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  rykey = 0;.  int
1b370 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 0a   autoinc = 0;...
1b380 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1b390 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1b3a0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1b3b0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c  etyCheckOk(db) |
1b3c0 7c 20 7a 54 61 62 6c 65 4e 61 6d 65 3d 3d 30 20  | zTableName==0 
1b3d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1b3e0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
1b3f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1b400 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64 61  /* Ensure the da
1b410 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61  tabase schema ha
1b420 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f  s been loaded */
1b430 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b440 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1b450 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1b460 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
1b470 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69   rc = sqlite3Ini
1b480 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b  t(db, &zErrMsg);
1b490 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1b4a0 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f  !=rc ){.    goto
1b4b0 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a   error_out;.  }.
1b4c0 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
1b4d0 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69   table in questi
1b4e0 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73  on */.  pTab = s
1b4f0 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
1b500 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20  db, zTableName, 
1b510 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zDbName);.  if( 
1b520 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70  !pTab || pTab->p
1b530 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 54  Select ){.    pT
1b540 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  ab = 0;.    goto
1b550 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a   error_out;.  }.
1b560 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 63  .  /* Find the c
1b570 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20  olumn for which 
1b580 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74 65  info is requeste
1b590 64 20 2a 2f 0a 20 20 69 66 28 20 7a 43 6f 6c 75  d */.  if( zColu
1b5a0 6d 6e 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  mnName==0 ){.   
1b5b0 20 2f 2a 20 51 75 65 72 79 20 66 6f 72 20 65 78   /* Query for ex
1b5c0 69 73 74 61 6e 63 65 20 6f 66 20 74 61 62 6c 65  istance of table
1b5d0 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d 65 6c 73 65   only */.  }else
1b5e0 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30  {.    for(iCol=0
1b5f0 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
1b600 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
1b610 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e    pCol = &pTab->
1b620 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  aCol[iCol];.    
1b630 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
1b640 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  StrICmp(pCol->zN
1b650 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65  ame, zColumnName
1b660 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  ) ){.        bre
1b670 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1b680 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d  }.    if( iCol==
1b690 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
1b6a0 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64      if( HasRowid
1b6b0 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65  (pTab) && sqlite
1b6c0 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e  3IsRowid(zColumn
1b6d0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
1b6e0 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
1b6f0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  Key;.        pCo
1b700 6c 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 26 70  l = iCol>=0 ? &p
1b710 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 20  Tab->aCol[iCol] 
1b720 3a 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  : 0;.      }else
1b730 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  {.        pTab =
1b740 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
1b750 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
1b760 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1b770 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1b780 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74  g block stores t
1b790 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  he meta informat
1b7a0 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ion that will be
1b7b0 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74   returned.  ** t
1b7c0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20  o the caller in 
1b7d0 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20  local variables 
1b7e0 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c  zDataType, zColl
1b7f0 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72  Seq, notnull, pr
1b800 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e  imarykey.  ** an
1b810 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68  d autoinc. At th
1b820 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61  is point there a
1b830 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69  re two possibili
1b840 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a  ties:.  ** .  **
1b850 20 20 20 20 20 31 2e 20 54 68 65 20 73 70 65 63       1. The spec
1b860 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ified column nam
1b870 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f  e was rowid", "o
1b880 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22  id" or "_rowid_"
1b890 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e   .  **        an
1b8a0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78  d there is no ex
1b8b0 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65  plicitly declare
1b8c0 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20  d IPK column. . 
1b8d0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20   **.  **     2. 
1b8e0 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  The table is not
1b8f0 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20   a view and the 
1b900 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e  column name iden
1b910 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20  tified an .  ** 
1b920 20 20 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c         explicitl
1b930 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d  y declared colum
1b940 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66  n. Copy meta inf
1b950 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70  ormation from *p
1b960 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28  Col..  */ .  if(
1b970 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61   pCol ){.    zDa
1b980 74 61 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  taType = sqlite3
1b990 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f 6c 2c  ColumnType(pCol,
1b9a0 30 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71  0);.    zCollSeq
1b9b0 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a   = pCol->zColl;.
1b9c0 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43      notnull = pC
1b9d0 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a  ol->notNull!=0;.
1b9e0 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20      primarykey  
1b9f0 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67  = (pCol->colFlag
1ba00 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d  s & COLFLAG_PRIM
1ba10 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20 61 75 74  KEY)!=0;.    aut
1ba20 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b  oinc = pTab->iPK
1ba30 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61  ey==iCol && (pTa
1ba40 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
1ba50 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21  _Autoincrement)!
1ba60 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
1ba70 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e   zDataType = "IN
1ba80 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d  TEGER";.    prim
1ba90 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a  arykey = 1;.  }.
1baa0 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20    if( !zCollSeq 
1bab0 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20  ){.    zCollSeq 
1bac0 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  = sqlite3StrBINA
1bad0 52 59 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f  RY;.  }..error_o
1bae0 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ut:.  sqlite3Btr
1baf0 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
1bb00 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68  .  /* Whether th
1bb10 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  e function call 
1bb20 73 75 63 63 65 65 64 65 64 20 6f 72 20 66 61 69  succeeded or fai
1bb30 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74  led, set the out
1bb40 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20  put parameters. 
1bb50 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20   ** to whatever 
1bb60 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e  their local coun
1bb70 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e  terparts contain
1bb80 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69  . If an error di
1bb90 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68  d occur,.  ** th
1bba0 69 73 20 68 61 73 20 74 68 65 20 65 66 66 65 63  is has the effec
1bbb0 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c  t of zeroing all
1bbc0 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
1bbd0 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rs..  */.  if( p
1bbe0 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44  zDataType ) *pzD
1bbf0 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54  ataType = zDataT
1bc00 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c  ype;.  if( pzCol
1bc10 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65  lSeq ) *pzCollSe
1bc20 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20  q = zCollSeq;.  
1bc30 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a  if( pNotNull ) *
1bc40 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75  pNotNull = notnu
1bc50 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61  ll;.  if( pPrima
1bc60 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72  ryKey ) *pPrimar
1bc70 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65  yKey = primaryke
1bc80 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e  y;.  if( pAutoin
1bc90 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20  c ) *pAutoinc = 
1bca0 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20  autoinc;..  if( 
1bcb0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26  SQLITE_OK==rc &&
1bcc0 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71   !pTab ){.    sq
1bcd0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1bce0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45  zErrMsg);.    zE
1bcf0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  rrMsg = sqlite3M
1bd00 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73  Printf(db, "no s
1bd10 75 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  uch table column
1bd20 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65  : %s.%s", zTable
1bd30 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43  Name,.        zC
1bd40 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  olumnName);.    
1bd50 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1bd60 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  R;.  }.  sqlite3
1bd70 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
1bd80 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25   rc, (zErrMsg?"%
1bd90 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b  s":0), zErrMsg);
1bda0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1bdb0 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  (db, zErrMsg);. 
1bdc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
1bdd0 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
1bde0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1bdf0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1be00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1be10 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
1be20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
1be30 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
1be40 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
1be50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1be60 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a  _sleep(int ms){.
1be70 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1be80 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Vfs;.  int rc;. 
1be90 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f   pVfs = sqlite3_
1bea0 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69  vfs_find(0);.  i
1beb0 66 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74  f( pVfs==0 ) ret
1bec0 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  urn 0;..  /* Thi
1bed0 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73  s function works
1bee0 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   in milliseconds
1bef0 2c 20 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c  , but the underl
1bf00 79 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a  ying OsSleep() .
1bf10 20 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69    ** API uses mi
1bf20 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63  croseconds. Henc
1bf30 65 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20  e the 1000's..  
1bf40 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74  */.  rc = (sqlit
1bf50 65 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20  e3OsSleep(pVfs, 
1bf60 31 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a  1000*ms)/1000);.
1bf70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1bf80 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20  /*.** Enable or 
1bf90 64 69 73 61 62 6c 65 20 74 68 65 20 65 78 74 65  disable the exte
1bfa0 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65  nded result code
1bfb0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1bfc0 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  3_extended_resul
1bfd0 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20  t_codes(sqlite3 
1bfe0 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b  *db, int onoff){
1bff0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1c000 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1c010 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1c020 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1c030 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1c040 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
1c050 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
1c060 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1c070 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d  tex);.  db->errM
1c080 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78  ask = onoff ? 0x
1c090 66 66 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b  ffffffff : 0xff;
1c0a0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1c0b0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1c0c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1c0d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1c0e0 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65  Invoke the xFile
1c0f0 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f  Control method o
1c100 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  n a particular d
1c110 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
1c120 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
1c130 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  trol(sqlite3 *db
1c140 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
1c150 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76  bName, int op, v
1c160 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e  oid *pArg){.  in
1c170 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  t rc = SQLITE_ER
1c180 52 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a 70 42  ROR;.  Btree *pB
1c190 74 72 65 65 3b 0a 0a 23 69 66 64 65 66 20 53 51  tree;..#ifdef SQ
1c1a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1c1b0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1c1c0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1c1d0 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
1c1e0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
1c1f0 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
1c200 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1c210 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42  db->mutex);.  pB
1c220 74 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62  tree = sqlite3Db
1c230 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20  NameToBtree(db, 
1c240 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zDbName);.  if( 
1c250 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61  pBtree ){.    Pa
1c260 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
1c270 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
1c280 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  d;.    sqlite3Bt
1c290 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
1c2a0 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73  ;.    pPager = s
1c2b0 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
1c2c0 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73  (pBtree);.    as
1c2d0 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
1c2e0 29 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69  );.    fd = sqli
1c2f0 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61  te3PagerFile(pPa
1c300 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ger);.    assert
1c310 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( fd!=0 );.    i
1c320 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  f( op==SQLITE_FC
1c330 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  NTL_FILE_POINTER
1c340 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69   ){.      *(sqli
1c350 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20  te3_file**)pArg 
1c360 3d 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d  = fd;.      rc =
1c370 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1c380 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51  }else if( op==SQ
1c390 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 5f 50  LITE_FCNTL_VFS_P
1c3a0 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20  OINTER ){.      
1c3b0 2a 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2a 29  *(sqlite3_vfs**)
1c3c0 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61  pArg = sqlite3Pa
1c3d0 67 65 72 56 66 73 28 70 50 61 67 65 72 29 3b 0a  gerVfs(pPager);.
1c3e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c3f0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E_OK;.    }else 
1c400 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46  if( op==SQLITE_F
1c410 43 4e 54 4c 5f 4a 4f 55 52 4e 41 4c 5f 50 4f 49  CNTL_JOURNAL_POI
1c420 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28  NTER ){.      *(
1c430 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70  sqlite3_file**)p
1c440 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Arg = sqlite3Pag
1c450 65 72 4a 72 6e 6c 46 69 6c 65 28 70 50 61 67 65  erJrnlFile(pPage
1c460 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  r);.      rc = S
1c470 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1c480 6c 73 65 20 69 66 28 20 66 64 2d 3e 70 4d 65 74  lse if( fd->pMet
1c490 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 72 63  hods ){.      rc
1c4a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1c4b0 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20  Control(fd, op, 
1c4c0 70 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pArg);.    }else
1c4d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1c4e0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
1c4f0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
1c500 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
1c510 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1c520 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1c530 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1c540 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
1c550 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20  nterface to the 
1c560 74 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a  testing logic..*
1c570 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65  /.int sqlite3_te
1c580 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f  st_control(int o
1c590 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72  p, ...){.  int r
1c5a0 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  c = 0;.#ifdef SQ
1c5b0 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a  LITE_UNTESTABLE.
1c5c0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1c5d0 45 52 28 6f 70 29 3b 0a 23 65 6c 73 65 0a 20 20  ER(op);.#else.  
1c5e0 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61  va_list ap;.  va
1c5f0 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a  _start(ap, op);.
1c600 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1c610 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
1c620 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
1c630 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e  state of the PRN
1c640 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  G..    */.    ca
1c650 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1c660 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a  RL_PRNG_SAVE: {.
1c670 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e        sqlite3Prn
1c680 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20  gSaveState();.  
1c690 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c6a0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1c6b0 52 65 73 74 6f 72 65 20 74 68 65 20 73 74 61 74  Restore the stat
1c6c0 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f  e of the PRNG to
1c6d0 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 20   the last state 
1c6e0 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20  saved using.    
1c6f0 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49  ** PRNG_SAVE.  I
1c700 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20  f PRNG_SAVE has 
1c710 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65  never before bee
1c720 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20  n called, then. 
1c730 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20     ** this verb 
1c740 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52  acts like PRNG_R
1c750 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ESET..    */.   
1c760 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1c770 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f  TCTRL_PRNG_RESTO
1c780 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  RE: {.      sqli
1c790 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74  te3PrngRestoreSt
1c7a0 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65  ate();.      bre
1c7b0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1c7c0 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74  *.    ** Reset t
1c7d0 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20  he PRNG back to 
1c7e0 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  its uninitialize
1c7f0 64 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65  d state.  The ne
1c800 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  xt call.    ** t
1c810 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d  o sqlite3_random
1c820 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65  ness() will rese
1c830 65 64 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e  ed the PRNG usin
1c840 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a  g a single call.
1c850 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52      ** to the xR
1c860 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64  andomness method
1c870 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   of the default 
1c880 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  VFS..    */.    
1c890 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1c8a0 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a  CTRL_PRNG_RESET:
1c8b0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1c8c0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29  _randomness(0,0)
1c8d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c8e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1c8f0 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
1c900 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43  t_control(BITVEC
1c910 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f  _TEST, size, pro
1c920 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20  gram).    **.   
1c930 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61   ** Run a test a
1c940 67 61 69 6e 73 74 20 61 20 42 69 74 76 65 63 20  gainst a Bitvec 
1c950 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20  object of size. 
1c960 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67   The program arg
1c970 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20  ument.    ** is 
1c980 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65  an array of inte
1c990 67 65 72 73 20 74 68 61 74 20 64 65 66 69 6e 65  gers that define
1c9a0 73 20 74 68 65 20 74 65 73 74 2e 20 20 52 65 74  s the test.  Ret
1c9b0 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20  urn -1 on a.    
1c9c0 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ** memory alloca
1c9d0 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e  tion error, 0 on
1c9e0 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e   success, or non
1c9f0 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72  -zero for an err
1ca00 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74  or..    ** See t
1ca10 68 65 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  he sqlite3Bitvec
1ca20 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f  BuiltinTest() fo
1ca30 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
1ca40 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
1ca50 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ca60 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43  _TESTCTRL_BITVEC
1ca70 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69  _TEST: {.      i
1ca80 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
1ca90 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
1caa0 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61  nt *aProg = va_a
1cab0 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20  rg(ap, int*);.  
1cac0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1cad0 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73  BitvecBuiltinTes
1cae0 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20  t(sz, aProg);.  
1caf0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1cb00 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1cb10 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1cb20 6e 74 72 6f 6c 28 46 41 55 4c 54 5f 49 4e 53 54  ntrol(FAULT_INST
1cb30 41 4c 4c 2c 20 78 43 61 6c 6c 62 61 63 6b 29 0a  ALL, xCallback).
1cb40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 72      **.    ** Ar
1cb50 72 61 6e 67 65 20 74 6f 20 69 6e 76 6f 6b 65 20  range to invoke 
1cb60 78 43 61 6c 6c 62 61 63 6b 28 29 20 77 68 65 6e  xCallback() when
1cb70 65 76 65 72 20 73 71 6c 69 74 65 33 46 61 75 6c  ever sqlite3Faul
1cb80 74 53 69 6d 28 29 20 69 73 20 63 61 6c 6c 65 64  tSim() is called
1cb90 2c 0a 20 20 20 20 2a 2a 20 69 66 20 78 43 61 6c  ,.    ** if xCal
1cba0 6c 62 61 63 6b 20 69 73 20 6e 6f 74 20 4e 55 4c  lback is not NUL
1cbb0 4c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  L..    **.    **
1cbc0 20 41 73 20 61 20 74 65 73 74 20 6f 66 20 74 68   As a test of th
1cbd0 65 20 66 61 75 6c 74 20 73 69 6d 75 6c 61 74 6f  e fault simulato
1cbe0 72 20 6d 65 63 68 61 6e 69 73 6d 20 69 74 73 65  r mechanism itse
1cbf0 6c 66 2c 20 73 71 6c 69 74 65 33 46 61 75 6c 74  lf, sqlite3Fault
1cc00 53 69 6d 28 30 29 0a 20 20 20 20 2a 2a 20 69 73  Sim(0).    ** is
1cc10 20 63 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74   called immediat
1cc20 65 6c 79 20 61 66 74 65 72 20 69 6e 73 74 61 6c  ely after instal
1cc30 6c 69 6e 67 20 74 68 65 20 6e 65 77 20 63 61 6c  ling the new cal
1cc40 6c 62 61 63 6b 20 61 6e 64 20 74 68 65 20 72 65  lback and the re
1cc50 74 75 72 6e 0a 20 20 20 20 2a 2a 20 76 61 6c 75  turn.    ** valu
1cc60 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 46 61  e from sqlite3Fa
1cc70 75 6c 74 53 69 6d 28 30 29 20 62 65 63 6f 6d 65  ultSim(0) become
1cc80 73 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f  s the return fro
1cc90 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  m.    ** sqlite3
1cca0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e  _test_control().
1ccb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1ccc0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1ccd0 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20  _FAULT_INSTALL: 
1cce0 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20  {.      /* MSVC 
1ccf0 69 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70  is picky about p
1cd00 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73  ulling func ptrs
1cd10 20 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a   from va lists..
1cd20 20 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f        ** http://
1cd30 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66  support.microsof
1cd40 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20  t.com/kb/47961. 
1cd50 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47       ** sqlite3G
1cd60 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73  lobalConfig.xTes
1cd70 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61  tCallback = va_a
1cd80 72 67 28 61 70 2c 20 69 6e 74 28 2a 29 28 69 6e  rg(ap, int(*)(in
1cd90 74 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20  t));.      */.  
1cda0 20 20 20 20 74 79 70 65 64 65 66 20 69 6e 74 28      typedef int(
1cdb0 2a 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e  *TESTCALLBACKFUN
1cdc0 43 5f 74 29 28 69 6e 74 29 3b 0a 20 20 20 20 20  C_t)(int);.     
1cdd0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1cde0 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61  nfig.xTestCallba
1cdf0 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ck = va_arg(ap, 
1ce00 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43  TESTCALLBACKFUNC
1ce10 5f 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  _t);.      rc = 
1ce20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
1ce30 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
1ce40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1ce50 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
1ce60 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49  est_control(BENI
1ce70 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c  GN_MALLOC_HOOKS,
1ce80 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20   xBegin, xEnd). 
1ce90 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67     **.    ** Reg
1cea0 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63  ister hooks to c
1ceb0 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65 20  all to indicate 
1cec0 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66  which malloc() f
1ced0 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a 20  ailures .    ** 
1cee0 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20  are benign..    
1cef0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1cf00 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49  TE_TESTCTRL_BENI
1cf10 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a  GN_MALLOC_HOOKS:
1cf20 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65 66   {.      typedef
1cf30 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e   void (*void_fun
1cf40 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20  ction)(void);.  
1cf50 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f      void_functio
1cf60 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a  n xBenignBegin;.
1cf70 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74        void_funct
1cf80 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a  ion xBenignEnd;.
1cf90 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65 67        xBenignBeg
1cfa0 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  in = va_arg(ap, 
1cfb0 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a  void_function);.
1cfc0 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e 64        xBenignEnd
1cfd0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
1cfe0 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20  id_function);.  
1cff0 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69 67      sqlite3Benig
1d000 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65  nMallocHooks(xBe
1d010 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69  nignBegin, xBeni
1d020 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62 72  gnEnd);.      br
1d030 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1d040 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1d050 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1d060 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1d070 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e  PENDING_BYTE, un
1d080 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20 20  signed int X).  
1d090 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20    **.    ** Set 
1d0a0 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
1d0b0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e   to the value in
1d0c0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 69   the argument, i
1d0d0 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61  f X>0..    ** Ma
1d0e0 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66  ke no changes if
1d0f0 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20 74   X==0.  Return t
1d100 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1d110 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20 20  pending byte.   
1d120 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74 69   ** as it existi
1d130 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ng before this r
1d140 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
1d150 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
1d160 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68 61   IMPORTANT:  Cha
1d170 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e  nging the PENDIN
1d180 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34 30  G byte from 0x40
1d190 30 30 30 30 30 30 20 72 65 73 75 6c 74 73 20 69  000000 results i
1d1a0 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f  n.    ** an inco
1d1b0 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62 61 73  mpatible databas
1d1c0 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20  e file format.  
1d1d0 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e  Changing the PEN
1d1e0 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a 2a  DING byte.    **
1d1f0 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61 62   while any datab
1d200 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ase connection i
1d210 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20 69  s open results i
1d220 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a  n undefined and.
1d230 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 72 69 6f      ** deleterio
1d240 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20  us behavior..   
1d250 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1d260 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e  ITE_TESTCTRL_PEN
1d270 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20  DING_BYTE: {.   
1d280 20 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f     rc = PENDING_
1d290 42 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53 51  BYTE;.#ifndef SQ
1d2a0 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20  LITE_OMIT_WSD.  
1d2b0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75 6e      {.        un
1d2c0 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56 61  signed int newVa
1d2d0 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  l = va_arg(ap, u
1d2e0 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
1d2f0 20 20 20 20 20 20 69 66 28 20 6e 65 77 56 61 6c        if( newVal
1d300 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69 6e   ) sqlite3Pendin
1d310 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a  gByte = newVal;.
1d320 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1d330 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d340 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1d350 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1d360 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1d370 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 69  STCTRL_ASSERT, i
1d380 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
1d390 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20   ** This action 
1d3a0 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74  provides a run-t
1d3b0 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20  ime test to see 
1d3c0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20  whether or not. 
1d3d0 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 77     ** assert() w
1d3e0 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  as enabled at co
1d3f0 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20  mpile-time.  If 
1d400 58 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 73  X is true and as
1d410 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69 73  sert().    ** is
1d420 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74   enabled, then t
1d430 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1d440 69 73 20 74 72 75 65 2e 20 20 49 66 20 58 20 69  is true.  If X i
1d450 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20 2a  s true and.    *
1d460 2a 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  * assert() is di
1d470 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  sabled, then the
1d480 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1d490 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73 0a   zero.  If X is.
1d4a0 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64      ** false and
1d4b0 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61   assert() is ena
1d4c0 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 61  bled, then the a
1d4d0 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20 61  ssertion fires a
1d4e0 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72  nd the.    ** pr
1d4f0 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20 49  ocess aborts.  I
1d500 66 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e 64  f X is false and
1d510 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73   assert() is dis
1d520 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a  abled, then the.
1d530 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61      ** return va
1d540 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20  lue is zero..   
1d550 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1d560 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
1d570 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c  ERT: {.      vol
1d580 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b  atile int x = 0;
1d590 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2f  .      assert( /
1d5a0 2a 73 69 64 65 2d 65 66 66 65 63 74 73 2d 6f 6b  *side-effects-ok
1d5b0 2a 2f 20 28 78 20 3d 20 76 61 5f 61 72 67 28 61  */ (x = va_arg(a
1d5c0 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20  p,int))!=0 );.  
1d5d0 20 20 20 20 72 63 20 3d 20 78 3b 0a 20 20 20 20      rc = x;.    
1d5e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1d5f0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1d600 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1d610 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1d620 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74  CTRL_ALWAYS, int
1d630 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   X).    **.    *
1d640 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72  * This action pr
1d650 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d  ovides a run-tim
1d660 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 68 6f  e test to see ho
1d670 77 20 74 68 65 20 41 4c 57 41 59 53 20 61 6e 64  w the ALWAYS and
1d680 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61  .    ** NEVER ma
1d690 63 72 6f 73 20 77 65 72 65 20 64 65 66 69 6e 65  cros were define
1d6a0 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1d6b0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1d6c0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
1d6d0 65 20 69 73 20 41 4c 57 41 59 53 28 58 29 2e 20  e is ALWAYS(X). 
1d6e0 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
1d6f0 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20  The recommended 
1d700 74 65 73 74 20 69 73 20 58 3d 3d 32 2e 20 20 49  test is X==2.  I
1d710 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
1d720 75 65 20 69 73 20 32 2c 20 74 68 61 74 20 6d 65  ue is 2, that me
1d730 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59  ans.    ** ALWAY
1d740 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20  S() and NEVER() 
1d750 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70  are both no-op p
1d760 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72  ass-through macr
1d770 6f 73 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  os, which is the
1d780 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  .    ** default 
1d790 73 65 74 74 69 6e 67 2e 20 20 49 66 20 74 68 65  setting.  If the
1d7a0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1d7b0 20 31 2c 20 74 68 65 6e 20 41 4c 57 41 59 53 28   1, then ALWAYS(
1d7c0 29 20 69 73 20 65 69 74 68 65 72 0a 20 20 20 20  ) is either.    
1d7d0 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64 20 74 6f  ** hard-coded to
1d7e0 20 74 72 75 65 20 6f 72 20 65 6c 73 65 20 69 74   true or else it
1d7f0 20 61 73 73 65 72 74 73 20 69 66 20 69 74 73 20   asserts if its 
1d800 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73  argument is fals
1d810 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69  e..    ** The fi
1d820 72 73 74 20 62 65 68 61 76 69 6f 72 20 28 68 61  rst behavior (ha
1d830 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65  rd-coded to true
1d840 29 20 69 73 20 74 68 65 20 63 61 73 65 20 69 66  ) is the case if
1d850 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54  .    ** SQLITE_T
1d860 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73  ESTCTRL_ASSERT s
1d870 68 6f 77 73 20 74 68 61 74 20 61 73 73 65 72 74  hows that assert
1d880 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 20 61  () is disabled a
1d890 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20  nd the second.  
1d8a0 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 20 28 61    ** behavior (a
1d8b0 73 73 65 72 74 20 69 66 20 74 68 65 20 61 72 67  ssert if the arg
1d8c0 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41 59 53 28  ument to ALWAYS(
1d8d0 29 20 69 73 20 66 61 6c 73 65 29 20 69 73 20 74  ) is false) is t
1d8e0 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a  he case if.    *
1d8f0 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  * SQLITE_TESTCTR
1d900 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74  L_ASSERT shows t
1d910 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20  hat assert() is 
1d920 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a  enabled..    **.
1d930 20 20 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74      ** The run-t
1d940 69 6d 65 20 74 65 73 74 20 70 72 6f 63 65 64 75  ime test procedu
1d950 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f  re might look so
1d960 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69  mething like thi
1d970 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
1d980 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
1d990 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1d9a0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
1d9b0 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20  AYS, 2)==2 ){.  
1d9c0 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
1d9d0 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28  AYS() and NEVER(
1d9e0 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73  ) are no-op pass
1d9f0 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a  -through macros.
1da00 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20      **    }else 
1da10 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74  if( sqlite3_test
1da20 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1da30 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c  TESTCTRL_ASSERT,
1da40 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20   1) ){.    **   
1da50 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20     // ALWAYS(x) 
1da60 61 73 73 65 72 74 73 20 74 68 61 74 20 78 20 69  asserts that x i
1da70 73 20 74 72 75 65 2e 20 4e 45 56 45 52 28 78 29  s true. NEVER(x)
1da80 20 61 73 73 65 72 74 73 20 78 20 69 73 20 66 61   asserts x is fa
1da90 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d  lse..    **    }
1daa0 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20  else{.    **    
1dab0 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 69    // ALWAYS(x) i
1dac0 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20  s a constant 1. 
1dad0 20 4e 45 56 45 52 28 78 29 20 69 73 20 61 20 63   NEVER(x) is a c
1dae0 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a  onstant 0..    *
1daf0 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20  *    }.    */.  
1db00 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1db10 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b  STCTRL_ALWAYS: {
1db20 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76  .      int x = v
1db30 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
1db40 20 20 20 20 20 72 63 20 3d 20 41 4c 57 41 59 53       rc = ALWAYS
1db50 28 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  (x);.      break
1db60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1db70 20 20 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33      **   sqlite3
1db80 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1db90 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59  LITE_TESTCTRL_BY
1dba0 54 45 4f 52 44 45 52 29 3b 0a 20 20 20 20 2a 2a  TEORDER);.    **
1dbb0 0a 20 20 20 20 2a 2a 20 54 68 65 20 69 6e 74 65  .    ** The inte
1dbc0 67 65 72 20 72 65 74 75 72 6e 65 64 20 72 65 76  ger returned rev
1dbd0 65 61 6c 73 20 74 68 65 20 62 79 74 65 2d 6f 72  eals the byte-or
1dbe0 64 65 72 20 6f 66 20 74 68 65 20 63 6f 6d 70 75  der of the compu
1dbf0 74 65 72 20 6f 6e 20 77 68 69 63 68 0a 20 20 20  ter on which.   
1dc00 20 2a 2a 20 53 51 4c 69 74 65 20 69 73 20 72 75   ** SQLite is ru
1dc10 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20 20  nning:.    **.  
1dc20 20 20 2a 2a 20 20 20 20 20 20 20 31 20 20 20 20    **       1    
1dc30 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20   big-endian,    
1dc40 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75  determined at ru
1dc50 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 20  n-time.    **   
1dc60 20 20 20 31 30 20 20 20 20 20 6c 69 74 74 6c 65     10     little
1dc70 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69  -endian, determi
1dc80 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a  ned at run-time.
1dc90 20 20 20 20 2a 2a 20 20 34 33 32 31 30 31 20 20      **  432101  
1dca0 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20     big-endian,  
1dcb0 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20    determined at 
1dcc0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20  compile-time.   
1dcd0 20 2a 2a 20 20 31 32 33 34 31 30 20 20 20 20 20   **  123410     
1dce0 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64  little-endian, d
1dcf0 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d  etermined at com
1dd00 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2f  pile-time.    */
1dd10 20 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54   .    case SQLIT
1dd20 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f  E_TESTCTRL_BYTEO
1dd30 52 44 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 63  RDER: {.      rc
1dd40 20 3d 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52   = SQLITE_BYTEOR
1dd50 44 45 52 2a 31 30 30 20 2b 20 53 51 4c 49 54 45  DER*100 + SQLITE
1dd60 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e 2a 31 30  _LITTLEENDIAN*10
1dd70 20 2b 20 53 51 4c 49 54 45 5f 42 49 47 45 4e 44   + SQLITE_BIGEND
1dd80 49 41 4e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IAN;.      break
1dd90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1dda0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1ddb0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1ddc0 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20  STCTRL_RESERVE, 
1ddd0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
1dde0 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   N).    **.    *
1ddf0 2a 20 53 65 74 20 74 68 65 20 6e 52 65 73 65 72  * Set the nReser
1de00 76 65 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72  ve size to N for
1de10 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
1de20 73 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  se on the databa
1de30 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63  se.    ** connec
1de40 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a  tion db..    */.
1de50 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1de60 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45  TESTCTRL_RESERVE
1de70 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1de80 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61  3 *db = va_arg(a
1de90 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  p, sqlite3*);.  
1dea0 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61      int x = va_a
1deb0 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
1dec0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1ded0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
1dee0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
1def0 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
1df00 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20  db->aDb[0].pBt, 
1df10 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, x, 0);.      
1df20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1df30 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1df40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1df50 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69   }..    /*  sqli
1df60 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1df70 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1df80 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20  _OPTIMIZATIONS, 
1df90 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
1dfa0 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   N).    **.    *
1dfb0 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
1dfc0 62 6c 65 20 76 61 72 69 6f 75 73 20 6f 70 74 69  ble various opti
1dfd0 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74 65  mizations for te
1dfe0 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20  sting purposes. 
1dff0 20 54 68 65 20 0a 20 20 20 20 2a 2a 20 61 72 67   The .    ** arg
1e000 75 6d 65 6e 74 20 4e 20 69 73 20 61 20 62 69 74  ument N is a bit
1e010 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61  mask of optimiza
1e020 74 69 6f 6e 73 20 74 6f 20 62 65 20 64 69 73 61  tions to be disa
1e030 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61  bled.  For norma
1e040 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69  l.    ** operati
1e050 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 30  on N should be 0
1e060 2e 20 20 54 68 65 20 69 64 65 61 20 69 73 20 74  .  The idea is t
1e070 68 61 74 20 61 20 74 65 73 74 20 70 72 6f 67 72  hat a test progr
1e080 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20 20 20  am (like the.   
1e090 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54 65   ** SQL Logic Te
1e0a0 73 74 20 6f 72 20 53 4c 54 20 74 65 73 74 20 6d  st or SLT test m
1e0b0 6f 64 75 6c 65 29 20 63 61 6e 20 72 75 6e 20 74  odule) can run t
1e0c0 68 65 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74  he same SQL mult
1e0d0 69 70 6c 65 20 74 69 6d 65 73 0a 20 20 20 20 2a  iple times.    *
1e0e0 2a 20 77 69 74 68 20 76 61 72 69 6f 75 73 20 6f  * with various o
1e0f0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73  ptimizations dis
1e100 61 62 6c 65 64 20 74 6f 20 76 65 72 69 66 79 20  abled to verify 
1e110 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e  that the same an
1e120 73 77 65 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f  swer.    ** is o
1e130 62 74 61 69 6e 65 64 20 69 6e 20 65 76 65 72 79  btained in every
1e140 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
1e150 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1e160 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
1e170 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73 71  IONS: {.      sq
1e180 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
1e190 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
1e1a0 3b 0a 20 20 20 20 20 20 64 62 2d 3e 64 62 4f 70  ;.      db->dbOp
1e1b0 74 46 6c 61 67 73 20 3d 20 28 75 31 36 29 28 76  tFlags = (u16)(v
1e1c0 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 20 26  a_arg(ap, int) &
1e1d0 20 30 78 66 66 66 66 29 3b 0a 20 20 20 20 20 20   0xffff);.      
1e1e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
1e1f0 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45  fdef SQLITE_N_KE
1e200 59 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73 71 6c  YWORD.    /* sql
1e210 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1e220 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1e230 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63 6f 6e  L_ISKEYWORD, con
1e240 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 29 0a  st char *zWord).
1e250 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
1e260 20 7a 57 6f 72 64 20 69 73 20 61 20 6b 65 79 77   zWord is a keyw
1e270 6f 72 64 20 72 65 63 6f 67 6e 69 7a 65 64 20 62  ord recognized b
1e280 79 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68  y the parser, th
1e290 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 20 20  en return the.  
1e2a0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6b    ** number of k
1e2b0 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 69 66 20  eywords.  Or if 
1e2c0 7a 57 6f 72 64 20 69 73 20 6e 6f 74 20 61 20 6b  zWord is not a k
1e2d0 65 79 77 6f 72 64 2c 20 72 65 74 75 72 6e 20 30  eyword, return 0
1e2e0 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
1e2f0 20 54 68 69 73 20 74 65 73 74 20 66 65 61 74 75   This test featu
1e300 72 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  re is only avail
1e310 61 62 6c 65 20 69 6e 20 74 68 65 20 61 6d 61 6c  able in the amal
1e320 67 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65 0a 20  gamation since. 
1e330 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45     ** the SQLITE
1e340 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63 72 6f  _N_KEYWORD macro
1e350 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20   is not defined 
1e360 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69 66 20  in this file if 
1e370 53 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20 69 73  SQLite.    ** is
1e380 20 62 75 69 6c 74 20 75 73 69 6e 67 20 73 65 70   built using sep
1e390 61 72 61 74 65 20 73 6f 75 72 63 65 20 66 69 6c  arate source fil
1e3a0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  es..    */.    c
1e3b0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1e3c0 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20 7b  TRL_ISKEYWORD: {
1e3d0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1e3e0 72 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f 61 72  r *zWord = va_ar
1e3f0 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
1e400 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  *);.      int n 
1e410 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1e420 30 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20 20 20  0(zWord);.      
1e430 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4b 65 79  rc = (sqlite3Key
1e440 77 6f 72 64 43 6f 64 65 28 28 75 38 2a 29 7a 57  wordCode((u8*)zW
1e450 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44 29 20  ord, n)!=TK_ID) 
1e460 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  ? SQLITE_N_KEYWO
1e470 52 44 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72  RD : 0;.      br
1e480 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1e490 66 20 0a 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  f ..    /* sqlit
1e4a0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1e4b0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e4c0 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 2c 20 73  SCRATCHMALLOC, s
1e4d0 7a 2c 20 26 70 4e 65 77 2c 20 70 46 72 65 65 29  z, &pNew, pFree)
1e4e0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1e4f0 50 61 73 73 20 70 46 72 65 65 20 69 6e 74 6f 20  Pass pFree into 
1e500 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
1e510 65 65 28 29 2e 20 0a 20 20 20 20 2a 2a 20 49 66  ee(). .    ** If
1e520 20 73 7a 3e 30 20 74 68 65 6e 20 61 6c 6c 6f 63   sz>0 then alloc
1e530 61 74 65 20 61 20 73 63 72 61 74 63 68 20 62 75  ate a scratch bu
1e540 66 66 65 72 20 69 6e 74 6f 20 70 4e 65 77 2e 20  ffer into pNew. 
1e550 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73   .    */.    cas
1e560 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1e570 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 3a  L_SCRATCHMALLOC:
1e580 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
1e590 46 72 65 65 2c 20 2a 2a 70 70 4e 65 77 3b 0a 20  Free, **ppNew;. 
1e5a0 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20       int sz;.   
1e5b0 20 20 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61     sz = va_arg(a
1e5c0 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 70  p, int);.      p
1e5d0 70 4e 65 77 20 3d 20 76 61 5f 61 72 67 28 61 70  pNew = va_arg(ap
1e5e0 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20 20 20 20 20  , void**);.     
1e5f0 20 70 46 72 65 65 20 3d 20 76 61 5f 61 72 67 28   pFree = va_arg(
1e600 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
1e610 20 20 69 66 28 20 73 7a 20 29 20 2a 70 70 4e 65    if( sz ) *ppNe
1e620 77 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74  w = sqlite3Scrat
1e630 63 68 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20  chMalloc(sz);.  
1e640 20 20 20 20 73 71 6c 69 74 65 33 53 63 72 61 74      sqlite3Scrat
1e650 63 68 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20  chFree(pFree);. 
1e660 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e670 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
1e680 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1e690 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1e6a0 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
1e6b0 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20  , int onoff);.  
1e6c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70    **.    ** If p
1e6d0 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69  arameter onoff i
1e6e0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66  s non-zero, conf
1e6f0 69 67 75 72 65 20 74 68 65 20 77 72 61 70 70 65  igure the wrappe
1e700 72 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 0a 20  rs so that all. 
1e710 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74     ** subsequent
1e720 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c 74   calls to localt
1e730 69 6d 65 28 29 20 61 6e 64 20 76 61 72 69 61 6e  ime() and varian
1e740 74 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66  ts fail. If onof
1e750 66 20 69 73 20 7a 65 72 6f 2c 0a 20 20 20 20 2a  f is zero,.    *
1e760 2a 20 75 6e 64 6f 20 74 68 69 73 20 73 65 74 74  * undo this sett
1e770 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
1e780 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1e790 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46  CTRL_LOCALTIME_F
1e7a0 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  AULT: {.      sq
1e7b0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1e7c0 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c  g.bLocaltimeFaul
1e7d0 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
1e7e0 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
1e7f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1e800 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1e810 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1e820 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52  STCTRL_NEVER_COR
1e830 52 55 50 54 2c 20 69 6e 74 29 3b 0a 20 20 20 20  RUPT, int);.    
1e840 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 6f 72  **.    ** Set or
1e850 20 63 6c 65 61 72 20 61 20 66 6c 61 67 20 74 68   clear a flag th
1e860 61 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  at indicates tha
1e870 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1e880 69 6c 65 20 69 73 20 61 6c 77 61 79 73 20 77 65  ile is always we
1e890 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 65  ll-.    ** forme
1e8a0 64 20 61 6e 64 20 6e 65 76 65 72 20 63 6f 72 72  d and never corr
1e8b0 75 70 74 2e 20 20 54 68 69 73 20 66 6c 61 67 20  upt.  This flag 
1e8c0 69 73 20 63 6c 65 61 72 20 62 79 20 64 65 66 61  is clear by defa
1e8d0 75 6c 74 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ult, indicating 
1e8e0 74 68 61 74 0a 20 20 20 20 2a 2a 20 64 61 74 61  that.    ** data
1e8f0 62 61 73 65 20 66 69 6c 65 73 20 6d 69 67 68 74  base files might
1e900 20 68 61 76 65 20 61 72 62 69 74 72 61 72 79 20   have arbitrary 
1e910 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 53 65 74  corruption.  Set
1e920 74 69 6e 67 20 74 68 65 20 66 6c 61 67 20 64 75  ting the flag du
1e930 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74 65 73 74  ring.    ** test
1e940 69 6e 67 20 63 61 75 73 65 73 20 63 65 72 74 61  ing causes certa
1e950 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
1e960 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
1e970 64 65 20 74 6f 20 62 65 20 61 63 74 69 76 61 74  de to be activat
1e980 65 64 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  ed.    ** that d
1e990 65 6d 6f 6e 73 74 72 61 74 20 69 6e 76 61 72 69  emonstrat invari
1e9a0 61 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d 66 6f 72  ants on well-for
1e9b0 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
1e9c0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  es..    */.    c
1e9d0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1e9e0 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50  TRL_NEVER_CORRUP
1e9f0 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
1ea00 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
1ea10 65 76 65 72 43 6f 72 72 75 70 74 20 3d 20 76 61  everCorrupt = va
1ea20 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
1ea30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ea40 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
1ea50 65 20 74 68 72 65 73 68 6f 6c 64 20 61 74 20 77  e threshold at w
1ea60 68 69 63 68 20 4f 50 5f 4f 6e 63 65 20 63 6f 75  hich OP_Once cou
1ea70 6e 74 65 72 73 20 72 65 73 65 74 20 62 61 63 6b  nters reset back
1ea80 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2a   to zero..    **
1ea90 20 42 79 20 64 65 66 61 75 6c 74 20 74 68 69 73   By default this
1eaa0 20 69 73 20 30 78 37 66 66 66 66 66 66 65 20 28   is 0x7ffffffe (
1eab0 6f 76 65 72 20 32 20 62 69 6c 6c 69 6f 6e 29 2c  over 2 billion),
1eac0 20 62 75 74 20 74 68 61 74 20 76 61 6c 75 65 20   but that value 
1ead0 69 73 0a 20 20 20 20 2a 2a 20 74 6f 6f 20 62 69  is.    ** too bi
1eae0 67 20 74 6f 20 74 65 73 74 20 69 6e 20 61 20 72  g to test in a r
1eaf0 65 61 73 6f 6e 61 62 6c 65 20 61 6d 6f 75 6e 74  easonable amount
1eb00 20 6f 66 20 74 69 6d 65 2c 20 73 6f 20 74 68 69   of time, so thi
1eb10 73 20 63 6f 6e 74 72 6f 6c 20 69 73 0a 20 20 20  s control is.   
1eb20 20 2a 2a 20 70 72 6f 76 69 64 65 64 20 74 6f 20   ** provided to 
1eb30 73 65 74 20 61 20 73 6d 61 6c 6c 20 61 6e 64 20  set a small and 
1eb40 65 61 73 69 6c 79 20 72 65 61 63 68 61 62 6c 65  easily reachable
1eb50 20 72 65 73 65 74 20 76 61 6c 75 65 2e 0a 20 20   reset value..  
1eb60 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1eb70 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 4e  LITE_TESTCTRL_ON
1eb80 43 45 5f 52 45 53 45 54 5f 54 48 52 45 53 48 4f  CE_RESET_THRESHO
1eb90 4c 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LD: {.      sqli
1eba0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1ebb0 69 4f 6e 63 65 52 65 73 65 74 54 68 72 65 73 68  iOnceResetThresh
1ebc0 6f 6c 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  old = va_arg(ap,
1ebd0 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
1ebe0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1ebf0 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1ec00 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1ec10 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f  TESTCTRL_VDBE_CO
1ec20 56 45 52 41 47 45 2c 20 78 43 61 6c 6c 62 61 63  VERAGE, xCallbac
1ec30 6b 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a 0a  k, ptr);.    **.
1ec40 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 56      ** Set the V
1ec50 44 42 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c  DBE coverage cal
1ec60 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74  lback function t
1ec70 6f 20 78 43 61 6c 6c 62 61 63 6b 20 77 69 74 68  o xCallback with
1ec80 20 63 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2a   context .    **
1ec90 20 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20 20   pointer ptr..  
1eca0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1ecb0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44  LITE_TESTCTRL_VD
1ecc0 42 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a 23  BE_COVERAGE: {.#
1ecd0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
1ece0 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20  E_COVERAGE.     
1ecf0 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a   typedef void (*
1ed00 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29  branch_callback)
1ed10 28 76 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c 75 38  (void*,int,u8,u8
1ed20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ed30 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64  GlobalConfig.xVd
1ed40 62 65 42 72 61 6e 63 68 20 3d 20 76 61 5f 61 72  beBranch = va_ar
1ed50 67 28 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c  g(ap,branch_call
1ed60 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  back);.      sql
1ed70 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ed80 2e 70 56 64 62 65 42 72 61 6e 63 68 41 72 67 20  .pVdbeBranchArg 
1ed90 3d 20 76 61 5f 61 72 67 28 61 70 2c 76 6f 69 64  = va_arg(ap,void
1eda0 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  *);.#endif.     
1edb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1edc0 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1edd0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1ede0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52  ITE_TESTCTRL_SOR
1edf0 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d  TER_MMAP, db, nM
1ee00 61 78 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65  ax); */.    case
1ee10 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1ee20 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a  _SORTER_MMAP: {.
1ee30 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1ee40 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
1ee50 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
1ee60 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d  db->nMaxSorterMm
1ee70 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
1ee80 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
1ee90 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1eea0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1eeb0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1eec0 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 29 3b  ESTCTRL_ISINIT);
1eed0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
1eee0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1eef0 69 66 20 53 51 4c 69 74 65 20 68 61 73 20 62 65  if SQLite has be
1ef00 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  en initialized a
1ef10 6e 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  nd SQLITE_ERROR 
1ef20 69 66 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20  if.    ** not.. 
1ef30 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1ef40 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
1ef50 53 49 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20 69  SINIT: {.      i
1ef60 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
1ef70 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30  Config.isInit==0
1ef80 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45   ) rc = SQLITE_E
1ef90 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
1efa0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1efb0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1efc0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1efd0 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c  STCTRL_IMPOSTER,
1efe0 20 64 62 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f   db, dbName, onO
1eff0 66 66 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 2a  ff, tnum);.    *
1f000 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65  *.    ** This te
1f010 73 74 20 63 6f 6e 74 72 6f 6c 20 69 73 20 75 73  st control is us
1f020 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 6d 70  ed to create imp
1f030 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20 22  oster tables.  "
1f040 64 62 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72  db" is a pointer
1f050 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64  .    ** to the d
1f060 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1f070 6f 6e 2e 20 20 64 62 4e 61 6d 65 20 69 73 20 74  on.  dbName is t
1f080 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
1f090 20 28 65 78 3a 20 22 6d 61 69 6e 22 20 6f 72 0a   (ex: "main" or.
1f0a0 20 20 20 20 2a 2a 20 22 74 65 6d 70 22 29 20 77      ** "temp") w
1f0b0 68 69 63 68 20 77 69 6c 6c 20 72 65 63 65 69 76  hich will receiv
1f0c0 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72 2e 20  e the imposter. 
1f0d0 20 22 6f 6e 4f 66 66 22 20 74 75 72 6e 73 20 69   "onOff" turns i
1f0e0 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 0a  mposter mode on.
1f0f0 20 20 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20      ** or off.  
1f100 22 74 6e 75 6d 22 20 69 73 20 74 68 65 20 72 6f  "tnum" is the ro
1f110 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
1f120 2d 74 72 65 65 20 74 6f 20 77 68 69 63 68 20 74  -tree to which t
1f130 68 65 20 69 6d 70 6f 73 74 65 72 0a 20 20 20 20  he imposter.    
1f140 2a 2a 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  ** table should 
1f150 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 2a 2a 0a  connect..    **.
1f160 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 69 6d      ** Enable im
1f170 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 6c 79  poster mode only
1f180 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
1f190 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1f1a0 6e 20 70 61 72 73 65 64 2e 20 20 54 68 65 6e 0a  n parsed.  Then.
1f1b0 20 20 20 20 2a 2a 20 72 75 6e 20 61 20 73 69 6e      ** run a sin
1f1c0 67 6c 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  gle CREATE TABLE
1f1d0 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 63 6f   statement to co
1f1e0 6e 73 74 72 75 63 74 20 74 68 65 20 69 6d 70 6f  nstruct the impo
1f1f0 73 74 65 72 20 74 61 62 6c 65 20 69 6e 0a 20 20  ster table in.  
1f200 20 20 2a 2a 20 74 68 65 20 70 61 72 73 65 64 20    ** the parsed 
1f210 73 63 68 65 6d 61 2e 20 20 54 68 65 6e 20 74 75  schema.  Then tu
1f220 72 6e 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65  rn imposter mode
1f230 20 62 61 63 6b 20 6f 66 66 20 61 67 61 69 6e 2e   back off again.
1f240 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1f250 66 20 6f 6e 4f 66 66 3d 3d 30 20 61 6e 64 20 74  f onOff==0 and t
1f260 6e 75 6d 3e 30 20 74 68 65 6e 20 72 65 73 65 74  num>0 then reset
1f270 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
1f280 61 6c 6c 20 64 61 74 61 62 61 73 65 73 2c 20 63  all databases, c
1f290 61 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  ausing.    ** th
1f2a0 65 20 73 63 68 65 6d 61 20 74 6f 20 62 65 20 72  e schema to be r
1f2b0 65 70 61 72 73 65 64 20 74 68 65 20 6e 65 78 74  eparsed the next
1f2c0 20 74 69 6d 65 20 69 74 20 69 73 20 6e 65 65 64   time it is need
1f2d0 65 64 2e 20 20 54 68 69 73 20 68 61 73 20 74 68  ed.  This has th
1f2e0 65 0a 20 20 20 20 2a 2a 20 65 66 66 65 63 74 20  e.    ** effect 
1f2f0 6f 66 20 65 72 61 73 69 6e 67 20 61 6c 6c 20 69  of erasing all i
1f300 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 0a  mposter tables..
1f310 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1f320 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1f330 49 4d 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20  IMPOSTER: {.    
1f340 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1f350 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1f360 65 33 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e3*);.      sqli
1f370 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1f380 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
1f390 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d    db->init.iDb =
1f3a0 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
1f3b0 6d 65 28 64 62 2c 20 76 61 5f 61 72 67 28 61 70  me(db, va_arg(ap
1f3c0 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a  ,const char*));.
1f3d0 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62        db->init.b
1f3e0 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69  usy = db->init.i
1f3f0 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 3d 20 76  mposterTable = v
1f400 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
1f410 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65       db->init.ne
1f420 77 54 6e 75 6d 20 3d 20 76 61 5f 61 72 67 28 61  wTnum = va_arg(a
1f430 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  p,int);.      if
1f440 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
1f450 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e  =0 && db->init.n
1f460 65 77 54 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20  ewTnum>0 ){.    
1f470 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
1f480 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e  AllSchemasOfConn
1f490 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20  ection(db);.    
1f4a0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1f4b0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1f4c0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
1f4d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1f4e0 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23  .  va_end(ap);.#
1f4f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1f500 55 4e 54 45 53 54 41 42 4c 45 20 2a 2f 0a 20 20  UNTESTABLE */.  
1f510 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f520 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74  .** This is a ut
1f530 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 2c 20 75  ility routine, u
1f540 73 65 66 75 6c 20 74 6f 20 56 46 53 20 69 6d 70  seful to VFS imp
1f550 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68  lementations, th
1f560 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f 20  at checks.** to 
1f570 73 65 65 20 69 66 20 61 20 64 61 74 61 62 61 73  see if a databas
1f580 65 20 66 69 6c 65 20 77 61 73 20 61 20 55 52 49  e file was a URI
1f590 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 65 64 20   that contained 
1f5a0 61 20 73 70 65 63 69 66 69 63 20 71 75 65 72 79  a specific query
1f5b0 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c 20   .** parameter, 
1f5c0 61 6e 64 20 69 66 20 73 6f 20 6f 62 74 61 69 6e  and if so obtain
1f5d0 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
1f5e0 68 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  he query paramet
1f5f0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46  er..**.** The zF
1f600 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
1f610 20 69 73 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   is the filename
1f620 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20   pointer passed 
1f630 69 6e 74 6f 20 74 68 65 20 78 4f 70 65 6e 28 29  into the xOpen()
1f640 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 61 20  .** method of a 
1f650 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
1f660 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72 61 6d 20  on.  The zParam 
1f670 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
1f680 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 71  name of the.** q
1f690 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 77  uery parameter w
1f6a0 65 20 73 65 65 6b 2e 20 20 54 68 69 73 20 72 6f  e seek.  This ro
1f6b0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1f6c0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 7a  e value of the z
1f6d0 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61 6d 65 74  Param.** paramet
1f6e0 65 72 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  er if it exists.
1f6f0 20 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74    If the paramet
1f700 65 72 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  er does not exis
1f710 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  t, this routine.
1f720 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 4e 55 4c  ** returns a NUL
1f730 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f  L pointer..*/.co
1f740 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
1f750 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
1f760 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1f770 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  ename, const cha
1f780 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20 20 69 66  r *zParam){.  if
1f790 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  ( zFilename==0 |
1f7a0 7c 20 7a 50 61 72 61 6d 3d 3d 30 20 29 20 72 65  | zParam==0 ) re
1f7b0 74 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e  turn 0;.  zFilen
1f7c0 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  ame += sqlite3St
1f7d0 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
1f7e0 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  ) + 1;.  while( 
1f7f0 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
1f800 20 20 20 20 69 6e 74 20 78 20 3d 20 73 74 72 63      int x = strc
1f810 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  mp(zFilename, zP
1f820 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65  aram);.    zFile
1f830 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
1f840 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
1f850 65 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20  e) + 1;.    if( 
1f860 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 46  x==0 ) return zF
1f870 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69  ilename;.    zFi
1f880 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65  lename += sqlite
1f890 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
1f8a0 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20  ame) + 1;.  }.  
1f8b0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1f8c0 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c  ** Return a bool
1f8d0 65 61 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20  ean value for a 
1f8e0 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
1f8f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1f900 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73  uri_boolean(cons
1f910 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1f920 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1f930 50 61 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74  Param, int bDflt
1f940 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1f950 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  *z = sqlite3_uri
1f960 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65  _parameter(zFile
1f970 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20  name, zParam);. 
1f980 20 62 44 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d   bDflt = bDflt!=
1f990 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f 20  0;.  return z ? 
1f9a0 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61  sqlite3GetBoolea
1f9b0 6e 28 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62 44  n(z, bDflt) : bD
1f9c0 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  flt;.}../*.** Re
1f9d0 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20 69 6e  turn a 64-bit in
1f9e0 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20  teger value for 
1f9f0 61 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  a query paramete
1fa00 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e  r..*/.sqlite3_in
1fa10 74 36 34 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  t64 sqlite3_uri_
1fa20 69 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74 20 63  int64(.  const c
1fa30 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1fa40 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61     /* Filename a
1fa50 73 20 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65  s passed to xOpe
1fa60 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
1fa70 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20 20  r *zParam,      
1fa80 20 2f 2a 20 55 52 49 20 70 61 72 61 6d 65 74 65   /* URI paramete
1fa90 72 20 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71  r sought */.  sq
1faa0 6c 69 74 65 33 5f 69 6e 74 36 34 20 62 44 66 6c  lite3_int64 bDfl
1fab0 74 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72  t       /* retur
1fac0 6e 20 69 66 20 70 61 72 61 6d 65 74 65 72 20 69  n if parameter i
1fad0 73 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a  s missing */.){.
1fae0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1faf0 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  = sqlite3_uri_pa
1fb00 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d  rameter(zFilenam
1fb10 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71  e, zParam);.  sq
1fb20 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20  lite3_int64 v;. 
1fb30 20 69 66 28 20 7a 20 26 26 20 73 71 6c 69 74 65   if( z && sqlite
1fb40 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a  3DecOrHexToI64(z
1fb50 2c 20 26 76 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  , &v)==SQLITE_OK
1fb60 20 29 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d 20   ){.    bDflt = 
1fb70 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  v;.  }.  return 
1fb80 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  bDflt;.}../*.** 
1fb90 52 65 74 75 72 6e 20 74 68 65 20 42 74 72 65 65  Return the Btree
1fba0 20 70 6f 69 6e 74 65 72 20 69 64 65 6e 74 69 66   pointer identif
1fbb0 69 65 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20  ied by zDbName. 
1fbc0 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
1fbd0 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74  not found..*/.Bt
1fbe0 72 65 65 20 2a 73 71 6c 69 74 65 33 44 62 4e 61  ree *sqlite3DbNa
1fbf0 6d 65 54 6f 42 74 72 65 65 28 73 71 6c 69 74 65  meToBtree(sqlite
1fc00 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1fc10 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69  r *zDbName){.  i
1fc20 6e 74 20 69 44 62 20 3d 20 7a 44 62 4e 61 6d 65  nt iDb = zDbName
1fc30 20 3f 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   ? sqlite3FindDb
1fc40 4e 61 6d 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65  Name(db, zDbName
1fc50 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ) : 0;.  return 
1fc60 69 44 62 3c 30 20 3f 20 30 20 3a 20 64 62 2d 3e  iDb<0 ? 0 : db->
1fc70 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 7d 0a  aDb[iDb].pBt;.}.
1fc80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1fc90 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68  e filename of th
1fca0 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
1fcb0 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
1fcc0 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
1fcd0 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ion..*/.const ch
1fce0 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66  ar *sqlite3_db_f
1fcf0 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20  ilename(sqlite3 
1fd00 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1fd10 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72  *zDbName){.  Btr
1fd20 65 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20  ee *pBt;.#ifdef 
1fd30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1fd40 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1fd50 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1fd60 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
1fd70 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
1fd80 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
1fd90 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
1fda0 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65  f.  pBt = sqlite
1fdb0 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64  3DbNameToBtree(d
1fdc0 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72  b, zDbName);.  r
1fdd0 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69  eturn pBt ? sqli
1fde0 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
1fdf0 61 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a  ame(pBt) : 0;.}.
1fe00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  ./*.** Return 1 
1fe10 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20 72  if database is r
1fe20 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66  ead-only or 0 if
1fe30 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65   read/write.  Re
1fe40 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f  turn -1 if.** no
1fe50 20 73 75 63 68 20 64 61 74 61 62 61 73 65 20 65   such database e
1fe60 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  xists..*/.int sq
1fe70 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c  lite3_db_readonl
1fe80 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  y(sqlite3 *db, c
1fe90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1fea0 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  me){.  Btree *pB
1feb0 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  t;.#ifdef SQLITE
1fec0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1fed0 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1fee0 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1fef0 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
1ff00 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
1ff10 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  T;.    return -1
1ff20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
1ff30 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61  Bt = sqlite3DbNa
1ff40 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44  meToBtree(db, zD
1ff50 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  bName);.  return
1ff60 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74   pBt ? sqlite3Bt
1ff70 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 70 42  reeIsReadonly(pB
1ff80 74 29 20 3a 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64  t) : -1;.}..#ifd
1ff90 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1ffa0 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20  _SNAPSHOT./*.** 
1ffb0 4f 62 74 61 69 6e 20 61 20 73 6e 61 70 73 68 6f  Obtain a snapsho
1ffc0 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65  t handle for the
1ffd0 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 64 61 74   snapshot of dat
1ffe0 61 62 61 73 65 20 7a 44 62 20 63 75 72 72 65 6e  abase zDb curren
1fff0 74 6c 79 20 0a 2a 2a 20 62 65 69 6e 67 20 72 65  tly .** being re
20000 61 64 20 62 79 20 68 61 6e 64 6c 65 20 64 62 2e  ad by handle db.
20010 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
20020 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 0a 20 20  snapshot_get(.  
20030 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
20040 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
20050 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  .  sqlite3_snaps
20060 68 6f 74 20 2a 2a 70 70 53 6e 61 70 73 68 6f 74  hot **ppSnapshot
20070 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
20080 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66  QLITE_ERROR;.#if
20090 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
200a0 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c  _WAL..#ifdef SQL
200b0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
200c0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
200d0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
200e0 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
200f0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
20100 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
20110 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
20120 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
20130 78 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 61  x);..  if( db->a
20140 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  utoCommit==0 ){.
20150 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
20160 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
20170 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66  db, zDb);.    if
20180 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e  ( iDb==0 || iDb>
20190 31 20 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  1 ){.      Btree
201a0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
201b0 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
201c0 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74  if( 0==sqlite3Bt
201d0 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
201e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
201f0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
20200 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 29  ginTrans(pBt, 0)
20210 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
20220 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20230 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
20240 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68  lite3PagerSnapsh
20250 6f 74 47 65 74 28 73 71 6c 69 74 65 33 42 74 72  otGet(sqlite3Btr
20260 65 65 50 61 67 65 72 28 70 42 74 29 2c 20 70 70  eePager(pBt), pp
20270 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20  Snapshot);.     
20280 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
20290 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
202a0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
202b0 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66  ->mutex);.#endif
202c0 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49     /* SQLITE_OMI
202d0 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72  T_WAL */.  retur
202e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
202f0 70 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73  pen a read-trans
20300 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 6e  action on the sn
20310 61 70 73 68 6f 74 20 69 64 65 6e 64 69 66 69 65  apshot idendifie
20320 64 20 62 79 20 70 53 6e 61 70 73 68 6f 74 2e 0a  d by pSnapshot..
20330 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
20340 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a 20 20  napshot_open(.  
20350 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
20360 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
20370 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70   .  sqlite3_snap
20380 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 0a  shot *pSnapshot.
20390 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
203a0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e  LITE_ERROR;.#ifn
203b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
203c0 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  WAL..#ifdef SQLI
203d0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
203e0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
203f0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
20400 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
20410 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
20420 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
20430 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
20440 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
20450 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74  );.  if( db->aut
20460 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  oCommit==0 ){.  
20470 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 69    int iDb;.    i
20480 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
20490 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b  DbName(db, zDb);
204a0 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30 20  .    if( iDb==0 
204b0 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20  || iDb>1 ){.    
204c0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
204d0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
204e0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71  .      if( 0==sq
204f0 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 52 65  lite3BtreeIsInRe
20500 61 64 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  adTrans(pBt) ){.
20510 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
20520 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f  ite3PagerSnapsho
20530 74 4f 70 65 6e 28 73 71 6c 69 74 65 33 42 74 72  tOpen(sqlite3Btr
20540 65 65 50 61 67 65 72 28 70 42 74 29 2c 20 70 53  eePager(pBt), pS
20550 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20  napshot);.      
20560 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20570 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
20580 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
20590 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74  eeBeginTrans(pBt
205a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
205b0 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70  sqlite3PagerSnap
205c0 73 68 6f 74 4f 70 65 6e 28 73 71 6c 69 74 65 33  shotOpen(sqlite3
205d0 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 2c  BtreePager(pBt),
205e0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
205f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
20600 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
20610 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
20620 78 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20  x);.#endif   /* 
20630 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
20640 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
20650 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 76 65 72  }../*.** Recover
20660 20 61 73 20 6d 61 6e 79 20 73 6e 61 70 73 68 6f   as many snapsho
20670 74 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66  ts as possible f
20680 72 6f 6d 20 74 68 65 20 77 61 6c 20 66 69 6c 65  rom the wal file
20690 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
206a0 0a 2a 2a 20 73 63 68 65 6d 61 20 7a 44 62 20 6f  .** schema zDb o
206b0 66 20 64 61 74 61 62 61 73 65 20 64 62 2e 0a 2a  f database db..*
206c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e  /.int sqlite3_sn
206d0 61 70 73 68 6f 74 5f 72 65 63 6f 76 65 72 28 73  apshot_recover(s
206e0 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
206f0 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
20700 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20710 45 52 52 4f 52 3b 0a 20 20 69 6e 74 20 69 44 62  ERROR;.  int iDb
20720 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
20730 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65  _OMIT_WAL..#ifde
20740 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
20750 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
20760 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
20770 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
20780 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
20790 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
207a0 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
207b0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
207c0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 44 62 20  ->mutex);.  iDb 
207d0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  = sqlite3FindDbN
207e0 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  ame(db, zDb);.  
207f0 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44  if( iDb==0 || iD
20800 62 3e 31 20 29 7b 0a 20 20 20 20 42 74 72 65 65  b>1 ){.    Btree
20810 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
20820 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  iDb].pBt;.    if
20830 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  ( 0==sqlite3Btre
20840 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 70  eIsInReadTrans(p
20850 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Bt) ){.      rc 
20860 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
20870 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 29  ginTrans(pBt, 0)
20880 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
20890 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
208a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
208b0 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 52 65  3PagerSnapshotRe
208c0 63 6f 76 65 72 28 73 71 6c 69 74 65 33 42 74 72  cover(sqlite3Btr
208d0 65 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20  eePager(pBt));. 
208e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
208f0 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  reeCommit(pBt);.
20900 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20910 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
20920 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
20930 78 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20  x);.#endif   /* 
20940 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
20950 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
20960 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  }../*.** Free a 
20970 73 6e 61 70 73 68 6f 74 20 68 61 6e 64 6c 65 20  snapshot handle 
20980 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
20990 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67  lite3_snapshot_g
209a0 65 74 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  et()..*/.void sq
209b0 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66  lite3_snapshot_f
209c0 72 65 65 28 73 71 6c 69 74 65 33 5f 73 6e 61 70  ree(sqlite3_snap
209d0 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 29  shot *pSnapshot)
209e0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  {.  sqlite3_free
209f0 28 70 53 6e 61 70 73 68 6f 74 29 3b 0a 7d 0a 23  (pSnapshot);.}.#
20a00 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
20a10 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20  ENABLE_SNAPSHOT 
20a20 2a 2f 0a                                         */.