/ Hex Artifact Content
Login

Artifact eab7285786f9051fb0bc969cacd2060b26bf51a2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64  u.h".#endif.#ifd
0320: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0330: 5f 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74  _JSON1.int sqlit
0340: 65 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69  e3Json1Init(sqli
0350: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69  te3*);.#endif.#i
0360: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
0370: 4c 45 5f 46 54 53 35 0a 69 6e 74 20 73 71 6c 69  LE_FTS5.int sqli
0380: 74 65 33 46 74 73 35 49 6e 69 74 28 73 71 6c 69  te3Fts5Init(sqli
0390: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  te3*);.#endif..#
03a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d  ifndef SQLITE_AM
03b0: 41 4c 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d  ALGAMATION./* IM
03c0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
03d0: 20 52 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54   R-46656-45156 T
03e0: 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69  he sqlite3_versi
03f0: 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73  on[] string cons
0400: 74 61 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  tant.** contains
0410: 20 74 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c   the text of SQL
0420: 49 54 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72  ITE_VERSION macr
0430: 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  o. .*/.const cha
0440: 72 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  r sqlite3_versio
0450: 6e 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52  n[] = SQLITE_VER
0460: 53 49 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  SION;.#endif../*
0470: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0480: 4f 46 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37  OF: R-53536-4257
0490: 35 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  5 The sqlite3_li
04a0: 62 76 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74  bversion() funct
04b0: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61  ion returns.** a
04c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
04d0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  to the sqlite3_v
04e0: 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20  ersion[] string 
04f0: 63 6f 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f  constant. .*/.co
0500: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0510: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69  3_libversion(voi
0520: 64 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  d){ return sqlit
0530: 65 33 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f  e3_version; }../
0540: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
0550: 2d 4f 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33  -OF: R-63124-393
0560: 30 30 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73  00 The sqlite3_s
0570: 6f 75 72 63 65 69 64 28 29 20 66 75 6e 63 74 69  ourceid() functi
0580: 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20  on returns a.** 
0590: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
05a0: 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f  ing constant who
05b0: 73 65 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  se value is the 
05c0: 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53  same as the.** S
05d0: 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20  QLITE_SOURCE_ID 
05e0: 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d  C preprocessor m
05f0: 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20  acro. .*/.const 
0600: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f  char *sqlite3_so
0610: 75 72 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65  urceid(void){ re
0620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52  turn SQLITE_SOUR
0630: 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  CE_ID; }../* IMP
0640: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0650: 52 2d 33 35 32 31 30 2d 36 33 35 30 38 20 54 68  R-35210-63508 Th
0660: 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  e sqlite3_libver
0670: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75  sion_number() fu
0680: 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  nction.** return
0690: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75  s an integer equ
06a0: 61 6c 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52  al to SQLITE_VER
06b0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a  SION_NUMBER..*/.
06c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  int sqlite3_libv
06d0: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f  ersion_number(vo
06e0: 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  id){ return SQLI
06f0: 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
0700: 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  R; }../* IMPLEME
0710: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30  NTATION-OF: R-20
0720: 37 39 30 2d 31 34 30 32 35 20 54 68 65 20 73 71  790-14025 The sq
0730: 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65  lite3_threadsafe
0740: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
0750: 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61  rns.** zero if a
0760: 6e 64 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74  nd only if SQLit
0770: 65 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77  e was compiled w
0780: 69 74 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64  ith mutexing cod
0790: 65 20 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f  e omitted due to
07a0: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54  .** the SQLITE_T
07b0: 48 52 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c  HREADSAFE compil
07c0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65  e-time option be
07d0: 69 6e 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f  ing set to 0..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72  .int sqlite3_thr
07f0: 65 61 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72  eadsafe(void){ r
0800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52  eturn SQLITE_THR
0810: 45 41 44 53 41 46 45 3b 20 7d 0a 0a 2f 2a 0a 2a  EADSAFE; }../*.*
0820: 2a 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * When compiling
0830: 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72   the test fixtur
0840: 65 20 6f 72 20 77 69 74 68 20 64 65 62 75 67 67  e or with debugg
0850: 69 6e 67 20 65 6e 61 62 6c 65 64 20 28 6f 6e 20  ing enabled (on 
0860: 57 69 6e 33 32 29 2c 0a 2a 2a 20 74 68 69 73 20  Win32),.** this 
0870: 76 61 72 69 61 62 6c 65 20 62 65 69 6e 67 20 73  variable being s
0880: 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 77  et to non-zero w
0890: 69 6c 6c 20 63 61 75 73 65 20 4f 53 54 52 41 43  ill cause OSTRAC
08a0: 45 20 6d 61 63 72 6f 73 20 74 6f 20 65 6d 69 74  E macros to emit
08b0: 0a 2a 2a 20 65 78 74 72 61 20 64 69 61 67 6e 6f  .** extra diagno
08c0: 73 74 69 63 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  stic information
08d0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
08e0: 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
08f0: 0a 23 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  .# ifndef SQLITE
0900: 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 0a  _DEBUG_OS_TRACE.
0910: 23 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  #   define SQLIT
0920: 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45  E_DEBUG_OS_TRACE
0930: 20 30 0a 23 20 65 6e 64 69 66 0a 20 20 69 6e 74   0.# endif.  int
0940: 20 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 20   sqlite3OSTrace 
0950: 3d 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f  = SQLITE_DEBUG_O
0960: 53 5f 54 52 41 43 45 3b 0a 23 65 6e 64 69 66 0a  S_TRACE;.#endif.
0970: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0980: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
0990: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
09a0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
09b0: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E)./*.** If the 
09c0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
09d0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  on pointer is no
09e0: 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a 2a 2a  t NULL and if.**
09f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
0a00: 4f 54 52 41 43 45 20 69 73 20 65 6e 61 62 6c 65  OTRACE is enable
0a10: 64 2c 20 74 68 65 6e 20 6d 65 73 73 61 67 65 73  d, then messages
0a20: 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20 49   describing.** I
0a30: 2f 4f 20 61 63 74 69 76 65 20 61 72 65 20 77 72  /O active are wr
0a40: 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68 69 73  itten using this
0a50: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 73   function.  Thes
0a60: 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20 61 72  e messages.** ar
0a70: 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 64  e intended for d
0a80: 65 62 75 67 67 69 6e 67 20 61 63 74 69 76 69 74  ebugging activit
0a90: 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53 51 4c 49 54  y only..*/.SQLIT
0aa0: 45 5f 41 50 49 20 76 6f 69 64 20 28 53 51 4c 49  E_API void (SQLI
0ab0: 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74 65  TE_CDECL *sqlite
0ac0: 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20  3IoTrace)(const 
0ad0: 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b  char*, ...) = 0;
0ae0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
0af0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0b00: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
0b10: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
0b20: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  ng which is the.
0b30: 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  ** name of a dir
0b40: 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61  ectory, then tha
0b50: 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  t directory will
0b60: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
0b70: 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66  e.** temporary f
0b80: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  iles..**.** See 
0b90: 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41  also the "PRAGMA
0ba0: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
0bb0: 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61  ctory" SQL comma
0bc0: 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nd..*/.char *sql
0bd0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
0be0: 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ory = 0;../*.** 
0bf0: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0c00: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0c10: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0c20: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0c30: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0c40: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0c50: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0c60: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0c70: 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62 61  re.** all databa
0c80: 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66 69  se files specifi
0c90: 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ed with a relati
0ca0: 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a 0a  ve pathname..**.
0cb0: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  ** See also the 
0cc0: 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f  "PRAGMA data_sto
0cd0: 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53 51  re_directory" SQ
0ce0: 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68  L command..*/.ch
0cf0: 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74 61  ar *sqlite3_data
0d00: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  _directory = 0;.
0d10: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0d20: 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a 2a  e SQLite.  .**.*
0d30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0d40: 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ust be called to
0d50: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
0d60: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
0d70: 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20 6d  n,.** VFS, and m
0d80: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73 20  utex subsystems 
0d90: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61  prior to doing a
0da0: 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b 20  ny serious work 
0db0: 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e 20  with.** SQLite. 
0dc0: 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73 20   But as long as 
0dd0: 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70 69  you do not compi
0de0: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f  le with SQLITE_O
0df0: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a 20  MIT_AUTOINIT.** 
0e00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
0e10: 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74 6f  l be called auto
0e20: 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65 79  matically by key
0e30: 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20 61   routines such a
0e40: 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  s.** sqlite3_ope
0e50: 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  n().  .**.** Thi
0e60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
0e70: 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20 69  o-op except on i
0e80: 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63 61  ts very first ca
0e90: 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63 65  ll for the proce
0ea0: 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74 68  ss,.** or for th
0eb0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66 74  e first call aft
0ec0: 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
0ed0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a 2a  ite3_shutdown..*
0ee0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
0ef0: 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74 68  hread to call th
0f00: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
0f10: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
0f20: 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65 74  on to.** complet
0f30: 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71 75  ion.  If subsequ
0f40: 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c 6c  ent threads call
0f50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
0f60: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  fore the first.*
0f70: 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69 6e  * thread has fin
0f80: 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69 61  ished the initia
0f90: 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73  lization process
0fa0: 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73 65  , then the subse
0fb0: 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64 73  quent.** threads
0fc0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fd0: 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  l the first thre
0fe0: 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74 68  ad finishes with
0ff0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1000: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
1010: 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67 68  irst thread migh
1020: 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  t call this rout
1030: 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79 2e  ine recursively.
1040: 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20 63    Recursive.** c
1050: 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75  alls to this rou
1060: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tine should not 
1070: 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73 65  block, of course
1080: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
1090: 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  .** initializati
10a0: 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c 64  on process would
10b0: 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65 2e   never complete.
10c0: 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65 20  .**.** Let X be 
10d0: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  the first thread
10e0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 72   to enter this r
10f0: 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20 62  outine.  Let Y b
1100: 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  e some other.** 
1110: 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77 68  thread.  Then wh
1120: 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ile the initial 
1130: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  invocation of th
1140: 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58 20  is routine by X 
1150: 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74 65  is.** incomplete
1160: 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65 64  , it is required
1170: 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   that:.**.**    
1180: 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69 73  *  Calls to this
1190: 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59 20   routine from Y 
11a0: 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69 6c  must block until
11b0: 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74 0a   the outer-most.
11c0: 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62 79  **       call by
11d0: 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a 2a   X completes..**
11e0: 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72 73  .**    *  Recurs
11f0: 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68 69  ive calls to thi
1200: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
1210: 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20 69  hread X return i
1220: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
1230: 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f 63      without bloc
1240: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
1250: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1260: 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f 4c  void){.  MUTEX_L
1270: 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
1280: 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20  tex *pMaster; ) 
1290: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
12a0: 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a  n static mutex *
12b0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1300: 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69 6e  _EXTRA_INIT.  in
1310: 74 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20  t bRunExtraInit 
1320: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
1340: 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  tra initializati
1350: 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6e  on needed */.#en
1360: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1370: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63  TE_OMIT_WSD.  rc
1380: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
1390: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
13a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13b0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
13c0: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
13d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 6f 6c  .  /* If the fol
13e0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20  lowing assert() 
13f0: 66 61 69 6c 73 20 6f 6e 20 73 6f 6d 65 20 6f 62  fails on some ob
1400: 73 63 75 72 65 20 70 72 6f 63 65 73 73 6f 72 2f  scure processor/
1410: 63 6f 6d 70 69 6c 65 72 0a 20 20 2a 2a 20 63 6f  compiler.  ** co
1420: 6d 62 69 6e 61 74 69 6f 6e 2c 20 74 68 65 20 77  mbination, the w
1430: 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 74 6f  ork-around is to
1440: 20 73 65 74 20 74 68 65 20 63 6f 72 72 65 63 74   set the correct
1450: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 73 69   pointer.  ** si
1460: 7a 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ze at compile-ti
1470: 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  me using -DSQLIT
1480: 45 5f 50 54 52 53 49 5a 45 3d 6e 20 63 6f 6d 70  E_PTRSIZE=n comp
1490: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
14a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  */.  assert( SQL
14b0: 49 54 45 5f 50 54 52 53 49 5a 45 3d 3d 73 69 7a  ITE_PTRSIZE==siz
14c0: 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 0a 20  eof(char*) );.. 
14d0: 20 2f 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73   /* If SQLite is
14e0: 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c 65 74   already complet
14f0: 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  ely initialized,
1500: 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 0a   then this call.
1510: 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
1520: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 73 68 6f  initialize() sho
1530: 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20  uld be a no-op. 
1540: 20 42 75 74 20 74 68 65 20 69 6e 69 74 69 61 6c   But the initial
1550: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d 75 73  ization.  ** mus
1560: 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e 20 20  t be complete.  
1570: 53 6f 20 69 73 49 6e 69 74 20 6d 75 73 74 20 6e  So isInit must n
1580: 6f 74 20 62 65 20 73 65 74 20 75 6e 74 69 6c 20  ot be set until 
1590: 74 68 65 20 76 65 72 79 20 65 6e 64 0a 20 20 2a  the very end.  *
15a0: 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * of this routin
15b0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  e..  */.  if( sq
15c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15d0: 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72  g.isInit ) retur
15e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
15f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
1600: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
1610: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   is initialized.
1620: 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 0a    If unable to .
1630: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
1640: 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  the mutex subsys
1650: 74 65 6d 2c 20 72 65 74 75 72 6e 20 65 61 72 6c  tem, return earl
1660: 79 20 77 69 74 68 20 74 68 65 20 65 72 72 6f 72  y with the error
1670: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 79  ..  ** If the sy
1680: 73 74 65 6d 20 69 73 20 73 6f 20 73 69 63 6b 20  stem is so sick 
1690: 74 68 61 74 20 77 65 20 61 72 65 20 75 6e 61 62  that we are unab
16a0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  le to allocate a
16b0: 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20 74 68 65   mutex,.  ** the
16c0: 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 53  re is not much S
16d0: 51 4c 69 74 65 20 69 73 20 67 6f 69 6e 67 20 74  QLite is going t
16e0: 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 2e  o be able to do.
16f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d  .  **.  ** The m
1700: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 20 6d  utex subsystem m
1710: 75 73 74 20 74 61 6b 65 20 63 61 72 65 20 6f 66  ust take care of
1720: 20 73 65 72 69 61 6c 69 7a 69 6e 67 20 69 74 73   serializing its
1730: 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69 74 69 61   own.  ** initia
1740: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  lization..  */. 
1750: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 75 74   rc = sqlite3Mut
1760: 65 78 49 6e 69 74 28 29 3b 0a 20 20 69 66 28 20  exInit();.  if( 
1770: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1780: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1790: 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20 73 79   the malloc() sy
17a0: 73 74 65 6d 20 61 6e 64 20 74 68 65 20 72 65 63  stem and the rec
17b0: 75 72 73 69 76 65 20 70 49 6e 69 74 4d 75 74 65  ursive pInitMute
17c0: 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a 20 54 68  x mutex..  ** Th
17d0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  is operation is 
17e0: 70 72 6f 74 65 63 74 65 64 20 62 79 20 74 68 65  protected by the
17f0: 20 53 54 41 54 49 43 5f 4d 41 53 54 45 52 20 6d   STATIC_MASTER m
1800: 75 74 65 78 2e 20 20 4e 6f 74 65 20 74 68 61 74  utex.  Note that
1810: 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c 6c 6f 63  .  ** MutexAlloc
1820: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  () is called for
1830: 20 61 20 73 74 61 74 69 63 20 6d 75 74 65 78 20   a static mutex 
1840: 70 72 69 6f 72 20 74 6f 20 69 6e 69 74 69 61 6c  prior to initial
1850: 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6d  izing the.  ** m
1860: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20  alloc subsystem 
1870: 2d 20 74 68 69 73 20 69 6d 70 6c 69 65 73 20 74  - this implies t
1880: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
1890: 6f 6e 20 6f 66 20 61 20 73 74 61 74 69 63 0a 20  on of a static. 
18a0: 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74 20 6e   ** mutex must n
18b0: 6f 74 20 72 65 71 75 69 72 65 20 73 75 70 70 6f  ot require suppo
18c0: 72 74 20 66 72 6f 6d 20 74 68 65 20 6d 61 6c 6c  rt from the mall
18d0: 6f 63 20 73 75 62 73 79 73 74 65 6d 2e 0a 20 20  oc subsystem..  
18e0: 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  */.  MUTEX_LOGIC
18f0: 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69  ( pMaster = sqli
1900: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
1910: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1920: 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73  C_MASTER); ).  s
1930: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1940: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
1950: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1960: 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d  ig.isMutexInit =
1970: 20 31 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   1;.  if( !sqlit
1980: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1990: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
19a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
19b0: 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a 20 20 7d  allocInit();.  }
19c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
19e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
19f0: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 31  isMallocInit = 1
1a00: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
1a10: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1a20: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1a30: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1a40: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
1a50: 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 73  x =.           s
1a60: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1a70: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
1a80: 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20 20  CURSIVE);.      
1a90: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1aa0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
1ab0: 65 78 20 26 26 20 21 73 71 6c 69 74 65 33 47 6c  ex && !sqlite3Gl
1ac0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1ad0: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
1ae0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1af0: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
1b00: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
1b10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b20: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1b30: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
1b40: 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ex++;.  }.  sqli
1b50: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1b60: 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pMaster);..  /* 
1b70: 49 66 20 72 63 20 69 73 20 6e 6f 74 20 53 51 4c  If rc is not SQL
1b80: 49 54 45 5f 4f 4b 20 61 74 20 74 68 69 73 20 70  ITE_OK at this p
1b90: 6f 69 6e 74 2c 20 74 68 65 6e 20 65 69 74 68 65  oint, then eithe
1ba0: 72 20 74 68 65 20 6d 61 6c 6c 6f 63 0a 20 20 2a  r the malloc.  *
1bb0: 2a 20 73 75 62 73 79 73 74 65 6d 20 63 6f 75 6c  * subsystem coul
1bc0: 64 20 6e 6f 74 20 62 65 20 69 6e 69 74 69 61 6c  d not be initial
1bd0: 69 7a 65 64 20 6f 72 20 74 68 65 20 73 79 73 74  ized or the syst
1be0: 65 6d 20 66 61 69 6c 65 64 20 74 6f 20 61 6c 6c  em failed to all
1bf0: 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70  ocate.  ** the p
1c00: 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65 78 2e  InitMutex mutex.
1c10: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
1c20: 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e   in either case.
1c30: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53    */.  if( rc!=S
1c40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c50: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1c60: 20 20 2f 2a 20 44 6f 20 74 68 65 20 72 65 73 74    /* Do the rest
1c70: 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
1c80: 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20 74 68 65  zation under the
1c90: 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78   recursive mutex
1ca0: 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 77 65   so.  ** that we
1cb0: 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1cc0: 20 68 61 6e 64 6c 65 20 72 65 63 75 72 73 69 76   handle recursiv
1cd0: 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a 20 20 2a  e calls into.  *
1ce0: 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  * sqlite3_initia
1cf0: 6c 69 7a 65 28 29 2e 20 20 54 68 65 20 72 65 63  lize().  The rec
1d00: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6e 6f 72  ursive calls nor
1d10: 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68 72 6f 75  mally come throu
1d20: 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  gh.  ** sqlite3_
1d30: 6f 73 5f 69 6e 69 74 28 29 20 77 68 65 6e 20 69  os_init() when i
1d40: 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65  t invokes sqlite
1d50: 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 29  3_vfs_register()
1d60: 2c 20 62 75 74 20 6f 74 68 65 72 0a 20 20 2a 2a  , but other.  **
1d70: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1d80: 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 70   might also be p
1d90: 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  ossible..  **.  
1da0: 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
1db0: 4e 2d 4f 46 3a 20 52 2d 30 30 31 34 30 2d 33 37  N-OF: R-00140-37
1dc0: 34 34 35 20 53 51 4c 69 74 65 20 61 75 74 6f 6d  445 SQLite autom
1dd0: 61 74 69 63 61 6c 6c 79 20 73 65 72 69 61 6c 69  atically seriali
1de0: 7a 65 73 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 74  zes calls.  ** t
1df0: 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68  o the xInit meth
1e00: 6f 64 2c 20 73 6f 20 74 68 65 20 78 49 6e 69 74  od, so the xInit
1e10: 20 6d 65 74 68 6f 64 20 6e 65 65 64 20 6e 6f 74   method need not
1e20: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2e 0a   be threadsafe..
1e30: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f    **.  ** The fo
1e40: 6c 6c 6f 77 69 6e 67 20 6d 75 74 65 78 20 69 73  llowing mutex is
1e50: 20 77 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73   what serializes
1e60: 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 61   access to the a
1e70: 70 70 64 65 66 20 70 63 61 63 68 65 20 78 49 6e  ppdef pcache xIn
1e80: 69 74 0a 20 20 2a 2a 20 6d 65 74 68 6f 64 73 2e  it.  ** methods.
1e90: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 70 63    The sqlite3_pc
1ea0: 61 63 68 65 5f 6d 65 74 68 6f 64 73 2e 78 49 6e  ache_methods.xIn
1eb0: 69 74 28 29 20 61 6c 6c 20 69 73 20 65 6d 62 65  it() all is embe
1ec0: 64 64 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a  dded in the.  **
1ed0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1ee0: 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65  PcacheInitialize
1ef0: 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ()..  */.  sqlit
1f00: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
1f10: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1f20: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a  ig.pInitMutex);.
1f30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1f40: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
1f50: 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 47 6c  ==0 && sqlite3Gl
1f60: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
1f70: 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20  gress==0 ){.    
1f80: 46 75 6e 63 44 65 66 48 61 73 68 20 2a 70 48 61  FuncDefHash *pHa
1f90: 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28 46 75 6e  sh = &GLOBAL(Fun
1fa0: 63 44 65 66 48 61 73 68 2c 20 73 71 6c 69 74 65  cDefHash, sqlite
1fb0: 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73  3GlobalFunctions
1fc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
1fd0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
1fe0: 67 72 65 73 73 20 3d 20 31 3b 0a 23 69 66 64 65  gress = 1;.#ifde
1ff0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2000: 53 51 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20 20 20  SQLLOG.    {.   
2010: 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73     extern void s
2020: 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c  qlite3_init_sqll
2030: 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20  og(void);.      
2040: 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c  sqlite3_init_sql
2050: 6c 6f 67 28 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  log();.    }.#en
2060: 64 69 66 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  dif.    memset(p
2070: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
2080: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e  sqlite3GlobalFun
2090: 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20 73 71  ctions));.    sq
20a0: 6c 69 74 65 33 52 65 67 69 73 74 65 72 47 6c 6f  lite3RegisterGlo
20b0: 62 61 6c 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a  balFunctions();.
20c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
20d0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
20e0: 61 63 68 65 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  acheInit==0 ){. 
20f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2100: 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a  3PcacheInitializ
2110: 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  e();.    }.    i
2120: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2130: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2140: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
2150: 50 43 61 63 68 65 49 6e 69 74 20 3d 20 31 3b 0a  PCacheInit = 1;.
2160: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2170: 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20 20 20 20  e3OsInit();.    
2180: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2190: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21a0: 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 42 75   sqlite3PCacheBu
21b0: 66 66 65 72 53 65 74 75 70 28 20 73 71 6c 69 74  fferSetup( sqlit
21c0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
21d0: 50 61 67 65 2c 20 0a 20 20 20 20 20 20 20 20 20  Page, .         
21e0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
21f0: 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c  nfig.szPage, sql
2200: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2210: 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 73  .nPage);.      s
2220: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2230: 69 67 2e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 23  ig.isInit = 1;.#
2240: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54  ifdef SQLITE_EXT
2250: 52 41 5f 49 4e 49 54 0a 20 20 20 20 20 20 62 52  RA_INIT.      bR
2260: 75 6e 45 78 74 72 61 49 6e 69 74 20 3d 20 31 3b  unExtraInit = 1;
2270: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
2280: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2290: 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73  onfig.inProgress
22a0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
22b0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
22c0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
22d0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b  fig.pInitMutex);
22e0: 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75  ..  /* Go back u
22f0: 6e 64 65 72 20 74 68 65 20 73 74 61 74 69 63 20  nder the static 
2300: 6d 75 74 65 78 20 61 6e 64 20 63 6c 65 61 6e 20  mutex and clean 
2310: 75 70 20 74 68 65 20 72 65 63 75 72 73 69 76 65  up the recursive
2320: 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70  .  ** mutex to p
2330: 72 65 76 65 6e 74 20 61 20 72 65 73 6f 75 72 63  revent a resourc
2340: 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73  e leak..  */.  s
2350: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
2360: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
2370: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2380: 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78  ig.nRefInitMutex
2390: 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  --;.  if( sqlite
23a0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
23b0: 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29  efInitMutex<=0 )
23c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
23d0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
23e0: 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3d  g.nRefInitMutex=
23f0: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
2400: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 73 71 6c  3_mutex_free(sql
2410: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2420: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20  .pInitMutex);.  
2430: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2440: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
2450: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
2460: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2470: 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pMaster);..  /* 
2480: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
2490: 20 6a 75 73 74 20 61 20 73 61 6e 69 74 79 20 63   just a sanity c
24a0: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
24b0: 65 20 53 51 4c 69 74 65 20 68 61 73 0a 20 20 2a  e SQLite has.  *
24c0: 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20  * been compiled 
24d0: 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 74 20 69  correctly.  It i
24e0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72  s important to r
24f0: 75 6e 20 74 68 69 73 20 63 6f 64 65 2c 20 62 75  un this code, bu
2500: 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  t.  ** we don't 
2510: 77 61 6e 74 20 74 6f 20 72 75 6e 20 69 74 20 74  want to run it t
2520: 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61  oo often and soa
2530: 6b 20 75 70 20 43 50 55 20 63 79 63 6c 65 73 20  k up CPU cycles 
2540: 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73  for no.  ** reas
2550: 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75 6e 20 69  on.  So we run i
2560: 74 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 69 6e  t once during in
2570: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
2580: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
2590: 47 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  G.#ifndef SQLITE
25a0: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
25b0: 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69 73 20 73  OINT.  /* This s
25c0: 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73  ection of code's
25d0: 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74 22 20 69   only "output" i
25e0: 73 20 76 69 61 20 61 73 73 65 72 74 28 29 20 73  s via assert() s
25f0: 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  tatements. */.  
2600: 69 66 20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  if ( rc==SQLITE_
2610: 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34 20 78 20  OK ){.    u64 x 
2620: 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 36 33 29  = (((u64)1)<<63)
2630: 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79  -1;.    double y
2640: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73 69 7a  ;.    assert(siz
2650: 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20 20 20 20  eof(x)==8);.    
2660: 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29  assert(sizeof(x)
2670: 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b 0a 20 20  ==sizeof(y));.  
2680: 20 20 6d 65 6d 63 70 79 28 26 79 2c 20 26 78 2c    memcpy(&y, &x,
2690: 20 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   8);.    assert(
26a0: 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 79 29   sqlite3IsNaN(y)
26b0: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   );.  }.#endif.#
26c0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 65  endif..  /* Do e
26d0: 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74  xtra initializat
26e0: 69 6f 6e 20 73 74 65 70 73 20 72 65 71 75 65 73  ion steps reques
26f0: 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ted by the SQLIT
2700: 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 2a  E_EXTRA_INIT.  *
2710: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  * compile-time o
2720: 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  ption..  */.#ifd
2730: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
2740: 49 4e 49 54 0a 20 20 69 66 28 20 62 52 75 6e 45  INIT.  if( bRunE
2750: 78 74 72 61 49 6e 69 74 20 29 7b 0a 20 20 20 20  xtraInit ){.    
2760: 69 6e 74 20 53 51 4c 49 54 45 5f 45 58 54 52 41  int SQLITE_EXTRA
2770: 5f 49 4e 49 54 28 63 6f 6e 73 74 20 63 68 61 72  _INIT(const char
2780: 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  *);.    rc = SQL
2790: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 30  ITE_EXTRA_INIT(0
27a0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
27b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27c0: 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65 20 65 66  *.** Undo the ef
27d0: 66 65 63 74 73 20 6f 66 20 73 71 6c 69 74 65 33  fects of sqlite3
27e0: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20  _initialize().  
27f0: 4d 75 73 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c  Must not be call
2800: 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72  ed while.** ther
2810: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
2820: 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  g database conne
2830: 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79  ctions or memory
2840: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a   allocations or.
2850: 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 70 61 72  ** while any par
2860: 74 20 6f 66 20 53 51 4c 69 74 65 20 69 73 20 6f  t of SQLite is o
2870: 74 68 65 72 77 69 73 65 20 69 6e 20 75 73 65 20  therwise in use 
2880: 69 6e 20 61 6e 79 20 74 68 72 65 61 64 2e 20 20  in any thread.  
2890: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
28a0: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
28b0: 65 2e 20 20 42 75 74 20 69 74 20 69 73 20 73 61  e.  But it is sa
28c0: 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69  fe to invoke thi
28d0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20  s routine.** on 
28e0: 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20 61  when SQLite is a
28f0: 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e  lready shut down
2900: 2e 20 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  .  If SQLite is 
2910: 61 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f 77  already shut dow
2920: 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72  n.** when this r
2930: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
2940: 64 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  d, then this rou
2950: 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65  tine is a harmle
2960: 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74  ss no-op..*/.int
2970: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
2980: 6e 28 76 6f 69 64 29 7b 0a 23 69 66 64 65 66 20  n(void){.#ifdef 
2990: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
29a0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
29b0: 65 33 5f 77 73 64 5f 69 6e 69 74 28 34 30 39 36  e3_wsd_init(4096
29c0: 2c 20 32 34 29 3b 0a 20 20 69 66 28 20 72 63 21  , 24);.  if( rc!
29d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
29f0: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73  .#endif..  if( s
2a00: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2a10: 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a 23 69 66  ig.isInit ){.#if
2a20: 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41  def SQLITE_EXTRA
2a30: 5f 53 48 55 54 44 4f 57 4e 0a 20 20 20 20 76 6f  _SHUTDOWN.    vo
2a40: 69 64 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  id SQLITE_EXTRA_
2a50: 53 48 55 54 44 4f 57 4e 28 76 6f 69 64 29 3b 0a  SHUTDOWN(void);.
2a60: 20 20 20 20 53 51 4c 49 54 45 5f 45 58 54 52 41      SQLITE_EXTRA
2a70: 5f 53 48 55 54 44 4f 57 4e 28 29 3b 0a 23 65 6e  _SHUTDOWN();.#en
2a80: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
2a90: 6f 73 5f 65 6e 64 28 29 3b 0a 20 20 20 20 73 71  os_end();.    sq
2aa0: 6c 69 74 65 33 5f 72 65 73 65 74 5f 61 75 74 6f  lite3_reset_auto
2ab0: 5f 65 78 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20  _extension();.  
2ac0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2ad0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 30  onfig.isInit = 0
2ae0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
2af0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2b00: 69 73 50 43 61 63 68 65 49 6e 69 74 20 29 7b 0a  isPCacheInit ){.
2b10: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2b20: 65 53 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 20  eShutdown();.   
2b30: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2b40: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2b50: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
2b60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2b70: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
2b80: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2b90: 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 20  MallocEnd();.   
2ba0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2bb0: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
2bc0: 74 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20  t = 0;..#ifndef 
2bd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 55 54  SQLITE_OMIT_SHUT
2be0: 44 4f 57 4e 5f 44 49 52 45 43 54 4f 52 49 45 53  DOWN_DIRECTORIES
2bf0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70  .    /* The heap
2c00: 20 73 75 62 73 79 73 74 65 6d 20 68 61 73 20 6e   subsystem has n
2c10: 6f 77 20 62 65 65 6e 20 73 68 75 74 64 6f 77 6e  ow been shutdown
2c20: 20 61 6e 64 20 74 68 65 73 65 20 76 61 6c 75 65   and these value
2c30: 73 20 61 72 65 20 73 75 70 70 6f 73 65 64 0a 20  s are supposed. 
2c40: 20 20 20 2a 2a 20 74 6f 20 62 65 20 4e 55 4c 4c     ** to be NULL
2c50: 20 6f 72 20 70 6f 69 6e 74 20 74 6f 20 6d 65 6d   or point to mem
2c60: 6f 72 79 20 74 68 61 74 20 77 61 73 20 6f 62 74  ory that was obt
2c70: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
2c80: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 0a 20 20 20  e3_malloc(),.   
2c90: 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20   ** which would 
2ca0: 72 65 6c 79 20 6f 6e 20 74 68 61 74 20 68 65 61  rely on that hea
2cb0: 70 20 73 75 62 73 79 73 74 65 6d 3b 20 74 68 65  p subsystem; the
2cc0: 72 65 66 6f 72 65 2c 20 6d 61 6b 65 20 73 75 72  refore, make sur
2cd0: 65 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 76  e these.    ** v
2ce0: 61 6c 75 65 73 20 63 61 6e 6e 6f 74 20 72 65 66  alues cannot ref
2cf0: 65 72 20 74 6f 20 68 65 61 70 20 6d 65 6d 6f 72  er to heap memor
2d00: 79 20 74 68 61 74 20 77 61 73 20 6a 75 73 74 20  y that was just 
2d10: 69 6e 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e  invalidated when
2d20: 20 74 68 65 0a 20 20 20 20 2a 2a 20 68 65 61 70   the.    ** heap
2d30: 20 73 75 62 73 79 73 74 65 6d 20 77 61 73 20 73   subsystem was s
2d40: 68 75 74 64 6f 77 6e 2e 20 20 54 68 69 73 20 69  hutdown.  This i
2d50: 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 69 66 20 74  s only done if t
2d60: 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 20  he current call 
2d70: 74 6f 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66  to.    ** this f
2d80: 75 6e 63 74 69 6f 6e 20 72 65 73 75 6c 74 65 64  unction resulted
2d90: 20 69 6e 20 74 68 65 20 68 65 61 70 20 73 75 62   in the heap sub
2da0: 73 79 73 74 65 6d 20 61 63 74 75 61 6c 6c 79 20  system actually 
2db0: 62 65 69 6e 67 20 73 68 75 74 64 6f 77 6e 2e 0a  being shutdown..
2dc0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
2dd0: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
2de0: 79 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  y = 0;.    sqlit
2df0: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
2e00: 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  y = 0;.#endif.  
2e10: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2e20: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75  lobalConfig.isMu
2e30: 74 65 78 49 6e 69 74 20 29 7b 0a 20 20 20 20 73  texInit ){.    s
2e40: 71 6c 69 74 65 33 4d 75 74 65 78 45 6e 64 28 29  qlite3MutexEnd()
2e50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
2e60: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65  balConfig.isMute
2e70: 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  xInit = 0;.  }..
2e80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e90: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
2ea0: 73 20 41 50 49 20 61 6c 6c 6f 77 73 20 61 70 70  s API allows app
2eb0: 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64  lications to mod
2ec0: 69 66 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 63  ify the global c
2ed0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a  onfiguration of.
2ee0: 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  ** the SQLite li
2ef0: 62 72 61 72 79 20 61 74 20 72 75 6e 2d 74 69 6d  brary at run-tim
2f00: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
2f10: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
2f20: 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  y be called when
2f30: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
2f40: 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74  tstanding.** dat
2f50: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2f60: 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  s or memory allo
2f70: 63 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 72  cations.  This r
2f80: 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a  outine is not.**
2f90: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 46 61   threadsafe.  Fa
2fa0: 69 6c 75 72 65 20 74 6f 20 68 65 65 64 20 74 68  ilure to heed th
2fb0: 65 73 65 20 77 61 72 6e 69 6e 67 73 20 63 61 6e  ese warnings can
2fc0: 20 6c 65 61 64 20 74 6f 20 75 6e 70 72 65 64 69   lead to unpredi
2fd0: 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69  ctable.** behavi
2fe0: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
2ff0: 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70  e3_config(int op
3000: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
3010: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d  t ap;.  int rc =
3020: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
3030: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  * sqlite3_config
3040: 28 29 20 73 68 61 6c 6c 20 72 65 74 75 72 6e 20  () shall return 
3050: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66  SQLITE_MISUSE if
3060: 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 77   it is invoked w
3070: 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53 51  hile.  ** the SQ
3080: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 69 73 20  Lite library is 
3090: 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28  in use. */.  if(
30a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
30b0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65  nfig.isInit ) re
30c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
30d0: 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76 61 5f 73  SE_BKPT;..  va_s
30e0: 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
30f0: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20  switch( op ){.. 
3100: 20 20 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66     /* Mutex conf
3110: 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
3120: 73 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  s are only avail
3130: 61 62 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64  able in a thread
3140: 73 61 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  safe.    ** comp
3150: 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20  ile..    */.#if 
3160: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
3170: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
3180: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
3190: 30 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 34 34  0  /* IMP: R-544
31a0: 36 36 2d 34 36 37 35 36 20 2a 2f 0a 20 20 20 20  66-46756 */.    
31b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
31c0: 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 3a  IG_SINGLETHREAD:
31d0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
31e0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 32 37 34 38  ENCE-OF: R-02748
31f0: 2d 31 39 30 39 36 20 54 68 69 73 20 6f 70 74 69  -19096 This opti
3200: 6f 6e 20 73 65 74 73 20 74 68 65 20 74 68 72 65  on sets the thre
3210: 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20  ading mode to.  
3220: 20 20 20 20 2a 2a 20 53 69 6e 67 6c 65 2d 74 68      ** Single-th
3230: 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73  read. */.      s
3240: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3250: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
3260: 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d  0;  /* Disable m
3270: 75 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a  utex on core */.
3280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3290: 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
32a0: 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a 20 44 69  utex = 0;  /* Di
32b0: 73 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63  sable mutex on c
32c0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
32d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
32e0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
32f0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
3300: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3310: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a  _THREADSAFE>0 /*
3320: 20 49 4d 50 3a 20 52 2d 32 30 35 32 30 2d 35 34   IMP: R-20520-54
3330: 30 38 36 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  086 */.    case 
3340: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55  SQLITE_CONFIG_MU
3350: 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a 20 20 20  LTITHREAD: {.   
3360: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
3370: 46 3a 20 52 2d 31 34 33 37 34 2d 34 32 34 36 38  F: R-14374-42468
3380: 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73 65 74   This option set
3390: 73 20 74 68 65 20 74 68 72 65 61 64 69 6e 67 20  s the threading 
33a0: 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  mode to.      **
33b0: 20 4d 75 6c 74 69 2d 74 68 72 65 61 64 2e 20 2a   Multi-thread. *
33c0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
33d0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
33e0: 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20  eMutex = 1;  /* 
33f0: 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20  Enable mutex on 
3400: 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  core */.      sq
3410: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3420: 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30  g.bFullMutex = 0
3430: 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75  ;  /* Disable mu
3440: 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f  tex on connectio
3450: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ns */.      brea
3460: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3470: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3480: 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26  TE_THREADSAFE) &
3490: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
34a0: 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  AFE>0 /* IMP: R-
34b0: 35 39 35 39 33 2d 32 31 38 31 30 20 2a 2f 0a 20  59593-21810 */. 
34c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
34d0: 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49 5a 45 44  ONFIG_SERIALIZED
34e0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
34f0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 32 32  DENCE-OF: R-4122
3500: 30 2d 35 31 38 30 30 20 54 68 69 73 20 6f 70 74  0-51800 This opt
3510: 69 6f 6e 20 73 65 74 73 20 74 68 65 20 74 68 72  ion sets the thr
3520: 65 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f 0a 20  eading mode to. 
3530: 20 20 20 20 20 2a 2a 20 53 65 72 69 61 6c 69 7a       ** Serializ
3540: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ed. */.      sql
3550: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3560: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b  .bCoreMutex = 1;
3570: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65    /* Enable mute
3580: 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20  x on core */.   
3590: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
35a0: 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
35b0: 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62 6c  x = 1;  /* Enabl
35c0: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65  e mutex on conne
35d0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ctions */.      
35e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
35f0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3600: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3610: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3620: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
3630: 3a 20 52 2d 36 33 36 36 36 2d 34 38 37 35 35 20  : R-63666-48755 
3640: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3650: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a  TE_CONFIG_MUTEX:
3660: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63   {.      /* Spec
3670: 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  ify an alternati
3680: 76 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65  ve mutex impleme
3690: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
36a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
36b0: 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61  nfig.mutex = *va
36c0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
36d0: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29  _mutex_methods*)
36e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
36f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
3700: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
3710: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
3720: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
3730: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 34 34 35  0 /* IMP: R-1445
3740: 30 2d 33 37 35 39 37 20 2a 2f 0a 20 20 20 20 63  0-37597 */.    c
3750: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3760: 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b 0a 20 20  G_GETMUTEX: {.  
3770: 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20      /* Retrieve 
3780: 74 68 65 20 63 75 72 72 65 6e 74 20 6d 75 74 65  the current mute
3790: 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  x implementation
37a0: 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72   */.      *va_ar
37b0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75  g(ap, sqlite3_mu
37c0: 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20  tex_methods*) = 
37d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
37e0: 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20 20 20 20  fig.mutex;.     
37f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
3800: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
3810: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c  QLITE_CONFIG_MAL
3820: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
3830: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
3840: 35 35 39 34 2d 32 31 30 33 30 20 54 68 65 20 53  5594-21030 The S
3850: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c  QLITE_CONFIG_MAL
3860: 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73  LOC option takes
3870: 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
3880: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
3890: 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  h is a pointer t
38a0: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
38b0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71   the.      ** sq
38c0: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
38d0: 73 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  s structure. The
38e0: 20 61 72 67 75 6d 65 6e 74 20 73 70 65 63 69 66   argument specif
38f0: 69 65 73 20 61 6c 74 65 72 6e 61 74 69 76 65 0a  ies alternative.
3900: 20 20 20 20 20 20 2a 2a 20 6c 6f 77 2d 6c 65 76        ** low-lev
3910: 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  el memory alloca
3920: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 6f  tion routines to
3930: 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63   be used in plac
3940: 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 0a  e of the memory.
3950: 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
3960: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 62 75 69  ion routines bui
3970: 6c 74 20 69 6e 74 6f 20 53 51 4c 69 74 65 2e 20  lt into SQLite. 
3980: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3990: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d  GlobalConfig.m =
39a0: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
39b0: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
39c0: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
39d0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
39e0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
39f0: 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20  TMALLOC: {.     
3a00: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
3a10: 20 52 2d 35 31 32 31 33 2d 34 36 34 31 34 20 54   R-51213-46414 T
3a20: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
3a30: 5f 47 45 54 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f  _GETMALLOC optio
3a40: 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20  n takes a.      
3a50: 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65  ** single argume
3a60: 6e 74 20 77 68 69 63 68 20 69 73 20 61 20 70 6f  nt which is a po
3a70: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
3a80: 61 6e 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20  ance of the.    
3a90: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d    ** sqlite3_mem
3aa0: 5f 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75  _methods structu
3ab0: 72 65 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f  re. The sqlite3_
3ac0: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75  mem_methods stru
3ad0: 63 74 75 72 65 20 69 73 0a 20 20 20 20 20 20 2a  cture is.      *
3ae0: 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  * filled with th
3af0: 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
3b00: 6e 65 64 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ned memory alloc
3b10: 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 2e 20  ation routines. 
3b20: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
3b30: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3b40: 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20  .m.xMalloc==0 ) 
3b50: 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66  sqlite3MemSetDef
3b60: 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 2a 76  ault();.      *v
3b70: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
3b80: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 20  3_mem_methods*) 
3b90: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
3ba0: 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20 20 20 62  onfig.m;.      b
3bb0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3bc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3bd0: 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a 20 7b 0a  IG_MEMSTATUS: {.
3be0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3bf0: 45 2d 4f 46 3a 20 52 2d 36 31 32 37 35 2d 33 35  E-OF: R-61275-35
3c00: 31 35 37 20 54 68 65 20 53 51 4c 49 54 45 5f 43  157 The SQLITE_C
3c10: 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 20  ONFIG_MEMSTATUS 
3c20: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a 20 20 20  option takes.   
3c30: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67     ** single arg
3c40: 75 6d 65 6e 74 20 6f 66 20 74 79 70 65 20 69 6e  ument of type in
3c50: 74 2c 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  t, interpreted a
3c60: 73 20 61 20 62 6f 6f 6c 65 61 6e 2c 20 77 68 69  s a boolean, whi
3c70: 63 68 20 65 6e 61 62 6c 65 73 0a 20 20 20 20 20  ch enables.     
3c80: 20 2a 2a 20 6f 72 20 64 69 73 61 62 6c 65 73 20   ** or disables 
3c90: 74 68 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f  the collection o
3ca0: 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  f memory allocat
3cb0: 69 6f 6e 20 73 74 61 74 69 73 74 69 63 73 2e 20  ion statistics. 
3cc0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3cd0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65  GlobalConfig.bMe
3ce0: 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67 28 61  mstat = va_arg(a
3cf0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3d00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3d10: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3d20: 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20 20  IG_SCRATCH: {.  
3d30: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
3d40: 4f 46 3a 20 52 2d 30 38 34 30 34 2d 36 30 38 38  OF: R-08404-6088
3d50: 37 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65  7 There are thre
3d60: 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20  e arguments to. 
3d70: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43       ** SQLITE_C
3d80: 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 41  ONFIG_SCRATCH: A
3d90: 20 70 6f 69 6e 74 65 72 20 61 6e 20 38 2d 62 79   pointer an 8-by
3da0: 74 65 20 61 6c 69 67 6e 65 64 20 6d 65 6d 6f 72  te aligned memor
3db0: 79 20 62 75 66 66 65 72 20 66 72 6f 6d 0a 20 20  y buffer from.  
3dc0: 20 20 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65      ** which the
3dd0: 20 73 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74   scratch allocat
3de0: 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 64 72 61  ions will be dra
3df0: 77 6e 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 20  wn, the size of 
3e00: 65 61 63 68 20 73 63 72 61 74 63 68 0a 20 20 20  each scratch.   
3e10: 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e     ** allocation
3e20: 20 28 73 7a 29 2c 20 61 6e 64 20 74 68 65 20 6d   (sz), and the m
3e30: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
3e40: 20 73 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74   scratch allocat
3e50: 69 6f 6e 73 20 28 4e 29 2e 20 2a 2f 0a 20 20 20  ions (N). */.   
3e60: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3e70: 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63 68 20  Config.pScratch 
3e80: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
3e90: 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d*);.      sqlit
3ea0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
3eb0: 7a 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72  zScratch = va_ar
3ec0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3ed0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3ee0: 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 20 3d  onfig.nScratch =
3ef0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
3f00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3f10: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3f20: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45  LITE_CONFIG_PAGE
3f30: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
3f40: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
3f50: 2d 31 38 37 36 31 2d 33 36 36 30 31 20 54 68 65  -18761-36601 The
3f60: 72 65 20 61 72 65 20 74 68 72 65 65 20 61 72 67  re are three arg
3f70: 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20 20  uments to.      
3f80: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ** SQLITE_CONFIG
3f90: 5f 50 41 47 45 43 41 43 48 45 3a 20 41 20 70 6f  _PAGECACHE: A po
3fa0: 69 6e 74 65 72 20 74 6f 20 38 2d 62 79 74 65 20  inter to 8-byte 
3fb0: 61 6c 69 67 6e 65 64 20 6d 65 6d 6f 72 79 20 28  aligned memory (
3fc0: 70 4d 65 6d 29 2c 0a 20 20 20 20 20 20 2a 2a 20  pMem),.      ** 
3fd0: 74 68 65 20 73 69 7a 65 20 6f 66 20 65 61 63 68  the size of each
3fe0: 20 70 61 67 65 20 63 61 63 68 65 20 6c 69 6e 65   page cache line
3ff0: 20 28 73 7a 29 2c 20 61 6e 64 20 74 68 65 20 6e   (sz), and the n
4000: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 6c  umber of cache l
4010: 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 28 4e  ines.      ** (N
4020: 29 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ). */.      sqli
4030: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4040: 70 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  pPage = va_arg(a
4050: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
4060: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4070: 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d 20 76 61  nfig.szPage = va
4080: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
4090: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
40a0: 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d  alConfig.nPage =
40b0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
40c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
40d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
40e0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43  LITE_CONFIG_PCAC
40f0: 48 45 5f 48 44 52 53 5a 3a 20 7b 0a 20 20 20 20  HE_HDRSZ: {.    
4100: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
4110: 3a 20 52 2d 33 39 31 30 30 2d 32 37 33 31 37 20  : R-39100-27317 
4120: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
4130: 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 20 6f  G_PCACHE_HDRSZ o
4140: 70 74 69 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20  ption takes.    
4150: 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 70 61    ** a single pa
4160: 72 61 6d 65 74 65 72 20 77 68 69 63 68 20 69 73  rameter which is
4170: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
4180: 20 69 6e 74 65 67 65 72 20 61 6e 64 20 77 72 69   integer and wri
4190: 74 65 73 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a  tes into.      *
41a0: 2a 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 74  * that integer t
41b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 74  he number of ext
41c0: 72 61 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ra bytes per pag
41d0: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65  e required for e
41e0: 61 63 68 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ach page.      *
41f0: 2a 20 69 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46  * in SQLITE_CONF
4200: 49 47 5f 50 41 47 45 43 41 43 48 45 2e 20 2a 2f  IG_PAGECACHE. */
4210: 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61  .      *va_arg(a
4220: 70 2c 20 69 6e 74 2a 29 20 3d 20 0a 20 20 20 20  p, int*) = .    
4230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 65 61        sqlite3Hea
4240: 64 65 72 53 69 7a 65 42 74 72 65 65 28 29 20 2b  derSizeBtree() +
4250: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4260: 65 33 48 65 61 64 65 72 53 69 7a 65 50 63 61 63  e3HeaderSizePcac
4270: 68 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20 20  he() +.         
4280: 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53 69   sqlite3HeaderSi
4290: 7a 65 50 63 61 63 68 65 31 28 29 3b 0a 20 20 20  zePcache1();.   
42a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
42b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
42c0: 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 3a 20  _CONFIG_PCACHE: 
42d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70  {.      /* no-op
42e0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
42f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4300: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
4310: 54 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20  TPCACHE: {.     
4320: 20 2f 2a 20 6e 6f 77 20 61 6e 20 65 72 72 6f 72   /* now an error
4330: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
4340: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
4350: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4360: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4370: 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 3a  _CONFIG_PCACHE2:
4380: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
4390: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 33 32 35  ENCE-OF: R-63325
43a0: 2d 34 38 33 37 38 20 54 68 65 20 53 51 4c 49 54  -48378 The SQLIT
43b0: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 32  E_CONFIG_PCACHE2
43c0: 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a   option takes a.
43d0: 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
43e0: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
43f0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
4400: 6e 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  n sqlite3_pcache
4410: 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20 20 20 20  _methods2.      
4420: 2a 2a 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  ** object. This 
4430: 6f 62 6a 65 63 74 20 73 70 65 63 69 66 69 65 73  object specifies
4440: 20 74 68 65 20 69 6e 74 65 72 66 61 63 65 20 74   the interface t
4450: 6f 20 61 20 63 75 73 74 6f 6d 20 70 61 67 65 20  o a custom page 
4460: 63 61 63 68 65 0a 20 20 20 20 20 20 2a 2a 20 69  cache.      ** i
4470: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 2a  mplementation. *
4480: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
4490: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63  lobalConfig.pcac
44a0: 68 65 32 20 3d 20 2a 76 61 5f 61 72 67 28 61 70  he2 = *va_arg(ap
44b0: 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  , sqlite3_pcache
44c0: 5f 6d 65 74 68 6f 64 73 32 2a 29 3b 0a 20 20 20  _methods2*);.   
44d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
44e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
44f0: 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45  CONFIG_GETPCACHE
4500: 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  2: {.      /* EV
4510: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 30  IDENCE-OF: R-220
4520: 33 35 2d 34 36 31 38 32 20 54 68 65 20 53 51 4c  35-46182 The SQL
4530: 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43  ITE_CONFIG_GETPC
4540: 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b  ACHE2 option tak
4550: 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69  es a.      ** si
4560: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  ngle argument wh
4570: 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ich is a pointer
4580: 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 70   to an sqlite3_p
4590: 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20  cache_methods2. 
45a0: 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20       ** object. 
45b0: 53 51 4c 69 74 65 20 63 6f 70 69 65 73 20 6f 66  SQLite copies of
45c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
45d0: 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e  e cache implemen
45e0: 74 61 74 69 6f 6e 20 69 6e 74 6f 0a 20 20 20 20  tation into.    
45f0: 20 20 2a 2a 20 74 68 61 74 20 6f 62 6a 65 63 74    ** that object
4600: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  . */.      if( s
4610: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4620: 69 67 2e 70 63 61 63 68 65 32 2e 78 49 6e 69 74  ig.pcache2.xInit
4630: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
4640: 71 6c 69 74 65 33 50 43 61 63 68 65 53 65 74 44  qlite3PCacheSetD
4650: 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20  efault();.      
4660: 7d 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28  }.      *va_arg(
4670: 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63  ap, sqlite3_pcac
4680: 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29 20 3d 20  he_methods2*) = 
4690: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
46a0: 66 69 67 2e 70 63 61 63 68 65 32 3b 0a 20 20 20  fig.pcache2;.   
46b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
46c0: 0a 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ./* EVIDENCE-OF:
46d0: 20 52 2d 30 36 36 32 36 2d 31 32 39 31 31 20 54   R-06626-12911 T
46e0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
46f0: 5f 48 45 41 50 20 6f 70 74 69 6f 6e 20 69 73 20  _HEAP option is 
4700: 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  only.** availabl
4710: 65 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 63  e if SQLite is c
4720: 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 65 69 74  ompiled with eit
4730: 68 65 72 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  her SQLITE_ENABL
4740: 45 5f 4d 45 4d 53 59 53 33 20 6f 72 0a 2a 2a 20  E_MEMSYS3 or.** 
4750: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
4760: 4d 53 59 53 35 20 61 6e 64 20 72 65 74 75 72 6e  MSYS5 and return
4770: 73 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  s SQLITE_ERROR i
4780: 66 20 69 6e 76 6f 6b 65 64 20 6f 74 68 65 72 77  f invoked otherw
4790: 69 73 65 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69  ise. */.#if defi
47a0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
47b0: 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65  E_MEMSYS3) || de
47c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
47d0: 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20  BLE_MEMSYS5).   
47e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
47f0: 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20  FIG_HEAP: {.    
4800: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
4810: 3a 20 52 2d 31 39 38 35 34 2d 34 32 31 32 36 20  : R-19854-42126 
4820: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
4830: 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
4840: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     ** SQLITE_CON
4850: 46 49 47 5f 48 45 41 50 3a 20 41 6e 20 38 2d 62  FIG_HEAP: An 8-b
4860: 79 74 65 20 61 6c 69 67 6e 65 64 20 70 6f 69 6e  yte aligned poin
4870: 74 65 72 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72  ter to the memor
4880: 79 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  y, the.      ** 
4890: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
48a0: 69 6e 20 74 68 65 20 6d 65 6d 6f 72 79 20 62 75  in the memory bu
48b0: 66 66 65 72 2c 20 61 6e 64 20 74 68 65 20 6d 69  ffer, and the mi
48c0: 6e 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 69 6f 6e  nimum allocation
48d0: 20 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   size..      */.
48e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
48f0: 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20  balConfig.pHeap 
4900: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
4910: 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d*);.      sqlit
4920: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
4930: 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Heap = va_arg(ap
4940: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
4950: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4960: 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67  g.mnReq = va_arg
4970: 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20  (ap, int);..    
4980: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
4990: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c  balConfig.mnReq<
49a0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
49b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
49c0: 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20 20 20 20  .mnReq = 1;.    
49d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
49e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
49f0: 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b  mnReq>(1<<12) ){
4a00: 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 61 70 20  .        /* cap 
4a10: 6d 69 6e 20 72 65 71 75 65 73 74 20 73 69 7a 65  min request size
4a20: 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20   at 2^12 */.    
4a30: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4a40: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
4a50: 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d  (1<<12);.      }
4a60: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
4a70: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4a80: 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20  pHeap==0 ){.    
4a90: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4aa0: 4f 46 3a 20 52 2d 34 39 39 32 30 2d 36 30 31 38  OF: R-49920-6018
4ab0: 39 20 49 66 20 74 68 65 20 66 69 72 73 74 20 70  9 If the first p
4ac0: 6f 69 6e 74 65 72 20 28 74 68 65 20 6d 65 6d 6f  ointer (the memo
4ad0: 72 79 20 70 6f 69 6e 74 65 72 29 0a 20 20 20 20  ry pointer).    
4ae0: 20 20 20 20 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20      ** is NULL, 
4af0: 74 68 65 6e 20 53 51 4c 69 74 65 20 72 65 76 65  then SQLite reve
4b00: 72 74 73 20 74 6f 20 75 73 69 6e 67 20 69 74 73  rts to using its
4b10: 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f 72 79 20   default memory 
4b20: 61 6c 6c 6f 63 61 74 6f 72 0a 20 20 20 20 20 20  allocator.      
4b30: 20 20 2a 2a 20 28 74 68 65 20 73 79 73 74 65 6d    ** (the system
4b40: 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d   malloc() implem
4b50: 65 6e 74 61 74 69 6f 6e 29 2c 20 75 6e 64 6f 69  entation), undoi
4b60: 6e 67 20 61 6e 79 20 70 72 69 6f 72 20 69 6e 76  ng any prior inv
4b70: 6f 63 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20  ocation of.     
4b80: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     ** SQLITE_CON
4b90: 46 49 47 5f 4d 41 4c 4c 4f 43 2e 0a 20 20 20 20  FIG_MALLOC..    
4ba0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
4bb0: 2a 20 53 65 74 74 69 6e 67 20 73 71 6c 69 74 65  * Setting sqlite
4bc0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20  3GlobalConfig.m 
4bd0: 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 20 77 69 6c  to all zeros wil
4be0: 6c 20 63 61 75 73 65 20 6d 61 6c 6c 6f 63 20 74  l cause malloc t
4bf0: 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 76  o.        ** rev
4c00: 65 72 74 20 74 6f 20 69 74 73 20 64 65 66 61 75  ert to its defau
4c10: 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  lt implementatio
4c20: 6e 20 77 68 65 6e 20 73 71 6c 69 74 65 33 5f 69  n when sqlite3_i
4c30: 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73 20 72  nitialize() is r
4c40: 75 6e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  un.        */.  
4c50: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71        memset(&sq
4c60: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4c70: 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  g.m, 0, sizeof(s
4c80: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4c90: 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65  ig.m));.      }e
4ca0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
4cb0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
4cc0: 31 30 30 36 2d 30 38 39 31 38 20 49 66 20 74 68  1006-08918 If th
4cd0: 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72  e memory pointer
4ce0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
4cf0: 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  n the.        **
4d00: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 65 6d   alternative mem
4d10: 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73  ory allocator is
4d20: 20 65 6e 67 61 67 65 64 20 74 6f 20 68 61 6e 64   engaged to hand
4d30: 6c 65 20 61 6c 6c 20 6f 66 20 53 51 4c 69 74 65  le all of SQLite
4d40: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d  s.        ** mem
4d50: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6e  ory allocation n
4d60: 65 65 64 73 2e 20 2a 2f 0a 23 69 66 64 65 66 20  eeds. */.#ifdef 
4d70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
4d80: 4d 53 59 53 33 0a 20 20 20 20 20 20 20 20 73 71  MSYS3.        sq
4d90: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4da0: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
4db0: 6d 47 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23  mGetMemsys3();.#
4dc0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
4dd0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4de0: 53 35 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  S5.        sqlit
4df0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4e00: 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65   = *sqlite3MemGe
4e10: 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64  tMemsys5();.#end
4e20: 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
4e30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
4e40: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
4e50: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f  QLITE_CONFIG_LOO
4e60: 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20  KASIDE: {.      
4e70: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4e80: 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20  fig.szLookaside 
4e90: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
4ea0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4eb0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f  GlobalConfig.nLo
4ec0: 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67  okaside = va_arg
4ed0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4ee0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4ef0: 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64    .    /* Record
4f00: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
4f10: 65 20 6c 6f 67 67 65 72 20 66 75 6e 63 74 69 6f  e logger functio
4f20: 6e 20 61 6e 64 20 69 74 73 20 66 69 72 73 74 20  n and its first 
4f30: 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a 2a  argument..    **
4f40: 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
4f50: 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20 69  NULL.  Logging i
4f60: 73 20 64 69 73 61 62 6c 65 64 20 69 66 20 74 68  s disabled if th
4f70: 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  e function point
4f80: 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c  er is.    ** NUL
4f90: 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  L..    */.    ca
4fa0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
4fb0: 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  _LOG: {.      /*
4fc0: 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20 61   MSVC is picky a
4fd0: 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e  bout pulling fun
4fe0: 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c  c ptrs from va l
4ff0: 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68  ists..      ** h
5000: 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69  ttp://support.mi
5010: 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34  crosoft.com/kb/4
5020: 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71  7961.      ** sq
5030: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
5040: 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28  g.xLog = va_arg(
5050: 61 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69 64  ap, void(*)(void
5060: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  *,int,const char
5070: 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20  *));.      */.  
5080: 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64      typedef void
5090: 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69  (*LOGFUNC_t)(voi
50a0: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61  d*,int,const cha
50b0: 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r*);.      sqlit
50c0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
50d0: 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Log = va_arg(ap,
50e0: 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20   LOGFUNC_t);.   
50f0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
5100: 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20 3d  Config.pLogArg =
5110: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
5120: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
5130: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45  .    }..    /* E
5140: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35  VIDENCE-OF: R-55
5150: 35 34 38 2d 33 33 38 31 37 20 54 68 65 20 63 6f  548-33817 The co
5160: 6d 70 69 6c 65 2d 74 69 6d 65 20 73 65 74 74 69  mpile-time setti
5170: 6e 67 20 66 6f 72 20 55 52 49 20 66 69 6c 65 6e  ng for URI filen
5180: 61 6d 65 73 0a 20 20 20 20 2a 2a 20 63 61 6e 20  ames.    ** can 
5190: 62 65 20 63 68 61 6e 67 65 64 20 61 74 20 73 74  be changed at st
51a0: 61 72 74 2d 74 69 6d 65 20 75 73 69 6e 67 20 74  art-time using t
51b0: 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  he.    ** sqlite
51c0: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
51d0: 43 4f 4e 46 49 47 5f 55 52 49 2c 31 29 20 6f 72  CONFIG_URI,1) or
51e0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
51f0: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
5200: 4e 46 49 47 5f 55 52 49 2c 30 29 20 63 6f 6e 66  NFIG_URI,0) conf
5210: 69 67 75 72 61 74 69 6f 6e 20 63 61 6c 6c 73 2e  iguration calls.
5220: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5230: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55   SQLITE_CONFIG_U
5240: 52 49 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  RI: {.      /* E
5250: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35  VIDENCE-OF: R-25
5260: 34 35 31 2d 36 31 31 32 35 20 54 68 65 20 53 51  451-61125 The SQ
5270: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 20  LITE_CONFIG_URI 
5280: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73  option takes a s
5290: 69 6e 67 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61  ingle.      ** a
52a0: 72 67 75 6d 65 6e 74 20 6f 66 20 74 79 70 65 20  rgument of type 
52b0: 69 6e 74 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f  int. If non-zero
52c0: 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64 6c  , then URI handl
52d0: 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a  ing is globally.
52e0: 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64        ** enabled
52f0: 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  . If the paramet
5300: 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  er is zero, then
5310: 20 55 52 49 20 68 61 6e 64 6c 69 6e 67 20 69 73   URI handling is
5320: 20 67 6c 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20   globally.      
5330: 2a 2a 20 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a  ** disabled. */.
5340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5350: 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55  balConfig.bOpenU
5360: 72 69 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ri = va_arg(ap, 
5370: 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
5380: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
5390: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
53a0: 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f  _COVERING_INDEX_
53b0: 53 43 41 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  SCAN: {.      /*
53c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
53d0: 33 36 35 39 32 2d 30 32 37 37 32 20 54 68 65 20  36592-02772 The 
53e0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f  SQLITE_CONFIG_CO
53f0: 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41  VERING_INDEX_SCA
5400: 4e 0a 20 20 20 20 20 20 2a 2a 20 6f 70 74 69 6f  N.      ** optio
5410: 6e 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65  n takes a single
5420: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
5430: 74 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  t which is inter
5440: 70 72 65 74 65 64 20 61 73 20 61 0a 20 20 20 20  preted as a.    
5450: 20 20 2a 2a 20 62 6f 6f 6c 65 61 6e 20 69 6e 20    ** boolean in 
5460: 6f 72 64 65 72 20 74 6f 20 65 6e 61 62 6c 65 20  order to enable 
5470: 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 75  or disable the u
5480: 73 65 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69  se of covering i
5490: 6e 64 69 63 65 73 20 66 6f 72 0a 20 20 20 20 20  ndices for.     
54a0: 20 2a 2a 20 66 75 6c 6c 20 74 61 62 6c 65 20 73   ** full table s
54b0: 63 61 6e 73 20 69 6e 20 74 68 65 20 71 75 65 72  cans in the quer
54c0: 79 20 6f 70 74 69 6d 69 7a 65 72 2e 20 2a 2f 0a  y optimizer. */.
54d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
54e0: 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
54f0: 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  s = va_arg(ap, i
5500: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
5510: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
5520: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
5530: 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65 20 53 51  LLOG.    case SQ
5540: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
5550: 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65  OG: {.      type
5560: 64 65 66 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47  def void(*SQLLOG
5570: 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73  FUNC_t)(void*, s
5580: 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63  qlite3*, const c
5590: 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20  har*, int);.    
55a0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
55b0: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20  onfig.xSqllog = 
55c0: 76 61 5f 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f  va_arg(ap, SQLLO
55d0: 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  GFUNC_t);.      
55e0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
55f0: 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d  fig.pSqllogArg =
5600: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
5610: 20 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   *);.      break
5620: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
5630: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5640: 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45  CONFIG_MMAP_SIZE
5650: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
5660: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 36  DENCE-OF: R-5806
5670: 33 2d 33 38 32 35 38 20 53 51 4c 49 54 45 5f 43  3-38258 SQLITE_C
5680: 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 20  ONFIG_MMAP_SIZE 
5690: 74 61 6b 65 73 20 74 77 6f 20 36 34 2d 62 69 74  takes two 64-bit
56a0: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  .      ** intege
56b0: 72 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  r (sqlite3_int64
56c0: 29 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72  ) values that ar
56d0: 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 6d 6d  e the default mm
56e0: 61 70 20 73 69 7a 65 20 6c 69 6d 69 74 0a 20 20  ap size limit.  
56f0: 20 20 20 20 2a 2a 20 28 74 68 65 20 64 65 66 61      ** (the defa
5700: 75 6c 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20  ult setting for 
5710: 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65  PRAGMA mmap_size
5720: 29 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  ) and the maximu
5730: 6d 20 61 6c 6c 6f 77 65 64 0a 20 20 20 20 20 20  m allowed.      
5740: 2a 2a 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d  ** mmap size lim
5750: 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  it. */.      sql
5760: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61  ite3_int64 szMma
5770: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  p = va_arg(ap, s
5780: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20  qlite3_int64);. 
5790: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
57a0: 36 34 20 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61  64 mxMmap = va_a
57b0: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69  rg(ap, sqlite3_i
57c0: 6e 74 36 34 29 3b 0a 20 20 20 20 20 20 2f 2a 20  nt64);.      /* 
57d0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
57e0: 33 33 36 37 2d 34 33 31 39 30 20 49 66 20 65 69  3367-43190 If ei
57f0: 74 68 65 72 20 61 72 67 75 6d 65 6e 74 20 74 6f  ther argument to
5800: 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 0a   this option is.
5810: 20 20 20 20 20 20 2a 2a 20 6e 65 67 61 74 69 76        ** negativ
5820: 65 2c 20 74 68 65 6e 20 74 68 61 74 20 61 72 67  e, then that arg
5830: 75 6d 65 6e 74 20 69 73 20 63 68 61 6e 67 65 64  ument is changed
5840: 20 74 6f 20 69 74 73 20 63 6f 6d 70 69 6c 65 2d   to its compile-
5850: 74 69 6d 65 20 64 65 66 61 75 6c 74 2e 0a 20 20  time default..  
5860: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
5870: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
5880: 34 39 39 33 2d 34 35 30 33 31 20 54 68 65 20 6d  4993-45031 The m
5890: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 6d  aximum allowed m
58a0: 6d 61 70 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  map size will be
58b0: 0a 20 20 20 20 20 20 2a 2a 20 73 69 6c 65 6e 74  .      ** silent
58c0: 6c 79 20 74 72 75 6e 63 61 74 65 64 20 69 66 20  ly truncated if 
58d0: 6e 65 63 65 73 73 61 72 79 20 73 6f 20 74 68 61  necessary so tha
58e0: 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  t it does not ex
58f0: 63 65 65 64 20 74 68 65 0a 20 20 20 20 20 20 2a  ceed the.      *
5900: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6d  * compile-time m
5910: 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a 65  aximum mmap size
5920: 20 73 65 74 20 62 79 20 74 68 65 20 53 51 4c 49   set by the SQLI
5930: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
5940: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  .      ** compil
5950: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20  e-time option.. 
5960: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
5970: 28 20 6d 78 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78  ( mxMmap<0 || mx
5980: 4d 6d 61 70 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Mmap>SQLITE_MAX_
5990: 4d 4d 41 50 5f 53 49 5a 45 20 29 7b 0a 20 20 20  MMAP_SIZE ){.   
59a0: 20 20 20 20 20 6d 78 4d 6d 61 70 20 3d 20 53 51       mxMmap = SQ
59b0: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
59c0: 5a 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ZE;.      }.    
59d0: 20 20 69 66 28 20 73 7a 4d 6d 61 70 3c 30 20 29    if( szMmap<0 )
59e0: 20 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45   szMmap = SQLITE
59f0: 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49  _DEFAULT_MMAP_SI
5a00: 5a 45 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  ZE;.      if( sz
5a10: 4d 6d 61 70 3e 6d 78 4d 6d 61 70 29 20 73 7a 4d  Mmap>mxMmap) szM
5a20: 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20  map = mxMmap;.  
5a30: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
5a40: 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 3d  lConfig.mxMmap =
5a50: 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 73   mxMmap;.      s
5a60: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
5a70: 69 67 2e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d  ig.szMmap = szMm
5a80: 61 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ap;.      break;
5a90: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  .    }..#if SQLI
5aa0: 54 45 5f 4f 53 5f 57 49 4e 20 26 26 20 64 65 66  TE_OS_WIN && def
5ab0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5ac0: 32 5f 4d 41 4c 4c 4f 43 29 20 2f 2a 20 49 4d 50  2_MALLOC) /* IMP
5ad0: 3a 20 52 2d 30 34 37 38 30 2d 35 35 38 31 35 20  : R-04780-55815 
5ae0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
5af0: 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e 33 32 5f  TE_CONFIG_WIN32_
5b00: 48 45 41 50 53 49 5a 45 3a 20 7b 0a 20 20 20 20  HEAPSIZE: {.    
5b10: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
5b20: 3a 20 52 2d 33 34 39 32 36 2d 30 33 33 36 30 20  : R-34926-03360 
5b30: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49  SQLITE_CONFIG_WI
5b40: 4e 33 32 5f 48 45 41 50 53 49 5a 45 20 74 61 6b  N32_HEAPSIZE tak
5b50: 65 73 20 61 20 33 32 2d 62 69 74 0a 20 20 20 20  es a 32-bit.    
5b60: 20 20 2a 2a 20 75 6e 73 69 67 6e 65 64 20 69 6e    ** unsigned in
5b70: 74 65 67 65 72 20 76 61 6c 75 65 20 74 68 61 74  teger value that
5b80: 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6d   specifies the m
5b90: 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74  aximum size of t
5ba0: 68 65 20 63 72 65 61 74 65 64 0a 20 20 20 20 20  he created.     
5bb0: 20 2a 2a 20 68 65 61 70 2e 20 2a 2f 0a 20 20 20   ** heap. */.   
5bc0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
5bd0: 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76  Config.nHeap = v
5be0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
5bf0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5c00: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63   }.#endif..    c
5c10: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
5c20: 47 5f 50 4d 41 53 5a 3a 20 7b 0a 20 20 20 20 20  G_PMASZ: {.     
5c30: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5c40: 6e 66 69 67 2e 73 7a 50 6d 61 20 3d 20 76 61 5f  nfig.szPma = va_
5c50: 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64  arg(ap, unsigned
5c60: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
5c70: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  ak;.    }..    d
5c80: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5c90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
5ca0: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
5cb0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65      }.  }.  va_e
5cc0: 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e  nd(ap);.  return
5cd0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
5ce0: 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61 73 69  t up the lookasi
5cf0: 64 65 20 62 75 66 66 65 72 73 20 66 6f 72 20 61  de buffers for a
5d00: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
5d10: 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  tion..** Return 
5d20: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
5d30: 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f  cess.  .** If lo
5d40: 6f 6b 61 73 69 64 65 20 69 73 20 61 6c 72 65 61  okaside is alrea
5d50: 64 79 20 61 63 74 69 76 65 2c 20 72 65 74 75 72  dy active, retur
5d60: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a  n SQLITE_BUSY..*
5d70: 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61 72 61  *.** The sz para
5d80: 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d  meter is the num
5d90: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
5da0: 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65 20 73  each lookaside s
5db0: 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e 74 20  lot..** The cnt 
5dc0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
5dd0: 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   number of slots
5de0: 2e 20 20 49 66 20 70 53 74 61 72 74 20 69 73 20  .  If pStart is 
5df0: 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70 61 63  NULL the.** spac
5e00: 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b 61 73  e for the lookas
5e10: 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 6f 62  ide memory is ob
5e20: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
5e30: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
5e40: 20 49 66 20 70 53 74 61 72 74 20 69 73 20 6e 6f   If pStart is no
5e50: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69  t NULL then it i
5e60: 73 20 73 7a 2a 63 6e 74 20 62 79 74 65 73 20 6f  s sz*cnt bytes o
5e70: 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73 65 20  f memory to use 
5e80: 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61  for.** the looka
5e90: 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  side memory..*/.
5ea0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 75 70  static int setup
5eb0: 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69 74 65  Lookaside(sqlite
5ec0: 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70 42 75  3 *db, void *pBu
5ed0: 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 63  f, int sz, int c
5ee0: 6e 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nt){.#ifndef SQL
5ef0: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49  ITE_OMIT_LOOKASI
5f00: 44 45 0a 20 20 76 6f 69 64 20 2a 70 53 74 61 72  DE.  void *pStar
5f10: 74 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  t;.  if( db->loo
5f20: 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20  kaside.nOut ){. 
5f30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5f40: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  _BUSY;.  }.  /* 
5f50: 46 72 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e  Free any existin
5f60: 67 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66  g lookaside buff
5f70: 65 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64  er for this hand
5f80: 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  le before.  ** a
5f90: 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
5fa0: 6f 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20  one so we don't 
5fb0: 68 61 76 65 20 74 6f 20 68 61 76 65 20 73 70 61  have to have spa
5fc0: 63 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74  ce for .  ** bot
5fd0: 68 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  h at the same ti
5fe0: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  me..  */.  if( d
5ff0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
6000: 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71  lloced ){.    sq
6010: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c  lite3_free(db->l
6020: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29  ookaside.pStart)
6030: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
6040: 69 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69  ize of a lookasi
6050: 64 65 20 73 6c 6f 74 20 61 66 74 65 72 20 52 4f  de slot after RO
6060: 55 4e 44 44 4f 57 4e 38 20 6e 65 65 64 73 20 74  UNDDOWN8 needs t
6070: 6f 20 62 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a  o be larger.  **
6080: 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 20   than a pointer 
6090: 74 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20  to be useful..  
60a0: 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44  */.  sz = ROUNDD
60b0: 4f 57 4e 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d  OWN8(sz);  /* IM
60c0: 50 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32  P: R-33038-09382
60d0: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69   */.  if( sz<=(i
60e0: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
60f0: 69 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d  ideSlot*) ) sz =
6100: 20 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20   0;.  if( cnt<0 
6110: 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  ) cnt = 0;.  if(
6120: 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30   sz==0 || cnt==0
6130: 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a   ){.    sz = 0;.
6140: 20 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a      pStart = 0;.
6150: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66    }else if( pBuf
6160: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
6170: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
6180: 6c 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72  loc();.    pStar
6190: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
61a0: 63 28 20 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a  c( sz*cnt );  /*
61b0: 20 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35   IMP: R-61949-35
61c0: 37 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  727 */.    sqlit
61d0: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
61e0: 63 28 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74  c();.    if( pSt
61f0: 61 72 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69  art ) cnt = sqli
6200: 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53  te3MallocSize(pS
6210: 74 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73  tart)/sz;.  }els
6220: 65 7b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20  e{.    pStart = 
6230: 70 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  pBuf;.  }.  db->
6240: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
6250: 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d   = pStart;.  db-
6260: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65  >lookaside.pFree
6270: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b   = 0;.  db->look
6280: 61 73 69 64 65 2e 73 7a 20 3d 20 28 75 31 36 29  aside.sz = (u16)
6290: 73 7a 3b 0a 20 20 69 66 28 20 70 53 74 61 72 74  sz;.  if( pStart
62a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
62b0: 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74     LookasideSlot
62c0: 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28   *p;.    assert(
62d0: 20 73 7a 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f   sz > (int)sizeo
62e0: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
62f0: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f  ) );.    p = (Lo
6300: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70 53 74  okasideSlot*)pSt
6310: 61 72 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63  art;.    for(i=c
6320: 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  nt-1; i>=0; i--)
6330: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74  {.      p->pNext
6340: 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65   = db->lookaside
6350: 2e 70 46 72 65 65 3b 0a 20 20 20 20 20 20 64 62  .pFree;.      db
6360: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65  ->lookaside.pFre
6370: 65 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 20 3d  e = p;.      p =
6380: 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a   (LookasideSlot*
6390: 29 26 28 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a  )&((u8*)p)[sz];.
63a0: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f      }.    db->lo
63b0: 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 70  okaside.pEnd = p
63c0: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
63d0: 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 31  ide.bEnabled = 1
63e0: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
63f0: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20  ide.bMalloced = 
6400: 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20  pBuf==0 ?1:0;.  
6410: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c  }else{.    db->l
6420: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20  ookaside.pStart 
6430: 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = db;.    db->lo
6440: 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 64  okaside.pEnd = d
6450: 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  b;.    db->looka
6460: 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20  side.bEnabled = 
6470: 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  0;.    db->looka
6480: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d  side.bMalloced =
6490: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   0;.  }.#endif /
64a0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  * SQLITE_OMIT_LO
64b0: 4f 4b 41 53 49 44 45 20 2a 2f 0a 20 20 72 65 74  OKASIDE */.  ret
64c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
64d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
64e0: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
64f0: 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
6500: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
6510: 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  */.sqlite3_mutex
6520: 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74   *sqlite3_db_mut
6530: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ex(sqlite3 *db){
6540: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6550: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
6560: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
6570: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
6580: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
6590: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
65a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
65b0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
65c0: 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a  rn db->mutex;.}.
65d0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20 61  ./*.** Free up a
65e0: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
65f0: 20 77 65 20 63 61 6e 20 66 72 6f 6d 20 74 68 65   we can from the
6600: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a   given database.
6610: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ** connection..*
6620: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
6630: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
6640: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
6650: 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 53  int i;..#ifdef S
6660: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
6670: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
6680: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
6690: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
66a0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
66b0: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
66c0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
66d0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
66e0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
66f0: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
6700: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
6710: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
6720: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
6730: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
6740: 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  t ){.      Pager
6750: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
6760: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
6770: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6780: 50 61 67 65 72 53 68 72 69 6e 6b 28 70 50 61 67  PagerShrink(pPag
6790: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
67a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
67b0: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
67c0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
67d0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
67e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
67f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
6800: 61 6e 79 20 64 69 72 74 79 20 70 61 67 65 73 20  any dirty pages 
6810: 69 6e 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  in the pager-cac
6820: 68 65 20 66 6f 72 20 61 6e 79 20 61 74 74 61 63  he for any attac
6830: 68 65 64 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  hed database.** 
6840: 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  to disk..*/.int 
6850: 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65  sqlite3_db_cache
6860: 66 6c 75 73 68 28 73 71 6c 69 74 65 33 20 2a 64  flush(sqlite3 *d
6870: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
6880: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6890: 4b 3b 0a 20 20 69 6e 74 20 62 53 65 65 6e 42 75  K;.  int bSeenBu
68a0: 73 79 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  sy = 0;..#ifdef 
68b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
68c0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
68d0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
68e0: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
68f0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
6900: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
6910: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6920: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
6930: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
6940: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28  rAll(db);.  for(
6950: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
6960: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
6970: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
6980: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
6990: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
69a0: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
69b0: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
69c0: 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  ) ){.      Pager
69d0: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
69e0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
69f0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
6a00: 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28  lite3PagerFlush(
6a10: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
6a20: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
6a30: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53  SY ){.        bS
6a40: 65 65 6e 42 75 73 79 20 3d 20 31 3b 0a 20 20 20  eenBusy = 1;.   
6a50: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6a60: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
6a70: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
6a80: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
6a90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
6aa0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
6ab0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  ex);.  return ((
6ac0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
6ad0: 20 62 53 65 65 6e 42 75 73 79 29 20 3f 20 53 51   bSeenBusy) ? SQ
6ae0: 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 29 3b  LITE_BUSY : rc);
6af0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
6b00: 75 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73  uration settings
6b10: 20 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75   for an individu
6b20: 61 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  al database conn
6b30: 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71  ection.*/.int sq
6b40: 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
6b50: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
6b60: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
6b70: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
6b80: 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  c;.  va_start(ap
6b90: 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
6ba0: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
6bb0: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
6bc0: 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20  LOOKASIDE: {.   
6bd0: 20 20 20 76 6f 69 64 20 2a 70 42 75 66 20 3d 20     void *pBuf = 
6be0: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
6bf0: 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 38  ); /* IMP: R-268
6c00: 33 35 2d 31 30 39 36 34 20 2a 2f 0a 20 20 20 20  35-10964 */.    
6c10: 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72    int sz = va_ar
6c20: 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20  g(ap, int);     
6c30: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 37 38 37    /* IMP: R-4787
6c40: 31 2d 32 35 39 39 34 20 2a 2f 0a 20 20 20 20 20  1-25994 */.     
6c50: 20 69 6e 74 20 63 6e 74 20 3d 20 76 61 5f 61 72   int cnt = va_ar
6c60: 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20  g(ap, int);     
6c70: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 34 36 30   /* IMP: R-04460
6c80: 2d 35 33 33 38 36 20 2a 2f 0a 20 20 20 20 20 20  -53386 */.      
6c90: 72 63 20 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73  rc = setupLookas
6ca0: 69 64 65 28 64 62 2c 20 70 42 75 66 2c 20 73 7a  ide(db, pBuf, sz
6cb0: 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , cnt);.      br
6cc0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
6cd0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
6ce0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
6cf0: 75 63 74 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  uct {.        in
6d00: 74 20 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  t op;      /* Th
6d10: 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  e opcode */.    
6d20: 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 20 20 20      u32 mask;   
6d30: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 68 65 20   /* Mask of the 
6d40: 62 69 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 66  bit in sqlite3.f
6d50: 6c 61 67 73 20 74 6f 20 73 65 74 2f 63 6c 65 61  lags to set/clea
6d60: 72 20 2a 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c  r */.      } aFl
6d70: 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  agOp[] = {.     
6d80: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
6d90: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59  NFIG_ENABLE_FKEY
6da0: 2c 20 20 20 20 53 51 4c 49 54 45 5f 46 6f 72 65  ,    SQLITE_Fore
6db0: 69 67 6e 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20  ignKeys    },.  
6dc0: 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44        { SQLITE_D
6dd0: 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54  BCONFIG_ENABLE_T
6de0: 52 49 47 47 45 52 2c 20 53 51 4c 49 54 45 5f 45  RIGGER, SQLITE_E
6df0: 6e 61 62 6c 65 54 72 69 67 67 65 72 20 20 7d 2c  nableTrigger  },
6e00: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
6e10: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
6e20: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6e30: 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a  E_ERROR; /* IMP:
6e40: 20 52 2d 34 32 37 39 30 2d 32 33 33 37 32 20 2a   R-42790-23372 *
6e50: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
6e60: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 6c   i<ArraySize(aFl
6e70: 61 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  agOp); i++){.   
6e80: 20 20 20 20 20 69 66 28 20 61 46 6c 61 67 4f 70       if( aFlagOp
6e90: 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20  [i].op==op ){.  
6ea0: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66          int onof
6eb0: 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  f = va_arg(ap, i
6ec0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
6ed0: 6e 74 20 2a 70 52 65 73 20 3d 20 76 61 5f 61 72  nt *pRes = va_ar
6ee0: 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20  g(ap, int*);.   
6ef0: 20 20 20 20 20 20 20 69 6e 74 20 6f 6c 64 46 6c         int oldFl
6f00: 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b  ags = db->flags;
6f10: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
6f20: 6e 6f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  noff>0 ){.      
6f30: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
6f40: 7c 3d 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61  |= aFlagOp[i].ma
6f50: 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  sk;.          }e
6f60: 6c 73 65 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30  lse if( onoff==0
6f70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6f80: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46  db->flags &= ~aF
6f90: 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20  lagOp[i].mask;. 
6fa0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6fb0: 20 20 20 20 20 69 66 28 20 6f 6c 64 46 6c 61 67       if( oldFlag
6fc0: 73 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a  s!=db->flags ){.
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6fe0: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
6ff0: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
7000: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7010: 20 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20         if( pRes 
7020: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
7030: 70 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  pRes = (db->flag
7040: 73 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  s & aFlagOp[i].m
7050: 61 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20 20 20  ask)!=0;.       
7060: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
7070: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
7080: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7090: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
70a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
70b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e     }.  }.  va_en
70c0: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
70d0: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
70e0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
70f0: 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31   buffer z[0..n-1
7100: 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73  ] contains all s
7110: 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  paces..*/.static
7120: 20 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28 63   int allSpaces(c
7130: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
7140: 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e  t n){.  while( n
7150: 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20  >0 && z[n-1]==' 
7160: 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65  ' ){ n--; }.  re
7170: 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  turn n==0;.}../*
7180: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
7190: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
71a0: 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  g function named
71b0: 20 22 42 49 4e 41 52 59 22 20 77 68 69 63 68 20   "BINARY" which 
71c0: 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61  is always.** ava
71d0: 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ilable..**.** If
71e0: 20 74 68 65 20 70 61 64 46 6c 61 67 20 61 72 67   the padFlag arg
71f0: 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
7200: 4c 20 74 68 65 6e 20 73 70 61 63 65 20 70 61 64  L then space pad
7210: 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a  ding at the end.
7220: 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69 73  ** of strings is
7230: 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20   ignored.  This 
7240: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 52  implements the R
7250: 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a  TRIM collation..
7260: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69  */.static int bi
7270: 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69  nCollFunc(.  voi
7280: 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e  d *padFlag,.  in
7290: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
72a0: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
72b0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
72c0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
72d0: 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d  int rc, n;.  n =
72e0: 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e   nKey1<nKey2 ? n
72f0: 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20  Key1 : nKey2;.  
7300: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
7310: 52 2d 36 35 30 33 33 2d 32 38 34 34 39 20 54 68  R-65033-28449 Th
7320: 65 20 62 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52  e built-in BINAR
7330: 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 6f 6d 70  Y collation comp
7340: 61 72 65 73 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ares.  ** string
7350: 73 20 62 79 74 65 20 62 79 20 62 79 74 65 20 75  s byte by byte u
7360: 73 69 6e 67 20 74 68 65 20 6d 65 6d 63 6d 70 28  sing the memcmp(
7370: 29 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20  ) function from 
7380: 74 68 65 20 73 74 61 6e 64 61 72 64 20 43 0a 20  the standard C. 
7390: 20 2a 2a 20 6c 69 62 72 61 72 79 2e 20 2a 2f 0a   ** library. */.
73a0: 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b    rc = memcmp(pK
73b0: 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a  ey1, pKey2, n);.
73c0: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
73d0: 20 20 20 69 66 28 20 70 61 64 46 6c 61 67 0a 20     if( padFlag. 
73e0: 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73      && allSpaces
73f0: 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31 29 2b  (((char*)pKey1)+
7400: 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20  n, nKey1-n).    
7410: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
7420: 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20  char*)pKey2)+n, 
7430: 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a  nKey2-n).    ){.
7440: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
7450: 45 2d 4f 46 3a 20 52 2d 33 31 36 32 34 2d 32 34  E-OF: R-31624-24
7460: 37 33 37 20 52 54 52 49 4d 20 69 73 20 6c 69 6b  737 RTRIM is lik
7470: 65 20 42 49 4e 41 52 59 20 65 78 63 65 70 74 20  e BINARY except 
7480: 74 68 61 74 20 65 78 74 72 61 0a 20 20 20 20 20  that extra.     
7490: 20 2a 2a 20 73 70 61 63 65 73 20 61 74 20 74 68   ** spaces at th
74a0: 65 20 65 6e 64 20 6f 66 20 65 69 74 68 65 72 20  e end of either 
74b0: 73 74 72 69 6e 67 20 64 6f 20 6e 6f 74 20 63 68  string do not ch
74c0: 61 6e 67 65 20 74 68 65 20 72 65 73 75 6c 74 2e  ange the result.
74d0: 20 49 6e 20 6f 74 68 65 72 0a 20 20 20 20 20 20   In other.      
74e0: 2a 2a 20 77 6f 72 64 73 2c 20 73 74 72 69 6e 67  ** words, string
74f0: 73 20 77 69 6c 6c 20 63 6f 6d 70 61 72 65 20 65  s will compare e
7500: 71 75 61 6c 20 74 6f 20 6f 6e 65 20 61 6e 6f 74  qual to one anot
7510: 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  her as long as t
7520: 68 65 79 0a 20 20 20 20 20 20 2a 2a 20 64 69 66  hey.      ** dif
7530: 66 65 72 20 6f 6e 6c 79 20 69 6e 20 74 68 65 20  fer only in the 
7540: 6e 75 6d 62 65 72 20 6f 66 20 73 70 61 63 65 73  number of spaces
7550: 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 20 20 20   at the end..   
7560: 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b     */.    }else{
7570: 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79  .      rc = nKey
7580: 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d  1 - nKey2;.    }
7590: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
75a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68  ;.}../*.** Anoth
75b0: 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  er built-in coll
75c0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20  ating sequence: 
75d0: 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54  NOCASE. .**.** T
75e0: 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  his collating se
75f0: 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64  quence is intend
7600: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ed to be used fo
7610: 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64  r "case independ
7620: 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ent.** compariso
7630: 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f  n". SQLite's kno
7640: 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72 20  wledge of upper 
7650: 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65  and lower case e
7660: 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78  quivalents.** ex
7670: 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68  tends only to th
7680: 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73 20  e 26 characters 
7690: 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c  used in the Engl
76a0: 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a  ish language..**
76b0: 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e  .** At the momen
76c0: 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  t there is only 
76d0: 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e  a UTF-8 implemen
76e0: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  tation..*/.stati
76f0: 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c  c int nocaseColl
7700: 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69  atingFunc(.  voi
7710: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
7720: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
7730: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
7740: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
7750: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
7760: 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53  int r = sqlite3S
7770: 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28  trNICmp(.      (
7780: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
7790: 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y1, (const char 
77a0: 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c  *)pKey2, (nKey1<
77b0: 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65  nKey2)?nKey1:nKe
77c0: 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  y2);.  UNUSED_PA
77d0: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
77e0: 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a  ;.  if( 0==r ){.
77f0: 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b      r = nKey1-nK
7800: 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey2;.  }.  retur
7810: 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n r;.}../*.** Re
7820: 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f  turn the ROWID o
7830: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
7840: 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69  t insert.*/.sqli
7850: 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  te_int64 sqlite3
7860: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
7870: 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  id(sqlite3 *db){
7880: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7890: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
78a0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
78b0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
78c0: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
78d0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
78e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
78f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
7900: 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  rn db->lastRowid
7910: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7920: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
7930: 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 6d  changes in the m
7940: 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20  ost recent call 
7950: 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  to sqlite3_exec(
7960: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
7970: 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65  3_changes(sqlite
7980: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
7990: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
79a0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
79b0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
79c0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
79d0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
79e0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
79f0: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
7a00: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
7a10: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
7a20: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
7a30: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
7a40: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
7a50: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
7a60: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
7a70: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
7a80: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
7a90: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7aa0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
7ab0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
7ac0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
7ad0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
7ae0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
7af0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7b00: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
7b10: 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
7b20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
7b30: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
7b40: 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74  ints. This funct
7b50: 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c  ion only manipul
7b60: 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66 20 74  ates fields of t
7b70: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  he.** database h
7b80: 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74  andle object, it
7b90: 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20   does not close 
7ba0: 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74  any savepoints t
7bb0: 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a  hat may be open.
7bc0: 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72 65 65  ** at the b-tree
7bd0: 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f  /pager level..*/
7be0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 6f  .void sqlite3Clo
7bf0: 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73 71 6c  seSavepoints(sql
7c00: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77 68 69  ite3 *db){.  whi
7c10: 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  le( db->pSavepoi
7c20: 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65 70 6f  nt ){.    Savepo
7c30: 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e  int *pTmp = db->
7c40: 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  pSavepoint;.    
7c50: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
7c60: 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   pTmp->pNext;.  
7c70: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7c80: 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20  db, pTmp);.  }. 
7c90: 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20   db->nSavepoint 
7ca0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74  = 0;.  db->nStat
7cb0: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  ement = 0;.  db-
7cc0: 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
7cd0: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  vepoint = 0;.}..
7ce0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
7cf0: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
7d00: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
7d10: 77 69 74 68 20 46 75 6e 63 44 65 66 20 70 2c 20  with FuncDef p, 
7d20: 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a  if any. Except,.
7d30: 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ** if this is no
7d40: 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70 79 20  t the last copy 
7d50: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c  of the function,
7d60: 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69   do not invoke i
7d70: 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63  t. Multiple.** c
7d80: 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  opies of a singl
7d90: 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 63  e function are c
7da0: 72 65 61 74 65 64 20 77 68 65 6e 20 63 72 65 61  reated when crea
7db0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  te_function() is
7dc0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20   called.** with 
7dd0: 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20 74 68  SQLITE_ANY as th
7de0: 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  e encoding..*/.s
7df0: 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e 63 74  tatic void funct
7e00: 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c 69 74  ionDestroy(sqlit
7e10: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
7e20: 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73 74 72  *p){.  FuncDestr
7e30: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
7e40: 6f 72 20 3d 20 70 2d 3e 70 44 65 73 74 72 75 63  or = p->pDestruc
7e50: 74 6f 72 3b 0a 20 20 69 66 28 20 70 44 65 73 74  tor;.  if( pDest
7e60: 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44  ructor ){.    pD
7e70: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d  estructor->nRef-
7e80: 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 65 73 74  -;.    if( pDest
7e90: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20  ructor->nRef==0 
7ea0: 29 7b 0a 20 20 20 20 20 20 70 44 65 73 74 72 75  ){.      pDestru
7eb0: 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79 28 70  ctor->xDestroy(p
7ec0: 44 65 73 74 72 75 63 74 6f 72 2d 3e 70 55 73 65  Destructor->pUse
7ed0: 72 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71  rData);.      sq
7ee0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7ef0: 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  pDestructor);.  
7f00: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
7f10: 20 44 69 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20   Disconnect all 
7f20: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 6f 62 6a  sqlite3_vtab obj
7f30: 65 63 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  ects that belong
7f40: 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 6e   to database con
7f50: 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54  nection.** db. T
7f60: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68  his is called wh
7f70: 65 6e 20 64 62 20 69 73 20 62 65 69 6e 67 20 63  en db is being c
7f80: 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  losed..*/.static
7f90: 20 76 6f 69 64 20 64 69 73 63 6f 6e 6e 65 63 74   void disconnect
7fa0: 41 6c 6c 56 74 61 62 28 73 71 6c 69 74 65 33 20  AllVtab(sqlite3 
7fb0: 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  *db){.#ifndef SQ
7fc0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
7fd0: 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20 69 3b 0a  LTABLE.  int i;.
7fe0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20    HashElem *p;. 
7ff0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
8000: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72  erAll(db);.  for
8010: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
8020: 20 69 2b 2b 29 7b 0a 20 20 20 20 53 63 68 65 6d   i++){.    Schem
8030: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  a *pSchema = db-
8040: 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b  >aDb[i].pSchema;
8050: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62  .    if( db->aDb
8060: 5b 69 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20  [i].pSchema ){. 
8070: 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74       for(p=sqlit
8080: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
8090: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70  ema->tblHash); p
80a0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
80b0: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 20 20  xt(p)){.        
80c0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54  Table *pTab = (T
80d0: 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73  able *)sqliteHas
80e0: 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20  hData(p);.      
80f0: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
8100: 70 54 61 62 29 20 29 20 73 71 6c 69 74 65 33 56  pTab) ) sqlite3V
8110: 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62  tabDisconnect(db
8120: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d  , pTab);.      }
8130: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
8140: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
8150: 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  st(&db->aModule)
8160: 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73  ; p; p=sqliteHas
8170: 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 4d  hNext(p)){.    M
8180: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d  odule *pMod = (M
8190: 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61  odule *)sqliteHa
81a0: 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 69  shData(p);.    i
81b0: 66 28 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62  f( pMod->pEpoTab
81c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
81d0: 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28  3VtabDisconnect(
81e0: 64 62 2c 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  db, pMod->pEpoTa
81f0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
8200: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
8210: 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c  kList(db);.  sql
8220: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
8230: 6c 28 64 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55  l(db);.#else.  U
8240: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
8250: 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  db);.#endif.}../
8260: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
8270: 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   if database con
8280: 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 73 20 75  nection db has u
8290: 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61  nfinalized prepa
82a0: 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  red.** statement
82b0: 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20  s or unfinished 
82c0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f  sqlite3_backup o
82d0: 62 6a 65 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61  bjects.  .*/.sta
82e0: 74 69 63 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69  tic int connecti
82f0: 6f 6e 49 73 42 75 73 79 28 73 71 6c 69 74 65 33  onIsBusy(sqlite3
8300: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a   *db){.  int j;.
8310: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8320: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
8330: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
8340: 20 64 62 2d 3e 70 56 64 62 65 20 29 20 72 65 74   db->pVdbe ) ret
8350: 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30  urn 1;.  for(j=0
8360: 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b  ; j<db->nDb; j++
8370: 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  ){.    Btree *pB
8380: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70  t = db->aDb[j].p
8390: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20  Bt;.    if( pBt 
83a0: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  && sqlite3BtreeI
83b0: 73 49 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29  sInBackup(pBt) )
83c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
83d0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
83e0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69  .** Close an exi
83f0: 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74  sting SQLite dat
8400: 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20  abase.*/.static 
8410: 69 6e 74 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  int sqlite3Close
8420: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
8430: 74 20 66 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a  t forceZombie){.
8440: 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
8450: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
8460: 20 52 2d 36 33 32 35 37 2d 31 31 37 34 30 20 43   R-63257-11740 C
8470: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 63  alling sqlite3_c
8480: 6c 6f 73 65 28 29 20 6f 72 0a 20 20 20 20 2a 2a  lose() or.    **
8490: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
84a0: 32 28 29 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  2() with a NULL 
84b0: 70 6f 69 6e 74 65 72 20 61 72 67 75 6d 65 6e 74  pointer argument
84c0: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
84d0: 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 20 20 72 65 74  o-op. */.    ret
84e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
84f0: 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
8500: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
8510: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
8520: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
8530: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
8540: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
8550: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
8560: 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69  ..  /* Force xDi
8570: 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f  sconnect calls o
8580: 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61  n all virtual ta
8590: 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e  bles */.  discon
85a0: 6e 65 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b  nectAllVtab(db);
85b0: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e  ..  /* If a tran
85c0: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c  saction is open,
85d0: 20 74 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41   the disconnectA
85e0: 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62  llVtab() call ab
85f0: 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f  ove.  ** will no
8600: 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68  t have called th
8610: 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20  e xDisconnect() 
8620: 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69  method on any vi
8630: 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65  rtual.  ** table
8640: 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54  s in the db->aVT
8650: 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68  rans[] array. Th
8660: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
8670: 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28  te3VtabRollback(
8680: 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c  ).  ** call will
8690: 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20   do so. We need 
86a0: 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72  to do this befor
86b0: 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20  e the check for 
86c0: 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20  active.  ** SQL 
86d0: 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77  statements below
86e0: 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65  , as the v-table
86f0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
8700: 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20  may be storing. 
8710: 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65   ** some prepare
8720: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74  d statements int
8730: 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ernally..  */.  
8740: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
8750: 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c  ack(db);..  /* L
8760: 65 67 61 63 79 20 62 65 68 61 76 69 6f 72 20 28  egacy behavior (
8770: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20  sqlite3_close() 
8780: 62 65 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20  behavior) is to 
8790: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49  return.  ** SQLI
87a0: 54 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 63  TE_BUSY if the c
87b0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f  onnection can no
87c0: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
87d0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
87e0: 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65  if( !forceZombie
87f0: 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73   && connectionIs
8800: 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20  Busy(db) ){.    
8810: 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
8820: 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  Msg(db, SQLITE_B
8830: 55 53 59 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  USY, "unable to 
8840: 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66  close due to unf
8850: 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20 20 20 20  inalized ".     
8860: 20 20 22 73 74 61 74 65 6d 65 6e 74 73 20 6f 72    "statements or
8870: 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61 63 6b   unfinished back
8880: 75 70 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ups");.    sqlit
8890: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
88a0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72  b->mutex);.    r
88b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
88c0: 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  Y;.  }..#ifdef S
88d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
88e0: 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LOG.  if( sqlite
88f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
8900: 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20  qllog ){.    /* 
8910: 43 6c 6f 73 69 6e 67 20 74 68 65 20 68 61 6e 64  Closing the hand
8920: 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d  le. Fourth param
8930: 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74  eter is passed t
8940: 68 65 20 76 61 6c 75 65 20 32 2e 20 2a 2f 0a 20  he value 2. */. 
8950: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
8960: 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 73  Config.xSqllog(s
8970: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
8980: 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 64  ig.pSqllogArg, d
8990: 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d 0a 23 65  b, 0, 2);.  }.#e
89a0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  ndif..  /* Conve
89b0: 72 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  rt the connectio
89c0: 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20  n into a zombie 
89d0: 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69  and then close i
89e0: 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61  t..  */.  db->ma
89f0: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
8a00: 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c  IC_ZOMBIE;.  sql
8a10: 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e  ite3LeaveMutexAn
8a20: 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29  dCloseZombie(db)
8a30: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
8a40: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
8a50: 77 6f 20 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e  wo variations on
8a60: 20 74 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65   the public inte
8a70: 72 66 61 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e  rface for closin
8a80: 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
8a90: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20  connection. The 
8aa0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20  sqlite3_close() 
8ab0: 76 65 72 73 69 6f 6e 20 72 65 74 75 72 6e 73 20  version returns 
8ac0: 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a  SQLITE_BUSY and.
8ad0: 2a 2a 20 6c 65 61 76 65 73 20 74 68 65 20 63 6f  ** leaves the co
8ae0: 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20  nnection option 
8af0: 69 66 20 74 68 65 72 65 20 61 72 65 20 75 6e 66  if there are unf
8b00: 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65  inalized prepare
8b10: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  d.** statements 
8b20: 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71  or unfinished sq
8b30: 6c 69 74 65 33 5f 62 61 63 6b 75 70 73 2e 20 20  lite3_backups.  
8b40: 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  The sqlite3_clos
8b50: 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f  e_v2().** versio
8b60: 6e 20 66 6f 72 63 65 73 20 74 68 65 20 63 6f 6e  n forces the con
8b70: 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d  nection to becom
8b80: 65 20 61 20 7a 6f 6d 62 69 65 20 69 66 20 74 68  e a zombie if th
8b90: 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f  ere are.** unclo
8ba0: 73 65 64 20 72 65 73 6f 75 72 63 65 73 2c 20 61  sed resources, a
8bb0: 6e 64 20 61 72 72 61 6e 67 65 73 20 66 6f 72 20  nd arranges for 
8bc0: 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65  deallocation whe
8bd0: 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72  n the last.** pr
8be0: 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74 20  epare statement 
8bf0: 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  or sqlite3_backu
8c00: 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74  p closes..*/.int
8c10: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73   sqlite3_close(s
8c20: 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74  qlite3 *db){ ret
8c30: 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  urn sqlite3Close
8c40: 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71  (db,0); }.int sq
8c50: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73  lite3_close_v2(s
8c60: 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74  qlite3 *db){ ret
8c70: 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  urn sqlite3Close
8c80: 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a  (db,1); }.../*.*
8c90: 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d 75 74 65  * Close the mute
8ca0: 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 63 6f  x on database co
8cb0: 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a  nnection db..**.
8cc0: 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  ** Furthermore, 
8cd0: 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  if database conn
8ce0: 65 63 74 69 6f 6e 20 64 62 20 69 73 20 61 20 7a  ection db is a z
8cf0: 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e 67 20 74  ombie (meaning t
8d00: 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 68 61 73  hat there.** has
8d10: 20 62 65 65 6e 20 61 20 70 72 69 6f 72 20 63 61   been a prior ca
8d20: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c  ll to sqlite3_cl
8d30: 6f 73 65 28 64 62 29 20 6f 72 20 73 71 6c 69 74  ose(db) or sqlit
8d40: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29 29  e3_close_v2(db))
8d50: 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79 20 73 71   and.** every sq
8d60: 6c 69 74 65 33 5f 73 74 6d 74 20 68 61 73 20 6e  lite3_stmt has n
8d70: 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  ow been finalize
8d80: 64 20 61 6e 64 20 65 76 65 72 79 20 73 71 6c 69  d and every sqli
8d90: 74 65 33 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a  te3_backup has.*
8da0: 2a 20 66 69 6e 69 73 68 65 64 2c 20 74 68 65 6e  * finished, then
8db0: 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72   free all resour
8dc0: 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
8dd0: 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e  ite3LeaveMutexAn
8de0: 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c  dCloseZombie(sql
8df0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73  ite3 *db){.  Has
8e00: 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20 20  hElem *i;       
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e20: 48 61 73 68 20 74 61 62 6c 65 20 69 74 65 72 61  Hash table itera
8e30: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a  tor */.  int j;.
8e40: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
8e50: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 73  re outstanding s
8e60: 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 72 20 73  qlite3_stmt or s
8e70: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62  qlite3_backup ob
8e80: 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66  jects.  ** or if
8e90: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
8ea0: 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
8eb0: 20 63 6c 6f 73 65 64 20 62 79 20 73 71 6c 69 74   closed by sqlit
8ec0: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20  e3_close_v2(),. 
8ed0: 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20 6c 65   ** then just le
8ee0: 61 76 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e  ave the mutex an
8ef0: 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
8f00: 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d   if( db->magic!=
8f10: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d  SQLITE_MAGIC_ZOM
8f20: 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f  BIE || connectio
8f30: 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20  nIsBusy(db) ){. 
8f40: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
8f50: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
8f60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
8f70: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
8f80: 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
8f90: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
8fa0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
8fb0: 65 63 74 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20  ection has.  ** 
8fc0: 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71 6c 69 74  closed all sqlit
8fd0: 65 33 5f 73 74 6d 74 20 61 6e 64 20 73 71 6c 69  e3_stmt and sqli
8fe0: 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63  te3_backup objec
8ff0: 74 73 20 61 6e 64 20 68 61 73 20 62 65 65 6e 0a  ts and has been.
9000: 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 73    ** passed to s
9010: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65  qlite3_close (me
9020: 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20 69 73  aning that it is
9030: 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65   a zombie).  The
9040: 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20  refore,.  ** go 
9050: 61 68 65 61 64 20 61 6e 64 20 66 72 65 65 20 61  ahead and free a
9060: 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20  ll resources..  
9070: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72  */..  /* If a tr
9080: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
9090: 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  n, roll it back.
90a0: 20 54 68 69 73 20 61 6c 73 6f 20 65 6e 73 75 72   This also ensur
90b0: 65 73 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20  es that if.  ** 
90c0: 61 6e 79 20 64 61 74 61 62 61 73 65 20 73 63 68  any database sch
90d0: 65 6d 61 73 20 68 61 76 65 20 62 65 65 6e 20 6d  emas have been m
90e0: 6f 64 69 66 69 65 64 20 62 79 20 61 6e 20 75 6e  odified by an un
90f0: 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61  committed transa
9100: 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68 65 79 20  ction.  ** they 
9110: 61 72 65 20 72 65 73 65 74 2e 20 41 6e 64 20 74  are reset. And t
9120: 68 61 74 20 74 68 65 20 72 65 71 75 69 72 65 64  hat the required
9130: 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
9140: 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65 0a 20 20   held to make.  
9150: 2a 2a 20 74 68 65 20 70 61 67 65 72 20 72 6f 6c  ** the pager rol
9160: 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61  lback and schema
9170: 20 72 65 73 65 74 20 61 6e 20 61 74 6f 6d 69 63   reset an atomic
9180: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20   operation. */. 
9190: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
91a0: 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
91b0: 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61  K);..  /* Free a
91c0: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53  ny outstanding S
91d0: 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75  avepoint structu
91e0: 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  res. */.  sqlite
91f0: 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
9200: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  (db);..  /* Clos
9210: 65 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63  e all database c
9220: 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
9230: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e  for(j=0; j<db->n
9240: 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; j++){.    st
9250: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
9260: 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20  db->aDb[j];.    
9270: 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a  if( pDb->pBt ){.
9280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
9290: 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74  eeClose(pDb->pBt
92a0: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42  );.      pDb->pB
92b0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
92c0: 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20   j!=1 ){.       
92d0: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20   pDb->pSchema = 
92e0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
92f0: 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20  .  }.  /* Clear 
9300: 74 68 65 20 54 45 4d 50 20 73 63 68 65 6d 61 20  the TEMP schema 
9310: 73 65 70 61 72 61 74 65 6c 79 20 61 6e 64 20 6c  separately and l
9320: 61 73 74 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ast */.  if( db-
9330: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
9340: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63  ){.    sqlite3Sc
9350: 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44  hemaClear(db->aD
9360: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20  b[1].pSchema);. 
9370: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
9380: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
9390: 0a 20 20 2f 2a 20 46 72 65 65 20 75 70 20 74 68  .  /* Free up th
93a0: 65 20 61 72 72 61 79 20 6f 66 20 61 75 78 69 6c  e array of auxil
93b0: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 2a  iary databases *
93c0: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61  /.  sqlite3Colla
93d0: 70 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79  pseDatabaseArray
93e0: 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20  (db);.  assert( 
93f0: 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20  db->nDb<=2 );.  
9400: 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d  assert( db->aDb=
9410: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
9420: 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65  ;..  /* Tell the
9430: 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e   code in notify.
9440: 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65  c that the conne
9450: 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  ction no longer 
9460: 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c  holds any.  ** l
9470: 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f  ocks and does no
9480: 74 20 72 65 71 75 69 72 65 20 61 6e 79 20 66 75  t require any fu
9490: 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  rther unlock-not
94a0: 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
94b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e   */.  sqlite3Con
94c0: 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62  nectionClosed(db
94d0: 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  );..  for(j=0; j
94e0: 3c 41 72 72 61 79 53 69 7a 65 28 64 62 2d 3e 61  <ArraySize(db->a
94f0: 46 75 6e 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20  Func.a); j++){. 
9500: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 78     FuncDef *pNex
9510: 74 2c 20 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20  t, *pHash, *p;. 
9520: 20 20 20 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75     for(p=db->aFu
9530: 6e 63 2e 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48  nc.a[j]; p; p=pH
9540: 61 73 68 29 7b 0a 20 20 20 20 20 20 70 48 61 73  ash){.      pHas
9550: 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20  h = p->pHash;.  
9560: 20 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a      while( p ){.
9570: 20 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e          function
9580: 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a  Destroy(db, p);.
9590: 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20          pNext = 
95a0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  p->pNext;.      
95b0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
95c0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
95d0: 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20  p = pNext;.     
95e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   }.    }.  }.  f
95f0: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
9600: 69 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  irst(&db->aCollS
9610: 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65  eq); i; i=sqlite
9620: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
9630: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
9640: 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71   = (CollSeq *)sq
9650: 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
9660: 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61  .    /* Invoke a
9670: 6e 79 20 64 65 73 74 72 75 63 74 6f 72 73 20 72  ny destructors r
9680: 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 63 6f  egistered for co
9690: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
96a0: 20 75 73 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20   user data. */. 
96b0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b     for(j=0; j<3;
96c0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
96d0: 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29   pColl[j].xDel )
96e0: 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b  {.        pColl[
96f0: 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d  j].xDel(pColl[j]
9700: 2e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 7d  .pUser);.      }
9710: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9720: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
9730: 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ll);.  }.  sqlit
9740: 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d  e3HashClear(&db-
9750: 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e  >aCollSeq);.#ifn
9760: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9770: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 66  VIRTUALTABLE.  f
9780: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
9790: 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  irst(&db->aModul
97a0: 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  e); i; i=sqliteH
97b0: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
97c0: 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20   Module *pMod = 
97d0: 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65  (Module *)sqlite
97e0: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
97f0: 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74   if( pMod->xDest
9800: 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f  roy ){.      pMo
9810: 64 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d 6f 64  d->xDestroy(pMod
9820: 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20  ->pAux);.    }. 
9830: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 45 70     sqlite3VtabEp
9840: 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 43 6c 65 61  onymousTableClea
9850: 72 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 20  r(db, pMod);.   
9860: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9870: 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20  b, pMod);.  }.  
9880: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
9890: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a  (&db->aModule);.
98a0: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
98b0: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
98c0: 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f  E_OK); /* Deallo
98d0: 63 61 74 65 73 20 61 6e 79 20 63 61 63 68 65 64  cates any cached
98e0: 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20   error strings. 
98f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  */.  sqlite3Valu
9900: 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29 3b  eFree(db->pErr);
9910: 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 45  .  sqlite3CloseE
9920: 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 23  xtensions(db);.#
9930: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
9940: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20  UTHENTICATION.  
9950: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
9960: 3e 61 75 74 68 2e 7a 41 75 74 68 55 73 65 72 29  >auth.zAuthUser)
9970: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
9980: 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 50  (db->auth.zAuthP
9990: 57 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62  W);.#endif..  db
99a0: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
99b0: 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20  _MAGIC_ERROR;.. 
99c0: 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74   /* The temp-dat
99d0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20  abase schema is 
99e0: 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72  allocated differ
99f0: 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f  ently from the o
9a00: 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a  ther schema.  **
9a10: 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20   objects (using 
9a20: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64  sqliteMalloc() d
9a30: 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64  irectly, instead
9a40: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
9a50: 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20  Schema())..  ** 
9a60: 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  So it needs to b
9a70: 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f  e freed here. To
9a80: 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c  do: Why not roll
9a90: 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61   the temp schema
9aa0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73   into.  ** the s
9ab0: 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ame sqliteMalloc
9ac0: 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68  () as the one th
9ad0: 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  at allocates the
9ae0: 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20   database .  ** 
9af0: 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a  structure?.  */.
9b00: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9b10: 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  db, db->aDb[1].p
9b20: 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
9b30: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
9b40: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
9b50: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
9b60: 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20  MAGIC_CLOSED;.  
9b70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
9b80: 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ee(db->mutex);. 
9b90: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f   assert( db->loo
9ba0: 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29  kaside.nOut==0 )
9bb0: 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61  ;  /* Fails on a
9bc0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
9bd0: 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20  y leak */.  if( 
9be0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
9bf0: 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73  alloced ){.    s
9c00: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e  qlite3_free(db->
9c10: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
9c20: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
9c30: 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a  _free(db);.}../*
9c40: 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
9c50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
9c60: 20 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73    If tripCode is
9c70: 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20   not SQLITE_OK, 
9c80: 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 77 72 69 74  then.** any writ
9c90: 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  e cursors are in
9ca0: 76 61 6c 69 64 61 74 65 64 20 28 22 74 72 69 70  validated ("trip
9cb0: 70 65 64 22 20 2d 20 61 73 20 69 6e 20 22 74 72  ped" - as in "tr
9cc0: 69 70 70 69 6e 67 20 61 20 63 69 72 63 75 69 74  ipping a circuit
9cd0: 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29 20 61 6e  .** breaker") an
9ce0: 64 20 6d 61 64 65 20 74 6f 20 72 65 74 75 72 6e  d made to return
9cf0: 20 74 72 69 70 43 6f 64 65 20 69 66 20 74 68 65   tripCode if the
9d00: 72 65 20 61 72 65 20 61 6e 79 20 66 75 72 74 68  re are any furth
9d10: 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  er.** attempts t
9d20: 6f 20 75 73 65 20 74 68 61 74 20 63 75 72 73 6f  o use that curso
9d30: 72 2e 20 20 52 65 61 64 20 63 75 72 73 6f 72 73  r.  Read cursors
9d40: 20 72 65 6d 61 69 6e 20 6f 70 65 6e 20 61 6e 64   remain open and
9d50: 20 76 61 6c 69 64 0a 2a 2a 20 62 75 74 20 61 72   valid.** but ar
9d60: 65 20 22 73 61 76 65 64 22 20 69 6e 20 63 61 73  e "saved" in cas
9d70: 65 20 74 68 65 20 74 61 62 6c 65 20 70 61 67 65  e the table page
9d80: 73 20 61 72 65 20 6d 6f 76 65 64 20 61 72 6f 75  s are moved arou
9d90: 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nd..*/.void sqli
9da0: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73  te3RollbackAll(s
9db0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
9dc0: 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74  tripCode){.  int
9dd0: 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e   i;.  int inTran
9de0: 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 63 68  s = 0;.  int sch
9df0: 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 61 73 73  emaChange;.  ass
9e00: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9e10: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
9e20: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
9e30: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
9e40: 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e  ();..  /* Obtain
9e50: 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d 75 74 65   all b-tree mute
9e60: 78 65 73 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e  xes before makin
9e70: 67 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f 20 42  g any calls to B
9e80: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 2e 20  treeRollback(). 
9e90: 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 69 6d  .  ** This is im
9ea0: 70 6f 72 74 61 6e 74 20 69 6e 20 63 61 73 65 20  portant in case 
9eb0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
9ec0: 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
9ed0: 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f 64 69 66  k has.  ** modif
9ee0: 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ied the database
9ef0: 20 73 63 68 65 6d 61 2e 20 49 66 20 74 68 65 20   schema. If the 
9f00: 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20 61  b-tree mutexes a
9f10: 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a 20 20 2a  re not taken.  *
9f20: 2a 20 68 65 72 65 2c 20 74 68 65 6e 20 61 6e 6f  * here, then ano
9f30: 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
9f40: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 69 67  e connection mig
9f50: 68 74 20 73 6e 65 61 6b 20 69 6e 20 62 65 74 77  ht sneak in betw
9f60: 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 64 61 74  een.  ** the dat
9f70: 61 62 61 73 65 20 72 6f 6c 6c 62 61 63 6b 20 61  abase rollback a
9f80: 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65 74 2c  nd schema reset,
9f90: 20 77 68 69 63 68 20 63 61 6e 20 63 61 75 73 65   which can cause
9fa0: 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63 6f 72 72   false.  ** corr
9fb0: 75 70 74 69 6f 6e 20 72 65 70 6f 72 74 73 20 69  uption reports i
9fc0: 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e 20 20 2a  n some cases.  *
9fd0: 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
9fe0: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
9ff0: 73 63 68 65 6d 61 43 68 61 6e 67 65 20 3d 20 28  schemaChange = (
a000: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
a010: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
a020: 29 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74  )!=0 && db->init
a030: 2e 62 75 73 79 3d 3d 30 3b 0a 0a 20 20 66 6f 72  .busy==0;..  for
a040: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
a050: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
a060: 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d   *p = db->aDb[i]
a070: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20  .pBt;.    if( p 
a080: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
a090: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
a0a0: 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20  ns(p) ){.       
a0b0: 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20   inTrans = 1;.  
a0c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
a0d0: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
a0e0: 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 21 73  (p, tripCode, !s
a0f0: 63 68 65 6d 61 43 68 61 6e 67 65 29 3b 0a 20 20  chemaChange);.  
a100: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
a110: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62  3VtabRollback(db
a120: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42  );.  sqlite3EndB
a130: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
a140: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
a150: 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  &SQLITE_InternCh
a160: 61 6e 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d  anges)!=0 && db-
a170: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
a180: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
a190: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
a1a0: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71  ents(db);.    sq
a1b0: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
a1c0: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
a1d0: 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  (db);.  }.  sqli
a1e0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
a1f0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20  (db);..  /* Any 
a200: 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
a210: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68  int violations h
a220: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73  ave now been res
a230: 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e  olved. */.  db->
a240: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
a250: 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  0;.  db->nDeferr
a260: 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
a270: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
a280: 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a  QLITE_DeferFKs;.
a290: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73  .  /* If one has
a2a0: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
a2b0: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c  , invoke the rol
a2c0: 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62  lback-hook callb
a2d0: 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ack */.  if( db-
a2e0: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
a2f0: 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c  ck && (inTrans |
a300: 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  | !db->autoCommi
a310: 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52  t) ){.    db->xR
a320: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28  ollbackCallback(
a330: 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
a340: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
a350: 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20  Return a static 
a360: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
a370: 67 20 74 68 65 20 6e 61 6d 65 20 63 6f 72 72 65  g the name corre
a380: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
a390: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70  error code.** sp
a3a0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 61  ecified in the a
a3b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20  rgument..*/.#if 
a3c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
a3d0: 45 45 44 5f 45 52 52 5f 4e 41 4d 45 29 0a 63 6f  EED_ERR_NAME).co
a3e0: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
a3f0: 33 45 72 72 4e 61 6d 65 28 69 6e 74 20 72 63 29  3ErrName(int rc)
a400: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
a410: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zName = 0;.  int
a420: 20 69 2c 20 6f 72 69 67 52 63 20 3d 20 72 63 3b   i, origRc = rc;
a430: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 20  .  for(i=0; i<2 
a440: 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b  && zName==0; i++
a450: 2c 20 72 63 20 26 3d 20 30 78 66 66 29 7b 0a 20  , rc &= 0xff){. 
a460: 20 20 20 73 77 69 74 63 68 28 20 72 63 20 29 7b     switch( rc ){
a470: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a480: 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20 20  TE_OK:          
a490: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a4a0: 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20  SQLITE_OK";     
a4b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
a4c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a4d0: 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20  ITE_ERROR:      
a4e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a4f0: 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20  "SQLITE_ERROR"; 
a500: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a510: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a520: 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20  LITE_INTERNAL:  
a530: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
a540: 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41   "SQLITE_INTERNA
a550: 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  L";          bre
a560: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a570: 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20  QLITE_PERM:     
a580: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a590: 3d 20 22 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b  = "SQLITE_PERM";
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
a5b0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a5c0: 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20 20  SQLITE_ABORT:   
a5d0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a5e0: 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54   = "SQLITE_ABORT
a5f0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
a600: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a610: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
a620: 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a 4e 61 6d  LLBACK:     zNam
a630: 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52  e = "SQLITE_ABOR
a640: 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 20 20 20  T_ROLLBACK";    
a650: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a660: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 20  e SQLITE_BUSY:  
a670: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
a680: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53  me = "SQLITE_BUS
a690: 59 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Y";             
a6a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a6b0: 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  se SQLITE_BUSY_R
a6c0: 45 43 4f 56 45 52 59 3a 20 20 20 20 20 20 7a 4e  ECOVERY:      zN
a6d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55  ame = "SQLITE_BU
a6e0: 53 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 20 20  SY_RECOVERY";   
a6f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a700: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  ase SQLITE_BUSY_
a710: 53 4e 41 50 53 48 4f 54 3a 20 20 20 20 20 20 7a  SNAPSHOT:      z
a720: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42  Name = "SQLITE_B
a730: 55 53 59 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20  USY_SNAPSHOT";  
a740: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a750: 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  case SQLITE_LOCK
a760: 45 44 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ED:             
a770: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a780: 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20 20 20  LOCKED";        
a790: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a7a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43   case SQLITE_LOC
a7b0: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3a  KED_SHAREDCACHE:
a7c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a7d0: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
a7e0: 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  CHE";break;.    
a7f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
a800: 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20  MEM:            
a810: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a820: 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20  E_NOMEM";       
a830: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a840: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
a850: 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20  EADONLY:        
a860: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a870: 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20  TE_READONLY";   
a880: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a890: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a8a0: 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52  READONLY_RECOVER
a8b0: 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  Y:  zName = "SQL
a8c0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43  ITE_READONLY_REC
a8d0: 4f 56 45 52 59 22 3b 20 62 72 65 61 6b 3b 0a 20  OVERY"; break;. 
a8e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a8f0: 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f  _READONLY_CANTLO
a900: 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  CK:  zName = "SQ
a910: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41  LITE_READONLY_CA
a920: 4e 54 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  NTLOCK"; break;.
a930: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a940: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42  E_READONLY_ROLLB
a950: 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ACK:  zName = "S
a960: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
a970: 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b  OLLBACK"; break;
a980: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a990: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
a9a0: 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  VED:   zName = "
a9b0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
a9c0: 44 42 4d 4f 56 45 44 22 3b 20 20 62 72 65 61 6b  DBMOVED";  break
a9d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a9e0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20  ITE_INTERRUPT:  
a9f0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
aa00: 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  "SQLITE_INTERRUP
aa10: 54 22 3b 20 20 20 20 20 20 20 20 20 62 72 65 61  T";         brea
aa20: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
aa30: 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20  LITE_IOERR:     
aa40: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
aa50: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b   "SQLITE_IOERR";
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
aa70: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
aa80: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
aa90: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
aaa0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
aab0: 52 45 41 44 22 3b 20 20 20 20 20 20 20 20 62 72  READ";        br
aac0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
aad0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
aae0: 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e 61 6d 65  RT_READ:   zName
aaf0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
ab00: 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b 20 20 62  _SHORT_READ";  b
ab10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ab20: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
ab30: 49 54 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ITE:        zNam
ab40: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
ab50: 52 5f 57 52 49 54 45 22 3b 20 20 20 20 20 20 20  R_WRITE";       
ab60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ab70: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  e SQLITE_IOERR_F
ab80: 53 59 4e 43 3a 20 20 20 20 20 20 20 20 7a 4e 61  SYNC:        zNa
ab90: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
aba0: 52 52 5f 46 53 59 4e 43 22 3b 20 20 20 20 20 20  RR_FSYNC";      
abb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
abc0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
abd0: 44 49 52 5f 46 53 59 4e 43 3a 20 20 20 20 7a 4e  DIR_FSYNC:    zN
abe0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
abf0: 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b 20  ERR_DIR_FSYNC"; 
ac00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ac10: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
ac20: 5f 54 52 55 4e 43 41 54 45 3a 20 20 20 20 20 7a  _TRUNCATE:     z
ac30: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
ac40: 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 22 3b 20  OERR_TRUNCATE"; 
ac50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ac60: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
ac70: 52 5f 46 53 54 41 54 3a 20 20 20 20 20 20 20 20  R_FSTAT:        
ac80: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ac90: 49 4f 45 52 52 5f 46 53 54 41 54 22 3b 20 20 20  IOERR_FSTAT";   
aca0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
acb0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
acc0: 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20  RR_UNLOCK:      
acd0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ace0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20  _IOERR_UNLOCK"; 
acf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ad00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
ad10: 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20  ERR_RDLOCK:     
ad20: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ad30: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22 3b  E_IOERR_RDLOCK";
ad40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ad50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
ad60: 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20 20 20 20  OERR_DELETE:    
ad70: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ad80: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 22  TE_IOERR_DELETE"
ad90: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
ada0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
adb0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20  IOERR_NOMEM:    
adc0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
add0: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22  ITE_IOERR_NOMEM"
ade0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
adf0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ae00: 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3a 20 20  _IOERR_ACCESS:  
ae10: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ae20: 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
ae30: 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S";      break;.
ae40: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ae50: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
ae60: 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20 20 20 20  ERVEDLOCK:.     
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae80: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
ae90: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
aea0: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
aeb0: 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CK"; break;.    
aec0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
aed0: 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20  ERR_LOCK:       
aee0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
aef0: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20 20  E_IOERR_LOCK";  
af00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
af10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
af20: 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20 20 20 20  OERR_CLOSE:     
af30: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
af40: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 22 3b  TE_IOERR_CLOSE";
af50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
af60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
af70: 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3a  IOERR_DIR_CLOSE:
af80: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
af90: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c  ITE_IOERR_DIR_CL
afa0: 4f 53 45 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  OSE";   break;. 
afb0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
afc0: 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3a 20  _IOERR_SHMOPEN: 
afd0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
afe0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50  LITE_IOERR_SHMOP
aff0: 45 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  EN";     break;.
b000: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b010: 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3a  E_IOERR_SHMSIZE:
b020: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b030: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
b040: 49 5a 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  IZE";     break;
b050: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b060: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b  TE_IOERR_SHMLOCK
b070: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
b080: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b090: 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72 65 61 6b  LOCK";     break
b0a0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b0b0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
b0c0: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
b0d0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
b0e0: 4d 4d 41 50 22 3b 20 20 20 20 20 20 62 72 65 61  MMAP";      brea
b0f0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b100: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 3a  LITE_IOERR_SEEK:
b110: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b120: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
b130: 45 45 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65  EEK";        bre
b140: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b150: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
b160: 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20  TE_NOENT: zName 
b170: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b180: 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b 62 72  DELETE_NOENT";br
b190: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b1a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
b1b0: 50 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  P:         zName
b1c0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b1d0: 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20 20 20 62  _MMAP";        b
b1e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b1f0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45   SQLITE_IOERR_GE
b200: 54 54 45 4d 50 50 41 54 48 3a 20 20 7a 4e 61 6d  TTEMPPATH:  zNam
b210: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b220: 52 5f 47 45 54 54 45 4d 50 50 41 54 48 22 3b 20  R_GETTEMPPATH"; 
b230: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b240: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e SQLITE_IOERR_C
b250: 4f 4e 56 50 41 54 48 3a 20 20 20 20 20 7a 4e 61  ONVPATH:     zNa
b260: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b270: 52 52 5f 43 4f 4e 56 50 41 54 48 22 3b 20 20 20  RR_CONVPATH";   
b280: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b290: 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  se SQLITE_CORRUP
b2a0: 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  T:            zN
b2b0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b2c0: 52 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20  RRUPT";         
b2d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b2e0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ase SQLITE_CORRU
b2f0: 50 54 5f 56 54 41 42 3a 20 20 20 20 20 20 20 7a  PT_VTAB:       z
b300: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b310: 4f 52 52 55 50 54 5f 56 54 41 42 22 3b 20 20 20  ORRUPT_VTAB";   
b320: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b330: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46  case SQLITE_NOTF
b340: 4f 55 4e 44 3a 20 20 20 20 20 20 20 20 20 20 20  OUND:           
b350: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b360: 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20 20 20  NOTFOUND";      
b370: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b380: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c   case SQLITE_FUL
b390: 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L:              
b3a0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b3b0: 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 20  _FULL";         
b3c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b3d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
b3e0: 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20  NTOPEN:         
b3f0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b400: 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20  E_CANTOPEN";    
b410: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b420: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b430: 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49  ANTOPEN_NOTEMPDI
b440: 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  R: zName = "SQLI
b450: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45  TE_CANTOPEN_NOTE
b460: 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b 0a 20 20  MPDIR";break;.  
b470: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b480: 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3a 20  CANTOPEN_ISDIR: 
b490: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b4a0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44  ITE_CANTOPEN_ISD
b4b0: 49 52 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  IR";    break;. 
b4c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b4d0: 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
b4e0: 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  TH:  zName = "SQ
b4f0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
b500: 4c 4c 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a  LLPATH"; break;.
b510: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b520: 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50  E_CANTOPEN_CONVP
b530: 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ATH:  zName = "S
b540: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43  QLITE_CANTOPEN_C
b550: 4f 4e 56 50 41 54 48 22 3b 20 62 72 65 61 6b 3b  ONVPATH"; break;
b560: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b570: 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 20  TE_PROTOCOL:    
b580: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b590: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22  SQLITE_PROTOCOL"
b5a0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
b5b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b5c0: 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20  ITE_EMPTY:      
b5d0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b5e0: 22 53 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20  "SQLITE_EMPTY"; 
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b600: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b610: 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20 20 20  LITE_SCHEMA:    
b620: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b630: 20 22 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 22   "SQLITE_SCHEMA"
b640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
b650: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b660: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20  QLITE_TOOBIG:   
b670: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b680: 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47  = "SQLITE_TOOBIG
b690: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
b6a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b6b0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b6c0: 54 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  T:         zName
b6d0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
b6e0: 52 41 49 4e 54 22 3b 20 20 20 20 20 20 20 20 62  RAINT";        b
b6f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b700: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
b710: 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61 6d  NT_UNIQUE:  zNam
b720: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
b730: 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b 20  TRAINT_UNIQUE"; 
b740: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b750: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
b760: 49 4e 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e 61  INT_TRIGGER: zNa
b770: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
b780: 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 22  STRAINT_TRIGGER"
b790: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
b7a0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
b7b0: 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3a  AINT_FOREIGNKEY:
b7c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7e0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b7f0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
b800: 49 47 4e 4b 45 59 22 3b 20 20 20 62 72 65 61 6b  IGNKEY";   break
b810: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b820: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
b830: 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d 20  HECK:   zName = 
b840: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
b850: 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62 72 65 61  NT_CHECK";  brea
b860: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b870: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b880: 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20 20  PRIMARYKEY:.    
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b8b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
b8c0: 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
b8d0: 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  Y";   break;.   
b8e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b8f0: 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c  ONSTRAINT_NOTNUL
b900: 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  L: zName = "SQLI
b910: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f  TE_CONSTRAINT_NO
b920: 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20 20  TNULL";break;.  
b930: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b940: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49  CONSTRAINT_COMMI
b950: 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20 20  THOOK:.         
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b980: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b990: 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20  T_COMMITHOOK";  
b9a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b9b0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
b9c0: 41 49 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a 4e  AINT_VTAB:    zN
b9d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b9e0: 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 22 3b 20  NSTRAINT_VTAB"; 
b9f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ba00: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
ba10: 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a  RAINT_FUNCTION:.
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba40: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ba50: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54  CONSTRAINT_FUNCT
ba60: 49 4f 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ION";     break;
ba70: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ba80: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f  TE_CONSTRAINT_RO
ba90: 57 49 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  WID:   zName = "
baa0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
bab0: 54 5f 52 4f 57 49 44 22 3b 20 20 62 72 65 61 6b  T_ROWID";  break
bac0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bad0: 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20  ITE_MISMATCH:   
bae0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
baf0: 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48  "SQLITE_MISMATCH
bb00: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
bb10: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bb20: 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20  LITE_MISUSE:    
bb30: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bb40: 20 22 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22   "SQLITE_MISUSE"
bb50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
bb60: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bb70: 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20  QLITE_NOLFS:    
bb80: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bb90: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22  = "SQLITE_NOLFS"
bba0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             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 41 55 54 48 3a 20 20 20 20  SQLITE_AUTH:    
bbd0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bbe0: 20 3d 20 22 53 51 4c 49 54 45 5f 41 55 54 48 22   = "SQLITE_AUTH"
bbf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              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 46 4f 52 4d 41 54 3a 20   SQLITE_FORMAT: 
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
bc30: 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d  e = "SQLITE_FORM
bc40: 41 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  AT";            
bc50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bc60: 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20  e SQLITE_RANGE: 
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
bc80: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e  me = "SQLITE_RAN
bc90: 47 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  GE";            
bca0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bcb0: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  se SQLITE_NOTADB
bcc0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
bcd0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
bce0: 54 41 44 42 22 3b 20 20 20 20 20 20 20 20 20 20  TADB";          
bcf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bd00: 61 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20  ase SQLITE_ROW: 
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
bd20: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
bd30: 4f 57 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  OW";            
bd40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bd50: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49  case SQLITE_NOTI
bd60: 43 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  CE:             
bd70: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bd80: 4e 4f 54 49 43 45 22 3b 20 20 20 20 20 20 20 20  NOTICE";        
bd90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bda0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
bdb0: 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 3a  ICE_RECOVER_WAL:
bdc0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bdd0: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
bde0: 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  WAL";break;.    
bdf0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
be00: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c  TICE_RECOVER_ROL
be10: 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20 20 20 20  LBACK:.         
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
be40: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
be50: 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b  COVER_ROLLBACK";
be60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
be70: 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  se SQLITE_WARNIN
be80: 47 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  G:            zN
be90: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41  ame = "SQLITE_WA
bea0: 52 4e 49 4e 47 22 3b 20 20 20 20 20 20 20 20 20  RNING";         
beb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bec0: 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49  ase SQLITE_WARNI
bed0: 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a 20 20 7a  NG_AUTOINDEX:  z
bee0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57  Name = "SQLITE_W
bef0: 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58  ARNING_AUTOINDEX
bf00: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
bf10: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45  case SQLITE_DONE
bf20: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
bf30: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bf40: 44 4f 4e 45 22 3b 20 20 20 20 20 20 20 20 20 20  DONE";          
bf50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bf60: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65  .  }.  if( zName
bf70: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ==0 ){.    stati
bf80: 63 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b  c char zBuf[50];
bf90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
bfa0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
bfb0: 66 29 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49 54  f), zBuf, "SQLIT
bfc0: 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c 20  E_UNKNOWN(%d)", 
bfd0: 6f 72 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e 61  origRc);.    zNa
bfe0: 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20  me = zBuf;.  }. 
bff0: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
c000: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
c010: 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73  eturn a static s
c020: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
c030: 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66  ibes the kind of
c040: 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64   error specified
c050: 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d   in the.** argum
c060: 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ent..*/.const ch
c070: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74  ar *sqlite3ErrSt
c080: 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61  r(int rc){.  sta
c090: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20  tic const char* 
c0a0: 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b  const aMsg[] = {
c0b0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  .    /* SQLITE_O
c0c0: 4b 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e  K          */ "n
c0d0: 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20  ot an error",.  
c0e0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f    /* SQLITE_ERRO
c0f0: 52 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20  R       */ "SQL 
c100: 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d  logic error or m
c110: 69 73 73 69 6e 67 20 64 61 74 61 62 61 73 65 22  issing database"
c120: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c130: 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30  INTERNAL    */ 0
c140: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c150: 50 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20 22  PERM        */ "
c160: 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
c170: 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f  n denied",.    /
c180: 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 20  * SQLITE_ABORT  
c190: 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61 63       */ "callbac
c1a0: 6b 20 72 65 71 75 65 73 74 65 64 20 71 75 65 72  k requested quer
c1b0: 79 20 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f 2a  y abort",.    /*
c1c0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20 20   SQLITE_BUSY    
c1d0: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
c1e0: 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20   is locked",.   
c1f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   /* SQLITE_LOCKE
c200: 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  D      */ "datab
c210: 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63  ase table is loc
c220: 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ked",.    /* SQL
c230: 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20  ITE_NOMEM       
c240: 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  */ "out of memor
c250: 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  y",.    /* SQLIT
c260: 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f  E_READONLY    */
c270: 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69   "attempt to wri
c280: 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61  te a readonly da
c290: 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20  tabase",.    /* 
c2a0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
c2b0: 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70 74     */ "interrupt
c2c0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c2d0: 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20 2a  TE_IOERR       *
c2e0: 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f  / "disk I/O erro
c2f0: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
c300: 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a 2f  E_CORRUPT     */
c310: 20 22 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   "database disk 
c320: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
c330: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c340: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a  TE_NOTFOUND    *
c350: 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61  / "unknown opera
c360: 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51  tion",.    /* SQ
c370: 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20  LITE_FULL       
c380: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f 72   */ "database or
c390: 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a   disk is full",.
c3a0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41      /* SQLITE_CA
c3b0: 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e  NTOPEN    */ "un
c3c0: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
c3d0: 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20 20  abase file",.   
c3e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f   /* SQLITE_PROTO
c3f0: 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69  COL    */ "locki
c400: 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20  ng protocol",.  
c410: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54    /* SQLITE_EMPT
c420: 59 20 20 20 20 20 20 20 2a 2f 20 22 74 61 62 6c  Y       */ "tabl
c430: 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61  e contains no da
c440: 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ta",.    /* SQLI
c450: 54 45 5f 53 43 48 45 4d 41 20 20 20 20 20 20 2a  TE_SCHEMA      *
c460: 2f 20 22 64 61 74 61 62 61 73 65 20 73 63 68 65  / "database sche
c470: 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64 22 2c  ma has changed",
c480: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54  .    /* SQLITE_T
c490: 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f 20 22 73  OOBIG      */ "s
c4a0: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f  tring or blob to
c4b0: 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53  o big",.    /* S
c4c0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c4d0: 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74    */ "constraint
c4e0: 20 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a   failed",.    /*
c4f0: 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48   SQLITE_MISMATCH
c500: 20 20 20 20 2a 2f 20 22 64 61 74 61 74 79 70 65      */ "datatype
c510: 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20 20 20   mismatch",.    
c520: 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  /* SQLITE_MISUSE
c530: 20 20 20 20 20 20 2a 2f 20 22 6c 69 62 72 61 72        */ "librar
c540: 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64  y routine called
c550: 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65   out of sequence
c560: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c570: 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20  _NOLFS       */ 
c580: 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70  "large file supp
c590: 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65 64 22  ort is disabled"
c5a0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c5b0: 41 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20 22  AUTH        */ "
c5c0: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65  authorization de
c5d0: 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  nied",.    /* SQ
c5e0: 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20  LITE_FORMAT     
c5f0: 20 2a 2f 20 22 61 75 78 69 6c 69 61 72 79 20 64   */ "auxiliary d
c600: 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20 65  atabase format e
c610: 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rror",.    /* SQ
c620: 4c 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20 20  LITE_RANGE      
c630: 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c   */ "bind or col
c640: 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66  umn index out of
c650: 20 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20   range",.    /* 
c660: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20 20  SQLITE_NOTADB   
c670: 20 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20 65     */ "file is e
c680: 6e 63 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e  ncrypted or is n
c690: 6f 74 20 61 20 64 61 74 61 62 61 73 65 22 2c 0a  ot a database",.
c6a0: 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61    };.  const cha
c6b0: 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f  r *zErr = "unkno
c6c0: 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73 77 69  wn error";.  swi
c6d0: 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63  tch( rc ){.    c
c6e0: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
c6f0: 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20 20  _ROLLBACK: {.   
c700: 20 20 20 7a 45 72 72 20 3d 20 22 61 62 6f 72 74     zErr = "abort
c710: 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43 4b   due to ROLLBACK
c720: 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";.      break;.
c730: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
c740: 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 26 3d  t: {.      rc &=
c750: 20 30 78 66 66 3b 0a 20 20 20 20 20 20 69 66 28   0xff;.      if(
c760: 20 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20 26   ALWAYS(rc>=0) &
c770: 26 20 72 63 3c 41 72 72 61 79 53 69 7a 65 28 61  & rc<ArraySize(a
c780: 4d 73 67 29 20 26 26 20 61 4d 73 67 5b 72 63 5d  Msg) && aMsg[rc]
c790: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  !=0 ){.        z
c7a0: 45 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a  Err = aMsg[rc];.
c7b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
c7c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
c7d0: 20 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a   return zErr;.}.
c7e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
c7f0: 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  ine implements a
c800: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74   busy callback t
c810: 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20 74  hat sleeps and t
c820: 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e  ries.** again un
c830: 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76 61  til a timeout va
c840: 6c 75 65 20 69 73 20 72 65 61 63 68 65 64 2e 20  lue is reached. 
c850: 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61 6c   The timeout val
c860: 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65  ue is.** an inte
c870: 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  ger number of mi
c880: 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73 65  lliseconds passe
c890: 64 20 69 6e 20 61 73 20 74 68 65 20 66 69 72 73  d in as the firs
c8a0: 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  t.** argument..*
c8b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
c8c0: 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61  iteDefaultBusyCa
c8d0: 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70  llback(. void *p
c8e0: 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
c8f0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
c900: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74  nnection */. int
c910: 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20 20   count          
c920: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c930: 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68  of times table h
c940: 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a  as been busy */.
c950: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
c960: 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f 55 53 4c  _WIN || HAVE_USL
c970: 45 45 50 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  EEP.  static con
c980: 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d  st u8 delays[] =
c990: 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c  .     { 1, 2, 5,
c9a0: 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c   10, 15, 20, 25,
c9b0: 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20   25,  25,  50,  
c9c0: 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61  50, 100 };.  sta
c9d0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74  tic const u8 tot
c9e0: 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30  als[] =.     { 0
c9f0: 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20  , 1, 3,  8, 18, 
ca00: 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c  33, 53, 78, 103,
ca10: 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d   128, 178, 228 }
ca20: 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41  ;.# define NDELA
ca30: 59 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c 61  Y ArraySize(dela
ca40: 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ys).  sqlite3 *d
ca50: 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70  b = (sqlite3 *)p
ca60: 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75  tr;.  int timeou
ca70: 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d 65  t = db->busyTime
ca80: 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79  out;.  int delay
ca90: 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73 65  , prior;..  asse
caa0: 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a  rt( count>=0 );.
cab0: 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44    if( count < ND
cac0: 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c 61  ELAY ){.    dela
cad0: 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74  y = delays[count
cae0: 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74  ];.    prior = t
caf0: 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20  otals[count];.  
cb00: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61 79  }else{.    delay
cb10: 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59   = delays[NDELAY
cb20: 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  -1];.    prior =
cb30: 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31   totals[NDELAY-1
cb40: 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74  ] + delay*(count
cb50: 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20  -(NDELAY-1));.  
cb60: 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b 20  }.  if( prior + 
cb70: 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74 20  delay > timeout 
cb80: 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 74  ){.    delay = t
cb90: 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a  imeout - prior;.
cba0: 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d 30      if( delay<=0
cbb0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
cbc0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
cbd0: 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61  p(db->pVfs, dela
cbe0: 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  y*1000);.  retur
cbf0: 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  n 1;.#else.  sql
cc00: 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69  ite3 *db = (sqli
cc10: 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74  te3 *)ptr;.  int
cc20: 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73 71 6c   timeout = ((sql
cc30: 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75 73  ite3 *)ptr)->bus
cc40: 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20  yTimeout;.  if( 
cc50: 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e  (count+1)*1000 >
cc60: 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20   timeout ){.    
cc70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
cc80: 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64  sqlite3OsSleep(d
cc90: 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30 30  b->pVfs, 1000000
cca0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  );.  return 1;.#
ccb0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  endif.}../*.** I
ccc0: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
ccd0: 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a  busy handler..**
cce0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ccf0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
cd00: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69  an operation fai
cd10: 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63 6b 2e  led with a lock.
cd20: 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74  .** If this rout
cd30: 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ine returns non-
cd40: 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
cd50: 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20 69  s retried.  If i
cd60: 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c 20  t.** returns 0, 
cd70: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 62  the operation ab
cd80: 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51 4c  orts with an SQL
cd90: 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a  ITE_BUSY error..
cda0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
cdb0: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
cdc0: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 29 7b  BusyHandler *p){
cdd0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
cde0: 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c 7c 20   NEVER(p==0) || 
cdf0: 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20 70  p->xFunc==0 || p
ce00: 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75  ->nBusy<0 ) retu
ce10: 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d 3e  rn 0;.  rc = p->
ce20: 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70  xFunc(p->pArg, p
ce30: 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66 28 20  ->nBusy);.  if( 
ce40: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  rc==0 ){.    p->
ce50: 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65  nBusy = -1;.  }e
ce60: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73  lse{.    p->nBus
ce70: 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  y++;.  }.  retur
ce80: 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n rc; .}../*.** 
ce90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
cea0: 73 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  s the busy callb
ceb0: 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74  ack for an Sqlit
cec0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
ced0: 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62  e.** given callb
cee0: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ack function wit
cef0: 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75  h the given argu
cf00: 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
cf10: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
cf20: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
cf30: 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29  ,.  int (*xBusy)
cf40: 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76  (void*,int),.  v
cf50: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66  oid *pArg.){.#if
cf60: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
cf70: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
cf80: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
cf90: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
cfa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
cfb0: 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
cfc0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
cfd0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
cfe0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
cff0: 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73  ler.xFunc = xBus
d000: 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  y;.  db->busyHan
d010: 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67  dler.pArg = pArg
d020: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
d030: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
d040: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
d050: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
d060: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
d070: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
d080: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
d090: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d0a0: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
d0b0: 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BACK./*.** This 
d0c0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
d0d0: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
d0e0: 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65  ck for an Sqlite
d0f0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65   database to the
d100: 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  .** given callba
d110: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ck function with
d120: 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d   the given argum
d130: 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73  ent. The progres
d140: 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a  s callback will.
d150: 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76  ** be invoked ev
d160: 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73  ery nOps opcodes
d170: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d180: 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  3_progress_handl
d190: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  er(.  sqlite3 *d
d1a0: 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a  b, .  int nOps,.
d1b0: 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73    int (*xProgres
d1c0: 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f  s)(void*), .  vo
d1d0: 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64  id *pArg.){.#ifd
d1e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d1f0: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
d200: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
d210: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
d220: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
d230: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
d240: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
d250: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
d260: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
d270: 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e  ex);.  if( nOps>
d280: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72  0 ){.    db->xPr
d290: 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72 65  ogress = xProgre
d2a0: 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f  ss;.    db->nPro
d2b0: 67 72 65 73 73 4f 70 73 20 3d 20 28 75 6e 73 69  gressOps = (unsi
d2c0: 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20 20 20 64  gned)nOps;.    d
d2d0: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20  b->pProgressArg 
d2e0: 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b  = pArg;.  }else{
d2f0: 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65  .    db->xProgre
d300: 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  ss = 0;.    db->
d310: 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30  nProgressOps = 0
d320: 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72  ;.    db->pProgr
d330: 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a  essArg = 0;.  }.
d340: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d350: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
d360: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
d370: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d380: 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75  installs a defau
d390: 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  lt busy handler 
d3a0: 74 68 61 74 20 77 61 69 74 73 20 66 6f 72 20 74  that waits for t
d3b0: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  he.** specified 
d3c0: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
d3d0: 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65  econds before re
d3e0: 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e  turning 0..*/.in
d3f0: 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74  t sqlite3_busy_t
d400: 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a  imeout(sqlite3 *
d410: 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 23 69 66  db, int ms){.#if
d420: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d430: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
d440: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
d450: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
d460: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
d470: 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
d480: 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20    if( ms>0 ){.  
d490: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
d4a0: 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74  andler(db, sqlit
d4b0: 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c  eDefaultBusyCall
d4c0: 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29  back, (void*)db)
d4d0: 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69  ;.    db->busyTi
d4e0: 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 7d 65  meout = ms;.  }e
d4f0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
d500: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62  _busy_handler(db
d510: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
d520: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20  .}../*.** Cause 
d540: 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72  any pending oper
d550: 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74  ation to stop at
d560: 20 69 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70   its earliest op
d570: 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f  portunity..*/.vo
d580: 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  id sqlite3_inter
d590: 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62  rupt(sqlite3 *db
d5a0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
d5b0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
d5c0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
d5d0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
d5e0: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
d5f0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
d600: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
d610: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e   }.#endif.  db->
d620: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
d630: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
d640: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
d650: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
d660: 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65  e as sqlite3_cre
d670: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  ate_function(), 
d680: 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69  except.** that i
d690: 74 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  t is designed to
d6a0: 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e   be called by in
d6b0: 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65  ternal code. The
d6c0: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a   difference is.*
d6d0: 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c  * that if a mall
d6e0: 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71  oc() fails in sq
d6f0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
d700: 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f  ction(), an erro
d710: 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74  r code.** is ret
d720: 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61  urned and the ma
d730: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
d740: 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74  cleared. .*/.int
d750: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
d760: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nc(.  sqlite3 *d
d770: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
d780: 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a  *zFunctionName,.
d790: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
d7a0: 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70  t enc,.  void *p
d7b0: 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64  UserData,.  void
d7c0: 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
d7d0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
d7e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
d7f0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
d800: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
d810: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
d820: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
d830: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
d840: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20  e3_context*),.  
d850: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
d860: 70 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20  pDestructor.){. 
d870: 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69   FuncDef *p;.  i
d880: 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  nt nName;.  int 
d890: 65 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61  extraFlags;..  a
d8a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d8b0: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
d8c0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46  tex) );.  if( zF
d8d0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c  unctionName==0 |
d8e0: 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63 20 26  |.      (xFunc &
d8f0: 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74  & (xFinal || xSt
d900: 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28  ep)) || .      (
d910: 21 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61  !xFunc && (xFina
d920: 6c 20 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c  l && !xStep)) ||
d930: 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26  .      (!xFunc &
d940: 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53  & (!xFinal && xS
d950: 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28  tep)) ||.      (
d960: 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e  nArg<-1 || nArg>
d970: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
d980: 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20  ION_ARG) ||.    
d990: 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20    (255<(nName = 
d9a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
d9b0: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29   zFunctionName))
d9c0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
d9d0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
d9e0: 50 54 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  PT;.  }..  asser
d9f0: 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  t( SQLITE_FUNC_C
da00: 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c 49 54 45 5f  ONSTANT==SQLITE_
da10: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b  DETERMINISTIC );
da20: 0a 20 20 65 78 74 72 61 46 6c 61 67 73 20 3d 20  .  extraFlags = 
da30: 65 6e 63 20 26 20 20 53 51 4c 49 54 45 5f 44 45  enc &  SQLITE_DE
da40: 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a 20 20 65  TERMINISTIC;.  e
da50: 6e 63 20 26 3d 20 28 53 51 4c 49 54 45 5f 46 55  nc &= (SQLITE_FU
da60: 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c 49 54  NC_ENCMASK|SQLIT
da70: 45 5f 41 4e 59 29 3b 0a 20 20 0a 23 69 66 6e 64  E_ANY);.  .#ifnd
da80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
da90: 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c  TF16.  /* If SQL
daa0: 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65  ITE_UTF16 is spe
dab0: 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e  cified as the en
dac0: 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61  coding type, tra
dad0: 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a  nsform this.  **
dae0: 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   to one of SQLIT
daf0: 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c  E_UTF16LE or SQL
db00: 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e  ITE_UTF16BE usin
db10: 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  g the.  ** SQLIT
db20: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61  E_UTF16NATIVE ma
db30: 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31  cro. SQLITE_UTF1
db40: 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e  6 is not used in
db50: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20  ternally..  **. 
db60: 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 41 4e   ** If SQLITE_AN
db70: 59 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  Y is specified, 
db80: 61 64 64 20 74 68 72 65 65 20 76 65 72 73 69 6f  add three versio
db90: 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  ns of the functi
dba0: 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 68  on.  ** to the h
dbb0: 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ash table..  */.
dbc0: 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54    if( enc==SQLIT
dbd0: 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65  E_UTF16 ){.    e
dbe0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  nc = SQLITE_UTF1
dbf0: 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65  6NATIVE;.  }else
dc00: 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45   if( enc==SQLITE
dc10: 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74 20  _ANY ){.    int 
dc20: 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
dc30: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
dc40: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
dc50: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
dc60: 54 46 38 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a  TF8|extraFlags,.
dc70: 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61           pUserDa
dc80: 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70  ta, xFunc, xStep
dc90: 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72  , xFinal, pDestr
dca0: 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  uctor);.    if( 
dcb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
dcc0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
dcd0: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
dce0: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
dcf0: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
dd00: 46 31 36 4c 45 7c 65 78 74 72 61 46 6c 61 67 73  F16LE|extraFlags
dd10: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 55 73 65  ,.          pUse
dd20: 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53  rData, xFunc, xS
dd30: 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65  tep, xFinal, pDe
dd40: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d  structor);.    }
dd50: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
dd60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
dd70: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
dd80: 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  .    enc = SQLIT
dd90: 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23  E_UTF16BE;.  }.#
dda0: 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c  else.  enc = SQL
ddb0: 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66  ITE_UTF8;.#endif
ddc0: 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
ddd0: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75  f an existing fu
dde0: 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
ddf0: 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65  overridden or de
de00: 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20  leted. If so,.  
de10: 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
de20: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65   active VMs, the
de30: 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
de40: 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74  BUSY. If a funct
de50: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e  ion.  ** is bein
de60: 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c  g overridden/del
de70: 65 74 65 64 20 62 75 74 20 74 68 65 72 65 20 61  eted but there a
de80: 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
de90: 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a  , allow the.  **
dea0: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f   operation to co
deb0: 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c  ntinue but inval
dec0: 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d  idate all precom
ded0: 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
dee0: 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ..  */.  p = sql
def0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
df00: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
df10: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
df20: 20 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20   (u8)enc, 0);.  
df30: 69 66 28 20 70 20 26 26 20 28 70 2d 3e 66 75 6e  if( p && (p->fun
df40: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
df50: 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 3d 3d 65  FUNC_ENCMASK)==e
df60: 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e  nc && p->nArg==n
df70: 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64  Arg ){.    if( d
df80: 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29  b->nVdbeActive )
df90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
dfa0: 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
dfb0: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
dfc0: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
dfd0: 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75   delete/modify u
dfe0: 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65  ser-function due
dff0: 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
e000: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61  ments");.      a
e010: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
e020: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
e030: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e040: 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BUSY;.    }else{
e050: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
e060: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
e070: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
e080: 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  }.  }..  p = sql
e090: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
e0a0: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
e0b0: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
e0c0: 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20   (u8)enc, 1);.  
e0d0: 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e  assert(p || db->
e0e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20  mallocFailed);. 
e0f0: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
e100: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
e110: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EM;.  }..  /* If
e120: 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   an older versio
e130: 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  n of the functio
e140: 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75  n with a configu
e150: 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69  red destructor i
e160: 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70  s.  ** being rep
e170: 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65  laced invoke the
e180: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
e190: 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20  tion here. */.  
e1a0: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
e1b0: 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70  db, p);..  if( p
e1c0: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
e1d0: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
e1e0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Ref++;.  }.  p->
e1f0: 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44  pDestructor = pD
e200: 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e  estructor;.  p->
e210: 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70 2d 3e  funcFlags = (p->
e220: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
e230: 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29  TE_FUNC_ENCMASK)
e240: 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 20   | extraFlags;. 
e250: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 75   testcase( p->fu
e260: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
e270: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29  _DETERMINISTIC )
e280: 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78  ;.  p->xFunc = x
e290: 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70  Func;.  p->xStep
e2a0: 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78   = xStep;.  p->x
e2b0: 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61  Finalize = xFina
e2c0: 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74  l;.  p->pUserDat
e2d0: 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20  a = pUserData;. 
e2e0: 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29   p->nArg = (u16)
e2f0: 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53  nArg;.  return S
e300: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
e310: 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73  ** Create new us
e320: 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  er functions..*/
e330: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
e340: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
e350: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
e360: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
e370: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
e380: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
e390: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75  *p,.  void (*xFu
e3a0: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
e3b0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
e3c0: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
e3d0: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
e3e0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
e3f0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
e400: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
e410: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
e420: 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75  text*).){.  retu
e430: 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  rn sqlite3_creat
e440: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62  e_function_v2(db
e450: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
e460: 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53  nc, p, xFunc, xS
e470: 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tep,.           
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e490: 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c           xFinal,
e4a0: 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69   0);.}..int sqli
e4b0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
e4c0: 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
e4d0: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
e4e0: 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e  har *zFunc,.  in
e4f0: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
e500: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
e510: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
e520: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
e530: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
e540: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
e550: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
e560: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
e570: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
e580: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
e590: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
e5a0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  ,.  void (*xDest
e5b0: 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a  roy)(void *).){.
e5c0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e5d0: 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44  E_ERROR;.  FuncD
e5e0: 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20  estructor *pArg 
e5f0: 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  = 0;..#ifdef SQL
e600: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
e610: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
e620: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
e630: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
e640: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
e650: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
e660: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
e670: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
e680: 78 29 3b 0a 20 20 69 66 28 20 78 44 65 73 74 72  x);.  if( xDestr
e690: 6f 79 20 29 7b 0a 20 20 20 20 70 41 72 67 20 3d  oy ){.    pArg =
e6a0: 20 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72   (FuncDestructor
e6b0: 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
e6c0: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
e6d0: 66 28 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72  f(FuncDestructor
e6e0: 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 41 72  ));.    if( !pAr
e6f0: 67 20 29 7b 0a 20 20 20 20 20 20 78 44 65 73 74  g ){.      xDest
e700: 72 6f 79 28 70 29 3b 0a 20 20 20 20 20 20 67 6f  roy(p);.      go
e710: 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  to out;.    }.  
e720: 20 20 70 41 72 67 2d 3e 78 44 65 73 74 72 6f 79    pArg->xDestroy
e730: 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a 20 20 20   = xDestroy;.   
e740: 20 70 41 72 67 2d 3e 70 55 73 65 72 44 61 74 61   pArg->pUserData
e750: 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   = p;.  }.  rc =
e760: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
e770: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41  nc(db, zFunc, nA
e780: 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e  rg, enc, p, xFun
e790: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
e7a0: 2c 20 70 41 72 67 29 3b 0a 20 20 69 66 28 20 70  , pArg);.  if( p
e7b0: 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6e 52 65  Arg && pArg->nRe
e7c0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  f==0 ){.    asse
e7d0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
e7e0: 4b 20 29 3b 0a 20 20 20 20 78 44 65 73 74 72 6f  K );.    xDestro
e7f0: 79 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  y(p);.    sqlite
e800: 33 44 62 46 72 65 65 28 64 62 2c 20 70 41 72 67  3DbFree(db, pArg
e810: 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20  );.  }.. out:.  
e820: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
e830: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
e840: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
e850: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
e860: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
e870: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e880: 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71 6c  IT_UTF16.int sql
e890: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
e8a0: 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65  tion16(.  sqlite
e8b0: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76  3 *db,.  const v
e8c0: 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61  oid *zFunctionNa
e8d0: 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  me,.  int nArg,.
e8e0: 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a    int eTextRep,.
e8f0: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
e900: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
e910: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
e920: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29  sqlite3_value**)
e930: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
e940: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e950: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
e960: 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  alue**),.  void 
e970: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
e980: 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20  3_context*).){. 
e990: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
e9a0: 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69 66 64 65 66  *zFunc8;..#ifdef
e9b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
e9c0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
e9d0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
e9e0: 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 46 75 6e  ckOk(db) || zFun
e9f0: 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29 20 72  ctionName==0 ) r
ea00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
ea10: 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
ea20: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
ea30: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
ea40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
ea50: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
ea60: 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c  ;.  zFunc8 = sql
ea70: 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c  ite3Utf16to8(db,
ea80: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
ea90: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  -1, SQLITE_UTF16
eaa0: 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20 3d 20  NATIVE);.  rc = 
eab0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
eac0: 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41  c(db, zFunc8, nA
ead0: 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c  rg, eTextRep, p,
eae0: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
eaf0: 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69  Final,0);.  sqli
eb00: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 46  te3DbFree(db, zF
eb10: 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73 71  unc8);.  rc = sq
eb20: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
eb30: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
eb40: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
eb50: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
eb60: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a   rc;.}.#endif...
eb70: 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 68  /*.** Declare th
eb80: 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61  at a function ha
eb90: 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65  s been overloade
eba0: 64 20 62 79 20 61 20 76 69 72 74 75 61 6c 20 74  d by a virtual t
ebb0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  able..**.** If t
ebc0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65  he function alre
ebd0: 61 64 79 20 65 78 69 73 74 73 20 61 73 20 61 20  ady exists as a 
ebe0: 72 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66  regular global f
ebf0: 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a  unction, then.**
ec00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
ec10: 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68   a no-op.  If th
ec20: 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
ec30: 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20  not exist, then 
ec40: 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20  create.** a new 
ec50: 6f 6e 65 20 74 68 61 74 20 61 6c 77 61 79 73 20  one that always 
ec60: 74 68 72 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d  throws a run-tim
ec70: 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a  e error.  .**.**
ec80: 20 57 68 65 6e 20 76 69 72 74 75 61 6c 20 74 61   When virtual ta
ec90: 62 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f 20 70  bles intend to p
eca0: 72 6f 76 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f  rovide an overlo
ecb0: 61 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74  aded function, t
ecc0: 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61  hey.** should ca
ecd0: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
ece0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
ecf0: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
ed00: 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c   exists..** A gl
ed10: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75  obal function mu
ed20: 73 74 20 65 78 69 73 74 20 69 6e 20 6f 72 64 65  st exist in orde
ed30: 72 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c  r for name resol
ed40: 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a  ution to work.**
ed50: 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e   properly..*/.in
ed60: 74 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f  t sqlite3_overlo
ed70: 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73  ad_function(.  s
ed80: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
ed90: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
eda0: 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20  .  int nArg.){. 
edb0: 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c   int nName = sql
edc0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
edd0: 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  me);.  int rc = 
ede0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64  SQLITE_OK;..#ifd
edf0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ee00: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
ee10: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
ee20: 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e  heckOk(db) || zN
ee30: 61 6d 65 3d 3d 30 20 7c 7c 20 6e 41 72 67 3c 2d  ame==0 || nArg<-
ee40: 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
ee50: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
ee60: 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  PT;.  }.#endif. 
ee70: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
ee80: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
ee90: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
eea0: 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a  ndFunction(db, z
eeb0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72  Name, nName, nAr
eec0: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
eed0: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  0)==0 ){.    rc 
eee0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
eef0: 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  unc(db, zName, n
ef00: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
ef10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
ef30: 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75  sqlite3InvalidFu
ef40: 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29  nction, 0, 0, 0)
ef50: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
ef60: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
ef70: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
ef80: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
ef90: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
efa0: 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
efb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
efc0: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
efd0: 61 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e  a trace function
efe0: 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d  .  The pArg from
eff0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
f000: 72 65 67 69 73 74 65 72 65 64 20 74 72 61 63 65  registered trace
f010: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
f020: 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20    .**.** A NULL 
f030: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d  trace function m
f040: 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61  eans that no tra
f050: 63 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73  cing is executes
f060: 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a  .  A non-NULL.**
f070: 20 74 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e   trace is a poin
f080: 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f  ter to a functio
f090: 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65  n that is invoke
f0a0: 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
f0b0: 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74  f each.** SQL st
f0c0: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
f0d0: 20 2a 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28   *sqlite3_trace(
f0e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69  sqlite3 *db, voi
f0f0: 64 20 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64  d (*xTrace)(void
f100: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20  *,const char*), 
f110: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76  void *pArg){.  v
f120: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64  oid *pOld;..#ifd
f130: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f140: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
f150: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
f160: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
f170: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
f180: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
f190: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
f1a0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
f1b0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
f1c0: 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  utex);.  pOld = 
f1d0: 64 62 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a 20  db->pTraceArg;. 
f1e0: 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78 54   db->xTrace = xT
f1f0: 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61  race;.  db->pTra
f200: 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  ceArg = pArg;.  
f210: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f220: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
f230: 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d    return pOld;.}
f240: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
f250: 61 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  a profile functi
f260: 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72  on.  The pArg fr
f270: 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  om the previousl
f280: 79 20 72 65 67 69 73 74 65 72 65 64 20 0a 2a 2a  y registered .**
f290: 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
f2a0: 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  n is returned.  
f2b0: 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72  .**.** A NULL pr
f2c0: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d  ofile function m
f2d0: 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 70 72 6f  eans that no pro
f2e0: 66 69 6c 69 6e 67 20 69 73 20 65 78 65 63 75 74  filing is execut
f2f0: 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a  es.  A non-NULL.
f300: 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73 20 61 20  ** profile is a 
f310: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
f320: 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e  ction that is in
f330: 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e  voked at the con
f340: 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61  clusion of.** ea
f350: 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ch SQL statement
f360: 20 74 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f   that is run..*/
f370: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70  .void *sqlite3_p
f380: 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  rofile(.  sqlite
f390: 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a  3 *db,.  void (*
f3a0: 78 50 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c  xProfile)(void*,
f3b0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69  const char*,sqli
f3c0: 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f  te_uint64),.  vo
f3d0: 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f  id *pArg.){.  vo
f3e0: 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65  id *pOld;..#ifde
f3f0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
f400: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
f410: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
f420: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
f430: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
f440: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
f450: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
f460: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
f470: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
f480: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
f490: 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 3b 0a  b->pProfileArg;.
f4a0: 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20 3d    db->xProfile =
f4b0: 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64 62 2d   xProfile;.  db-
f4c0: 3e 70 50 72 6f 66 69 6c 65 41 72 67 20 3d 20 70  >pProfileArg = p
f4d0: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
f4e0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
f4f0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
f500: 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  pOld;.}.#endif /
f510: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  * SQLITE_OMIT_TR
f520: 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  ACE */../*.** Re
f530: 67 69 73 74 65 72 20 61 20 66 75 6e 63 74 69 6f  gister a functio
f540: 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  n to be invoked 
f550: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
f560: 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a 20 49  on commits..** I
f570: 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 66 75  f the invoked fu
f580: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e  nction returns n
f590: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
f5a0: 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73  e commit becomes
f5b0: 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a   a.** rollback..
f5c0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
f5d0: 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20  _commit_hook(.  
f5e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
f5f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
f600: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
f610: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
f620: 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61  .  int (*xCallba
f630: 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20  ck)(void*),  /* 
f640: 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f  Function to invo
f650: 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69  ke on each commi
f660: 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72  t */.  void *pAr
f670: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
f680: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20   /* Argument to 
f690: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
f6a0: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b  ){.  void *pOld;
f6b0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
f6c0: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
f6d0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
f6e0: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
f6f0: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
f700: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
f710: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
f720: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
f730: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
f740: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
f750: 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69  Old = db->pCommi
f760: 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d  tArg;.  db->xCom
f770: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  mitCallback = xC
f780: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
f790: 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67  CommitArg = pArg
f7a0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
f7b0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
f7c0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
f7d0: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  d;.}../*.** Regi
f7e0: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
f7f0: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
f800: 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73  ch time a row is
f810: 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73   updated,.** ins
f820: 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64  erted or deleted
f830: 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61   using this data
f840: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
f850: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
f860: 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20  3_update_hook(. 
f870: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
f880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
f890: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
f8a0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
f8b0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
f8c0: 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  back)(void*,int,
f8d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61  char const *,cha
f8e0: 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65  r const *,sqlite
f8f0: 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  _int64),.  void 
f900: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
f910: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
f920: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
f930: 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
f940: 52 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  Ret;..#ifdef SQL
f950: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
f960: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
f970: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
f980: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
f990: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
f9a0: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
f9b0: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
f9c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
f9d0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
f9e0: 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55  .  pRet = db->pU
f9f0: 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e  pdateArg;.  db->
fa00: 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20  xUpdateCallback 
fa10: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
fa20: 62 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20  b->pUpdateArg = 
fa30: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
fa40: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
fa50: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
fa60: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
fa70: 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
fa80: 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
fa90: 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72  d each time a tr
faa0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
fab0: 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74  led.** back by t
fac0: 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
fad0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
fae0: 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61   *sqlite3_rollba
faf0: 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  ck_hook(.  sqlit
fb00: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
fb10: 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
fb20: 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
fb30: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f  database */.  vo
fb40: 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  id (*xCallback)(
fb50: 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62  void*), /* Callb
fb60: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ack function */.
fb70: 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
fb80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
fb90: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
fba0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
fbb0: 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66  void *pRet;..#if
fbc0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
fbd0: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
fbe0: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
fbf0: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
fc00: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
fc10: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
fc20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
fc30: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
fc40: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
fc50: 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
fc60: 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72   db->pRollbackAr
fc70: 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61  g;.  db->xRollba
fc80: 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  ckCallback = xCa
fc90: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52  llback;.  db->pR
fca0: 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70 41 72  ollbackArg = pAr
fcb0: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
fcc0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
fcd0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ex);.  return pR
fce0: 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  et;.}..#ifndef S
fcf0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
fd00: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
fd10: 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c  _wal_hook() call
fd20: 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20  back registered 
fd30: 62 79 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61  by sqlite3_wal_a
fd40: 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e  utocheckpoint().
fd50: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74  .** Invoke sqlit
fd60: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
fd70: 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t if the number 
fd80: 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65  of frames in the
fd90: 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20   log file.** is 
fda0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 73 71 6c  greater than sql
fdb0: 69 74 65 33 2e 70 57 61 6c 41 72 67 20 63 61 73  ite3.pWalArg cas
fdc0: 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  t to an integer 
fdd0: 28 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69  (the value confi
fde0: 67 75 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f  gured by.** wal_
fdf0: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29  autocheckpoint()
fe00: 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  )..*/ .int sqlit
fe10: 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b  e3WalDefaultHook
fe20: 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e  (.  void *pClien
fe30: 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 41 72  tData,     /* Ar
fe40: 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69  gument */.  sqli
fe50: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
fe60: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
fe70: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
fe80: 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a 20   *zDb,       /* 
fe90: 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  Database */.  in
fea0: 74 20 6e 46 72 61 6d 65 20 20 20 20 20 20 20 20  t nFrame        
feb0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
fec0: 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  WAL */.){.  if( 
fed0: 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50  nFrame>=SQLITE_P
fee0: 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e  TR_TO_INT(pClien
fef0: 74 44 61 74 61 29 20 29 7b 0a 20 20 20 20 73 71  tData) ){.    sq
ff00: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
ff10: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71  Malloc();.    sq
ff20: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
ff30: 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20  oint(db, zDb);. 
ff40: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
ff50: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d  ignMalloc();.  }
ff60: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ff70: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
ff80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
ff90: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69   */../*.** Confi
ffa0: 67 75 72 65 20 61 6e 20 73 71 6c 69 74 65 33 5f  gure an sqlite3_
ffb0: 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62  wal_hook() callb
ffc0: 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69 63  ack to automatic
ffd0: 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a  ally checkpoint.
ffe0: 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 66  ** a database af
fff0: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
10000 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
10010 74 68 65 72 65 20 61 72 65 20 6e 46 72 61 6d 65  there are nFrame
10020 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d   or.** more fram
10030 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69  es in the log fi
10040 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a 65 72 6f  le. Passing zero
10050 20 6f 72 20 61 20 6e 65 67 61 74 69 76 65 20 76   or a negative v
10060 61 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e  alue as the.** n
10070 46 72 61 6d 65 20 70 61 72 61 6d 65 74 65 72 20  Frame parameter 
10080 64 69 73 61 62 6c 65 73 20 61 75 74 6f 6d 61 74  disables automat
10090 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 65  ic checkpoints e
100a0 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  ntirely..**.** T
100b0 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69  he callback regi
100c0 73 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  stered by this f
100d0 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73  unction replaces
100e0 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 63 61   any existing ca
100f0 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74  llback.** regist
10100 65 72 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ered using sqlit
10110 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c  e3_wal_hook(). L
10120 69 6b 65 77 69 73 65 2c 20 72 65 67 69 73 74 65  ikewise, registe
10130 72 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a  ring a callback.
10140 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ** using sqlite3
10150 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61  _wal_hook() disa
10160 62 6c 65 73 20 74 68 65 20 61 75 74 6f 6d 61 74  bles the automat
10170 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65  ic checkpoint me
10180 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69  chanism.** confi
10190 67 75 72 65 64 20 62 79 20 74 68 69 73 20 66 75  gured by this fu
101a0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
101b0 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
101c0 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
101d0 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d  3 *db, int nFram
101e0 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e){.#ifdef SQLIT
101f0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55  E_OMIT_WAL.  UNU
10200 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
10210 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
10220 4d 45 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23  METER(nFrame);.#
10230 65 6c 73 65 0a 23 69 66 64 65 66 20 53 51 4c 49  else.#ifdef SQLI
10240 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
10250 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
10260 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
10270 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
10280 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
10290 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6e 46  .#endif.  if( nF
102a0 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73 71  rame>0 ){.    sq
102b0 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64  lite3_wal_hook(d
102c0 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66  b, sqlite3WalDef
102d0 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54 45  aultHook, SQLITE
102e0 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72 61  _INT_TO_PTR(nFra
102f0 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  me));.  }else{. 
10300 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68     sqlite3_wal_h
10310 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20  ook(db, 0, 0);. 
10320 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
10330 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10340 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
10350 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
10360 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
10370 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
10380 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
10390 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d 61 68  nto the write-ah
103a0 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69 73 20  ead-log by this 
103b0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
103c0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
103d0 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a  lite3_wal_hook(.
103e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
103f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10400 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
10410 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 62 20  hook to this db 
10420 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 28  handle */.  int(
10430 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
10440 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f   *, sqlite3*, co
10450 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c  nst char*, int),
10460 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10480 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
10490 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78  ment passed to x
104a0 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29 7b  Callback() */.){
104b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
104c0 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64 20  OMIT_WAL.  void 
104d0 2a 70 52 65 74 3b 0a 23 69 66 64 65 66 20 53 51  *pRet;.#ifdef SQ
104e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
104f0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
10500 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
10510 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
10520 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
10530 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
10540 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
10550 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10560 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
10570 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
10580 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57  WalArg;.  db->xW
10590 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  alCallback = xCa
105a0 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57  llback;.  db->pW
105b0 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  alArg = pArg;.  
105c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
105d0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
105e0 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23    return pRet;.#
105f0 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b  else.  return 0;
10600 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
10610 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61   Checkpoint data
10620 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74  base zDb..*/.int
10630 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
10640 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71  ckpoint_v2(.  sq
10650 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
10660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10670 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
10680 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
10690 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20   *zDb,          
106a0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
106b0 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
106c0 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  se (or NULL) */.
106d0 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20    int eMode,    
106e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106f0 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
10700 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a  KPOINT_* value *
10710 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20  /.  int *pnLog, 
10720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10730 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
10740 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66   of WAL log in f
10750 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  rames */.  int *
10760 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20 20  pnCkpt          
10770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
10780 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  T: Total number 
10790 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b 70  of frames checkp
107a0 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66  ointed */.){.#if
107b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
107c0 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  WAL.  return SQL
107d0 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
107e0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
107f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10800 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
10810 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51  /.  int iDb = SQ
10820 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
10830 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61  D;  /* sqlite3.a
10840 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62  Db[] index of db
10850 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a   to checkpoint *
10860 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
10870 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
10880 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
10890 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
108a0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
108b0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
108c0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 69 74  endif..  /* Init
108d0 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75  ialize the outpu
108e0 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 2d  t variables to -
108f0 31 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  1 in case an err
10900 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
10910 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c  if( pnLog ) *pnL
10920 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70  og = -1;.  if( p
10930 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74 20  nCkpt ) *pnCkpt 
10940 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28  = -1;..  assert(
10950 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
10960 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30 20 29 3b  NT_PASSIVE==0 );
10970 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
10980 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c  E_CHECKPOINT_FUL
10990 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  L==1 );.  assert
109a0 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
109b0 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32 20 29  INT_RESTART==2 )
109c0 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
109d0 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52  TE_CHECKPOINT_TR
109e0 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 20 20 69  UNCATE==3 );.  i
109f0 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f  f( eMode<SQLITE_
10a00 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
10a10 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49  VE || eMode>SQLI
10a20 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52  TE_CHECKPOINT_TR
10a30 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 2f 2a  UNCATE ){.    /*
10a40 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
10a50 30 33 39 39 36 2d 31 32 30 38 38 20 54 68 65 20  03996-12088 The 
10a60 4d 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74  M parameter must
10a70 20 62 65 20 61 20 76 61 6c 69 64 20 63 68 65 63   be a valid chec
10a80 6b 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6d 6f  kpoint.    ** mo
10a90 64 65 3a 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  de: */.    retur
10aa0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
10ab0 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
10ac0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
10ad0 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44  mutex);.  if( zD
10ae0 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a 20  b && zDb[0] ){. 
10af0 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
10b00 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
10b10 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  Db);.  }.  if( i
10b20 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  Db<0 ){.    rc =
10b30 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
10b40 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
10b50 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54  ithMsg(db, SQLIT
10b60 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77  E_ERROR, "unknow
10b70 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c  n database: %s",
10b80 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   zDb);.  }else{.
10b90 20 20 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64      db->busyHand
10ba0 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
10bb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
10bc0 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44  heckpoint(db, iD
10bd0 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c  b, eMode, pnLog,
10be0 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73 71   pnCkpt);.    sq
10bf0 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
10c00 63 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  c);.  }.  rc = s
10c10 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
10c20 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
10c30 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
10c40 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
10c50 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
10c60 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e  ./*.** Checkpoin
10c70 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20  t database zDb. 
10c80 49 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20  If zDb is NULL, 
10c90 6f 72 20 69 66 20 74 68 65 20 62 75 66 66 65 72  or if the buffer
10ca0 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zDb points.** t
10cb0 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72  o contains a zer
10cc0 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c  o-length string,
10cd0 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
10ce0 74 61 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20  tabases are .** 
10cf0 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f  checkpointed..*/
10d00 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c  .int sqlite3_wal
10d10 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69  _checkpoint(sqli
10d20 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
10d30 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 2f 2a 20  har *zDb){.  /* 
10d40 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
10d50 31 36 31 33 2d 32 30 35 35 33 20 54 68 65 20 73  1613-20553 The s
10d60 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
10d70 70 6f 69 6e 74 28 44 2c 58 29 20 69 73 20 65 71  point(D,X) is eq
10d80 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 2a 2a  uivalent to.  **
10d90 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
10da0 63 6b 70 6f 69 6e 74 5f 76 32 28 44 2c 58 2c 53  ckpoint_v2(D,X,S
10db0 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
10dc0 5f 50 41 53 53 49 56 45 2c 30 2c 30 29 2e 20 2a  _PASSIVE,0,0). *
10dd0 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  /.  return sqlit
10de0 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
10df0 74 5f 76 32 28 64 62 2c 7a 44 62 2c 53 51 4c 49  t_v2(db,zDb,SQLI
10e00 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
10e10 53 53 49 56 45 2c 30 2c 30 29 3b 0a 7d 0a 0a 23  SSIVE,0,0);.}..#
10e20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10e30 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e  IT_WAL./*.** Run
10e40 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e   a checkpoint on
10e50 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 54   database iDb. T
10e60 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
10e70 66 20 64 61 74 61 62 61 73 65 20 69 44 62 20 69  f database iDb i
10e80 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74  s.** not current
10e90 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d  ly open in WAL m
10ea0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ode..**.** If a 
10eb0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
10ec0 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
10ed0 61 73 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70  ase being checkp
10ee0 6f 69 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a  ointed, this .**
10ef0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
10f00 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  s SQLITE_LOCKED 
10f10 61 6e 64 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  and a checkpoint
10f20 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
10f30 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72  d. If .** an err
10f40 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
10f50 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 68 65 63  running the chec
10f60 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74  kpoint, an SQLit
10f70 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
10f80 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 28 69 2e  .** returned (i.
10f90 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  e. SQLITE_IOERR)
10fa0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
10fb0 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68  ITE_OK..**.** Th
10fc0 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62  e mutex on datab
10fd0 61 73 65 20 68 61 6e 64 6c 65 20 64 62 20 73 68  ase handle db sh
10fe0 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 62 79 20  ould be held by 
10ff0 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 20  the caller. The 
11000 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61  mutex.** associa
11010 74 65 64 20 77 69 74 68 20 74 68 65 20 73 70 65  ted with the spe
11020 63 69 66 69 63 20 62 2d 74 72 65 65 20 62 65 69  cific b-tree bei
11030 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  ng checkpointed 
11040 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74  is taken by.** t
11050 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 68 69  his function whi
11060 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  le the checkpoin
11070 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a  t is running..**
11080 0a 2a 2a 20 49 66 20 69 44 62 20 69 73 20 70 61  .** If iDb is pa
11090 73 73 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ssed SQLITE_MAX_
110a0 41 54 54 41 43 48 45 44 2c 20 74 68 65 6e 20 61  ATTACHED, then a
110b0 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
110c0 62 61 73 65 73 20 61 72 65 0a 2a 2a 20 63 68 65  bases are.** che
110d0 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e  ckpointed. If an
110e0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
110f0 74 65 72 65 64 20 69 74 20 69 73 20 72 65 74 75  tered it is retu
11100 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  rned immediately
11110 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74   -.** no attempt
11120 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63   is made to chec
11130 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61 69  kpoint any remai
11140 6e 69 6e 67 20 64 61 74 61 62 61 73 65 73 2e 0a  ning databases..
11150 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
11160 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66 20  eMode is one of 
11170 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
11180 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c 20  T_PASSIVE, FULL 
11190 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a 2f 0a 69  or RESTART..*/.i
111a0 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70  nt sqlite3Checkp
111b0 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  oint(sqlite3 *db
111c0 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 65  , int iDb, int e
111d0 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67  Mode, int *pnLog
111e0 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29 7b 0a  , int *pnCkpt){.
111f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11200 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
11210 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
11220 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11240 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
11250 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
11260 20 61 74 74 61 63 68 65 64 20 64 62 73 20 2a 2f   attached dbs */
11270 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d 20 30  .  int bBusy = 0
11280 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11290 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 53 51     /* True if SQ
112a0 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20 62 65  LITE_BUSY has be
112b0 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a  en encountered *
112c0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
112d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
112e0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
112f0 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67 20 7c  assert( !pnLog |
11300 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a  | *pnLog==-1 );.
11310 20 20 61 73 73 65 72 74 28 20 21 70 6e 43 6b 70    assert( !pnCkp
11320 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31  t || *pnCkpt==-1
11330 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   );..  for(i=0; 
11340 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72 63 3d  i<db->nDb && rc=
11350 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
11360 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 44 62  {.    if( i==iDb
11370 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54 45 5f   || iDb==SQLITE_
11380 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 7b 0a  MAX_ATTACHED ){.
11390 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
113a0 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f 69 6e  e3BtreeCheckpoin
113b0 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  t(db->aDb[i].pBt
113c0 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20  , eMode, pnLog, 
113d0 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20 20 70  pnCkpt);.      p
113e0 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  nLog = 0;.      
113f0 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20  pnCkpt = 0;.    
11400 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11410 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
11420 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20 20 20   bBusy = 1;.    
11430 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11440 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
11450 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
11460 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  (rc==SQLITE_OK &
11470 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c 49 54  & bBusy) ? SQLIT
11480 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d 0a 23  E_BUSY : rc;.}.#
11490 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
114a0 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
114b0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
114c0 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66   returns true if
114d0 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f   main-memory sho
114e0 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e 73 74  uld be used inst
114f0 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70  ead of.** a temp
11500 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72 20 74  orary file for t
11510 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72 20 66  ransient pager f
11520 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65 6d 65  iles and stateme
11530 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  nt journals..** 
11540 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
11550 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  ed depends on th
11560 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 74  e value of db->t
11570 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e 74 69  emp_store (runti
11580 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 29  me.** parameter)
11590 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
115a0 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20 53   time value of S
115b0 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
115c0 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  . The.** followi
115d0 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62  ng table describ
115e0 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73  es the relations
115f0 68 69 70 20 62 65 74 77 65 65 6e 20 74 68 65 73  hip between thes
11600 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20  e two values.** 
11610 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
11620 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e  ns return value.
11630 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  .**.**   SQLITE_
11640 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20 20 64  TEMP_STORE     d
11650 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20 20  b->temp_store   
11660 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65    Location of te
11670 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
11680 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
11690 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
116a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
116b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
116d0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
116e0 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20           any    
116f0 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
11700 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
11710 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20  .**   1         
11720 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
11730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
11740 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
11750 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20   0).**   1      
11760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
11790 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20 20 20  urn 1).**   1   
117a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117b0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
117c0 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
117d0 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32  return 0).**   2
117e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117f0 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
11800 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
11810 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
11820 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
11830 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
11840 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
11850 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a  y    (return 1).
11860 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
11870 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
11880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
11890 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
118a0 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20 20 20  1).**   3       
118b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
118c0 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
118d0 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
118e0 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rn 1).*/.int sql
118f0 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
11900 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 20 2a  (const sqlite3 *
11910 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  db){.#if SQLITE_
11920 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20  TEMP_STORE==1.  
11930 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d  return ( db->tem
11940 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a 23 65  p_store==2 );.#e
11950 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
11960 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20  TEMP_STORE==2.  
11970 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d  return ( db->tem
11980 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a 23 65  p_store!=1 );.#e
11990 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
119a0 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20  TEMP_STORE==3.  
119b0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
119c0 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  (db);.  return 1
119d0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
119e0 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31  ITE_TEMP_STORE<1
119f0 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f   || SQLITE_TEMP_
11a00 53 54 4f 52 45 3e 33 0a 20 20 55 4e 55 53 45 44  STORE>3.  UNUSED
11a10 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
11a20 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64    return 0;.#end
11a30 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
11a40 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  rn UTF-8 encoded
11a50 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
11a60 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  e explanation of
11a70 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
11a80 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f  .** error..*/.co
11a90 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
11aa0 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65 33  3_errmsg(sqlite3
11ab0 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63   *db){.  const c
11ac0 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64  har *z;.  if( !d
11ad0 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
11ae0 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
11af0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d  LITE_NOMEM);.  }
11b00 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
11b10 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
11b20 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
11b30 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53  turn sqlite3ErrS
11b40 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  tr(SQLITE_MISUSE
11b50 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73 71  _BKPT);.  }.  sq
11b60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
11b70 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
11b80 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
11b90 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20  iled ){.    z = 
11ba0 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
11bb0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d  LITE_NOMEM);.  }
11bc0 65 6c 73 65 7b 0a 20 20 20 20 74 65 73 74 63 61  else{.    testca
11bd0 73 65 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20  se( db->pErr==0 
11be0 29 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72  );.    z = (char
11bf0 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
11c00 74 65 78 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a  text(db->pErr);.
11c10 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
11c20 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
11c30 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
11c40 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
11c50 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72  e3ErrStr(db->err
11c60 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Code);.    }.  }
11c70 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
11c80 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
11c90 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  );.  return z;.}
11ca0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11cb0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
11cc0 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31 36 20  * Return UTF-16 
11cd0 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20  encoded English 
11ce0 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61  language explana
11cf0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
11d00 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72   recent.** error
11d10 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
11d20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31  *sqlite3_errmsg1
11d30 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  6(sqlite3 *db){.
11d40 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
11d50 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20  16 outOfMem[] = 
11d60 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20  {.    'o', 'u', 
11d70 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27  't', ' ', 'o', '
11d80 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27 65  f', ' ', 'm', 'e
11d90 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27  ', 'm', 'o', 'r'
11da0 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20  , 'y', 0.  };.  
11db0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36  static const u16
11dc0 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20   misuse[] = {.  
11dd0 20 20 27 6c 27 2c 20 27 69 27 2c 20 27 62 27 2c    'l', 'i', 'b',
11de0 20 27 72 27 2c 20 27 61 27 2c 20 27 72 27 2c 20   'r', 'a', 'r', 
11df0 27 79 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'y', ' ', .    '
11e00 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c 20 27 74  r', 'o', 'u', 't
11e10 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20 27 65 27  ', 'i', 'n', 'e'
11e20 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 63 27 2c  , ' ', .    'c',
11e30 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c 27 2c 20   'a', 'l', 'l', 
11e40 27 65 27 2c 20 27 64 27 2c 20 27 20 27 2c 20 0a  'e', 'd', ' ', .
11e50 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74      'o', 'u', 't
11e60 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27  ', ' ', .    'o'
11e70 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'f', ' ', .   
11e80 20 27 73 27 2c 20 27 65 27 2c 20 27 71 27 2c 20   's', 'e', 'q', 
11e90 27 75 27 2c 20 27 65 27 2c 20 27 6e 27 2c 20 27  'u', 'e', 'n', '
11ea0 63 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a  c', 'e', 0.  };.
11eb0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
11ec0 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20  ;.  if( !db ){. 
11ed0 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20     return (void 
11ee0 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a  *)outOfMem;.  }.
11ef0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
11f00 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
11f10 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
11f20 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73 75  urn (void *)misu
11f30 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  se;.  }.  sqlite
11f40 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
11f50 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
11f60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11f70 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69   ){.    z = (voi
11f80 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20  d *)outOfMem;.  
11f90 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73  }else{.    z = s
11fa0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
11fb0 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20  t16(db->pErr);. 
11fc0 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20     if( z==0 ){. 
11fd0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
11fe0 72 57 69 74 68 4d 73 67 28 64 62 2c 20 64 62 2d  rWithMsg(db, db-
11ff0 3e 65 72 72 43 6f 64 65 2c 20 73 71 6c 69 74 65  >errCode, sqlite
12000 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43  3ErrStr(db->errC
12010 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 7a 20 3d  ode));.      z =
12020 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
12030 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b  ext16(db->pErr);
12040 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20  .    }.    /* A 
12050 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68 61 76  malloc() may hav
12060 65 20 66 61 69 6c 65 64 20 77 69 74 68 69 6e 20  e failed within 
12070 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
12080 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
12090 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 2e  ().    ** above.
120a0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
120b0 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 64  case, then the d
120c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
120d0 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a 20 20  flag needs to.  
120e0 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65 64 20    ** be cleared 
120f0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
12100 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65 63 74  . Do this direct
12110 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 76  ly, instead of v
12120 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  ia.    ** sqlite
12130 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f 20 61  3ApiExit(), to a
12140 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74 68 65  void setting the
12150 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
12160 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a   error message..
12170 20 20 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d      */.    db->m
12180 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b  allocFailed = 0;
12190 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
121a0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
121b0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
121c0 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  z;.}.#endif /* S
121d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
121e0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
121f0 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
12200 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65 6e  t error code gen
12210 65 72 61 74 65 64 20 62 79 20 61 6e 20 53 51 4c  erated by an SQL
12220 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66 20  ite routine. If 
12230 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73 65  NULL is.** passe
12240 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
12250 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61 20  on, we assume a 
12260 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
12270 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f  during sqlite3_o
12280 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pen()..*/.int sq
12290 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73 71  lite3_errcode(sq
122a0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66  lite3 *db){.  if
122b0 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65 33  ( db && !sqlite3
122c0 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
122d0 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
122e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
122f0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  USE_BKPT;.  }.  
12300 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d  if( !db || db->m
12310 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
12320 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12330 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65  _NOMEM;.  }.  re
12340 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65  turn db->errCode
12350 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a   & db->errMask;.
12360 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78  }.int sqlite3_ex
12370 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 73  tended_errcode(s
12380 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
12390 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65  f( db && !sqlite
123a0 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
123b0 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
123c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
123d0 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
123e0 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e   if( !db || db->
123f0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
12400 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12410 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
12420 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64  eturn db->errCod
12430 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
12440 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  rn a string that
12450 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b   describes the k
12460 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65  ind of error spe
12470 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  cified in the.**
12480 20 61 72 67 75 6d 65 6e 74 2e 20 20 46 6f 72 20   argument.  For 
12490 6e 6f 77 2c 20 74 68 69 73 20 73 69 6d 70 6c 79  now, this simply
124a0 20 63 61 6c 6c 73 20 74 68 65 20 69 6e 74 65 72   calls the inter
124b0 6e 61 6c 20 73 71 6c 69 74 65 33 45 72 72 53 74  nal sqlite3ErrSt
124c0 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  r().** function.
124d0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
124e0 73 71 6c 69 74 65 33 5f 65 72 72 73 74 72 28 69  sqlite3_errstr(i
124f0 6e 74 20 72 63 29 7b 0a 20 20 72 65 74 75 72 6e  nt rc){.  return
12500 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
12510 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  c);.}../*.** Cre
12520 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ate a new collat
12530 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ing function for
12540 20 64 61 74 61 62 61 73 65 20 22 64 62 22 2e 20   database "db". 
12550 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61   The name is zNa
12560 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e  me.** and the en
12570 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a  coding is enc..*
12580 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65  /.static int cre
12590 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  ateCollation(.  
125a0 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20 63  sqlite3* db,.  c
125b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
125c0 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 76  , .  u8 enc,.  v
125d0 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
125e0 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
125f0 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
12600 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
12610 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c  *),.  void(*xDel
12620 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f  )(void*).){.  Co
12630 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
12640 69 6e 74 20 65 6e 63 32 3b 0a 20 20 0a 20 20 61  int enc2;.  .  a
12650 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12660 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
12670 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
12680 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
12690 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
126a0 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
126b0 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
126c0 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
126d0 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
126e0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
126f0 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
12700 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
12710 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
12720 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
12730 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
12740 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b  */.  enc2 = enc;
12750 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63  .  testcase( enc
12760 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20  2==SQLITE_UTF16 
12770 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65  );.  testcase( e
12780 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
12790 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69  6_ALIGNED );.  i
127a0 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  f( enc2==SQLITE_
127b0 55 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53  UTF16 || enc2==S
127c0 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
127d0 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e 63 32 20  NED ){.    enc2 
127e0 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
127f0 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  TIVE;.  }.  if( 
12800 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54 46 38  enc2<SQLITE_UTF8
12810 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f   || enc2>SQLITE_
12820 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20 72  UTF16BE ){.    r
12830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
12840 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  USE_BKPT;.  }.. 
12850 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69   /* Check if thi
12860 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69  s call is removi
12870 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67 20  ng or replacing 
12880 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c  an existing coll
12890 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75  ation .  ** sequ
128a0 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64  ence. If so, and
128b0 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76   there are activ
128c0 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62 75  e VMs, return bu
128d0 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a  sy. If there.  *
128e0 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
128f0 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65 20  VMs, invalidate 
12900 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64  any pre-compiled
12910 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
12920 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  /.  pColl = sqli
12930 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
12940 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61  b, (u8)enc2, zNa
12950 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43  me, 0);.  if( pC
12960 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43  oll && pColl->xC
12970 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  mp ){.    if( db
12980 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b  ->nVdbeActive ){
12990 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
129a0 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53  rorWithMsg(db, S
129b0 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20  QLITE_BUSY, .   
129c0 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
129d0 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f  delete/modify co
129e0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
129f0 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73   due to active s
12a00 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20  tatements");.   
12a10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12a20 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _BUSY;.    }.   
12a30 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
12a40 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
12a50 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  (db);..    /* If
12a60 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
12a70 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72  nce pColl was cr
12a80 65 61 74 65 64 20 64 69 72 65 63 74 6c 79 20 62  eated directly b
12a90 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  y a call to.    
12aa0 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  ** sqlite3_creat
12ab0 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64  e_collation, and
12ac0 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62   not generated b
12ad0 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  y synthCollSeq()
12ae0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e  ,.    ** then an
12af0 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79  y copies made by
12b00 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20   synthCollSeq() 
12b10 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  need to be inval
12b20 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41  idated..    ** A
12b30 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64  lso, collation d
12b40 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c  estructor - Coll
12b50 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e  Seq.xDel() - fun
12b60 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20  ction may need. 
12b70 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c     ** to be call
12b80 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  ed..    */ .    
12b90 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20  if( (pColl->enc 
12ba0 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  & ~SQLITE_UTF16_
12bb0 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29  ALIGNED)==enc2 )
12bc0 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
12bd0 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *aColl = sqlite3
12be0 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43  HashFind(&db->aC
12bf0 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 29 3b 0a  ollSeq, zName);.
12c00 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
12c10 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b     for(j=0; j<3;
12c20 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   j++){.        C
12c30 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f  ollSeq *p = &aCo
12c40 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[j];.        i
12c50 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c  f( p->enc==pColl
12c60 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  ->enc ){.       
12c70 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29     if( p->xDel )
12c80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
12c90 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b  >xDel(p->pUser);
12ca0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
12cb0 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d         p->xCmp =
12cc0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
12cd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
12ce0 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
12cf0 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
12d00 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d  , (u8)enc2, zNam
12d10 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f  e, 1);.  if( pCo
12d20 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll==0 ) return S
12d30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70  QLITE_NOMEM;.  p
12d40 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f  Coll->xCmp = xCo
12d50 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e  mpare;.  pColl->
12d60 70 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20  pUser = pCtx;.  
12d70 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44  pColl->xDel = xD
12d80 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63  el;.  pColl->enc
12d90 20 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20 28   = (u8)(enc2 | (
12da0 65 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54 46  enc & SQLITE_UTF
12db0 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20  16_ALIGNED));.  
12dc0 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
12dd0 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 72   SQLITE_OK);.  r
12de0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12df0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
12e00 61 72 72 61 79 20 64 65 66 69 6e 65 73 20 68 61  array defines ha
12e10 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64 73 20  rd upper bounds 
12e20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e  on limit values.
12e30 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c    The.** initial
12e40 69 7a 65 72 20 6d 75 73 74 20 62 65 20 6b 65 70  izer must be kep
12e50 74 20 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74  t in sync with t
12e60 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  he SQLITE_LIMIT_
12e70 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20 69 6e  *.** #defines in
12e80 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73   sqlite3.h..*/.s
12e90 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
12ea0 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b  aHardLimit[] = {
12eb0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  .  SQLITE_MAX_LE
12ec0 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  NGTH,.  SQLITE_M
12ed0 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20  AX_SQL_LENGTH,. 
12ee0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
12ef0 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  MN,.  SQLITE_MAX
12f00 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a 20 20 53  _EXPR_DEPTH,.  S
12f10 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
12f20 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c  ND_SELECT,.  SQL
12f30 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c  ITE_MAX_VDBE_OP,
12f40 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  .  SQLITE_MAX_FU
12f50 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51  NCTION_ARG,.  SQ
12f60 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
12f70 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  D,.  SQLITE_MAX_
12f80 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
12f90 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
12fa0 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
12fb0 52 2c 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  R,      /* IMP: 
12fc0 52 2d 33 38 30 39 31 2d 33 32 33 35 32 20 2a 2f  R-38091-32352 */
12fd0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  .  SQLITE_MAX_TR
12fe0 49 47 47 45 52 5f 44 45 50 54 48 2c 0a 20 20 53  IGGER_DEPTH,.  S
12ff0 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
13000 5f 54 48 52 45 41 44 53 2c 0a 7d 3b 0a 0a 2f 2a  _THREADS,.};../*
13010 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
13020 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20 61 72  e hard limits ar
13030 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f 6e 61  e set to reasona
13040 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69  ble values.*/.#i
13050 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  f SQLITE_MAX_LEN
13060 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20  GTH<100.# error 
13070 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
13080 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
13090 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69  st 100.#endif.#i
130a0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  f SQLITE_MAX_SQL
130b0 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72  _LENGTH<100.# er
130c0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ror SQLITE_MAX_S
130d0 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  QL_LENGTH must b
130e0 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23  e at least 100.#
130f0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
13100 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e  _MAX_SQL_LENGTH>
13110 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
13120 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  H.# error SQLITE
13130 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
13140 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72 65 61  must not be grea
13150 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  ter than SQLITE_
13160 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69  MAX_LENGTH.#endi
13170 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
13180 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
13190 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <2.# error SQLIT
131a0 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
131b0 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20 61 74  ELECT must be at
131c0 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69 66 0a   least 2.#endif.
131d0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  #if SQLITE_MAX_V
131e0 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f  DBE_OP<40.# erro
131f0 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  r SQLITE_MAX_VDB
13200 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61 74 20  E_OP must be at 
13210 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69 66 0a  least 40.#endif.
13220 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46  #if SQLITE_MAX_F
13230 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c  UNCTION_ARG<0 ||
13240 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
13250 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a 23 20  TION_ARG>1000.# 
13260 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
13270 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75  _FUNCTION_ARG mu
13280 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  st be between 0 
13290 61 6e 64 20 31 30 30 30 0a 23 65 6e 64 69 66 0a  and 1000.#endif.
132a0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  #if SQLITE_MAX_A
132b0 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c  TTACHED<0 || SQL
132c0 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
132d0 3e 31 32 35 0a 23 20 65 72 72 6f 72 20 53 51 4c  >125.# error SQL
132e0 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
132f0 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
13300 20 30 20 61 6e 64 20 31 32 35 0a 23 65 6e 64 69   0 and 125.#endi
13310 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
13320 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
13330 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53  NGTH<1.# error S
13340 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
13350 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75  ATTERN_LENGTH mu
13360 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
13370 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
13380 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32  TE_MAX_COLUMN>32
13390 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  767.# error SQLI
133a0 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75  TE_MAX_COLUMN mu
133b0 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32  st not exceed 32
133c0 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  767.#endif.#if S
133d0 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
133e0 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72 72 6f  R_DEPTH<1.# erro
133f0 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49  r SQLITE_MAX_TRI
13400 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73 74 20  GGER_DEPTH must 
13410 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65  be at least 1.#e
13420 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
13430 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
13440 44 53 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  DS<0 || SQLITE_M
13450 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
13460 53 3e 35 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  S>50.# error SQL
13470 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
13480 48 52 45 41 44 53 20 6d 75 73 74 20 62 65 20 62  HREADS must be b
13490 65 74 77 65 65 6e 20 30 20 61 6e 64 20 35 30 0a  etween 0 and 50.
134a0 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
134b0 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
134c0 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20 52 65 70  of a limit.  Rep
134d0 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75  ort the old valu
134e0 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61  e..** If an inva
134f0 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64 65 78 20  lid limit index 
13500 69 73 20 73 75 70 70 6c 69 65 64 2c 20 72 65 70  is supplied, rep
13510 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20  ort -1..** Make 
13520 6e 6f 20 63 68 61 6e 67 65 73 20 62 75 74 20 73  no changes but s
13530 74 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20  till report the 
13540 6f 6c 64 20 76 61 6c 75 65 20 69 66 20 74 68 65  old value if the
13550 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69 73  .** new limit is
13560 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
13570 20 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d   A new lower lim
13580 69 74 20 64 6f 65 73 20 6e 6f 74 20 73 68 72 69  it does not shri
13590 6e 6b 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 73  nk existing cons
135a0 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65  tructs..** It me
135b0 72 65 6c 79 20 70 72 65 76 65 6e 74 73 20 6e 65  rely prevents ne
135c0 77 20 63 6f 6e 73 74 72 75 63 74 73 20 74 68 61  w constructs tha
135d0 74 20 65 78 63 65 65 64 20 74 68 65 20 6c 69 6d  t exceed the lim
135e0 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69  it.** from formi
135f0 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
13600 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 33  e3_limit(sqlite3
13610 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49   *db, int limitI
13620 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29  d, int newLimit)
13630 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74  {.  int oldLimit
13640 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
13650 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
13660 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
13670 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
13680 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
13690 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
136a0 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  T;.    return -1
136b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
136c0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
136d0 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20 46 6f  R-30189-54097 Fo
136e0 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63 61 74  r each limit cat
136f0 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c 49 4d  egory SQLITE_LIM
13700 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74 68 65  IT_NAME.  ** the
13710 72 65 20 69 73 20 61 20 68 61 72 64 20 75 70 70  re is a hard upp
13720 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61 74 20  er bound set at 
13730 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79 20  compile-time by 
13740 61 20 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72  a C preprocessor
13750 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61 6c 6c  .  ** macro call
13760 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4e 41  ed SQLITE_MAX_NA
13770 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d 49 54  ME. (The "_LIMIT
13780 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 69  _" in the name i
13790 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20 20 2a  s changed to.  *
137a0 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f  * "_MAX_".).  */
137b0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
137c0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
137d0 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49  IT_LENGTH]==SQLI
137e0 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b  TE_MAX_LENGTH );
137f0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
13800 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
13810 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d  IT_SQL_LENGTH]==
13820 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
13830 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72  ENGTH );.  asser
13840 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
13850 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
13860 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43  N]==SQLITE_MAX_C
13870 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73 65 72  OLUMN );.  asser
13880 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
13890 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f  LITE_LIMIT_EXPR_
138a0 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d  DEPTH]==SQLITE_M
138b0 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20 29 3b  AX_EXPR_DEPTH );
138c0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
138d0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
138e0 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
138f0 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  CT]==SQLITE_MAX_
13900 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29  COMPOUND_SELECT)
13910 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
13920 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
13930 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53 51  MIT_VDBE_OP]==SQ
13940 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
13950 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
13960 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
13970 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41  LIMIT_FUNCTION_A
13980 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  RG]==SQLITE_MAX_
13990 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29 3b 0a  FUNCTION_ARG );.
139a0 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
139b0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
139c0 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53 51 4c  T_ATTACHED]==SQL
139d0 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
139e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
139f0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
13a00 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45  LIMIT_LIKE_PATTE
13a10 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20 20  RN_LENGTH]==.   
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a40 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
13a50 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
13a60 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  ERN_LENGTH );.  
13a70 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
13a80 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
13a90 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
13aa0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52  ==SQLITE_MAX_VAR
13ab0 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20  IABLE_NUMBER);. 
13ac0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
13ad0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
13ae0 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 5d 3d  _TRIGGER_DEPTH]=
13af0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47  =SQLITE_MAX_TRIG
13b00 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61  GER_DEPTH );.  a
13b10 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
13b20 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57  t[SQLITE_LIMIT_W
13b30 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 3d 3d  ORKER_THREADS]==
13b40 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
13b50 52 5f 54 48 52 45 41 44 53 20 29 3b 0a 20 20 61  R_THREADS );.  a
13b60 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4c 49  ssert( SQLITE_LI
13b70 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
13b80 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c 49  DS==(SQLITE_N_LI
13b90 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20 69 66  MIT-1) );...  if
13ba0 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c  ( limitId<0 || l
13bb0 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e  imitId>=SQLITE_N
13bc0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 72 65  _LIMIT ){.    re
13bd0 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f  turn -1;.  }.  o
13be0 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c  ldLimit = db->aL
13bf0 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20  imit[limitId];. 
13c00 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30   if( newLimit>=0
13c10 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
13c20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
13c30 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f 0a 20  52476-28732 */. 
13c40 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
13c50 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74  aHardLimit[limit
13c60 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  Id] ){.      new
13c70 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c 69 6d  Limit = aHardLim
13c80 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20 2f 2a  it[limitId];  /*
13c90 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d 32 35   IMP: R-51463-25
13ca0 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  634 */.    }.   
13cb0 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69   db->aLimit[limi
13cc0 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  tId] = newLimit;
13cd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c  .  }.  return ol
13ce0 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  dLimit;         
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13d00 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35 34 31  MP: R-53341-3541
13d10 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  9 */.}../*.** Th
13d20 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
13d30 73 65 64 20 74 6f 20 70 61 72 73 65 20 62 6f 74  sed to parse bot
13d40 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e 2d 55  h URIs and non-U
13d50 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70 61 73  RI filenames pas
13d60 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 75 73  sed by the.** us
13d70 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63 74 69  er to API functi
13d80 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ons sqlite3_open
13d90 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  () or sqlite3_op
13da0 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66 6f 72  en_v2(), and for
13db0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55 52 49   database.** URI
13dc0 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70  s specified as p
13dd0 61 72 74 20 6f 66 20 41 54 54 41 43 48 20 73 74  art of ATTACH st
13de0 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
13df0 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
13e00 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
13e10 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ion is the name 
13e20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75 73  of the VFS to us
13e30 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20  e (or.** a NULL 
13e40 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65 20 64  to signify the d
13e50 65 66 61 75 6c 74 20 56 46 53 29 20 69 66 20 74  efault VFS) if t
13e60 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f 74 20  he URI does not 
13e70 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73 3d 78  contain a "vfs=x
13e80 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70 61 72  xx".** query par
13e90 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65 63 6f  ameter. The seco
13ea0 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e 74  nd argument cont
13eb0 61 69 6e 73 20 74 68 65 20 55 52 49 20 28 6f 72  ains the URI (or
13ec0 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d   non-URI filenam
13ed0 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20 57 68  e).** itself. Wh
13ee0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
13ef0 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 2a   is called the *
13f00 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c 65 20  pFlags variable 
13f10 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a  should contain.*
13f20 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 66 6c  * the default fl
13f30 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ags to open the 
13f40 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
13f50 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75 65 20  with. The value 
13f60 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a 70 46  stored in.** *pF
13f70 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70 64 61  lags may be upda
13f80 74 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  ted before retur
13f90 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52 49 20  ning if the URI 
13fa0 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61 69 6e  filename contain
13fb0 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78 78 78  s .** "cache=xxx
13fc0 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78 22 20  " or "mode=xxx" 
13fd0 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73  query parameters
13fe0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
13ff0 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
14000 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e   is returned. In
14010 20 74 68 69 73 20 63 61 73 65 20 2a 70 70 56 66   this case *ppVf
14020 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  s is set to poin
14030 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46 53 20  t to.** the VFS 
14040 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75  that should be u
14050 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  sed to open the 
14060 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
14070 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20 74 6f  pzFile is set to
14080 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  .** point to a b
14090 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
140a0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
140b0 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 20 49   file to open. I
140c0 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
140d0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
140e0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
140f0 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73 71 6c  ntually call sql
14100 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f 20 72  ite3_free() to r
14110 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20 62  elease.** this b
14120 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uffer..**.** If 
14130 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
14140 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74 65 20   then an SQLite 
14150 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
14160 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a 45 72  turned and *pzEr
14170 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65 20 73  rMsg.** may be s
14180 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
14190 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
141a0 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61  ng an English la
141b0 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a 2a 2a  nguage error .**
141c0 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20   message. It is 
141d0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
141e0 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
141f0 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72   to eventually r
14200 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20 62  elease.** this b
14210 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69 6e 67  uffer by calling
14220 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
14230 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
14240 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e 73 74  arseUri(.  const
14250 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 56   char *zDefaultV
14260 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 46  fs,        /* VF
14270 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f 20 22  S to use if no "
14280 76 66 73 3d 78 78 78 22 20 71 75 65 72 79 20 6f  vfs=xxx" query o
14290 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ption */.  const
142a0 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20 20 20   char *zUri,    
142b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
142c0 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 52 49  l-terminated URI
142d0 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20 20 75   to parse */.  u
142e0 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70 46 6c  nsigned int *pFl
142f0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ags,           /
14300 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49 54 45  * IN/OUT: SQLITE
14310 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20  _OPEN_XXX flags 
14320 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
14330 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20 20 20   **ppVfs,       
14340 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 46 53       /* OUT: VFS
14350 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20 63 68   to use */ .  ch
14360 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20 20 20  ar **pzFile,    
14370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14380 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65 20 63   OUT: Filename c
14390 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52 49 20  omponent of URI 
143a0 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
143b0 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20 20  rMsg            
143c0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72       /* OUT: Err
143d0 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66 20 72  or message (if r
143e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f  c!=SQLITE_OK) */
143f0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
14400 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69  QLITE_OK;.  unsi
14410 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 20 3d  gned int flags =
14420 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f 6e 73   *pFlags;.  cons
14430 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 7a  t char *zVfs = z
14440 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20 63 68  DefaultVfs;.  ch
14450 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61  ar *zFile;.  cha
14460 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72 69 20  r c;.  int nUri 
14470 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
14480 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73 73 65  0(zUri);..  asse
14490 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30  rt( *pzErrMsg==0
144a0 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66 6c 61   );..  if( ((fla
144b0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
144c0 5f 55 52 49 29 20 20 20 20 20 20 20 20 20 20 20  _URI)           
144d0 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 38 37 32    /* IMP: R-4872
144e0 35 2d 33 32 32 30 36 20 2a 2f 0a 20 20 20 20 20  5-32206 */.     
144f0 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
14500 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f  3GlobalConfig.bO
14510 70 65 6e 55 72 69 29 20 2f 2a 20 49 4d 50 3a 20  penUri) /* IMP: 
14520 52 2d 35 31 36 38 39 2d 34 36 35 34 38 20 2a 2f  R-51689-46548 */
14530 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d 35 20 26  .   && nUri>=5 &
14540 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c 20 22  & memcmp(zUri, "
14550 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20 2f 2a  file:", 5)==0 /*
14560 20 49 4d 50 3a 20 52 2d 35 37 38 38 34 2d 33 37   IMP: R-57884-37
14570 34 39 36 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20  496 */.  ){.    
14580 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20  char *zOpt;.    
14590 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20 20  int eState;     
145a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
145b0 20 50 61 72 73 65 72 20 73 74 61 74 65 20 77 68   Parser state wh
145c0 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49 20 2a  en parsing URI *
145d0 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b 20 20  /.    int iIn;  
145e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145f0 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68 61      /* Input cha
14600 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a  racter index */.
14610 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30      int iOut = 0
14620 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14630 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68 61 72    /* Output char
14640 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20  acter index */. 
14650 20 20 20 75 36 34 20 6e 42 79 74 65 20 3d 20 6e     u64 nByte = n
14660 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20 20 20  Uri+2;          
14670 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
14680 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ce to allocate *
14690 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  /..    /* Make s
146a0 75 72 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4f  ure the SQLITE_O
146b0 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69 73 20  PEN_URI flag is 
146c0 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20  set to indicate 
146d0 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70 65 6e  to the VFS xOpen
146e0 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20   .    ** method 
146f0 74 68 61 74 20 74 68 65 72 65 20 6d 61 79 20 62  that there may b
14700 65 20 65 78 74 72 61 20 70 61 72 61 6d 65 74 65  e extra paramete
14710 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  rs following the
14720 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a   file-name.  */.
14730 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
14740 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20  ITE_OPEN_URI;.. 
14750 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20 69 49     for(iIn=0; iI
14760 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29 20 6e  n<nUri; iIn++) n
14770 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b 69 49  Byte += (zUri[iI
14780 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20 7a 46  n]=='&');.    zF
14790 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ile = sqlite3_ma
147a0 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20  lloc64(nByte);. 
147b0 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20     if( !zFile ) 
147c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
147d0 4d 45 4d 3b 0a 0a 20 20 20 20 69 49 6e 20 3d 20  MEM;..    iIn = 
147e0 35 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  5;.#ifdef SQLITE
147f0 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54 48 4f  _ALLOW_URI_AUTHO
14800 52 49 54 59 0a 20 20 20 20 69 66 28 20 73 74 72  RITY.    if( str
14810 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20 22 2f 2f  ncmp(zUri+5, "//
14820 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20  /", 3)==0 ){.   
14830 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20     iIn = 7;.    
14840 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
14850 6e 67 20 63 6f 6e 64 69 74 69 6f 6e 20 63 61 75  ng condition cau
14860 73 65 73 20 55 52 49 73 20 77 69 74 68 20 66 69  ses URIs with fi
14870 76 65 20 6c 65 61 64 69 6e 67 20 2f 20 63 68 61  ve leading / cha
14880 72 61 63 74 65 72 73 0a 20 20 20 20 20 20 2a 2a  racters.      **
14890 20 6c 69 6b 65 20 66 69 6c 65 3a 2f 2f 2f 2f 2f   like file://///
148a0 68 6f 73 74 2f 70 61 74 68 20 74 6f 20 62 65 20  host/path to be 
148b0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 55  converted into U
148c0 4e 43 73 20 6c 69 6b 65 20 2f 2f 68 6f 73 74 2f  NCs like //host/
148d0 70 61 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 54  path..      ** T
148e0 68 65 20 63 6f 72 72 65 63 74 20 55 52 49 20 66  he correct URI f
148f0 6f 72 20 74 68 61 74 20 55 4e 43 20 68 61 73 20  or that UNC has 
14900 6f 6e 6c 79 20 74 77 6f 20 6f 72 20 66 6f 75 72  only two or four
14910 20 6c 65 61 64 69 6e 67 20 2f 20 63 68 61 72 61   leading / chara
14920 63 74 65 72 73 0a 20 20 20 20 20 20 2a 2a 20 66  cters.      ** f
14930 69 6c 65 3a 2f 2f 68 6f 73 74 2f 70 61 74 68 20  ile://host/path 
14940 6f 72 20 66 69 6c 65 3a 2f 2f 2f 2f 68 6f 73 74  or file:////host
14950 2f 70 61 74 68 2e 20 20 42 75 74 20 35 20 6c 65  /path.  But 5 le
14960 61 64 69 6e 67 20 73 6c 61 73 68 65 73 20 69 73  ading slashes is
14970 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d   a .      ** com
14980 6d 6f 6e 20 65 72 72 6f 72 2c 20 77 65 20 61 72  mon error, we ar
14990 65 20 74 6f 6c 64 2c 20 73 6f 20 77 65 20 68 61  e told, so we ha
149a0 6e 64 6c 65 20 69 74 20 61 73 20 61 20 73 70 65  ndle it as a spe
149b0 63 69 61 6c 20 63 61 73 65 2e 20 2a 2f 0a 20 20  cial case. */.  
149c0 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
149d0 7a 55 72 69 2b 37 2c 20 22 2f 2f 2f 22 2c 20 33  zUri+7, "///", 3
149e0 29 3d 3d 30 20 29 7b 20 69 49 6e 2b 2b 3b 20 7d  )==0 ){ iIn++; }
149f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
14a00 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20 22  trncmp(zUri+5, "
14a10 2f 2f 6c 6f 63 61 6c 68 6f 73 74 2f 22 2c 20 31  //localhost/", 1
14a20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  2)==0 ){.      i
14a30 49 6e 20 3d 20 31 36 3b 0a 20 20 20 20 7d 0a 23  In = 16;.    }.#
14a40 65 6c 73 65 0a 20 20 20 20 2f 2a 20 44 69 73 63  else.    /* Disc
14a50 61 72 64 20 74 68 65 20 73 63 68 65 6d 65 20 61  ard the scheme a
14a60 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73 65 67  nd authority seg
14a70 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52 49  ments of the URI
14a80 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55 72  . */.    if( zUr
14a90 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55 72  i[5]=='/' && zUr
14aa0 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i[6]=='/' ){.   
14ab0 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20     iIn = 7;.    
14ac0 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49    while( zUri[iI
14ad0 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21  n] && zUri[iIn]!
14ae0 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20  ='/' ) iIn++;.  
14af0 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20 26      if( iIn!=7 &
14b00 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d 65  & (iIn!=16 || me
14b10 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74 22  mcmp("localhost"
14b20 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29 20  , &zUri[7], 9)) 
14b30 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  ){.        *pzEr
14b40 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
14b50 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64 20  printf("invalid 
14b60 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20 25  uri authority: %
14b70 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20  .*s", .         
14b80 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69 5b     iIn-7, &zUri[
14b90 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  7]);.        rc 
14ba0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
14bb0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72          goto par
14bc0 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20  se_uri_out;.    
14bd0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
14be0 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68  ..    /* Copy th
14bf0 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 61  e filename and a
14c00 6e 79 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ny query paramet
14c10 65 72 73 20 69 6e 74 6f 20 74 68 65 20 7a 46 69  ers into the zFi
14c20 6c 65 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20  le buffer. .    
14c30 2a 2a 20 44 65 63 6f 64 65 20 25 48 48 20 65 73  ** Decode %HH es
14c40 63 61 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e 67  cape codes along
14c50 20 74 68 65 20 77 61 79 2e 20 0a 20 20 20 20 2a   the way. .    *
14c60 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 69 6e 20  *.    ** Within 
14c70 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69 61  this loop, varia
14c80 62 6c 65 20 65 53 74 61 74 65 20 6d 61 79 20 62  ble eState may b
14c90 65 20 73 65 74 20 74 6f 20 30 2c 20 31 20 6f 72  e set to 0, 1 or
14ca0 20 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20   2, depending.  
14cb0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72 73    ** on the pars
14cc0 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41 73 20  ing context. As 
14cd0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a  follows:.    **.
14ce0 20 20 20 20 2a 2a 20 20 20 30 3a 20 50 61 72 73      **   0: Pars
14cf0 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a 20  ing file-name.. 
14d00 20 20 20 2a 2a 20 20 20 31 3a 20 50 61 72 73 69     **   1: Parsi
14d10 6e 67 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e 20  ng name section 
14d20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20  of a name=value 
14d30 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
14d40 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20 50 61 72  .    **   2: Par
14d50 73 69 6e 67 20 76 61 6c 75 65 20 73 65 63 74 69  sing value secti
14d60 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c  on of a name=val
14d70 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ue query paramet
14d80 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65  er..    */.    e
14d90 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 77  State = 0;.    w
14da0 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b  hile( (c = zUri[
14db0 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  iIn])!=0 && c!='
14dc0 23 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 2b  #' ){.      iIn+
14dd0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  +;.      if( c==
14de0 27 25 27 20 0a 20 20 20 20 20 20 20 26 26 20 73  '%' .       && s
14df0 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a  qlite3Isxdigit(z
14e00 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20 20  Uri[iIn]) .     
14e10 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64    && sqlite3Isxd
14e20 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31 5d  igit(zUri[iIn+1]
14e30 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
14e40 20 20 20 20 69 6e 74 20 6f 63 74 65 74 20 3d 20      int octet = 
14e50 28 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74  (sqlite3HexToInt
14e60 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c 3c  (zUri[iIn++]) <<
14e70 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6f 63 74   4);.        oct
14e80 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 48 65 78  et += sqlite3Hex
14e90 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b  ToInt(zUri[iIn++
14ea0 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73  ]);..        ass
14eb0 65 72 74 28 20 6f 63 74 65 74 3e 3d 30 20 26 26  ert( octet>=0 &&
14ec0 20 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a 20 20   octet<256 );.  
14ed0 20 20 20 20 20 20 69 66 28 20 6f 63 74 65 74 3d        if( octet=
14ee0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
14ef0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
14f00 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 22 25 30  s taken when "%0
14f10 30 22 20 61 70 70 65 61 72 73 20 77 69 74 68 69  0" appears withi
14f20 6e 20 74 68 65 20 55 52 49 2e 20 49 6e 20 74 68  n the URI. In th
14f30 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
14f40 63 61 73 65 20 77 65 20 69 67 6e 6f 72 65 20 61  case we ignore a
14f50 6c 6c 20 74 65 78 74 20 69 6e 20 74 68 65 20 72  ll text in the r
14f60 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
14f70 70 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a 20 20  path, name or.  
14f80 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
14f90 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
14fa0 20 70 61 72 73 65 64 2e 20 53 6f 20 69 67 6e 6f   parsed. So igno
14fb0 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
14fc0 68 61 72 61 63 74 65 72 0a 20 20 20 20 20 20 20  haracter.       
14fd0 20 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70 20 74     ** and skip t
14fe0 6f 20 74 68 65 20 6e 65 78 74 20 22 3f 22 2c 20  o the next "?", 
14ff0 22 3d 22 20 6f 72 20 22 26 22 2c 20 61 73 20 61  "=" or "&", as a
15000 70 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f 0a 20  ppropriate. */. 
15010 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
15020 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21  (c = zUri[iIn])!
15030 3d 30 20 26 26 20 63 21 3d 27 23 27 20 0a 20 20  =0 && c!='#' .  
15040 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
15050 65 53 74 61 74 65 21 3d 30 20 7c 7c 20 63 21 3d  eState!=0 || c!=
15060 27 3f 27 29 0a 20 20 20 20 20 20 20 20 20 20 20  '?').           
15070 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 31     && (eState!=1
15080 20 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26 20 63   || (c!='=' && c
15090 21 3d 27 26 27 29 29 0a 20 20 20 20 20 20 20 20  !='&')).        
150a0 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65        && (eState
150b0 21 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29 0a 20  !=2 || c!='&'). 
150c0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
150d0 20 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20          iIn++;. 
150e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
150f0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
15100 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15110 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20 20 20   c = octet;.    
15120 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61    }else if( eSta
15130 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27 26 27  te==1 && (c=='&'
15140 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b 0a 20   || c=='=') ){. 
15150 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
15160 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20  [iOut-1]==0 ){. 
15170 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
15180 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61 6d 65  mpty option name
15190 2e 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6f 70  . Ignore this op
151a0 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65 72 2e  tion altogether.
151b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68   */.          wh
151c0 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26  ile( zUri[iIn] &
151d0 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 23 27  & zUri[iIn]!='#'
151e0 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31 5d 21   && zUri[iIn-1]!
151f0 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20  ='&' ) iIn++;.  
15200 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
15210 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15220 20 20 20 20 69 66 28 20 63 3d 3d 27 26 27 20 29      if( c=='&' )
15230 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c  {.          zFil
15240 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
15250 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
15260 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74  .          eStat
15270 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d  e = 2;.        }
15280 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a  .        c = 0;.
15290 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
152a0 28 65 53 74 61 74 65 3d 3d 30 20 26 26 20 63 3d  (eState==0 && c=
152b0 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74 61 74 65  ='?') || (eState
152c0 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27 29 20 29  ==2 && c=='&') )
152d0 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b  {.        c = 0;
152e0 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 20  .        eState 
152f0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
15300 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d     zFile[iOut++]
15310 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = c;.    }.    
15320 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 29 20  if( eState==1 ) 
15330 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
15340 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
15350 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  iOut++] = '\0';.
15360 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
15370 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 2f  ] = '\0';..    /
15380 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 72 65  * Check if there
15390 20 77 65 72 65 20 61 6e 79 20 6f 70 74 69 6f 6e   were any option
153a0 73 20 73 70 65 63 69 66 69 65 64 20 74 68 61 74  s specified that
153b0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 74 65 72   should be inter
153c0 70 72 65 74 65 64 20 0a 20 20 20 20 2a 2a 20 68  preted .    ** h
153d0 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74 68 61  ere. Options tha
153e0 74 20 61 72 65 20 69 6e 74 65 72 70 72 65 74 65  t are interprete
153f0 64 20 68 65 72 65 20 69 6e 63 6c 75 64 65 20 22  d here include "
15400 76 66 73 22 20 61 6e 64 20 74 68 6f 73 65 20 74  vfs" and those t
15410 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65  hat.    ** corre
15420 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73 20 74  spond to flags t
15430 68 61 74 20 6d 61 79 20 62 65 20 70 61 73 73 65  hat may be passe
15440 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  d to the sqlite3
15450 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20 20 2a  _open_v2().    *
15460 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20 20 20  * method. */.   
15470 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65 5b 73   zOpt = &zFile[s
15480 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
15490 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68  File)+1];.    wh
154a0 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a  ile( zOpt[0] ){.
154b0 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 20 3d        int nOpt =
154c0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
154d0 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 63 68  (zOpt);.      ch
154e0 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70 74  ar *zVal = &zOpt
154f0 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20 20 20  [nOpt+1];.      
15500 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74  int nVal = sqlit
15510 65 33 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c 29  e3Strlen30(zVal)
15520 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 70  ;..      if( nOp
15530 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==3 && memcmp("
15540 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d  vfs", zOpt, 3)==
15550 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 56 66  0 ){.        zVf
15560 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20  s = zVal;.      
15570 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
15580 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 7b  truct OpenMode {
15590 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
155a0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
155b0 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20      int mode;.  
155c0 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65 20 3d        } *aMode =
155d0 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72   0;.        char
155e0 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20 30 3b   *zModeType = 0;
155f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61 73  .        int mas
15600 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  k = 0;.        i
15610 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20  nt limit = 0;.. 
15620 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d         if( nOpt=
15630 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 63 61  =5 && memcmp("ca
15640 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d  che", zOpt, 5)==
15650 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
15660 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65  tatic struct Ope
15670 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f 64 65  nMode aCacheMode
15680 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
15690 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c 20 20     { "shared",  
156a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
156b0 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20  EDCACHE },.     
156c0 20 20 20 20 20 20 20 7b 20 22 70 72 69 76 61 74         { "privat
156d0 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  e", SQLITE_OPEN_
156e0 50 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a  PRIVATECACHE },.
156f0 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c              { 0,
15700 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d   0 }.          }
15710 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73  ;..          mas
15720 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  k = SQLITE_OPEN_
15730 53 48 41 52 45 44 43 41 43 48 45 7c 53 51 4c 49  SHAREDCACHE|SQLI
15740 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
15750 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20 20 20  ACHE;.          
15760 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65 4d 6f  aMode = aCacheMo
15770 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69  de;.          li
15780 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  mit = mask;.    
15790 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20        zModeType 
157a0 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20 20 20  = "cache";.     
157b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
157c0 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d 63   nOpt==4 && memc
157d0 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c  mp("mode", zOpt,
157e0 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)==0 ){.      
157f0 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63      static struc
15800 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65 6e  t OpenMode aOpen
15810 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Mode[] = {.     
15820 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c 20 20         { "ro",  
15830 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
15840 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20 20  ONLY },.        
15850 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53 51 4c      { "rw",  SQL
15860 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
15870 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 20  TE }, .         
15880 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51 4c 49     { "rwc", SQLI
15890 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
158a0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
158b0 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20  CREATE },.      
158c0 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72 79 22        { "memory"
158d0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45  , SQLITE_OPEN_ME
158e0 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20 20 20  MORY },.        
158f0 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20      { 0, 0 }.   
15900 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20         };..     
15910 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49       mask = SQLI
15920 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
15930 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   | SQLITE_OPEN_R
15940 45 41 44 57 52 49 54 45 0a 20 20 20 20 20 20 20  EADWRITE.       
15950 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
15960 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
15970 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   | SQLITE_OPEN_M
15980 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20 20 20  EMORY;.         
15990 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d 6f   aMode = aOpenMo
159a0 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69  de;.          li
159b0 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c 61  mit = mask & fla
159c0 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d  gs;.          zM
159d0 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63 65 73  odeType = "acces
159e0 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  s";.        }.. 
159f0 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f 64 65         if( aMode
15a00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
15a10 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69  t i;.          i
15a20 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  nt mode = 0;.   
15a30 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
15a40 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29  aMode[i].z; i++)
15a50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
15a60 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 4d  nst char *z = aM
15a70 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20 20  ode[i].z;.      
15a80 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d 3d        if( nVal==
15a90 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
15aa0 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  z) && 0==memcmp(
15ab0 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20 29  zVal, z, nVal) )
15ac0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
15ad0 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e  mode = aMode[i].
15ae0 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  mode;.          
15af0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15b00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15b10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
15b20 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  f( mode==0 ){.  
15b30 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72            *pzErr
15b40 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
15b50 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 25  rintf("no such %
15b60 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d 6f  s mode: %s", zMo
15b70 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20  deType, zVal);. 
15b80 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
15b90 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
15ba0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
15bb0 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20  arse_uri_out;.  
15bc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15bd0 20 20 20 20 69 66 28 20 28 6d 6f 64 65 20 26 20      if( (mode & 
15be0 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d  ~SQLITE_OPEN_MEM
15bf0 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a 20 20  ORY)>limit ){.  
15c00 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72            *pzErr
15c10 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
15c20 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65 20 6e  rintf("%s mode n
15c30 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22 2c  ot allowed: %s",
15c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c60 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79           zModeTy
15c70 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20  pe, zVal);.     
15c80 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
15c90 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 20  TE_PERM;.       
15ca0 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f       goto parse_
15cb0 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  uri_out;.       
15cc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
15cd0 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26 20  lags = (flags & 
15ce0 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20  ~mask) | mode;. 
15cf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15d00 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d 20 26  ..      zOpt = &
15d10 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20  zVal[nVal+1];.  
15d20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    }..  }else{.  
15d30 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65    zFile = sqlite
15d40 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 55 72 69 2b  3_malloc64(nUri+
15d50 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69  2);.    if( !zFi
15d60 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
15d70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65  TE_NOMEM;.    me
15d80 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69  mcpy(zFile, zUri
15d90 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 7a 46 69  , nUri);.    zFi
15da0 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b  le[nUri] = '\0';
15db0 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b  .    zFile[nUri+
15dc0 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66  1] = '\0';.    f
15dd0 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
15de0 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20  OPEN_URI;.  }.. 
15df0 20 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74 65   *ppVfs = sqlite
15e00 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29  3_vfs_find(zVfs)
15e10 3b 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d 3d  ;.  if( *ppVfs==
15e20 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d  0 ){.    *pzErrM
15e30 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
15e40 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76 66  intf("no such vf
15e50 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20  s: %s", zVfs);. 
15e60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
15e70 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65  RROR;.  }. parse
15e80 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20  _uri_out:.  if( 
15e90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15ea0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
15eb0 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46  e(zFile);.    zF
15ec0 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a  ile = 0;.  }.  *
15ed0 70 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  pFlags = flags;.
15ee0 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c    *pzFile = zFil
15ef0 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
15f00 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
15f10 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
15f20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20  work of opening 
15f30 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65  a database on be
15f40 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  half of.** sqlit
15f50 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71  e3_open() and sq
15f60 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20  lite3_open16(). 
15f70 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
15f80 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65  ename "zFilename
15f90 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20  "  .** is UTF-8 
15fa0 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74  encoded..*/.stat
15fb0 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62  ic int openDatab
15fc0 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ase(.  const cha
15fd0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a  r *zFilename, /*
15fe0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
15ff0 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  me UTF-8 encoded
16000 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a   */.  sqlite3 **
16010 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20  ppDb,        /* 
16020 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61  OUT: Returned da
16030 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
16040 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
16050 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65  flags,    /* Ope
16060 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a  rational flags *
16070 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
16080 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61  zVfs       /* Na
16090 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f  me of the VFS to
160a0 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c   use */.){.  sql
160b0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
160d0 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  Store allocated 
160e0 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20  handle here */. 
160f0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16110 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
16120 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61  */.  int isThrea
16130 64 73 61 66 65 3b 20 20 20 20 20 20 20 20 20 20  dsafe;          
16140 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
16150 20 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e   threadsafe conn
16160 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61  ections */.  cha
16170 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20  r *zOpen = 0;   
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16190 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
161a0 74 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72  t to pass to Btr
161b0 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68  eeOpen() */.  ch
161c0 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
161e0 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   Error message f
161f0 72 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65  rom sqlite3Parse
16200 55 72 69 28 29 20 2a 2f 0a 0a 23 69 66 64 65 66  Uri() */..#ifdef
16210 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
16220 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70  PI_ARMOR.  if( p
16230 70 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  pDb==0 ) return 
16240 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
16250 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70  PT;.#endif.  *pp
16260 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  Db = 0;.#ifndef 
16270 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
16280 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69  INIT.  rc = sqli
16290 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
162a0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
162b0 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a  urn rc;.#endif..
162c0 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20    /* Only allow 
162d0 73 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61  sensible combina
162e0 74 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e  tions of bits in
162f0 20 74 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   the flags argum
16300 65 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f  ent.  .  ** Thro
16310 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e  w an error if an
16320 79 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62  y non-sense comb
16330 69 6e 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e  ination is used.
16340 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20    If we.  ** do 
16350 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61  not block illega
16360 6c 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68  l combinations h
16370 65 72 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72  ere, it could tr
16380 69 67 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72  igger.  ** asser
16390 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69  t() statements i
163a0 6e 20 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e  n deeper layers.
163b0 20 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69    Sensible combi
163c0 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65  nations.  ** are
163d0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20  :.  **.  **  1: 
163e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
163f0 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20  DONLY.  **  2:  
16400 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16410 57 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20  WRITE.  **  6:  
16420 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16430 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
16440 50 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a  PEN_CREATE.  */.
16450 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
16460 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20  _OPEN_READONLY  
16470 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73  == 0x01 );.  ass
16480 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
16490 5f 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78  _READWRITE == 0x
164a0 30 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  02 );.  assert( 
164b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
164c0 54 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b  TE    == 0x04 );
164d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c  .  testcase( (1<
164e0 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30  <(flags&7))==0x0
164f0 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59  2 ); /* READONLY
16500 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
16510 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d  (1<<(flags&7))==
16520 30 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57  0x04 ); /* READW
16530 52 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61  RITE */.  testca
16540 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37  se( (1<<(flags&7
16550 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52  ))==0x40 ); /* R
16560 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
16570 45 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c  E */.  if( ((1<<
16580 28 66 6c 61 67 73 26 37 29 29 20 26 20 30 78 34  (flags&7)) & 0x4
16590 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  6)==0 ){.    ret
165a0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
165b0 45 5f 42 4b 50 54 3b 20 20 2f 2a 20 49 4d 50 3a  E_BKPT;  /* IMP:
165c0 20 52 2d 36 35 34 39 37 2d 34 34 35 39 34 20 2a   R-65497-44594 *
165d0 2f 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 71 6c  /.  }..  if( sql
165e0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
165f0 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29  .bCoreMutex==0 )
16600 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
16610 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  fe = 0;.  }else 
16620 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
16630 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
16640 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  ){.    isThreads
16650 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  afe = 0;.  }else
16660 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
16670 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
16680 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65  EX ){.    isThre
16690 61 64 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65  adsafe = 1;.  }e
166a0 6c 73 65 7b 0a 20 20 20 20 69 73 54 68 72 65 61  lse{.    isThrea
166b0 64 73 61 66 65 20 3d 20 73 71 6c 69 74 65 33 47  dsafe = sqlite3G
166c0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c  lobalConfig.bFul
166d0 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66  lMutex;.  }.  if
166e0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
166f0 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
16700 48 45 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20  HE ){.    flags 
16710 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
16720 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d  SHAREDCACHE;.  }
16730 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
16740 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61  GlobalConfig.sha
16750 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20  redCacheEnabled 
16760 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  ){.    flags |= 
16770 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
16780 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20  EDCACHE;.  }..  
16790 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75  /* Remove harmfu
167a0 6c 20 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20  l bits from the 
167b0 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a  flags parameter.
167c0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51    **.  ** The SQ
167d0 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
167e0 58 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45  X and SQLITE_OPE
167f0 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67  N_FULLMUTEX flag
16800 73 20 77 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c  s were.  ** deal
16810 74 20 77 69 74 68 20 69 6e 20 74 68 65 20 70 72  t with in the pr
16820 65 76 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63  evious code bloc
16830 6b 2e 20 20 42 65 73 69 64 65 73 20 74 68 65 73  k.  Besides thes
16840 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a  e, the only.  **
16850 20 76 61 6c 69 64 20 69 6e 70 75 74 20 66 6c 61   valid input fla
16860 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f  gs for sqlite3_o
16870 70 65 6e 5f 76 32 28 29 20 61 72 65 20 53 51 4c  pen_v2() are SQL
16880 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
16890 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f  Y,.  ** SQLITE_O
168a0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 2c 20 53  PEN_READWRITE, S
168b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
168c0 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  E, SQLITE_OPEN_S
168d0 48 41 52 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a  HAREDCACHE,.  **
168e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49   SQLITE_OPEN_PRI
168f0 56 41 54 45 43 41 43 48 45 2c 20 61 6e 64 20 73  VATECACHE, and s
16900 6f 6d 65 20 72 65 73 65 72 76 65 64 20 62 69 74  ome reserved bit
16910 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73  s.  Silently mas
16920 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f  k.  ** off all o
16930 74 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f  ther flags..  */
16940 0a 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20  .  flags &=  ~( 
16950 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
16960 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20  TEONCLOSE |.    
16970 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
16980 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
16990 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
169a0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
169b0 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20  IN_DB |.        
169c0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
169d0 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20  EN_TEMP_DB | .  
169e0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
169f0 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
16a00 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20  NT_DB | .       
16a10 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
16a20 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
16a30 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
16a40 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
16a50 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  EMP_JOURNAL | . 
16a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
16a70 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
16a80 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
16a90 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
16aa0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
16ab0 4c 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  L |.            
16ac0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e     SQLITE_OPEN_N
16ad0 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20  OMUTEX |.       
16ae0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
16af0 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a  PEN_FULLMUTEX |.
16b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
16b10 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
16b20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a              );..
16b30 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
16b40 65 20 73 71 6c 69 74 65 20 64 61 74 61 20 73 74  e sqlite data st
16b50 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20  ructure */.  db 
16b60 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
16b70 65 72 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69  ero( sizeof(sqli
16b80 74 65 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62  te3) );.  if( db
16b90 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64  ==0 ) goto opend
16ba0 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54  b_out;.  if( isT
16bb0 68 72 65 61 64 73 61 66 65 20 29 7b 0a 20 20 20  hreadsafe ){.   
16bc0 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c   db->mutex = sql
16bd0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
16be0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55  QLITE_MUTEX_RECU
16bf0 52 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20  RSIVE);.    if( 
16c00 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  db->mutex==0 ){.
16c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
16c20 65 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62  ee(db);.      db
16c30 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 0;.      goto
16c40 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20   opendb_out;.   
16c50 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
16c60 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
16c70 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65  >mutex);.  db->e
16c80 72 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20  rrMask = 0xff;. 
16c90 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20   db->nDb = 2;.  
16ca0 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
16cb0 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20  TE_MAGIC_BUSY;. 
16cc0 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
16cd0 44 62 53 74 61 74 69 63 3b 0a 0a 20 20 61 73 73  DbStatic;..  ass
16ce0 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e  ert( sizeof(db->
16cf0 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28  aLimit)==sizeof(
16d00 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20  aHardLimit) );. 
16d10 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d   memcpy(db->aLim
16d20 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20  it, aHardLimit, 
16d30 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69  sizeof(db->aLimi
16d40 74 29 29 3b 0a 20 20 64 62 2d 3e 61 4c 69 6d 69  t));.  db->aLimi
16d50 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57  t[SQLITE_LIMIT_W
16d60 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 20 3d  ORKER_THREADS] =
16d70 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
16d80 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3b 0a  WORKER_THREADS;.
16d90 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
16da0 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74   = 1;.  db->next
16db0 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20  Autovac = -1;.  
16dc0 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c  db->szMmap = sql
16dd0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
16de0 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e  .szMmap;.  db->n
16df0 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b  extPagesize = 0;
16e00 0a 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65  .  db->nMaxSorte
16e10 72 4d 6d 61 70 20 3d 20 30 78 37 46 46 46 46 46  rMmap = 0x7FFFFF
16e20 46 46 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  FF;.  db->flags 
16e30 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43  |= SQLITE_ShortC
16e40 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45  olNames | SQLITE
16e50 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20 7c  _EnableTrigger |
16e60 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69   SQLITE_CacheSpi
16e70 6c 6c 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ll.#if !defined(
16e80 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
16e90 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 29 20  UTOMATIC_INDEX) 
16ea0 7c 7c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  || SQLITE_DEFAUL
16eb0 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
16ec0 58 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X.              
16ed0 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f     | SQLITE_Auto
16ee0 49 6e 64 65 78 0a 23 65 6e 64 69 66 0a 23 69 66  Index.#endif.#if
16ef0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
16f00 43 4b 50 54 46 55 4c 4c 46 53 59 4e 43 0a 20 20  CKPTFULLFSYNC.  
16f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16f20 20 53 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c   SQLITE_CkptFull
16f30 46 53 79 6e 63 0a 23 65 6e 64 69 66 0a 23 69 66  FSync.#endif.#if
16f40 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
16f50 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20  FILE_FORMAT<4.  
16f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16f70 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69   SQLITE_LegacyFi
16f80 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66  leFmt.#endif.#if
16f90 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
16fa0 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
16fb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16fc0 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45    | SQLITE_LoadE
16fd0 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a  xtension.#endif.
16fe0 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
16ff0 4c 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49  LT_RECURSIVE_TRI
17000 47 47 45 52 53 0a 20 20 20 20 20 20 20 20 20 20  GGERS.          
17010 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
17020 52 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64  RecTriggers.#end
17030 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
17040 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f  QLITE_DEFAULT_FO
17050 52 45 49 47 4e 5f 4b 45 59 53 29 20 26 26 20 53  REIGN_KEYS) && S
17060 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f  QLITE_DEFAULT_FO
17070 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20  REIGN_KEYS.     
17080 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
17090 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73  LITE_ForeignKeys
170a0 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
170b0 6e 65 64 28 53 51 4c 49 54 45 5f 52 45 56 45 52  ned(SQLITE_REVER
170c0 53 45 5f 55 4e 4f 52 44 45 52 45 44 5f 53 45 4c  SE_UNORDERED_SEL
170d0 45 43 54 53 29 0a 20 20 20 20 20 20 20 20 20 20  ECTS).          
170e0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
170f0 52 65 76 65 72 73 65 4f 72 64 65 72 0a 23 65 6e  ReverseOrder.#en
17100 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
17110 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
17120 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
17130 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K).             
17140 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 65 6c      | SQLITE_Cel
17150 6c 53 69 7a 65 43 6b 0a 23 65 6e 64 69 66 0a 20  lSizeCk.#endif. 
17160 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74 65 33       ;.  sqlite3
17170 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 43  HashInit(&db->aC
17180 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66  ollSeq);.#ifndef
17190 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
171a0 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69  TUALTABLE.  sqli
171b0 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d  te3HashInit(&db-
171c0 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69  >aModule);.#endi
171d0 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  f..  /* Add the 
171e0 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f  default collatio
171f0 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52  n sequence BINAR
17200 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20  Y. BINARY works 
17210 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20  for both UTF-8. 
17220 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20   ** and UTF-16, 
17230 73 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e  so add a version
17240 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f   for each to avo
17250 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61  id any unnecessa
17260 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69  ry.  ** conversi
17270 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72  ons. The only er
17280 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63  ror that can occ
17290 75 72 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c  ur here is a mal
172a0 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20  loc() failure.. 
172b0 20 2a 2a 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43   **.  ** EVIDENC
172c0 45 2d 4f 46 3a 20 52 2d 35 32 37 38 36 2d 34 34  E-OF: R-52786-44
172d0 38 37 38 20 53 51 4c 69 74 65 20 64 65 66 69 6e  878 SQLite defin
172e0 65 73 20 74 68 72 65 65 20 62 75 69 6c 74 2d 69  es three built-i
172f0 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 2a 2a  n collating.  **
17300 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 20 20 2a 2f   functions:.  */
17310 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
17320 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74  on(db, sqlite3St
17330 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f  rBINARY, SQLITE_
17340 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  UTF8, 0, binColl
17350 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
17360 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
17370 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
17380 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  , SQLITE_UTF16BE
17390 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  , 0, binCollFunc
173a0 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
173b0 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69  llation(db, sqli
173c0 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51  te3StrBINARY, SQ
173d0 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c  LITE_UTF16LE, 0,
173e0 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
173f0 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
17400 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22  ion(db, "NOCASE"
17410 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
17420 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e  , nocaseCollatin
17430 67 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  gFunc, 0);.  cre
17440 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
17450 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49 54 45   "RTRIM", SQLITE
17460 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 31 2c  _UTF8, (void*)1,
17470 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
17480 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
17490 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
174a0 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
174b0 0a 20 20 7d 0a 20 20 2f 2a 20 45 56 49 44 45 4e  .  }.  /* EVIDEN
174c0 43 45 2d 4f 46 3a 20 52 2d 30 38 33 30 38 2d 31  CE-OF: R-08308-1
174d0 37 32 32 34 20 54 68 65 20 64 65 66 61 75 6c 74  7224 The default
174e0 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
174f0 69 6f 6e 20 66 6f 72 20 61 6c 6c 0a 20 20 2a 2a  ion for all.  **
17500 20 73 74 72 69 6e 67 73 20 69 73 20 42 49 4e 41   strings is BINA
17510 52 59 2e 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e  RY. .  */.  db->
17520 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69  pDfltColl = sqli
17530 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
17540 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  b, SQLITE_UTF8, 
17550 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
17560 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
17570 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30  db->pDfltColl!=0
17580 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20   );..  /* Parse 
17590 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49  the filename/URI
175a0 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20   argument. */.  
175b0 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  db->openFlags = 
175c0 66 6c 61 67 73 3b 0a 20 20 72 63 20 3d 20 73 71  flags;.  rc = sq
175d0 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 7a 56  lite3ParseUri(zV
175e0 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  fs, zFilename, &
175f0 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70 56 66 73  flags, &db->pVfs
17600 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d  , &zOpen, &zErrM
17610 73 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  sg);.  if( rc!=S
17620 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17630 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
17640 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f  OMEM ) db->mallo
17650 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
17660 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
17670 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 7a 45 72  hMsg(db, rc, zEr
17680 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c  rMsg ? "%s" : 0,
17690 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73   zErrMsg);.    s
176a0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
176b0 4d 73 67 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f  Msg);.    goto o
176c0 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  pendb_out;.  }..
176d0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61    /* Open the ba
176e0 63 6b 65 6e 64 20 64 61 74 61 62 61 73 65 20 64  ckend database d
176f0 72 69 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20  river */.  rc = 
17700 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
17710 28 64 62 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e  (db->pVfs, zOpen
17720 2c 20 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30  , db, &db->aDb[0
17730 5d 2e 70 42 74 2c 20 30 2c 0a 20 20 20 20 20 20  ].pBt, 0,.      
17740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17750 20 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45    flags | SQLITE
17760 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a  _OPEN_MAIN_DB);.
17770 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17780 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
17790 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
177a0 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72  NOMEM ){.      r
177b0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
177c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
177d0 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29  te3Error(db, rc)
177e0 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  ;.    goto opend
177f0 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  b_out;.  }.  sql
17800 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 64  ite3BtreeEnter(d
17810 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
17820 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63    db->aDb[0].pSc
17830 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63  hema = sqlite3Sc
17840 68 65 6d 61 47 65 74 28 64 62 2c 20 64 62 2d 3e  hemaGet(db, db->
17850 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69  aDb[0].pBt);.  i
17860 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
17870 69 6c 65 64 20 29 20 45 4e 43 28 64 62 29 20 3d  iled ) ENC(db) =
17880 20 53 43 48 45 4d 41 5f 45 4e 43 28 64 62 29 3b   SCHEMA_ENC(db);
17890 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
178a0 65 61 76 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  eave(db->aDb[0].
178b0 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  pBt);.  db->aDb[
178c0 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c  1].pSchema = sql
178d0 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62  ite3SchemaGet(db
178e0 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  , 0);..  /* The 
178f0 64 65 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c  default safety_l
17900 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69  evel for the mai
17910 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 27 66  n database is 'f
17920 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20 74 65  ull'; for the te
17930 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  mp.  ** database
17940 20 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54   it is 'NONE'. T
17950 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20  his matches the 
17960 70 61 67 65 72 20 6c 61 79 65 72 20 64 65 66 61  pager layer defa
17970 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64  ults.  .  */.  d
17980 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20  b->aDb[0].zName 
17990 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e  = "main";.  db->
179a0 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65  aDb[0].safety_le
179b0 76 65 6c 20 3d 20 33 3b 0a 20 20 64 62 2d 3e 61  vel = 3;.  db->a
179c0 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74  Db[1].zName = "t
179d0 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  emp";.  db->aDb[
179e0 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  1].safety_level 
179f0 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69  = 1;..  db->magi
17a00 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
17a10 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d  _OPEN;.  if( db-
17a20 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
17a30 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
17a40 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
17a50 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62 75 69  Register all bui
17a60 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c  lt-in functions,
17a70 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74 74 65   but do not atte
17a80 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68 65 0a  mpt to read the.
17a90 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63    ** database sc
17aa0 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73 20 69  hema yet. This i
17ab0 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20  s delayed until 
17ac0 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  the first time t
17ad0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
17ae0 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a 20 20   is accessed..  
17af0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  */.  sqlite3Erro
17b00 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  r(db, SQLITE_OK)
17b10 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69 73  ;.  sqlite3Regis
17b20 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  terBuiltinFuncti
17b30 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c  ons(db);..  /* L
17b40 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78  oad automatic ex
17b50 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e  tensions - exten
17b60 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20  sions that have 
17b70 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a  been registered.
17b80 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73    ** using the s
17b90 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63  qlite3_automatic
17ba0 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49  _extension() API
17bb0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
17bc0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
17bd0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
17be0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
17bf0 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74  lite3AutoLoadExt
17c00 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20  ensions(db);.   
17c10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
17c20 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 69  rcode(db);.    i
17c30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17c40 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f   ){.      goto o
17c50 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d  pendb_out;.    }
17c60 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
17c70 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a  ITE_ENABLE_FTS1.
17c80 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
17c90 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65  cFailed ){.    e
17ca0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
17cb0 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65  3Fts1Init(sqlite
17cc0 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  3*);.    rc = sq
17cd0 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62  lite3Fts1Init(db
17ce0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
17cf0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
17d00 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21  BLE_FTS2.  if( !
17d10 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
17d20 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
17d30 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  K ){.    extern 
17d40 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49  int sqlite3Fts2I
17d50 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20  nit(sqlite3*);. 
17d60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
17d70 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts2Init(db);.  }
17d80 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
17d90 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
17da0 53 33 20 2f 2a 20 61 75 74 6f 6d 61 74 69 63 61  S3 /* automatica
17db0 6c 6c 79 20 64 65 66 69 6e 65 64 20 62 79 20 53  lly defined by S
17dc0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
17dd0 34 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e  4 */.  if( !db->
17de0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
17df0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17e00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17e10 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20  3Fts3Init(db);. 
17e20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
17e30 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17e40 46 54 53 35 0a 20 20 69 66 28 20 21 64 62 2d 3e  FTS5.  if( !db->
17e50 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
17e60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17e70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17e80 33 46 74 73 35 49 6e 69 74 28 64 62 29 3b 0a 20  3Fts5Init(db);. 
17e90 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
17ea0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17eb0 49 43 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  ICU.  if( !db->m
17ec0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
17ed0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17ee0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17ef0 49 63 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  IcuInit(db);.  }
17f00 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
17f10 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54  SQLITE_ENABLE_RT
17f20 52 45 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  REE.  if( !db->m
17f30 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
17f40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20  c==SQLITE_OK){. 
17f50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52     rc = sqlite3R
17f60 74 72 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20  treeInit(db);.  
17f70 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
17f80 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
17f90 42 53 54 41 54 5f 56 54 41 42 0a 20 20 69 66 28  BSTAT_VTAB.  if(
17fa0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
17fb0 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
17fc0 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  _OK){.    rc = s
17fd0 71 6c 69 74 65 33 44 62 73 74 61 74 52 65 67 69  qlite3DbstatRegi
17fe0 73 74 65 72 28 64 62 29 3b 0a 20 20 7d 0a 23 65  ster(db);.  }.#e
17ff0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
18000 49 54 45 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 31  ITE_ENABLE_JSON1
18010 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
18020 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
18030 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20  SQLITE_OK){.    
18040 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 73 6f 6e  rc = sqlite3Json
18050 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  1Init(db);.  }.#
18060 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53 51  endif..  /* -DSQ
18070 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
18080 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65  KING_MODE=1 make
18090 73 20 45 58 43 4c 55 53 49 56 45 20 74 68 65 20  s EXCLUSIVE the 
180a0 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a  default locking.
180b0 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51    ** mode.  -DSQ
180c0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
180d0 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65  KING_MODE=0 make
180e0 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61   NORMAL the defa
180f0 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a  ult locking.  **
18100 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f   mode.  Doing no
18110 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73  thing at all als
18120 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74  o makes NORMAL t
18130 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f  he default..  */
18140 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
18150 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
18160 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f  ODE.  db->dfltLo
18170 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  ckMode = SQLITE_
18180 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
18190 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50  MODE;.  sqlite3P
181a0 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  agerLockingMode(
181b0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
181c0 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  r(db->aDb[0].pBt
181d0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
181e0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
181f0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
18200 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69  ING_MODE);.#endi
18210 66 0a 0a 20 20 69 66 28 20 72 63 20 29 20 73 71  f..  if( rc ) sq
18220 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
18230 63 29 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65  c);..  /* Enable
18240 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d   the lookaside-m
18250 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20  alloc subsystem 
18260 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73  */.  setupLookas
18270 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69 74  ide(db, 0, sqlit
18280 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
18290 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20  zLookaside,.    
182a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182b0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
182c0 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69  lConfig.nLookasi
182d0 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  de);..  sqlite3_
182e0 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
182f0 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 45  nt(db, SQLITE_DE
18300 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48  FAULT_WAL_AUTOCH
18310 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e  ECKPOINT);..open
18320 64 62 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64 62  db_out:.  if( db
18330 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
18340 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20  db->mutex!=0 || 
18350 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30 0a  isThreadsafe==0.
18360 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
18370 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
18380 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20  g.bFullMutex==0 
18390 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
183a0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
183b0 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20  utex);.  }.  rc 
183c0 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  = sqlite3_errcod
183d0 65 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28  e(db);.  assert(
183e0 20 64 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51   db!=0 || rc==SQ
183f0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
18400 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
18410 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69  OMEM ){.    sqli
18420 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20  te3_close(db);. 
18430 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c     db = 0;.  }el
18440 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
18450 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e  E_OK ){.    db->
18460 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
18470 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20  AGIC_SICK;.  }. 
18480 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 23 69 66   *ppDb = db;.#if
18490 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
184a0 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73  E_SQLLOG.  if( s
184b0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
184c0 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20  ig.xSqllog ){.  
184d0 20 20 2f 2a 20 4f 70 65 6e 69 6e 67 20 61 20 64    /* Opening a d
184e0 62 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68  b handle. Fourth
184f0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61   parameter is pa
18500 73 73 65 64 20 30 2e 20 2a 2f 0a 20 20 20 20 76  ssed 0. */.    v
18510 6f 69 64 20 2a 70 41 72 67 20 3d 20 73 71 6c 69  oid *pArg = sqli
18520 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
18530 70 53 71 6c 6c 6f 67 41 72 67 3b 0a 20 20 20 20  pSqllogArg;.    
18540 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
18550 66 69 67 2e 78 53 71 6c 6c 6f 67 28 70 41 72 67  fig.xSqllog(pArg
18560 2c 20 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , db, zFilename,
18570 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
18580 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
18590 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 0a 20 20  TE_HAS_CODEC).  
185a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
185b0 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  K ){.    const c
185c0 68 61 72 20 2a 7a 48 65 78 4b 65 79 20 3d 20 73  har *zHexKey = s
185d0 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
185e0 65 74 65 72 28 7a 4f 70 65 6e 2c 20 22 68 65 78  eter(zOpen, "hex
185f0 6b 65 79 22 29 3b 0a 20 20 20 20 69 66 28 20 7a  key");.    if( z
18600 48 65 78 4b 65 79 20 26 26 20 7a 48 65 78 4b 65  HexKey && zHexKe
18610 79 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 75 38  y[0] ){.      u8
18620 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 69 6e   iByte;.      in
18630 74 20 69 3b 0a 20 20 20 20 20 20 63 68 61 72 20  t i;.      char 
18640 7a 4b 65 79 5b 34 30 5d 3b 0a 20 20 20 20 20 20  zKey[40];.      
18650 66 6f 72 28 69 3d 30 2c 20 69 42 79 74 65 3d 30  for(i=0, iByte=0
18660 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 4b 65 79 29  ; i<sizeof(zKey)
18670 2a 32 20 26 26 20 73 71 6c 69 74 65 33 49 73 78  *2 && sqlite3Isx
18680 64 69 67 69 74 28 7a 48 65 78 4b 65 79 5b 69 5d  digit(zHexKey[i]
18690 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
186a0 20 69 42 79 74 65 20 3d 20 28 69 42 79 74 65 3c   iByte = (iByte<
186b0 3c 34 29 20 2b 20 73 71 6c 69 74 65 33 48 65 78  <4) + sqlite3Hex
186c0 54 6f 49 6e 74 28 7a 48 65 78 4b 65 79 5b 69 5d  ToInt(zHexKey[i]
186d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
186e0 69 26 31 29 21 3d 30 20 29 20 7a 4b 65 79 5b 69  i&1)!=0 ) zKey[i
186f0 2f 32 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20 20  /2] = iByte;.   
18700 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
18710 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 30 2c  e3_key_v2(db, 0,
18720 20 7a 4b 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20   zKey, i/2);.   
18730 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
18740 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70  sqlite3_free(zOp
18750 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  en);.  return rc
18760 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   & 0xff;.}../*.*
18770 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
18780 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
18790 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
187a0 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
187b0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
187c0 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29  qlite3 **ppDb .)
187d0 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44  {.  return openD
187e0 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d  atabase(zFilenam
187f0 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20  e, ppDb,.       
18800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
18810 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
18820 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
18830 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d  EN_CREATE, 0);.}
18840 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
18850 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68  n_v2(.  const ch
18860 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20  ar *filename,   
18870 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
18880 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  name (UTF-8) */.
18890 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
188a0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
188b0 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64  : SQLite db hand
188c0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
188d0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
188e0 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  /* Flags */.  co
188f0 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
18900 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
18910 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75   VFS module to u
18920 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  se */.){.  retur
18930 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66  n openDatabase(f
18940 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28  ilename, ppDb, (
18950 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61  unsigned int)fla
18960 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69  gs, zVfs);.}..#i
18970 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18980 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70  T_UTF16./*.** Op
18990 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
189a0 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
189b0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
189c0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
189d0 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c  Filename, .  sql
189e0 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20  ite3 **ppDb.){. 
189f0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
18a00 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46  lename8;   /* zF
18a10 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20  ilename encoded 
18a20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64  in UTF-8 instead
18a30 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20   of UTF-16 */.  
18a40 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
18a50 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  Val;.  int rc;..
18a60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
18a70 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
18a80 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72   if( ppDb==0 ) r
18a90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
18aa0 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
18ab0 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69  .  *ppDb = 0;.#i
18ac0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18ad0 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20  T_AUTOINIT.  rc 
18ae0 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
18af0 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
18b00 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
18b10 6e 64 69 66 0a 20 20 69 66 28 20 7a 46 69 6c 65  ndif.  if( zFile
18b20 6e 61 6d 65 3d 3d 30 20 29 20 7a 46 69 6c 65 6e  name==0 ) zFilen
18b30 61 6d 65 20 3d 20 22 5c 30 30 30 5c 30 30 30 22  ame = "\000\000"
18b40 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
18b50 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
18b60 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
18b70 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46  Str(pVal, -1, zF
18b80 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  ilename, SQLITE_
18b90 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c  UTF16NATIVE, SQL
18ba0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a  ITE_STATIC);.  z
18bb0 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69  Filename8 = sqli
18bc0 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61  te3ValueText(pVa
18bd0 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  l, SQLITE_UTF8);
18be0 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
18bf0 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70  8 ){.    rc = op
18c00 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65  enDatabase(zFile
18c10 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20  name8, ppDb,.   
18c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c30 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
18c40 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
18c50 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30  E_OPEN_CREATE, 0
18c60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  );.    assert( *
18c70 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  ppDb || rc==SQLI
18c80 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
18c90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18ca0 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f 70 65  K && !DbHasPrope
18cb0 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42  rty(*ppDb, 0, DB
18cc0 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29  _SchemaLoaded) )
18cd0 7b 0a 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45  {.      SCHEMA_E
18ce0 4e 43 28 2a 70 70 44 62 29 20 3d 20 45 4e 43 28  NC(*ppDb) = ENC(
18cf0 2a 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f  *ppDb) = SQLITE_
18d00 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20  UTF16NATIVE;.   
18d10 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
18d20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
18d30 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  M;.  }.  sqlite3
18d40 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
18d50 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 20 26 20  ..  return rc & 
18d60 30 78 66 66 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  0xff;.}.#endif /
18d70 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
18d80 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
18d90 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
18da0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
18db0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
18dc0 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
18dd0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
18de0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  te_collation(.  
18df0 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
18e00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
18e10 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  e, .  int enc, .
18e20 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
18e30 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
18e40 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
18e50 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
18e60 6f 69 64 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72  oid*).){.  retur
18e70 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  n sqlite3_create
18e80 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62  _collation_v2(db
18e90 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20 70 43  , zName, enc, pC
18ea0 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29  tx, xCompare, 0)
18eb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
18ec0 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
18ed0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
18ee0 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
18ef0 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
18f00 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
18f10 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20  collation_v2(.  
18f20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
18f30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
18f40 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  e, .  int enc, .
18f50 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
18f60 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
18f70 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
18f80 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
18f90 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78  oid*),.  void(*x
18fa0 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20  Del)(void*).){. 
18fb0 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66   int rc;..#ifdef
18fc0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
18fd0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
18fe0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
18ff0 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d  ckOk(db) || zNam
19000 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
19010 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
19020 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
19030 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
19040 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
19050 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
19060 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d  Failed );.  rc =
19070 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
19080 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29  (db, zName, (u8)
19090 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
190a0 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63  are, xDel);.  rc
190b0 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
190c0 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
190d0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
190e0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
190f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
19100 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19110 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67  _UTF16./*.** Reg
19120 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
19130 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
19140 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
19150 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
19160 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
19170 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20  e_collation16(. 
19180 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
19190 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61   const void *zNa
191a0 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  me,.  int enc, .
191b0 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
191c0 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
191d0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
191e0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
191f0 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  oid*).){.  int r
19200 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19210 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 0a   char *zName8;..
19220 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
19230 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
19240 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
19250 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c  etyCheckOk(db) |
19260 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  | zName==0 ) ret
19270 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
19280 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
19290 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
192a0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
192b0 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
192c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
192d0 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74    zName8 = sqlit
192e0 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a  e3Utf16to8(db, z
192f0 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
19300 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
19310 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20   if( zName8 ){. 
19320 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f     rc = createCo
19330 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
19340 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74  e8, (u8)enc, pCt
19350 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b  x, xCompare, 0);
19360 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
19370 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a  ee(db, zName8);.
19380 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
19390 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
193a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
193b0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
193c0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
193d0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
193e0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
193f0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  */../*.** Regist
19400 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  er a collation s
19410 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20  equence factory 
19420 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68  callback with th
19430 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
19440 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65  e.** db. Replace
19450 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20   any previously 
19460 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74  installed collat
19470 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
19480 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tory..*/.int sql
19490 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
194a0 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33  eeded(.  sqlite3
194b0 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *db, .  void *p
194c0 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a  CollNeededArg, .
194d0 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65    void(*xCollNee
194e0 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74  ded)(void*,sqlit
194f0 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70  e3*,int eTextRep
19500 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b  ,const char*).){
19510 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
19520 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
19530 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
19540 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
19550 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
19560 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
19570 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
19580 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
19590 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  tex);.  db->xCol
195a0 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e  lNeeded = xCollN
195b0 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f  eeded;.  db->xCo
195c0 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a  llNeeded16 = 0;.
195d0 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
195e0 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
195f0 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  edArg;.  sqlite3
19600 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
19610 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
19620 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19630 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19640 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
19650 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61  Register a colla
19660 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
19670 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77  ctory callback w
19680 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
19690 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52   handle.** db. R
196a0 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69  eplace any previ
196b0 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20  ously installed 
196c0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
196d0 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69  ce factory..*/.i
196e0 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61  nt sqlite3_colla
196f0 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20  tion_needed16(. 
19700 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
19710 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64   void *pCollNeed
19720 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a  edArg, .  void(*
19730 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76  xCollNeeded16)(v
19740 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e  oid*,sqlite3*,in
19750 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74  t eTextRep,const
19760 20 76 6f 69 64 2a 29 0a 29 7b 0a 23 69 66 64 65   void*).){.#ifde
19770 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
19780 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
19790 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
197a0 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
197b0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
197c0 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
197d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
197e0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
197f0 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
19800 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f  d = 0;.  db->xCo
19810 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78 43 6f  llNeeded16 = xCo
19820 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20 64 62  llNeeded16;.  db
19830 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
19840 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72   = pCollNeededAr
19850 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
19860 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
19870 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
19880 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
19890 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
198a0 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64  _UTF16 */..#ifnd
198b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
198c0 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20  EPRECATED./*.** 
198d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
198e0 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e   now an anachron
198f0 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f 20  ism. It used to 
19900 62 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f 76  be used to recov
19910 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c  er from a.** mal
19920 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20 62  loc() failure, b
19930 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f  ut SQLite now do
19940 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74 69  es this automati
19950 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cally..*/.int sq
19960 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63  lite3_global_rec
19970 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72 65  over(void){.  re
19980 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19990 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
199a0 54 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74  Test to see whet
199b0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 64  her or not the d
199c0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
199d0 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d  on is in autocom
199e0 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65  mit.** mode.  Re
199f0 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
19a00 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20  is and FALSE if 
19a10 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74  not.  Autocommit
19a20 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62   mode is on.** b
19a30 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75 74 6f  y default.  Auto
19a40 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61 62 6c  commit is disabl
19a50 65 64 20 62 79 20 61 20 42 45 47 49 4e 20 73 74  ed by a BEGIN st
19a60 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e  atement and reen
19a70 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  abled.** by the 
19a80 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52  next COMMIT or R
19a90 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69 6e 74 20  OLLBACK..*/.int 
19aa0 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
19ab0 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  commit(sqlite3 *
19ac0 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
19ad0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
19ae0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
19af0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
19b00 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
19b10 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
19b20 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
19b30 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
19b40 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43  return db->autoC
19b50 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ommit;.}../*.** 
19b60 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
19b70 75 74 69 6e 65 73 20 61 72 65 20 73 75 62 73 74  utines are subst
19b80 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74  itutes for const
19b90 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  ants SQLITE_CORR
19ba0 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  UPT,.** SQLITE_M
19bb0 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41  ISUSE, SQLITE_CA
19bc0 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 49  NTOPEN, SQLITE_I
19bd0 4f 45 52 52 20 61 6e 64 20 70 6f 73 73 69 62 6c  OERR and possibl
19be0 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a  y other error.**
19bf0 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65   constants.  The
19c00 79 20 73 65 72 76 65 20 74 77 6f 20 70 75 72 70  y serve two purp
19c10 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e  oses:.**.**   1.
19c20 20 20 53 65 72 76 65 20 61 73 20 61 20 63 6f 6e    Serve as a con
19c30 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f  venient place to
19c40 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e   set a breakpoin
19c50 74 20 69 6e 20 61 20 64 65 62 75 67 67 65 72 0a  t in a debugger.
19c60 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74 65  **       to dete
19c70 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e 20  ct when version 
19c80 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73  error conditions
19c90 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20   occurs..**.**  
19ca0 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69   2.  Invoke sqli
19cb0 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f  te3_log() to pro
19cc0 76 69 64 65 20 74 68 65 20 73 6f 75 72 63 65 20  vide the source 
19cd0 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68  code location wh
19ce0 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c  ere.**       a l
19cf0 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 69  ow-level error i
19d00 73 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64  s first detected
19d10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19d20 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74  CorruptError(int
19d30 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
19d40 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
19d50 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
19d60 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  0 );.  sqlite3_l
19d70 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  og(SQLITE_CORRUP
19d80 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T,.             
19d90 20 22 64 61 74 61 62 61 73 65 20 63 6f 72 72 75   "database corru
19da0 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 25 64  ption at line %d
19db0 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20   of [%.10s]",.  
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65              line
19dd0 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73  no, 20+sqlite3_s
19de0 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65  ourceid());.  re
19df0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
19e00 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  UPT;.}.int sqlit
19e10 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69 6e  e3MisuseError(in
19e20 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
19e30 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
19e40 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
19e50 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
19e60 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53 55 53  log(SQLITE_MISUS
19e70 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
19e80 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c 69 6e    "misuse at lin
19e90 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22  e %d of [%.10s]"
19ea0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19eb0 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
19ec0 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
19ed0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19ee0 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20 73 71  MISUSE;.}.int sq
19ef0 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72 72  lite3CantopenErr
19f00 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
19f10 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
19f20 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
19f30 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c  xLog!=0 );.  sql
19f40 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
19f50 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20 20 20  CANTOPEN, .     
19f60 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74           "cannot
19f70 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 6c 69   open file at li
19f80 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d  ne %d of [%.10s]
19f90 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
19fa0 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69   lineno, 20+sqli
19fb0 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b  te3_sourceid());
19fc0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19fd0 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23  _CANTOPEN;.}...#
19fe0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19ff0 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
1a000 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f  .** This is a co
1a010 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e  nvenience routin
1a020 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
1a030 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61  e that all threa
1a040 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61  d-specific.** da
1a050 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72 65  ta for this thre
1a060 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c  ad has been deal
1a070 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  located..**.** S
1a080 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  QLite no longer 
1a090 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65 63  uses thread-spec
1a0a0 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68 69  ific data so thi
1a0b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77  s routine is now
1a0c0 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74   a.** no-op.  It
1a0d0 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72   is retained for
1a0e0 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70   historical comp
1a0f0 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f  atibility..*/.vo
1a100 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  id sqlite3_threa
1a110 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b  d_cleanup(void){
1a120 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1a130 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66   Return meta inf
1a140 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
1a150 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e   specific column
1a160 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 74   of a database t
1a170 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d  able..** See com
1a180 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e  ment in sqlite3.
1a190 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20  h (sqlite.h.in) 
1a1a0 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
1a1b0 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  int sqlite3_tabl
1a1c0 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
1a1d0 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  a(.  sqlite3 *db
1a1e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a1f0 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
1a200 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  andle */.  const
1a210 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20   char *zDbName, 
1a220 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1a230 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20  se name or NULL 
1a240 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1a250 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20  *zTableName,    
1a260 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a   /* Table name *
1a270 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1a280 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20  zColumnName,    
1a290 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  /* Column name *
1a2a0 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  /.  char const *
1a2b0 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20  *pzDataType,    
1a2c0 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61  /* OUTPUT: Decla
1a2d0 72 65 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f  red data type */
1a2e0 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
1a2f0 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f  pzCollSeq,     /
1a300 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74  * OUTPUT: Collat
1a310 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
1a320 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74  e */.  int *pNot
1a330 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Null,           
1a340 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
1a350 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63  ue if NOT NULL c
1a360 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74 73  onstraint exists
1a370 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d   */.  int *pPrim
1a380 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20  aryKey,         
1a390 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
1a3a0 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74  e if column part
1a3b0 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20   of PK */.  int 
1a3c0 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20  *pAutoinc       
1a3d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
1a3e0 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
1a3f0 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d  n is auto-increm
1a400 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
1a410 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
1a420 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65  Msg = 0;.  Table
1a430 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f   *pTab = 0;.  Co
1a440 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a  lumn *pCol = 0;.
1a450 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 30 3b 0a    int iCol = 0;.
1a460 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44    char const *zD
1a470 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20 63  ataType = 0;.  c
1a480 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
1a490 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Seq = 0;.  int n
1a4a0 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e  otnull = 0;.  in
1a4b0 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 30  t primarykey = 0
1a4c0 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 20  ;.  int autoinc 
1a4d0 3d 20 30 3b 0a 0a 0a 23 69 66 64 65 66 20 53 51  = 0;...#ifdef SQ
1a4e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1a4f0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1a500 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1a510 6b 28 64 62 29 20 7c 7c 20 7a 54 61 62 6c 65 4e  k(db) || zTableN
1a520 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
1a530 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
1a540 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e  SE_BKPT;.  }.#en
1a550 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65  dif..  /* Ensure
1a560 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1a570 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f  hema has been lo
1a580 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  aded */.  sqlite
1a590 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1a5a0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69  ->mutex);.  sqli
1a5b0 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
1a5c0 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  (db);.  rc = sql
1a5d0 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26 7a 45  ite3Init(db, &zE
1a5e0 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 53 51  rrMsg);.  if( SQ
1a5f0 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20  LITE_OK!=rc ){. 
1a600 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
1a610 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  t;.  }..  /* Loc
1a620 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e  ate the table in
1a630 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70   question */.  p
1a640 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Tab = sqlite3Fin
1a650 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c  dTable(db, zTabl
1a660 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b  eName, zDbName);
1a670 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20  .  if( !pTab || 
1a680 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
1a690 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20  .    pTab = 0;. 
1a6a0 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
1a6b0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e  t;.  }..  /* Fin
1a6c0 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72  d the column for
1a6d0 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73 20 72   which info is r
1a6e0 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66  equested */.  if
1a6f0 28 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30  ( zColumnName==0
1a700 20 29 7b 0a 20 20 20 20 2f 2a 20 51 75 65 72 79   ){.    /* Query
1a710 20 66 6f 72 20 65 78 69 73 74 61 6e 63 65 20 6f   for existance o
1a720 66 20 74 61 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a  f table only */.
1a730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
1a740 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
1a750 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
1a760 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20  ){.      pCol = 
1a770 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
1a780 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ];.      if( 0==
1a790 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1a7a0 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Col->zName, zCol
1a7b0 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  umnName) ){.    
1a7c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1a7d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1a7e0 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f   iCol==pTab->nCo
1a7f0 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 48  l ){.      if( H
1a800 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26 26  asRowid(pTab) &&
1a810 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
1a820 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a  zColumnName) ){.
1a830 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 70          iCol = p
1a840 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
1a850 20 20 20 20 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e      pCol = iCol>
1a860 3d 30 20 3f 20 26 70 54 61 62 2d 3e 61 43 6f 6c  =0 ? &pTab->aCol
1a870 5b 69 43 6f 6c 5d 20 3a 20 30 3b 0a 20 20 20 20  [iCol] : 0;.    
1a880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a890 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20   pTab = 0;.     
1a8a0 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
1a8b0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1a8c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66  .  }..  /* The f
1a8d0 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73  ollowing block s
1a8e0 74 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20 69  tores the meta i
1a8f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20  nformation that 
1a900 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
1a910 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c  .  ** to the cal
1a920 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72  ler in local var
1a930 69 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65  iables zDataType
1a940 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e  , zCollSeq, notn
1a950 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a  ull, primarykey.
1a960 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63    ** and autoinc
1a970 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
1a980 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f  there are two po
1a990 73 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a  ssibilities:.  *
1a9a0 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54  * .  **     1. T
1a9b0 68 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c  he specified col
1a9c0 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77  umn name was row
1a9d0 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f  id", "oid" or "_
1a9e0 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20  rowid_" .  **   
1a9f0 20 20 20 20 20 61 6e 64 20 74 68 65 72 65 20 69       and there i
1aa00 73 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20  s no explicitly 
1aa10 64 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c  declared IPK col
1aa20 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  umn. .  **.  ** 
1aa30 20 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65      2. The table
1aa40 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61   is not a view a
1aa50 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  nd the column na
1aa60 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e  me identified an
1aa70 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78   .  **        ex
1aa80 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65  plicitly declare
1aa90 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d  d column. Copy m
1aaa0 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
1aab0 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f  from *pCol..  */
1aac0 20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a   .  if( pCol ){.
1aad0 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20      zDataType = 
1aae0 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20  pCol->zType;.   
1aaf0 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c   zCollSeq = pCol
1ab00 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74  ->zColl;.    not
1ab10 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74  null = pCol->not
1ab20 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69  Null!=0;.    pri
1ab30 6d 61 72 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c  marykey  = (pCol
1ab40 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c  ->colFlags & COL
1ab50 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30  FLAG_PRIMKEY)!=0
1ab60 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20  ;.    autoinc = 
1ab70 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f  pTab->iPKey==iCo
1ab80 6c 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  l && (pTab->tabF
1ab90 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
1aba0 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d  crement)!=0;.  }
1abb0 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54  else{.    zDataT
1abc0 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
1abd0 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20  .    primarykey 
1abe0 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  = 1;.  }.  if( !
1abf0 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  zCollSeq ){.    
1ac00 7a 43 6f 6c 6c 53 65 71 20 3d 20 73 71 6c 69 74  zCollSeq = sqlit
1ac10 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d  e3StrBINARY;.  }
1ac20 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73  ..error_out:.  s
1ac30 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1ac40 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57  All(db);..  /* W
1ac50 68 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74  hether the funct
1ac60 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64  ion call succeed
1ac70 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65  ed or failed, se
1ac80 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72  t the output par
1ac90 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20  ameters.  ** to 
1aca0 77 68 61 74 65 76 65 72 20 74 68 65 69 72 20 6c  whatever their l
1acb0 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74  ocal counterpart
1acc0 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e  s contain. If an
1acd0 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72   error did occur
1ace0 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20  ,.  ** this has 
1acf0 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65  the effect of ze
1ad00 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74  roing all output
1ad10 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a   parameters..  *
1ad20 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54 79  /.  if( pzDataTy
1ad30 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65  pe ) *pzDataType
1ad40 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20   = zDataType;.  
1ad50 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20  if( pzCollSeq ) 
1ad60 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f  *pzCollSeq = zCo
1ad70 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f  llSeq;.  if( pNo
1ad80 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c  tNull ) *pNotNul
1ad90 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69  l = notnull;.  i
1ada0 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29  f( pPrimaryKey )
1adb0 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20   *pPrimaryKey = 
1adc0 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66  primarykey;.  if
1add0 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41  ( pAutoinc ) *pA
1ade0 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63  utoinc = autoinc
1adf0 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
1ae00 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20  OK==rc && !pTab 
1ae10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1ae20 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67  Free(db, zErrMsg
1ae30 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d  );.    zErrMsg =
1ae40 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1ae50 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  db, "no such tab
1ae60 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73  le column: %s.%s
1ae70 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20  ", zTableName,. 
1ae80 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61         zColumnNa
1ae90 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
1aea0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1aeb0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
1aec0 74 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 28 7a  thMsg(db, rc, (z
1aed0 45 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20  ErrMsg?"%s":0), 
1aee0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
1aef0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
1af00 72 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73  rrMsg);.  rc = s
1af10 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
1af20 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
1af30 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1af40 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1af50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
1af60 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
1af70 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
1af80 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
1af90 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e  ime slept..*/.in
1afa0 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28  t sqlite3_sleep(
1afb0 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74  int ms){.  sqlit
1afc0 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20  e3_vfs *pVfs;.  
1afd0 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d  int rc;.  pVfs =
1afe0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
1aff0 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73  d(0);.  if( pVfs
1b000 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1b010 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
1b020 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c  ion works in mil
1b030 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74  liseconds, but t
1b040 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73  he underlying Os
1b050 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50  Sleep() .  ** AP
1b060 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f  I uses microseco
1b070 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31  nds. Hence the 1
1b080 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  000's..  */.  rc
1b090 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65   = (sqlite3OsSle
1b0a0 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73  ep(pVfs, 1000*ms
1b0b0 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  )/1000);.  retur
1b0c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
1b0d0 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
1b0e0 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65   the extended re
1b0f0 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69  sult codes..*/.i
1b100 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  nt sqlite3_exten
1b110 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
1b120 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
1b130 74 20 6f 6e 6f 66 66 29 7b 0a 23 69 66 64 65 66  t onoff){.#ifdef
1b140 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1b150 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1b160 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1b170 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
1b180 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1b190 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
1b1a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1b1b0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1b1c0 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f   db->errMask = o
1b1d0 6e 6f 66 66 20 3f 20 30 78 66 66 66 66 66 66 66  noff ? 0xfffffff
1b1e0 66 20 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69  f : 0xff;.  sqli
1b1f0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1b200 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
1b210 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b220 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
1b230 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  the xFileControl
1b240 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70 61 72   method on a par
1b250 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
1b260 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b270 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71  _file_control(sq
1b280 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1b290 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20   char *zDbName, 
1b2a0 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
1b2b0 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  rg){.  int rc = 
1b2c0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1b2d0 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b 0a 0a  Btree *pBtree;..
1b2e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1b2f0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1b300 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1b310 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
1b320 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1b330 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
1b340 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
1b350 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1b360 65 78 29 3b 0a 20 20 70 42 74 72 65 65 20 3d 20  ex);.  pBtree = 
1b370 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
1b380 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65  tree(db, zDbName
1b390 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  );.  if( pBtree 
1b3a0 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
1b3b0 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  ager;.    sqlite
1b3c0 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20  3_file *fd;.    
1b3d0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1b3e0 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70  r(pBtree);.    p
1b3f0 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
1b400 74 72 65 65 50 61 67 65 72 28 70 42 74 72 65 65  treePager(pBtree
1b410 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1b420 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Pager!=0 );.    
1b430 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
1b440 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20  rFile(pPager);. 
1b450 20 20 20 61 73 73 65 72 74 28 20 66 64 21 3d 30     assert( fd!=0
1b460 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d   );.    if( op==
1b470 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c  SQLITE_FCNTL_FIL
1b480 45 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20  E_POINTER ){.   
1b490 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c     *(sqlite3_fil
1b4a0 65 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a 20  e**)pArg = fd;. 
1b4b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b4c0 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
1b4d0 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  f( op==SQLITE_FC
1b4e0 4e 54 4c 5f 56 46 53 5f 50 4f 49 4e 54 45 52 20  NTL_VFS_POINTER 
1b4f0 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74  ){.      *(sqlit
1b500 65 33 5f 76 66 73 2a 2a 29 70 41 72 67 20 3d 20  e3_vfs**)pArg = 
1b510 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
1b520 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
1b530 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b540 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d     }else if( op=
1b550 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4a 4f  =SQLITE_FCNTL_JO
1b560 55 52 4e 41 4c 5f 50 4f 49 4e 54 45 52 20 29 7b  URNAL_POINTER ){
1b570 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33  .      *(sqlite3
1b580 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 73  _file**)pArg = s
1b590 71 6c 69 74 65 33 50 61 67 65 72 4a 72 6e 6c 46  qlite3PagerJrnlF
1b5a0 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ile(pPager);.   
1b5b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1b5c0 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
1b5d0 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b   fd->pMethods ){
1b5e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1b5f0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
1b600 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a  (fd, op, pArg);.
1b610 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b620 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
1b630 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a 20 20 20  FOUND;.    }.   
1b640 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1b650 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
1b660 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1b670 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1b680 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1b690 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ../*.** Interfac
1b6a0 65 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67  e to the testing
1b6b0 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73   logic..*/.int s
1b6c0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1b6d0 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  rol(int op, ...)
1b6e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
1b6f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
1b700 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a  IT_BUILTIN_TEST.
1b710 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1b720 45 52 28 6f 70 29 3b 0a 23 65 6c 73 65 0a 20 20  ER(op);.#else.  
1b730 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61  va_list ap;.  va
1b740 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a  _start(ap, op);.
1b750 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1b760 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
1b770 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
1b780 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e  state of the PRN
1b790 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  G..    */.    ca
1b7a0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1b7b0 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a  RL_PRNG_SAVE: {.
1b7c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e        sqlite3Prn
1b7d0 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20  gSaveState();.  
1b7e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b7f0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1b800 52 65 73 74 6f 72 65 20 74 68 65 20 73 74 61 74  Restore the stat
1b810 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f  e of the PRNG to
1b820 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 20   the last state 
1b830 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20  saved using.    
1b840 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49  ** PRNG_SAVE.  I
1b850 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20  f PRNG_SAVE has 
1b860 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65  never before bee
1b870 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20  n called, then. 
1b880 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20     ** this verb 
1b890 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52  acts like PRNG_R
1b8a0 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ESET..    */.   
1b8b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1b8c0 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f  TCTRL_PRNG_RESTO
1b8d0 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  RE: {.      sqli
1b8e0 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74  te3PrngRestoreSt
1b8f0 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65  ate();.      bre
1b900 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1b910 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74  *.    ** Reset t
1b920 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20  he PRNG back to 
1b930 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  its uninitialize
1b940 64 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65  d state.  The ne
1b950 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  xt call.    ** t
1b960 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d  o sqlite3_random
1b970 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65  ness() will rese
1b980 65 64 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e  ed the PRNG usin
1b990 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a  g a single call.
1b9a0 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52      ** to the xR
1b9b0 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64  andomness method
1b9c0 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   of the default 
1b9d0 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  VFS..    */.    
1b9e0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1b9f0 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a  CTRL_PRNG_RESET:
1ba00 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1ba10 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29  _randomness(0,0)
1ba20 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ba30 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1ba40 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
1ba50 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43  t_control(BITVEC
1ba60 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f  _TEST, size, pro
1ba70 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20  gram).    **.   
1ba80 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61   ** Run a test a
1ba90 67 61 69 6e 73 74 20 61 20 42 69 74 76 65 63 20  gainst a Bitvec 
1baa0 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20  object of size. 
1bab0 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67   The program arg
1bac0 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20  ument.    ** is 
1bad0 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65  an array of inte
1bae0 67 65 72 73 20 74 68 61 74 20 64 65 66 69 6e 65  gers that define
1baf0 73 20 74 68 65 20 74 65 73 74 2e 20 20 52 65 74  s the test.  Ret
1bb00 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20  urn -1 on a.    
1bb10 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ** memory alloca
1bb20 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e  tion error, 0 on
1bb30 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e   success, or non
1bb40 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72  -zero for an err
1bb50 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74  or..    ** See t
1bb60 68 65 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  he sqlite3Bitvec
1bb70 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f  BuiltinTest() fo
1bb80 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
1bb90 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
1bba0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1bbb0 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43  _TESTCTRL_BITVEC
1bbc0 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69  _TEST: {.      i
1bbd0 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
1bbe0 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
1bbf0 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61  nt *aProg = va_a
1bc00 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20  rg(ap, int*);.  
1bc10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1bc20 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73  BitvecBuiltinTes
1bc30 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20  t(sz, aProg);.  
1bc40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bc50 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1bc60 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1bc70 6e 74 72 6f 6c 28 46 41 55 4c 54 5f 49 4e 53 54  ntrol(FAULT_INST
1bc80 41 4c 4c 2c 20 78 43 61 6c 6c 62 61 63 6b 29 0a  ALL, xCallback).
1bc90 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 72      **.    ** Ar
1bca0 72 61 6e 67 65 20 74 6f 20 69 6e 76 6f 6b 65 20  range to invoke 
1bcb0 78 43 61 6c 6c 62 61 63 6b 28 29 20 77 68 65 6e  xCallback() when
1bcc0 65 76 65 72 20 73 71 6c 69 74 65 33 46 61 75 6c  ever sqlite3Faul
1bcd0 74 53 69 6d 28 29 20 69 73 20 63 61 6c 6c 65 64  tSim() is called
1bce0 2c 0a 20 20 20 20 2a 2a 20 69 66 20 78 43 61 6c  ,.    ** if xCal
1bcf0 6c 62 61 63 6b 20 69 73 20 6e 6f 74 20 4e 55 4c  lback is not NUL
1bd00 4c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  L..    **.    **
1bd10 20 41 73 20 61 20 74 65 73 74 20 6f 66 20 74 68   As a test of th
1bd20 65 20 66 61 75 6c 74 20 73 69 6d 75 6c 61 74 6f  e fault simulato
1bd30 72 20 6d 65 63 68 61 6e 69 73 6d 20 69 74 73 65  r mechanism itse
1bd40 6c 66 2c 20 73 71 6c 69 74 65 33 46 61 75 6c 74  lf, sqlite3Fault
1bd50 53 69 6d 28 30 29 0a 20 20 20 20 2a 2a 20 69 73  Sim(0).    ** is
1bd60 20 63 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74   called immediat
1bd70 65 6c 79 20 61 66 74 65 72 20 69 6e 73 74 61 6c  ely after instal
1bd80 6c 69 6e 67 20 74 68 65 20 6e 65 77 20 63 61 6c  ling the new cal
1bd90 6c 62 61 63 6b 20 61 6e 64 20 74 68 65 20 72 65  lback and the re
1bda0 74 75 72 6e 0a 20 20 20 20 2a 2a 20 76 61 6c 75  turn.    ** valu
1bdb0 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 46 61  e from sqlite3Fa
1bdc0 75 6c 74 53 69 6d 28 30 29 20 62 65 63 6f 6d 65  ultSim(0) become
1bdd0 73 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f  s the return fro
1bde0 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  m.    ** sqlite3
1bdf0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e  _test_control().
1be00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1be10 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1be20 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20  _FAULT_INSTALL: 
1be30 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20  {.      /* MSVC 
1be40 69 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70  is picky about p
1be50 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73  ulling func ptrs
1be60 20 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a   from va lists..
1be70 20 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f        ** http://
1be80 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66  support.microsof
1be90 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20  t.com/kb/47961. 
1bea0 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47       ** sqlite3G
1beb0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73  lobalConfig.xTes
1bec0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61  tCallback = va_a
1bed0 72 67 28 61 70 2c 20 69 6e 74 28 2a 29 28 69 6e  rg(ap, int(*)(in
1bee0 74 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20  t));.      */.  
1bef0 20 20 20 20 74 79 70 65 64 65 66 20 69 6e 74 28      typedef int(
1bf00 2a 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e  *TESTCALLBACKFUN
1bf10 43 5f 74 29 28 69 6e 74 29 3b 0a 20 20 20 20 20  C_t)(int);.     
1bf20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1bf30 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61  nfig.xTestCallba
1bf40 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ck = va_arg(ap, 
1bf50 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43  TESTCALLBACKFUNC
1bf60 5f 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  _t);.      rc = 
1bf70 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
1bf80 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
1bf90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1bfa0 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
1bfb0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49  est_control(BENI
1bfc0 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c  GN_MALLOC_HOOKS,
1bfd0 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20   xBegin, xEnd). 
1bfe0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67     **.    ** Reg
1bff0 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63  ister hooks to c
1c000 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65 20  all to indicate 
1c010 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66  which malloc() f
1c020 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a 20  ailures .    ** 
1c030 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20  are benign..    
1c040 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1c050 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49  TE_TESTCTRL_BENI
1c060 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a  GN_MALLOC_HOOKS:
1c070 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65 66   {.      typedef
1c080 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e   void (*void_fun
1c090 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20  ction)(void);.  
1c0a0 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f      void_functio
1c0b0 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a  n xBenignBegin;.
1c0c0 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74        void_funct
1c0d0 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a  ion xBenignEnd;.
1c0e0 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65 67        xBenignBeg
1c0f0 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  in = va_arg(ap, 
1c100 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a  void_function);.
1c110 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e 64        xBenignEnd
1c120 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
1c130 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20  id_function);.  
1c140 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69 67      sqlite3Benig
1c150 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65  nMallocHooks(xBe
1c160 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69  nignBegin, xBeni
1c170 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62 72  gnEnd);.      br
1c180 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1c190 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1c1a0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1c1b0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1c1c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e  PENDING_BYTE, un
1c1d0 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20 20  signed int X).  
1c1e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20    **.    ** Set 
1c1f0 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
1c200 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e   to the value in
1c210 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 69   the argument, i
1c220 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61  f X>0..    ** Ma
1c230 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66  ke no changes if
1c240 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20 74   X==0.  Return t
1c250 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1c260 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20 20  pending byte.   
1c270 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74 69   ** as it existi
1c280 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ng before this r
1c290 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
1c2a0 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
1c2b0 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68 61   IMPORTANT:  Cha
1c2c0 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e  nging the PENDIN
1c2d0 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34 30  G byte from 0x40
1c2e0 30 30 30 30 30 30 20 72 65 73 75 6c 74 73 20 69  000000 results i
1c2f0 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f  n.    ** an inco
1c300 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62 61 73  mpatible databas
1c310 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20  e file format.  
1c320 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e  Changing the PEN
1c330 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a 2a  DING byte.    **
1c340 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61 62   while any datab
1c350 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ase connection i
1c360 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20 69  s open results i
1c370 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a  n undefined and.
1c380 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 72 69 6f      ** deleterio
1c390 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20  us behavior..   
1c3a0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1c3b0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e  ITE_TESTCTRL_PEN
1c3c0 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20  DING_BYTE: {.   
1c3d0 20 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f     rc = PENDING_
1c3e0 42 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53 51  BYTE;.#ifndef SQ
1c3f0 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20  LITE_OMIT_WSD.  
1c400 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75 6e      {.        un
1c410 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56 61  signed int newVa
1c420 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  l = va_arg(ap, u
1c430 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
1c440 20 20 20 20 20 20 69 66 28 20 6e 65 77 56 61 6c        if( newVal
1c450 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69 6e   ) sqlite3Pendin
1c460 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a  gByte = newVal;.
1c470 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1c480 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c490 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1c4a0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1c4b0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1c4c0 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 69  STCTRL_ASSERT, i
1c4d0 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
1c4e0 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20   ** This action 
1c4f0 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74  provides a run-t
1c500 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20  ime test to see 
1c510 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20  whether or not. 
1c520 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 77     ** assert() w
1c530 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  as enabled at co
1c540 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20  mpile-time.  If 
1c550 58 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 73  X is true and as
1c560 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69 73  sert().    ** is
1c570 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74   enabled, then t
1c580 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1c590 69 73 20 74 72 75 65 2e 20 20 49 66 20 58 20 69  is true.  If X i
1c5a0 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20 2a  s true and.    *
1c5b0 2a 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  * assert() is di
1c5c0 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  sabled, then the
1c5d0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1c5e0 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73 0a   zero.  If X is.
1c5f0 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64      ** false and
1c600 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61   assert() is ena
1c610 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 61  bled, then the a
1c620 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20 61  ssertion fires a
1c630 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72  nd the.    ** pr
1c640 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20 49  ocess aborts.  I
1c650 66 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e 64  f X is false and
1c660 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73   assert() is dis
1c670 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a  abled, then the.
1c680 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61      ** return va
1c690 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20  lue is zero..   
1c6a0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1c6b0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
1c6c0 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c  ERT: {.      vol
1c6d0 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b  atile int x = 0;
1c6e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
1c6f0 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
1c700 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  t))!=0 );.      
1c710 72 63 20 3d 20 78 3b 0a 20 20 20 20 20 20 62 72  rc = x;.      br
1c720 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20  eak;.    }...   
1c730 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1c740 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1c750 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1c760 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20 58 29 0a  _ALWAYS, int X).
1c770 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1c780 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64  is action provid
1c790 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65  es a run-time te
1c7a0 73 74 20 74 6f 20 73 65 65 20 68 6f 77 20 74 68  st to see how th
1c7b0 65 20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20 20  e ALWAYS and.   
1c7c0 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f 73   ** NEVER macros
1c7d0 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 61 74   were defined at
1c7e0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20   compile-time.. 
1c7f0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1c800 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1c810 20 41 4c 57 41 59 53 28 58 29 2e 20 20 0a 20 20   ALWAYS(X).  .  
1c820 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1c830 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74  recommended test
1c840 20 69 73 20 58 3d 3d 32 2e 20 20 49 66 20 74 68   is X==2.  If th
1c850 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1c860 73 20 32 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a  s 2, that means.
1c870 20 20 20 20 2a 2a 20 41 4c 57 41 59 53 28 29 20      ** ALWAYS() 
1c880 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20  and NEVER() are 
1c890 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d  both no-op pass-
1c8a0 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20  through macros, 
1c8b0 77 68 69 63 68 20 69 73 20 74 68 65 0a 20 20 20  which is the.   
1c8c0 20 2a 2a 20 64 65 66 61 75 6c 74 20 73 65 74 74   ** default sett
1c8d0 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 65 74  ing.  If the ret
1c8e0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31 2c 20  urn value is 1, 
1c8f0 74 68 65 6e 20 41 4c 57 41 59 53 28 29 20 69 73  then ALWAYS() is
1c900 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 68   either.    ** h
1c910 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75  ard-coded to tru
1c920 65 20 6f 72 20 65 6c 73 65 20 69 74 20 61 73 73  e or else it ass
1c930 65 72 74 73 20 69 66 20 69 74 73 20 61 72 67 75  erts if its argu
1c940 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a 20  ment is false.. 
1c950 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20     ** The first 
1c960 62 65 68 61 76 69 6f 72 20 28 68 61 72 64 2d 63  behavior (hard-c
1c970 6f 64 65 64 20 74 6f 20 74 72 75 65 29 20 69 73  oded to true) is
1c980 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20 20   the case if.   
1c990 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43   ** SQLITE_TESTC
1c9a0 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73  TRL_ASSERT shows
1c9b0 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20 69   that assert() i
1c9c0 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20 74  s disabled and t
1c9d0 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a  he second.    **
1c9e0 20 62 65 68 61 76 69 6f 72 20 28 61 73 73 65 72   behavior (asser
1c9f0 74 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  t if the argumen
1ca00 74 20 74 6f 20 41 4c 57 41 59 53 28 29 20 69 73  t to ALWAYS() is
1ca10 20 66 61 6c 73 65 29 20 69 73 20 74 68 65 20 63   false) is the c
1ca20 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51  ase if.    ** SQ
1ca30 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
1ca40 53 45 52 54 20 73 68 6f 77 73 20 74 68 61 74 20  SERT shows that 
1ca50 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62  assert() is enab
1ca60 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  led..    **.    
1ca70 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d 65 20  ** The run-time 
1ca80 74 65 73 74 20 70 72 6f 63 65 64 75 72 65 20 6d  test procedure m
1ca90 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68  ight look someth
1caa0 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  ing like this:. 
1cab0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1cac0 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74  if( sqlite3_test
1cad0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1cae0 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c  TESTCTRL_ALWAYS,
1caf0 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a   2)==2 ){.    **
1cb00 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
1cb10 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72  ) and NEVER() ar
1cb20 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72  e no-op pass-thr
1cb30 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20 20 20 20  ough macros.    
1cb40 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  **    }else if( 
1cb50 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1cb60 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1cb70 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 31 29 20  CTRL_ASSERT, 1) 
1cb80 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f  ){.    **      /
1cb90 2f 20 41 4c 57 41 59 53 28 78 29 20 61 73 73 65  / ALWAYS(x) asse
1cba0 72 74 73 20 74 68 61 74 20 78 20 69 73 20 74 72  rts that x is tr
1cbb0 75 65 2e 20 4e 45 56 45 52 28 78 29 20 61 73 73  ue. NEVER(x) ass
1cbc0 65 72 74 73 20 78 20 69 73 20 66 61 6c 73 65 2e  erts x is false.
1cbd0 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65  .    **    }else
1cbe0 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
1cbf0 20 41 4c 57 41 59 53 28 78 29 20 69 73 20 61 20   ALWAYS(x) is a 
1cc00 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45 56  constant 1.  NEV
1cc10 45 52 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74  ER(x) is a const
1cc20 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20  ant 0..    **   
1cc30 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61   }.    */.    ca
1cc40 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1cc50 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20  RL_ALWAYS: {.   
1cc60 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72     int x = va_ar
1cc70 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20  g(ap,int);.     
1cc80 20 72 63 20 3d 20 41 4c 57 41 59 53 28 78 29 3b   rc = ALWAYS(x);
1cc90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1cca0 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1ccb0 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  **   sqlite3_tes
1ccc0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1ccd0 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52  _TESTCTRL_BYTEOR
1cce0 44 45 52 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  DER);.    **.   
1ccf0 20 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20   ** The integer 
1cd00 72 65 74 75 72 6e 65 64 20 72 65 76 65 61 6c 73  returned reveals
1cd10 20 74 68 65 20 62 79 74 65 2d 6f 72 64 65 72 20   the byte-order 
1cd20 6f 66 20 74 68 65 20 63 6f 6d 70 75 74 65 72 20  of the computer 
1cd30 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 2a 2a 20  on which.    ** 
1cd40 53 51 4c 69 74 65 20 69 73 20 72 75 6e 6e 69 6e  SQLite is runnin
1cd50 67 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  g:.    **.    **
1cd60 20 20 20 20 20 20 20 31 20 20 20 20 20 62 69 67         1     big
1cd70 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64 65 74 65  -endian,    dete
1cd80 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69  rmined at run-ti
1cd90 6d 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 31  me.    **      1
1cda0 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64  0     little-end
1cdb0 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64 20  ian, determined 
1cdc0 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20  at run-time.    
1cdd0 2a 2a 20 20 34 33 32 31 30 31 20 20 20 20 20 62  **  432101     b
1cde0 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64 65  ig-endian,    de
1cdf0 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70  termined at comp
1ce00 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20  ile-time.    ** 
1ce10 20 31 32 33 34 31 30 20 20 20 20 20 6c 69 74 74   123410     litt
1ce20 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72  le-endian, deter
1ce30 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  mined at compile
1ce40 2d 74 69 6d 65 0a 20 20 20 20 2a 2f 20 0a 20 20  -time.    */ .  
1ce50 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1ce60 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52  STCTRL_BYTEORDER
1ce70 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  : {.      rc = S
1ce80 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52 2a  QLITE_BYTEORDER*
1ce90 31 30 30 20 2b 20 53 51 4c 49 54 45 5f 4c 49 54  100 + SQLITE_LIT
1cea0 54 4c 45 45 4e 44 49 41 4e 2a 31 30 20 2b 20 53  TLEENDIAN*10 + S
1ceb0 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e 3b  QLITE_BIGENDIAN;
1cec0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ced0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71    }..    /*   sq
1cee0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1cef0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1cf00 52 4c 5f 52 45 53 45 52 56 45 2c 20 73 71 6c 69  RL_RESERVE, sqli
1cf10 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a  te3 *db, int N).
1cf20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65      **.    ** Se
1cf30 74 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73  t the nReserve s
1cf40 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74 68 65  ize to N for the
1cf50 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f   main database o
1cf60 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  n the database. 
1cf70 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e     ** connection
1cf80 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   db..    */.    
1cf90 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1cfa0 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 20 7b 0a  CTRL_RESERVE: {.
1cfb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1cfc0 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
1cfd0 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
1cfe0 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61  int x = va_arg(a
1cff0 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  p,int);.      sq
1d000 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1d010 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
1d020 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1d030 53 65 74 50 61 67 65 53 69 7a 65 28 64 62 2d 3e  SetPageSize(db->
1d040 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 20 78  aDb[0].pBt, 0, x
1d050 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
1d060 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1d070 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
1d080 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1d090 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f      /*  sqlite3_
1d0a0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1d0b0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
1d0c0 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71 6c 69  IMIZATIONS, sqli
1d0d0 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a  te3 *db, int N).
1d0e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e      **.    ** En
1d0f0 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20  able or disable 
1d100 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61  various optimiza
1d110 74 69 6f 6e 73 20 66 6f 72 20 74 65 73 74 69 6e  tions for testin
1d120 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68 65  g purposes.  The
1d130 20 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e   .    ** argumen
1d140 74 20 4e 20 69 73 20 61 20 62 69 74 6d 61 73 6b  t N is a bitmask
1d150 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   of optimization
1d160 73 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  s to be disabled
1d170 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20  .  For normal.  
1d180 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 4e    ** operation N
1d190 20 73 68 6f 75 6c 64 20 62 65 20 30 2e 20 20 54   should be 0.  T
1d1a0 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20  he idea is that 
1d1b0 61 20 74 65 73 74 20 70 72 6f 67 72 61 6d 20 28  a test program (
1d1c0 6c 69 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  like the.    ** 
1d1d0 53 51 4c 20 4c 6f 67 69 63 20 54 65 73 74 20 6f  SQL Logic Test o
1d1e0 72 20 53 4c 54 20 74 65 73 74 20 6d 6f 64 75 6c  r SLT test modul
1d1f0 65 29 20 63 61 6e 20 72 75 6e 20 74 68 65 20 73  e) can run the s
1d200 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70 6c 65  ame SQL multiple
1d210 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20 77 69   times.    ** wi
1d220 74 68 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d  th various optim
1d230 69 7a 61 74 69 6f 6e 73 20 64 69 73 61 62 6c 65  izations disable
1d240 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  d to verify that
1d250 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72   the same answer
1d260 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62 74 61 69  .    ** is obtai
1d270 6e 65 64 20 69 6e 20 65 76 65 72 79 20 63 61 73  ned in every cas
1d280 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  e..    */.    ca
1d290 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1d2a0 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
1d2b0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1d2c0 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61  3 *db = va_arg(a
1d2d0 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  p, sqlite3*);.  
1d2e0 20 20 20 20 64 62 2d 3e 64 62 4f 70 74 46 6c 61      db->dbOptFla
1d2f0 67 73 20 3d 20 28 75 31 36 29 28 76 61 5f 61 72  gs = (u16)(va_ar
1d300 67 28 61 70 2c 20 69 6e 74 29 20 26 20 30 78 66  g(ap, int) & 0xf
1d310 66 66 66 29 3b 0a 20 20 20 20 20 20 62 72 65 61  fff);.      brea
1d320 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  k;.    }..#ifdef
1d330 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
1d340 44 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  D.    /* sqlite3
1d350 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1d360 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53  LITE_TESTCTRL_IS
1d370 4b 45 59 57 4f 52 44 2c 20 63 6f 6e 73 74 20 63  KEYWORD, const c
1d380 68 61 72 20 2a 7a 57 6f 72 64 29 0a 20 20 20 20  har *zWord).    
1d390 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 7a 57 6f  **.    ** If zWo
1d3a0 72 64 20 69 73 20 61 20 6b 65 79 77 6f 72 64 20  rd is a keyword 
1d3b0 72 65 63 6f 67 6e 69 7a 65 64 20 62 79 20 74 68  recognized by th
1d3c0 65 20 70 61 72 73 65 72 2c 20 74 68 65 6e 20 72  e parser, then r
1d3d0 65 74 75 72 6e 20 74 68 65 0a 20 20 20 20 2a 2a  eturn the.    **
1d3e0 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 77 6f   number of keywo
1d3f0 72 64 73 2e 20 20 4f 72 20 69 66 20 7a 57 6f 72  rds.  Or if zWor
1d400 64 20 69 73 20 6e 6f 74 20 61 20 6b 65 79 77 6f  d is not a keywo
1d410 72 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  rd, return 0..  
1d420 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 54 68 69    ** .    ** Thi
1d430 73 20 74 65 73 74 20 66 65 61 74 75 72 65 20 69  s test feature i
1d440 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
1d450 20 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61   in the amalgama
1d460 74 69 6f 6e 20 73 69 6e 63 65 0a 20 20 20 20 2a  tion since.    *
1d470 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 5f 4b  * the SQLITE_N_K
1d480 45 59 57 4f 52 44 20 6d 61 63 72 6f 20 69 73 20  EYWORD macro is 
1d490 6e 6f 74 20 64 65 66 69 6e 65 64 20 69 6e 20 74  not defined in t
1d4a0 68 69 73 20 66 69 6c 65 20 69 66 20 53 51 4c 69  his file if SQLi
1d4b0 74 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 75 69  te.    ** is bui
1d4c0 6c 74 20 75 73 69 6e 67 20 73 65 70 61 72 61 74  lt using separat
1d4d0 65 20 73 6f 75 72 63 65 20 66 69 6c 65 73 2e 0a  e source files..
1d4e0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1d4f0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1d500 49 53 4b 45 59 57 4f 52 44 3a 20 7b 0a 20 20 20  ISKEYWORD: {.   
1d510 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1d520 57 6f 72 64 20 3d 20 76 61 5f 61 72 67 28 61 70  Word = va_arg(ap
1d530 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  , const char*);.
1d540 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
1d550 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 57  lite3Strlen30(zW
1d560 6f 72 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ord);.      rc =
1d570 20 28 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64   (sqlite3Keyword
1d580 43 6f 64 65 28 28 75 38 2a 29 7a 57 6f 72 64 2c  Code((u8*)zWord,
1d590 20 6e 29 21 3d 54 4b 5f 49 44 29 20 3f 20 53 51   n)!=TK_ID) ? SQ
1d5a0 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a  LITE_N_KEYWORD :
1d5b0 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
1d5c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 0a 0a  .    }.#endif ..
1d5d0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74      /* sqlite3_t
1d5e0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1d5f0 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41  TE_TESTCTRL_SCRA
1d600 54 43 48 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26  TCHMALLOC, sz, &
1d610 70 4e 65 77 2c 20 70 46 72 65 65 29 3b 0a 20 20  pNew, pFree);.  
1d620 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 61 73 73    **.    ** Pass
1d630 20 70 46 72 65 65 20 69 6e 74 6f 20 73 71 6c 69   pFree into sqli
1d640 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 29  te3ScratchFree()
1d650 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 73 7a 3e  . .    ** If sz>
1d660 30 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  0 then allocate 
1d670 61 20 73 63 72 61 74 63 68 20 62 75 66 66 65 72  a scratch buffer
1d680 20 69 6e 74 6f 20 70 4e 65 77 2e 20 20 0a 20 20   into pNew.  .  
1d690 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1d6a0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43  LITE_TESTCTRL_SC
1d6b0 52 41 54 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  RATCHMALLOC: {. 
1d6c0 20 20 20 20 20 76 6f 69 64 20 2a 70 46 72 65 65       void *pFree
1d6d0 2c 20 2a 2a 70 70 4e 65 77 3b 0a 20 20 20 20 20  , **ppNew;.     
1d6e0 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 73   int sz;.      s
1d6f0 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  z = va_arg(ap, i
1d700 6e 74 29 3b 0a 20 20 20 20 20 20 70 70 4e 65 77  nt);.      ppNew
1d710 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
1d720 69 64 2a 2a 29 3b 0a 20 20 20 20 20 20 70 46 72  id**);.      pFr
1d730 65 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ee = va_arg(ap, 
1d740 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 69 66  void*);.      if
1d750 28 20 73 7a 20 29 20 2a 70 70 4e 65 77 20 3d 20  ( sz ) *ppNew = 
1d760 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61  sqlite3ScratchMa
1d770 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20  lloc(sz);.      
1d780 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
1d790 65 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20  ee(pFree);.     
1d7a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1d7b0 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1d7c0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1d7d0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
1d7e0 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e  ALTIME_FAULT, in
1d7f0 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a  t onoff);.    **
1d800 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d  .    ** If param
1d810 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f  eter onoff is no
1d820 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67 75 72  n-zero, configur
1d830 65 20 74 68 65 20 77 72 61 70 70 65 72 73 20 73  e the wrappers s
1d840 6f 20 74 68 61 74 20 61 6c 6c 0a 20 20 20 20 2a  o that all.    *
1d850 2a 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * subsequent cal
1d860 6c 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65 28  ls to localtime(
1d870 29 20 61 6e 64 20 76 61 72 69 61 6e 74 73 20 66  ) and variants f
1d880 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69 73  ail. If onoff is
1d890 20 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e   zero,.    ** un
1d8a0 64 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e  do this setting.
1d8b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1d8c0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1d8d0 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
1d8e0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1d8f0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c  3GlobalConfig.bL
1d900 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20  ocaltimeFault = 
1d910 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1d920 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d930 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71    }..    /*   sq
1d940 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1d950 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1d960 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54  RL_NEVER_CORRUPT
1d970 2c 20 69 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a 20  , int);.    **. 
1d980 20 20 20 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65     ** Set or cle
1d990 61 72 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  ar a flag that i
1d9a0 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
1d9b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1d9c0 69 73 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d 0a  is always well-.
1d9d0 20 20 20 20 2a 2a 20 66 6f 72 6d 65 64 20 61 6e      ** formed an
1d9e0 64 20 6e 65 76 65 72 20 63 6f 72 72 75 70 74 2e  d never corrupt.
1d9f0 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 63    This flag is c
1da00 6c 65 61 72 20 62 79 20 64 65 66 61 75 6c 74 2c  lear by default,
1da10 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
1da20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
1da30 20 66 69 6c 65 73 20 6d 69 67 68 74 20 68 61 76   files might hav
1da40 65 20 61 72 62 69 74 72 61 72 79 20 63 6f 72 72  e arbitrary corr
1da50 75 70 74 69 6f 6e 2e 20 20 53 65 74 74 69 6e 67  uption.  Setting
1da60 20 74 68 65 20 66 6c 61 67 20 64 75 72 69 6e 67   the flag during
1da70 0a 20 20 20 20 2a 2a 20 74 65 73 74 69 6e 67 20  .    ** testing 
1da80 63 61 75 73 65 73 20 63 65 72 74 61 69 6e 20 61  causes certain a
1da90 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1daa0 74 73 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74  ts in the code t
1dab0 6f 20 62 65 20 61 63 74 69 76 61 74 65 64 0a 20  o be activated. 
1dac0 20 20 20 2a 2a 20 74 68 61 74 20 64 65 6d 6f 6e     ** that demon
1dad0 73 74 72 61 74 20 69 6e 76 61 72 69 61 6e 74 73  strat invariants
1dae0 20 6f 6e 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20   on well-formed 
1daf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a  database files..
1db00 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1db10 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1db20 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 3a 20 7b  NEVER_CORRUPT: {
1db30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1db40 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 65 76 65 72  obalConfig.never
1db50 43 6f 72 72 75 70 74 20 3d 20 76 61 5f 61 72 67  Corrupt = va_arg
1db60 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
1db70 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a   break;.    }...
1db80 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
1db90 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1dba0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44  LITE_TESTCTRL_VD
1dbb0 42 45 5f 43 4f 56 45 52 41 47 45 2c 20 78 43 61  BE_COVERAGE, xCa
1dbc0 6c 6c 62 61 63 6b 2c 20 70 74 72 29 3b 0a 20 20  llback, ptr);.  
1dbd0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20    **.    ** Set 
1dbe0 74 68 65 20 56 44 42 45 20 63 6f 76 65 72 61 67  the VDBE coverag
1dbf0 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
1dc00 69 6f 6e 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b  ion to xCallback
1dc10 20 77 69 74 68 20 63 6f 6e 74 65 78 74 20 0a 20   with context . 
1dc20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 70 74     ** pointer pt
1dc30 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
1dc40 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1dc50 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  RL_VDBE_COVERAGE
1dc60 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  : {.#ifdef SQLIT
1dc70 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a  E_VDBE_COVERAGE.
1dc80 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
1dc90 69 64 20 28 2a 62 72 61 6e 63 68 5f 63 61 6c 6c  id (*branch_call
1dca0 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  back)(void*,int,
1dcb0 75 38 2c 75 38 29 3b 0a 20 20 20 20 20 20 73 71  u8,u8);.      sq
1dcc0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1dcd0 67 2e 78 56 64 62 65 42 72 61 6e 63 68 20 3d 20  g.xVdbeBranch = 
1dce0 76 61 5f 61 72 67 28 61 70 2c 62 72 61 6e 63 68  va_arg(ap,branch
1dcf0 5f 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  _callback);.    
1dd00 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1dd10 6f 6e 66 69 67 2e 70 56 64 62 65 42 72 61 6e 63  onfig.pVdbeBranc
1dd20 68 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70  hArg = va_arg(ap
1dd30 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a  ,void*);.#endif.
1dd40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1dd50 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
1dd60 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1dd70 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1dd80 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64  L_SORTER_MMAP, d
1dd90 62 2c 20 6e 4d 61 78 29 3b 20 2a 2f 0a 20 20 20  b, nMax); */.   
1dda0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1ddb0 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41  TCTRL_SORTER_MMA
1ddc0 50 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  P: {.      sqlit
1ddd0 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
1dde0 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
1ddf0 20 20 20 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72       db->nMaxSor
1de00 74 65 72 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67  terMmap = va_arg
1de10 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
1de20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1de30 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1de40 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1de50 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49  ITE_TESTCTRL_ISI
1de60 4e 49 54 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  NIT);.    **.   
1de70 20 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54   ** Return SQLIT
1de80 45 5f 4f 4b 20 69 66 20 53 51 4c 69 74 65 20 68  E_OK if SQLite h
1de90 61 73 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  as been initiali
1dea0 7a 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 45  zed and SQLITE_E
1deb0 52 52 4f 52 20 69 66 0a 20 20 20 20 2a 2a 20 6e  RROR if.    ** n
1dec0 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ot..    */.    c
1ded0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1dee0 54 52 4c 5f 49 53 49 4e 49 54 3a 20 7b 0a 20 20  TRL_ISINIT: {.  
1def0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
1df00 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
1df10 69 74 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c  it==0 ) rc = SQL
1df20 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
1df30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1df40 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74     /*  sqlite3_t
1df50 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1df60 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
1df70 53 54 45 52 2c 20 64 62 2c 20 64 62 4e 61 6d 65  STER, db, dbName
1df80 2c 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a  , onOff, tnum);.
1df90 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1dfa0 69 73 20 74 65 73 74 20 63 6f 6e 74 72 6f 6c 20  is test control 
1dfb0 69 73 20 75 73 65 64 20 74 6f 20 63 72 65 61 74  is used to creat
1dfc0 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  e imposter table
1dfd0 73 2e 20 20 22 64 62 22 20 69 73 20 61 20 70 6f  s.  "db" is a po
1dfe0 69 6e 74 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20  inter.    ** to 
1dff0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
1e000 6e 65 63 74 69 6f 6e 2e 20 20 64 62 4e 61 6d 65  nection.  dbName
1e010 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
1e020 20 6e 61 6d 65 20 28 65 78 3a 20 22 6d 61 69 6e   name (ex: "main
1e030 22 20 6f 72 0a 20 20 20 20 2a 2a 20 22 74 65 6d  " or.    ** "tem
1e040 70 22 29 20 77 68 69 63 68 20 77 69 6c 6c 20 72  p") which will r
1e050 65 63 65 69 76 65 20 74 68 65 20 69 6d 70 6f 73  eceive the impos
1e060 74 65 72 2e 20 20 22 6f 6e 4f 66 66 22 20 74 75  ter.  "onOff" tu
1e070 72 6e 73 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64  rns imposter mod
1e080 65 20 6f 6e 0a 20 20 20 20 2a 2a 20 6f 72 20 6f  e on.    ** or o
1e090 66 66 2e 20 20 22 74 6e 75 6d 22 20 69 73 20 74  ff.  "tnum" is t
1e0a0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1e0b0 74 68 65 20 62 2d 74 72 65 65 20 74 6f 20 77 68  the b-tree to wh
1e0c0 69 63 68 20 74 68 65 20 69 6d 70 6f 73 74 65 72  ich the imposter
1e0d0 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 73 68  .    ** table sh
1e0e0 6f 75 6c 64 20 63 6f 6e 6e 65 63 74 2e 0a 20 20  ould connect..  
1e0f0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62    **.    ** Enab
1e100 6c 65 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65  le imposter mode
1e110 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 20 73   only when the s
1e120 63 68 65 6d 61 20 68 61 73 20 61 6c 72 65 61 64  chema has alread
1e130 79 20 62 65 65 6e 20 70 61 72 73 65 64 2e 20 20  y been parsed.  
1e140 54 68 65 6e 0a 20 20 20 20 2a 2a 20 72 75 6e 20  Then.    ** run 
1e150 61 20 73 69 6e 67 6c 65 20 43 52 45 41 54 45 20  a single CREATE 
1e160 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
1e170 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  to construct the
1e180 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
1e190 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  in.    ** the pa
1e1a0 72 73 65 64 20 73 63 68 65 6d 61 2e 20 20 54 68  rsed schema.  Th
1e1b0 65 6e 20 74 75 72 6e 20 69 6d 70 6f 73 74 65 72  en turn imposter
1e1c0 20 6d 6f 64 65 20 62 61 63 6b 20 6f 66 66 20 61   mode back off a
1e1d0 67 61 69 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  gain..    **.   
1e1e0 20 2a 2a 20 49 66 20 6f 6e 4f 66 66 3d 3d 30 20   ** If onOff==0 
1e1f0 61 6e 64 20 74 6e 75 6d 3e 30 20 74 68 65 6e 20  and tnum>0 then 
1e200 72 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61  reset the schema
1e210 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
1e220 65 73 2c 20 63 61 75 73 69 6e 67 0a 20 20 20 20  es, causing.    
1e230 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
1e240 20 62 65 20 72 65 70 61 72 73 65 64 20 74 68 65   be reparsed the
1e250 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73   next time it is
1e260 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20 68   needed.  This h
1e270 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 66  as the.    ** ef
1e280 66 65 63 74 20 6f 66 20 65 72 61 73 69 6e 67 20  fect of erasing 
1e290 61 6c 6c 20 69 6d 70 6f 73 74 65 72 20 74 61 62  all imposter tab
1e2a0 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  les..    */.    
1e2b0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1e2c0 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 3a 20 7b  CTRL_IMPOSTER: {
1e2d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
1e2e0 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
1e2f0 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
1e300 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1e310 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1e320 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e  .      db->init.
1e330 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
1e340 64 44 62 4e 61 6d 65 28 64 62 2c 20 76 61 5f 61  dDbName(db, va_a
1e350 72 67 28 61 70 2c 63 6f 6e 73 74 20 63 68 61 72  rg(ap,const char
1e360 2a 29 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69  *));.      db->i
1e370 6e 69 74 2e 62 75 73 79 20 3d 20 64 62 2d 3e 69  nit.busy = db->i
1e380 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c  nit.imposterTabl
1e390 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  e = va_arg(ap,in
1e3a0 74 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e  t);.      db->in
1e3b0 69 74 2e 6e 65 77 54 6e 75 6d 20 3d 20 76 61 5f  it.newTnum = va_
1e3c0 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
1e3d0 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e     if( db->init.
1e3e0 62 75 73 79 3d 3d 30 20 26 26 20 64 62 2d 3e 69  busy==0 && db->i
1e3f0 6e 69 74 2e 6e 65 77 54 6e 75 6d 3e 30 20 29 7b  nit.newTnum>0 ){
1e400 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e410 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
1e420 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b  fConnection(db);
1e430 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1e440 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1e450 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1e460 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e470 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
1e480 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  p);.#endif /* SQ
1e490 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49  LITE_OMIT_BUILTI
1e4a0 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65 74 75  N_TEST */.  retu
1e4b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e4c0 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74  This is a utilit
1e4d0 79 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66 75  y routine, usefu
1e4e0 6c 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65  l to VFS impleme
1e4f0 6e 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20 63  ntations, that c
1e500 68 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20  hecks.** to see 
1e510 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  if a database fi
1e520 6c 65 20 77 61 73 20 61 20 55 52 49 20 74 68 61  le was a URI tha
1e530 74 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73 70  t contained a sp
1e540 65 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a 2a  ecific query .**
1e550 20 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64 20   parameter, and 
1e560 69 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74 68  if so obtains th
1e570 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 71  e value of the q
1e580 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
1e590 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e  **.** The zFilen
1e5a0 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
1e5b0 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69  the filename poi
1e5c0 6e 74 65 72 20 70 61 73 73 65 64 20 69 6e 74 6f  nter passed into
1e5d0 20 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20   the xOpen().** 
1e5e0 6d 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53 20  method of a VFS 
1e5f0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
1e600 20 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67 75   The zParam argu
1e610 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65  ment is the name
1e620 20 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72 79   of the.** query
1e630 20 70 61 72 61 6d 65 74 65 72 20 77 65 20 73 65   parameter we se
1e640 65 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ek.  This routin
1e650 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61  e returns the va
1e660 6c 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72 61  lue of the zPara
1e670 6d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  m.** parameter i
1e680 66 20 69 74 20 65 78 69 73 74 73 2e 20 20 49 66  f it exists.  If
1e690 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 64   the parameter d
1e6a0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
1e6b0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
1e6c0 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f  eturns a NULL po
1e6d0 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  inter..*/.const 
1e6e0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75 72  char *sqlite3_ur
1e6f0 69 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e 73  i_parameter(cons
1e700 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1e710 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1e720 50 61 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a 46  Param){.  if( zF
1e730 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 50  ilename==0 || zP
1e740 61 72 61 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e  aram==0 ) return
1e750 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20   0;.  zFilename 
1e760 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
1e770 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  30(zFilename) + 
1e780 31 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46 69 6c  1;.  while( zFil
1e790 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
1e7a0 69 6e 74 20 78 20 3d 20 73 74 72 63 6d 70 28 7a  int x = strcmp(z
1e7b0 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d  Filename, zParam
1e7c0 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
1e7d0 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
1e7e0 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  n30(zFilename) +
1e7f0 20 31 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d 30   1;.    if( x==0
1e800 20 29 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e   ) return zFilen
1e810 61 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  ame;.    zFilena
1e820 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  me += sqlite3Str
1e830 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
1e840 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   + 1;.  }.  retu
1e850 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
1e860 65 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e 20  eturn a boolean 
1e870 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72  value for a quer
1e880 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a  y parameter..*/.
1e890 69 6e 74 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  int sqlite3_uri_
1e8a0 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68  boolean(const ch
1e8b0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63  ar *zFilename, c
1e8c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
1e8d0 6d 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a 20  m, int bDflt){. 
1e8e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1e8f0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
1e900 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65  ameter(zFilename
1e910 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44 66  , zParam);.  bDf
1e920 6c 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a 20  lt = bDflt!=0;. 
1e930 20 72 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c 69   return z ? sqli
1e940 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c  te3GetBoolean(z,
1e950 20 62 44 66 6c 74 29 20 3a 20 62 44 66 6c 74 3b   bDflt) : bDflt;
1e960 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1e970 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
1e980 72 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75  r value for a qu
1e990 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
1e9a0 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  /.sqlite3_int64 
1e9b0 73 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74 36  sqlite3_uri_int6
1e9c0 34 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  4(.  const char 
1e9d0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f  *zFilename,    /
1e9e0 2a 20 46 69 6c 65 6e 61 6d 65 20 61 73 20 70 61  * Filename as pa
1e9f0 73 73 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a 2f  ssed to xOpen */
1ea00 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1ea10 50 61 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a 20  Param,       /* 
1ea20 55 52 49 20 70 61 72 61 6d 65 74 65 72 20 73 6f  URI parameter so
1ea30 75 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ught */.  sqlite
1ea40 33 5f 69 6e 74 36 34 20 62 44 66 6c 74 20 20 20  3_int64 bDflt   
1ea50 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 69 66      /* return if
1ea60 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6d 69   parameter is mi
1ea70 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ssing */.){.  co
1ea80 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71  nst char *z = sq
1ea90 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
1eaa0 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  ter(zFilename, z
1eab0 50 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74 65  Param);.  sqlite
1eac0 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69 66 28  3_int64 v;.  if(
1ead0 20 7a 20 26 26 20 73 71 6c 69 74 65 33 44 65 63   z && sqlite3Dec
1eae0 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76  OrHexToI64(z, &v
1eaf0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
1eb00 20 20 20 20 62 44 66 6c 74 20 3d 20 76 3b 0a 20      bDflt = v;. 
1eb10 20 7d 0a 20 20 72 65 74 75 72 6e 20 62 44 66 6c   }.  return bDfl
1eb20 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
1eb30 72 6e 20 74 68 65 20 42 74 72 65 65 20 70 6f 69  rn the Btree poi
1eb40 6e 74 65 72 20 69 64 65 6e 74 69 66 69 65 64 20  nter identified 
1eb50 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20 52 65 74  by zDbName.  Ret
1eb60 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
1eb70 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65 65 20  found..*/.Btree 
1eb80 2a 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f  *sqlite3DbNameTo
1eb90 42 74 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64  Btree(sqlite3 *d
1eba0 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1ebb0 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  DbName){.  int i
1ebc0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
1ebd0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
1ebe0 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d    if( db->aDb[i]
1ebf0 2e 70 42 74 0a 20 20 20 20 20 26 26 20 28 7a 44  .pBt.     && (zD
1ec00 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  bName==0 || sqli
1ec10 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 4e 61  te3StrICmp(zDbNa
1ec20 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a  me, db->aDb[i].z
1ec30 4e 61 6d 65 29 3d 3d 30 29 0a 20 20 20 20 29 7b  Name)==0).    ){
1ec40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 64 62  .      return db
1ec50 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
1ec60 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1ec70 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
1ec80 75 72 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  urn the filename
1ec90 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1eca0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1ecb0 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63   a database.** c
1ecc0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f  onnection..*/.co
1ecd0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
1ece0 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71  3_db_filename(sq
1ecf0 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1ed00 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b   char *zDbName){
1ed10 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23  .  Btree *pBt;.#
1ed20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1ed30 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1ed40 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1ed50 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
1ed60 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
1ed70 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
1ed80 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1ed90 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d 20  .#endif.  pBt = 
1eda0 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
1edb0 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65  tree(db, zDbName
1edc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20  );.  return pBt 
1edd0 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  ? sqlite3BtreeGe
1ede0 74 46 69 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a  tFilename(pBt) :
1edf0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
1ee00 75 72 6e 20 31 20 69 66 20 64 61 74 61 62 61 73  urn 1 if databas
1ee10 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f  e is read-only o
1ee20 72 20 30 20 69 66 20 72 65 61 64 2f 77 72 69 74  r 0 if read/writ
1ee30 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  e.  Return -1 if
1ee40 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61 74 61  .** no such data
1ee50 62 61 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a  base exists..*/.
1ee60 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  int sqlite3_db_r
1ee70 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20  eadonly(sqlite3 
1ee80 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1ee90 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72  *zDbName){.  Btr
1eea0 65 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20  ee *pBt;.#ifdef 
1eeb0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1eec0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1eed0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1eee0 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
1eef0 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
1ef00 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
1ef10 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64  urn -1;.  }.#end
1ef20 69 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74  if.  pBt = sqlit
1ef30 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28  e3DbNameToBtree(
1ef40 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  db, zDbName);.  
1ef50 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c  return pBt ? sql
1ef60 69 74 65 33 42 74 72 65 65 49 73 52 65 61 64 6f  ite3BtreeIsReado
1ef70 6e 6c 79 28 70 42 74 29 20 3a 20 2d 31 3b 0a 7d  nly(pBt) : -1;.}
1ef80 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1ef90 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a  ENABLE_SNAPSHOT.
1efa0 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 73  /*.** Obtain a s
1efb0 6e 61 70 73 68 6f 74 20 68 61 6e 64 6c 65 20 66  napshot handle f
1efc0 6f 72 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20  or the snapshot 
1efd0 6f 66 20 64 61 74 61 62 61 73 65 20 7a 44 62 20  of database zDb 
1efe0 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 62 65  currently .** be
1eff0 69 6e 67 20 72 65 61 64 20 62 79 20 68 61 6e 64  ing read by hand
1f000 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
1f010 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67  lite3_snapshot_g
1f020 65 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  et(.  sqlite3 *d
1f030 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
1f040 20 2a 7a 44 62 2c 0a 20 20 73 71 6c 69 74 65 33   *zDb,.  sqlite3
1f050 5f 73 6e 61 70 73 68 6f 74 20 2a 2a 70 70 53 6e  _snapshot **ppSn
1f060 61 70 73 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20  apshot.){.  int 
1f070 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1f080 52 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  R;.#ifndef SQLIT
1f090 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 6e 74  E_OMIT_WAL.  int
1f0a0 20 69 44 62 3b 0a 0a 23 69 66 64 65 66 20 53 51   iDb;..#ifdef SQ
1f0b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1f0c0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1f0d0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1f0e0 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
1f0f0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
1f100 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
1f110 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
1f120 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1f130 65 78 29 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71  ex);..  iDb = sq
1f140 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
1f150 64 62 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20  db, zDb);.  if( 
1f160 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20  iDb==0 || iDb>1 
1f170 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  ){.    Btree *pB
1f180 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  t = db->aDb[iDb]
1f190 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 30 3d  .pBt;.    if( 0=
1f1a0 3d 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49  =sqlite3BtreeIsI
1f1b0 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
1f1c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f1d0 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
1f1e0 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
1f1f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f200 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
1f210 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e  = sqlite3PagerSn
1f220 61 70 73 68 6f 74 47 65 74 28 73 71 6c 69 74 65  apshotGet(sqlite
1f230 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
1f240 2c 20 70 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20  , ppSnapshot);. 
1f250 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1f260 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
1f270 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1f280 78 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20  x);.#endif   /* 
1f290 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
1f2a0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
1f2b0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
1f2c0 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
1f2d0 20 6f 6e 20 74 68 65 20 73 6e 61 70 73 68 6f 74   on the snapshot
1f2e0 20 69 64 65 6e 64 69 66 69 65 64 20 62 79 20 70   idendified by p
1f2f0 53 6e 61 70 73 68 6f 74 2e 0a 2a 2f 0a 69 6e 74  Snapshot..*/.int
1f300 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
1f310 74 5f 6f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  t_open(.  sqlite
1f320 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3 *db, .  const 
1f330 63 68 61 72 20 2a 7a 44 62 2c 20 0a 20 20 73 71  char *zDb, .  sq
1f340 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a  lite3_snapshot *
1f350 70 53 6e 61 70 73 68 6f 74 0a 29 7b 0a 20 20 69  pSnapshot.){.  i
1f360 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
1f370 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20 53 51  RROR;.#ifndef SQ
1f380 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23  LITE_OMIT_WAL..#
1f390 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1f3a0 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1f3b0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1f3c0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
1f3d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1f3e0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1f3f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
1f400 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1f410 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
1f420 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  f( db->autoCommi
1f430 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t==0 ){.    int 
1f440 69 44 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  iDb;.    iDb = s
1f450 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
1f460 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69  (db, zDb);.    i
1f470 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62  f( iDb==0 || iDb
1f480 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74 72 65  >1 ){.      Btre
1f490 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
1f4a0 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
1f4b0 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 42   if( 0==sqlite3B
1f4c0 74 72 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e  treeIsInReadTran
1f4d0 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
1f4e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f4f0 67 65 72 53 6e 61 70 73 68 6f 74 4f 70 65 6e 28  gerSnapshotOpen(
1f500 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
1f510 72 28 70 42 74 29 2c 20 70 53 6e 61 70 73 68 6f  r(pBt), pSnapsho
1f520 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
1f530 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f540 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f550 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
1f560 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 29 3b 0a  nTrans(pBt, 0);.
1f570 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1f580 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 4f 70  3PagerSnapshotOp
1f590 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  en(sqlite3BtreeP
1f5a0 61 67 65 72 28 70 42 74 29 2c 20 30 29 3b 0a 20  ager(pBt), 0);. 
1f5b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f5c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
1f5d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1f5e0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65  e(db->mutex);.#e
1f5f0 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45  ndif   /* SQLITE
1f600 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72  _OMIT_WAL */.  r
1f610 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f620 2a 2a 20 46 72 65 65 20 61 20 73 6e 61 70 73 68  ** Free a snapsh
1f630 6f 74 20 68 61 6e 64 6c 65 20 6f 62 74 61 69 6e  ot handle obtain
1f640 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
1f650 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 29 2e 0a  snapshot_get()..
1f660 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
1f670 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 28 73 71  snapshot_free(sq
1f680 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a  lite3_snapshot *
1f690 70 53 6e 61 70 73 68 6f 74 29 7b 0a 20 20 73 71  pSnapshot){.  sq
1f6a0 6c 69 74 65 33 5f 66 72 65 65 28 70 53 6e 61 70  lite3_free(pSnap
1f6b0 73 68 6f 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  shot);.}.#endif 
1f6c0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
1f6d0 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a           _SNAPSHOT */.