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

Artifact 3679a4f40434358fdfdfc86bf9576604b8d6fc9b:


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 20 20 20 20 6d  gress = 1;.    m
1ff0: 65 6d 73 65 74 28 70 48 61 73 68 2c 20 30 2c 20  emset(pHash, 0, 
2000: 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c  sizeof(sqlite3Gl
2010: 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 29 29 3b  obalFunctions));
2020: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69  .    sqlite3Regi
2030: 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e 63 74 69  sterGlobalFuncti
2040: 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28 20 73  ons();.    if( s
2050: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2060: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 3d  ig.isPCacheInit=
2070: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
2080: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e   sqlite3PcacheIn
2090: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  itialize();.    
20a0: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
20b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20c0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
20d0: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
20e0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  t = 1;.      rc 
20f0: 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69 74 28  = sqlite3OsInit(
2100: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2110: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
2130: 43 61 63 68 65 42 75 66 66 65 72 53 65 74 75 70  CacheBufferSetup
2140: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
2150: 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20 0a 20 20  onfig.pPage, .  
2160: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
2170: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
2180: 67 65 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ge, sqlite3Globa
2190: 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 29 3b 0a  lConfig.nPage);.
21a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
21b0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
21c0: 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 1;.#ifdef SQL
21d0: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20  ITE_EXTRA_INIT. 
21e0: 20 20 20 20 20 62 52 75 6e 45 78 74 72 61 49 6e       bRunExtraIn
21f0: 69 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20  it = 1;.#endif. 
2200: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2210: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
2220: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 7d  rogress = 0;.  }
2230: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2240: 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 47 6c  _leave(sqlite3Gl
2250: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
2260: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f  Mutex);..  /* Go
2270: 20 62 61 63 6b 20 75 6e 64 65 72 20 74 68 65 20   back under the 
2280: 73 74 61 74 69 63 20 6d 75 74 65 78 20 61 6e 64  static mutex and
2290: 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65   clean up the re
22a0: 63 75 72 73 69 76 65 0a 20 20 2a 2a 20 6d 75 74  cursive.  ** mut
22b0: 65 78 20 74 6f 20 70 72 65 76 65 6e 74 20 61 20  ex to prevent a 
22c0: 72 65 73 6f 75 72 63 65 20 6c 65 61 6b 2e 0a 20  resource leak.. 
22d0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
22e0: 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
22f0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f  r);.  sqlite3Glo
2300: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
2310: 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20 69 66 28  itMutex--;.  if(
2320: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2330: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
2340: 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ex<=0 ){.    ass
2350: 65 72 74 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ert( sqlite3Glob
2360: 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69  alConfig.nRefIni
2370: 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20  tMutex==0 );.   
2380: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
2390: 72 65 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ree(sqlite3Globa
23a0: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
23b0: 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
23c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
23d0: 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 7d  itMutex = 0;.  }
23e0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
23f0: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
2400: 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
2410: 77 69 6e 67 20 69 73 20 6a 75 73 74 20 61 20 73  wing is just a s
2420: 61 6e 69 74 79 20 63 68 65 63 6b 20 74 6f 20 6d  anity check to m
2430: 61 6b 65 20 73 75 72 65 20 53 51 4c 69 74 65 20  ake sure SQLite 
2440: 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f  has.  ** been co
2450: 6d 70 69 6c 65 64 20 63 6f 72 72 65 63 74 6c 79  mpiled correctly
2460: 2e 20 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  .  It is importa
2470: 6e 74 20 74 6f 20 72 75 6e 20 74 68 69 73 20 63  nt to run this c
2480: 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a 20 77 65  ode, but.  ** we
2490: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
24a0: 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74 65 6e 20  un it too often 
24b0: 61 6e 64 20 73 6f 61 6b 20 75 70 20 43 50 55 20  and soak up CPU 
24c0: 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f 0a 20 20  cycles for no.  
24d0: 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53 6f 20 77  ** reason.  So w
24e0: 65 20 72 75 6e 20 69 74 20 6f 6e 63 65 20 64 75  e run it once du
24f0: 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74  ring initializat
2500: 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ion..  */.#ifnde
2510: 66 20 4e 44 45 42 55 47 0a 23 69 66 6e 64 65 66  f NDEBUG.#ifndef
2520: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
2530: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a  ATING_POINT.  /*
2540: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 6f 66   This section of
2550: 20 63 6f 64 65 27 73 20 6f 6e 6c 79 20 22 6f 75   code's only "ou
2560: 74 70 75 74 22 20 69 73 20 76 69 61 20 61 73 73  tput" is via ass
2570: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
2580: 2e 20 2a 2f 0a 20 20 69 66 20 28 20 72 63 3d 3d  . */.  if ( rc==
2590: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25a0: 20 75 36 34 20 78 20 3d 20 28 28 28 75 36 34 29   u64 x = (((u64)
25b0: 31 29 3c 3c 36 33 29 2d 31 3b 0a 20 20 20 20 64  1)<<63)-1;.    d
25c0: 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 61 73 73  ouble y;.    ass
25d0: 65 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 38  ert(sizeof(x)==8
25e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73 69  );.    assert(si
25f0: 7a 65 6f 66 28 78 29 3d 3d 73 69 7a 65 6f 66 28  zeof(x)==sizeof(
2600: 79 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  y));.    memcpy(
2610: 26 79 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20  &y, &x, 8);.    
2620: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 49  assert( sqlite3I
2630: 73 4e 61 4e 28 79 29 20 29 3b 0a 20 20 7d 0a 23  sNaN(y) );.  }.#
2640: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
2650: 2f 2a 20 44 6f 20 65 78 74 72 61 20 69 6e 69 74  /* Do extra init
2660: 69 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73  ialization steps
2670: 20 72 65 71 75 65 73 74 65 64 20 62 79 20 74 68   requested by th
2680: 65 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  e SQLITE_EXTRA_I
2690: 4e 49 54 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65  NIT.  ** compile
26a0: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20 20  -time option..  
26b0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
26c0: 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69 66  _EXTRA_INIT.  if
26d0: 28 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20  ( bRunExtraInit 
26e0: 29 7b 0a 20 20 20 20 69 6e 74 20 53 51 4c 49 54  ){.    int SQLIT
26f0: 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 63 6f 6e  E_EXTRA_INIT(con
2700: 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 72  st char*);.    r
2710: 63 20 3d 20 53 51 4c 49 54 45 5f 45 58 54 52 41  c = SQLITE_EXTRA
2720: 5f 49 4e 49 54 28 30 29 3b 0a 20 20 7d 0a 23 65  _INIT(0);.  }.#e
2730: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
2740: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f  c;.}../*.** Undo
2750: 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20   the effects of 
2760: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
2770: 7a 65 28 29 2e 20 20 4d 75 73 74 20 6e 6f 74 20  ze().  Must not 
2780: 62 65 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 0a  be called while.
2790: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  ** there are out
27a0: 73 74 61 6e 64 69 6e 67 20 64 61 74 61 62 61 73  standing databas
27b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
27c0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
27d0: 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68 69 6c 65 20  ons or.** while 
27e0: 61 6e 79 20 70 61 72 74 20 6f 66 20 53 51 4c 69  any part of SQLi
27f0: 74 65 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  te is otherwise 
2800: 69 6e 20 75 73 65 20 69 6e 20 61 6e 79 20 74 68  in use in any th
2810: 72 65 61 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72  read.  This.** r
2820: 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 74 68  outine is not th
2830: 72 65 61 64 73 61 66 65 2e 20 20 42 75 74 20 69  readsafe.  But i
2840: 74 20 69 73 20 73 61 66 65 20 74 6f 20 69 6e 76  t is safe to inv
2850: 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oke this routine
2860: 0a 2a 2a 20 6f 6e 20 77 68 65 6e 20 53 51 4c 69  .** on when SQLi
2870: 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 68  te is already sh
2880: 75 74 20 64 6f 77 6e 2e 20 20 49 66 20 53 51 4c  ut down.  If SQL
2890: 69 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 73  ite is already s
28a0: 68 75 74 20 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e  hut down.** when
28b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
28c0: 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65 6e 20 74   invoked, then t
28d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
28e0: 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
28f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
2900: 73 68 75 74 64 6f 77 6e 28 76 6f 69 64 29 7b 0a  shutdown(void){.
2910: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
2920: 49 54 5f 57 53 44 0a 20 20 69 6e 74 20 72 63 20  IT_WSD.  int rc 
2930: 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69 6e  = sqlite3_wsd_in
2940: 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20 20  it(4096, 24);.  
2950: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2960: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
2970: 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
2980: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2990: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
29a0: 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
29b0: 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e  E_EXTRA_SHUTDOWN
29c0: 0a 20 20 20 20 76 6f 69 64 20 53 51 4c 49 54 45  .    void SQLITE
29d0: 5f 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e 28  _EXTRA_SHUTDOWN(
29e0: 76 6f 69 64 29 3b 0a 20 20 20 20 53 51 4c 49 54  void);.    SQLIT
29f0: 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e  E_EXTRA_SHUTDOWN
2a00: 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  ();.#endif.    s
2a10: 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 3b  qlite3_os_end();
2a20: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
2a30: 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f  et_auto_extensio
2a40: 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n();.    sqlite3
2a50: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
2a60: 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  nit = 0;.  }.  i
2a70: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
2a80: 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49  Config.isPCacheI
2a90: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2aa0: 65 33 50 63 61 63 68 65 53 68 75 74 64 6f 77 6e  e3PcacheShutdown
2ab0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47  ();.    sqlite3G
2ac0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
2ad0: 61 63 68 65 49 6e 69 74 20 3d 20 30 3b 0a 20 20  acheInit = 0;.  
2ae0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2af0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61  lobalConfig.isMa
2b00: 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20  llocInit ){.    
2b10: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e 64  sqlite3MallocEnd
2b20: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47  ();.    sqlite3G
2b30: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61  lobalConfig.isMa
2b40: 6c 6c 6f 63 49 6e 69 74 20 3d 20 30 3b 0a 0a 23  llocInit = 0;..#
2b50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b60: 49 54 5f 53 48 55 54 44 4f 57 4e 5f 44 49 52 45  IT_SHUTDOWN_DIRE
2b70: 43 54 4f 52 49 45 53 0a 20 20 20 20 2f 2a 20 54  CTORIES.    /* T
2b80: 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74 65  he heap subsyste
2b90: 6d 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 73  m has now been s
2ba0: 68 75 74 64 6f 77 6e 20 61 6e 64 20 74 68 65 73  hutdown and thes
2bb0: 65 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70  e values are sup
2bc0: 70 6f 73 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20  posed.    ** to 
2bd0: 62 65 20 4e 55 4c 4c 20 6f 72 20 70 6f 69 6e 74  be NULL or point
2be0: 20 74 6f 20 6d 65 6d 6f 72 79 20 74 68 61 74 20   to memory that 
2bf0: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
2c00: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
2c10: 28 29 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68  (),.    ** which
2c20: 20 77 6f 75 6c 64 20 72 65 6c 79 20 6f 6e 20 74   would rely on t
2c30: 68 61 74 20 68 65 61 70 20 73 75 62 73 79 73 74  hat heap subsyst
2c40: 65 6d 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 6d  em; therefore, m
2c50: 61 6b 65 20 73 75 72 65 20 74 68 65 73 65 0a 20  ake sure these. 
2c60: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 63 61 6e     ** values can
2c70: 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 68 65 61  not refer to hea
2c80: 70 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61  p memory that wa
2c90: 73 20 6a 75 73 74 20 69 6e 76 61 6c 69 64 61 74  s just invalidat
2ca0: 65 64 20 77 68 65 6e 20 74 68 65 0a 20 20 20 20  ed when the.    
2cb0: 2a 2a 20 68 65 61 70 20 73 75 62 73 79 73 74 65  ** heap subsyste
2cc0: 6d 20 77 61 73 20 73 68 75 74 64 6f 77 6e 2e 20  m was shutdown. 
2cd0: 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 64 6f   This is only do
2ce0: 6e 65 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ne if the curren
2cf0: 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  t call to.    **
2d00: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
2d10: 65 73 75 6c 74 65 64 20 69 6e 20 74 68 65 20 68  esulted in the h
2d20: 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 61 63  eap subsystem ac
2d30: 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 73 68 75  tually being shu
2d40: 74 64 6f 77 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  tdown..    */.  
2d50: 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
2d60: 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20  irectory = 0;.  
2d70: 20 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64    sqlite3_temp_d
2d80: 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23 65  irectory = 0;.#e
2d90: 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 73  ndif.  }.  if( s
2da0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2db0: 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 29  ig.isMutexInit )
2dc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74  {.    sqlite3Mut
2dd0: 65 78 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  exEnd();.    sql
2de0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2df0: 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d 20 30  .isMutexInit = 0
2e00: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2e10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2e20: 0a 2a 2a 20 54 68 69 73 20 41 50 49 20 61 6c 6c  .** This API all
2e30: 6f 77 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  ows applications
2e40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 67   to modify the g
2e50: 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  lobal configurat
2e60: 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 53 51  ion of.** the SQ
2e70: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 61 74 20  Lite library at 
2e80: 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  run-time..**.** 
2e90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
2ea0: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
2eb0: 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
2ec0: 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
2ed0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
2ee0: 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f  nections or memo
2ef0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20  ry allocations. 
2f00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2f10: 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 61   not.** threadsa
2f20: 66 65 2e 20 20 46 61 69 6c 75 72 65 20 74 6f 20  fe.  Failure to 
2f30: 68 65 65 64 20 74 68 65 73 65 20 77 61 72 6e 69  heed these warni
2f40: 6e 67 73 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  ngs can lead to 
2f50: 75 6e 70 72 65 64 69 63 74 61 62 6c 65 0a 2a 2a  unpredictable.**
2f60: 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e   behavior..*/.in
2f70: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  t sqlite3_config
2f80: 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20  (int op, ...){. 
2f90: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
2fa0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2fb0: 4b 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33  K;..  /* sqlite3
2fc0: 5f 63 6f 6e 66 69 67 28 29 20 73 68 61 6c 6c 20  _config() shall 
2fd0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
2fe0: 53 55 53 45 20 69 66 20 69 74 20 69 73 20 69 6e  SUSE if it is in
2ff0: 76 6f 6b 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a  voked while.  **
3000: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
3010: 61 72 79 20 69 73 20 69 6e 20 75 73 65 2e 20 2a  ary is in use. *
3020: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  /.  if( sqlite3G
3030: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
3040: 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  it ) return SQLI
3050: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
3060: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
3070: 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op);.  switch( o
3080: 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4d 75 74  p ){..    /* Mut
3090: 65 78 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ex configuration
30a0: 20 6f 70 74 69 6f 6e 73 20 61 72 65 20 6f 6e 6c   options are onl
30b0: 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61  y available in a
30c0: 20 74 68 72 65 61 64 73 61 66 65 0a 20 20 20 20   threadsafe.    
30d0: 2a 2a 20 63 6f 6d 70 69 6c 65 2e 0a 20 20 20 20  ** compile..    
30e0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
30f0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
3100: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
3110: 41 44 53 41 46 45 3e 30 20 20 2f 2a 20 49 4d 50  ADSAFE>0  /* IMP
3120: 3a 20 52 2d 35 34 34 36 36 2d 34 36 37 35 36 20  : R-54466-46756 
3130: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3140: 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45  TE_CONFIG_SINGLE
3150: 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20  THREAD: {.      
3160: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
3170: 52 2d 30 32 37 34 38 2d 31 39 30 39 36 20 54 68  R-02748-19096 Th
3180: 69 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74  is option sets t
3190: 68 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f 64  he threading mod
31a0: 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 69  e to.      ** Si
31b0: 6e 67 6c 65 2d 74 68 72 65 61 64 2e 20 2a 2f 0a  ngle-thread. */.
31c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
31d0: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
31e0: 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a 20 44 69  utex = 0;  /* Di
31f0: 73 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63  sable mutex on c
3200: 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ore */.      sql
3210: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3220: 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b  .bFullMutex = 0;
3230: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74    /* Disable mut
3240: 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e  ex on connection
3250: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
3260: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
3270: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3280: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
3290: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
32a0: 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 32  FE>0 /* IMP: R-2
32b0: 30 35 32 30 2d 35 34 30 38 36 20 2a 2f 0a 20 20  0520-54086 */.  
32c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
32d0: 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44  NFIG_MULTITHREAD
32e0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
32f0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 33 37  DENCE-OF: R-1437
3300: 34 2d 34 32 34 36 38 20 54 68 69 73 20 6f 70 74  4-42468 This opt
3310: 69 6f 6e 20 73 65 74 73 20 74 68 65 20 74 68 72  ion sets the thr
3320: 65 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f 0a 20  eading mode to. 
3330: 20 20 20 20 20 2a 2a 20 4d 75 6c 74 69 2d 74 68       ** Multi-th
3340: 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73  read. */.      s
3350: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3360: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
3370: 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75  1;  /* Enable mu
3380: 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20  tex on core */. 
3390: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
33a0: 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
33b0: 74 65 78 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73  tex = 0;  /* Dis
33c0: 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f  able mutex on co
33d0: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  nnections */.   
33e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
33f0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
3400: 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ed(SQLITE_THREAD
3410: 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f  SAFE) && SQLITE_
3420: 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a 20  THREADSAFE>0 /* 
3430: 49 4d 50 3a 20 52 2d 35 39 35 39 33 2d 32 31 38  IMP: R-59593-218
3440: 31 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  10 */.    case S
3450: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45 52  QLITE_CONFIG_SER
3460: 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20 20  IALIZED: {.     
3470: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
3480: 20 52 2d 34 31 32 32 30 2d 35 31 38 30 30 20 54   R-41220-51800 T
3490: 68 69 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20  his option sets 
34a0: 74 68 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f  the threading mo
34b0: 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53  de to.      ** S
34c0: 65 72 69 61 6c 69 7a 65 64 2e 20 2a 2f 0a 20 20  erialized. */.  
34d0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
34e0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
34f0: 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62  ex = 1;  /* Enab
3500: 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65  le mutex on core
3510: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3520: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
3530: 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f  ullMutex = 1;  /
3540: 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f  * Enable mutex o
3550: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  n connections */
3560: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3570: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
3580: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48  efined(SQLITE_TH
3590: 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c  READSAFE) && SQL
35a0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
35b0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 33 36 36 36   /* IMP: R-63666
35c0: 2d 34 38 37 35 35 20 2a 2f 0a 20 20 20 20 63 61  -48755 */.    ca
35d0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
35e0: 5f 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20  _MUTEX: {.      
35f0: 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c  /* Specify an al
3600: 74 65 72 6e 61 74 69 76 65 20 6d 75 74 65 78 20  ternative mutex 
3610: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
3620: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3630: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65  lobalConfig.mute
3640: 78 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  x = *va_arg(ap, 
3650: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65  sqlite3_mutex_me
3660: 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62  thods*);.      b
3670: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
3680: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
3690: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
36a0: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
36b0: 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a  ADSAFE>0 /* IMP:
36c0: 20 52 2d 31 34 34 35 30 2d 33 37 35 39 37 20 2a   R-14450-37597 *
36d0: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
36e0: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54 45  E_CONFIG_GETMUTE
36f0: 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65  X: {.      /* Re
3700: 74 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65  trieve the curre
3710: 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65  nt mutex impleme
3720: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
3730: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
3740: 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f  ite3_mutex_metho
3750: 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  ds*) = sqlite3Gl
3760: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78  obalConfig.mutex
3770: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3780: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
3790: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
37a0: 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  FIG_MALLOC: {.  
37b0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
37c0: 4f 46 3a 20 52 2d 35 35 35 39 34 2d 32 31 30 33  OF: R-55594-2103
37d0: 30 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  0 The SQLITE_CON
37e0: 46 49 47 5f 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f  FIG_MALLOC optio
37f0: 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20  n takes a.      
3800: 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65  ** single argume
3810: 6e 74 20 77 68 69 63 68 20 69 73 20 61 20 70 6f  nt which is a po
3820: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
3830: 61 6e 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20  ance of the.    
3840: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d    ** sqlite3_mem
3850: 5f 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75  _methods structu
3860: 72 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  re. The argument
3870: 20 73 70 65 63 69 66 69 65 73 20 61 6c 74 65 72   specifies alter
3880: 6e 61 74 69 76 65 0a 20 20 20 20 20 20 2a 2a 20  native.      ** 
3890: 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79  low-level memory
38a0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74   allocation rout
38b0: 69 6e 65 73 20 74 6f 20 62 65 20 75 73 65 64 20  ines to be used 
38c0: 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  in place of the 
38d0: 6d 65 6d 6f 72 79 0a 20 20 20 20 20 20 2a 2a 20  memory.      ** 
38e0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69  allocation routi
38f0: 6e 65 73 20 62 75 69 6c 74 20 69 6e 74 6f 20 53  nes built into S
3900: 51 4c 69 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20  QLite. */.      
3910: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3920: 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67 28  fig.m = *va_arg(
3930: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  ap, sqlite3_mem_
3940: 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20  methods*);.     
3950: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3960: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3970: 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20  NFIG_GETMALLOC: 
3980: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
3990: 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 32 31 33 2d  NCE-OF: R-51213-
39a0: 34 36 34 31 34 20 54 68 65 20 53 51 4c 49 54 45  46414 The SQLITE
39b0: 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f  _CONFIG_GETMALLO
39c0: 43 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61  C option takes a
39d0: 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65  .      ** single
39e0: 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20   argument which 
39f0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
3a00: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
3a10: 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  he.      ** sqli
3a20: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
3a30: 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 20 73  structure. The s
3a40: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
3a50: 64 73 20 73 74 72 75 63 74 75 72 65 20 69 73 0a  ds structure is.
3a60: 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20        ** filled 
3a70: 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
3a80: 6c 79 20 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72  ly defined memor
3a90: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75  y allocation rou
3aa0: 74 69 6e 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tines. */.      
3ab0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
3ac0: 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f  lConfig.m.xMallo
3ad0: 63 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d 65  c==0 ) sqlite3Me
3ae0: 6d 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20  mSetDefault();. 
3af0: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
3b00: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
3b10: 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33  hods*) = sqlite3
3b20: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a  GlobalConfig.m;.
3b30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b40: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3b50: 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41  TE_CONFIG_MEMSTA
3b60: 54 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  TUS: {.      /* 
3b70: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
3b80: 31 32 37 35 2d 33 35 31 35 37 20 54 68 65 20 53  1275-35157 The S
3b90: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d  QLITE_CONFIG_MEM
3ba0: 53 54 41 54 55 53 20 6f 70 74 69 6f 6e 20 74 61  STATUS option ta
3bb0: 6b 65 73 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e  kes.      ** sin
3bc0: 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 6f 66 20  gle argument of 
3bd0: 74 79 70 65 20 69 6e 74 2c 20 69 6e 74 65 72 70  type int, interp
3be0: 72 65 74 65 64 20 61 73 20 61 20 62 6f 6f 6c 65  reted as a boole
3bf0: 61 6e 2c 20 77 68 69 63 68 20 65 6e 61 62 6c 65  an, which enable
3c00: 73 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 64 69  s.      ** or di
3c10: 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 6c 65  sables the colle
3c20: 63 74 69 6f 6e 20 6f 66 20 6d 65 6d 6f 72 79 20  ction of memory 
3c30: 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 74 61 74 69  allocation stati
3c40: 73 74 69 63 73 2e 20 2a 2f 0a 20 20 20 20 20 20  stics. */.      
3c50: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3c60: 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 3d 20 76  fig.bMemstat = v
3c70: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
3c80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3c90: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3ca0: 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43  TE_CONFIG_SCRATC
3cb0: 48 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  H: {.      /* EV
3cc0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 34  IDENCE-OF: R-084
3cd0: 30 34 2d 36 30 38 38 37 20 54 68 65 72 65 20 61  04-60887 There a
3ce0: 72 65 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e  re three argumen
3cf0: 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53  ts to.      ** S
3d00: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52  QLITE_CONFIG_SCR
3d10: 41 54 43 48 3a 20 41 20 70 6f 69 6e 74 65 72 20  ATCH: A pointer 
3d20: 61 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  an 8-byte aligne
3d30: 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 20  d memory buffer 
3d40: 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 77 68  from.      ** wh
3d50: 69 63 68 20 74 68 65 20 73 63 72 61 74 63 68 20  ich the scratch 
3d60: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 77 69 6c 6c  allocations will
3d70: 20 62 65 20 64 72 61 77 6e 2c 20 74 68 65 20 73   be drawn, the s
3d80: 69 7a 65 20 6f 66 20 65 61 63 68 20 73 63 72 61  ize of each scra
3d90: 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  tch.      ** all
3da0: 6f 63 61 74 69 6f 6e 20 28 73 7a 29 2c 20 61 6e  ocation (sz), an
3db0: 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  d the maximum nu
3dc0: 6d 62 65 72 20 6f 66 20 73 63 72 61 74 63 68 20  mber of scratch 
3dd0: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 28 4e 29 2e  allocations (N).
3de0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3df0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
3e00: 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28  cratch = va_arg(
3e10: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
3e20: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3e30: 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68 20  onfig.szScratch 
3e40: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
3e50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3e60: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63  GlobalConfig.nSc
3e70: 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61  ratch = va_arg(a
3e80: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3e90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3ea0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3eb0: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a  IG_PAGECACHE: {.
3ec0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3ed0: 45 2d 4f 46 3a 20 52 2d 33 31 34 30 38 2d 34 30  E-OF: R-31408-40
3ee0: 35 31 30 20 54 68 65 72 65 20 61 72 65 20 74 68  510 There are th
3ef0: 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ree arguments to
3f00: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
3f10: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
3f20: 45 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  E: A pointer to 
3f30: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d  8-byte aligned m
3f40: 65 6d 6f 72 79 2c 20 74 68 65 20 73 69 7a 65 0a  emory, the size.
3f50: 20 20 20 20 20 20 2a 2a 20 6f 66 20 65 61 63 68        ** of each
3f60: 20 70 61 67 65 20 62 75 66 66 65 72 20 28 73 7a   page buffer (sz
3f70: 29 2c 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ), and the numbe
3f80: 72 20 6f 66 20 70 61 67 65 73 20 28 4e 29 2e 20  r of pages (N). 
3f90: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3fa0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61  GlobalConfig.pPa
3fb0: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
3fc0: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
3fd0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3fe0: 67 2e 73 7a 50 61 67 65 20 3d 20 76 61 5f 61 72  g.szPage = va_ar
3ff0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
4000: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4010: 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20 76 61  onfig.nPage = va
4020: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
4030: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4040: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
4050: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f  E_CONFIG_PCACHE_
4060: 48 44 52 53 5a 3a 20 7b 0a 20 20 20 20 20 20 2f  HDRSZ: {.      /
4070: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
4080: 2d 33 39 31 30 30 2d 32 37 33 31 37 20 54 68 65  -39100-27317 The
4090: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
40a0: 43 41 43 48 45 5f 48 44 52 53 5a 20 6f 70 74 69  CACHE_HDRSZ opti
40b0: 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a  on takes.      *
40c0: 2a 20 61 20 73 69 6e 67 6c 65 20 70 61 72 61 6d  * a single param
40d0: 65 74 65 72 20 77 68 69 63 68 20 69 73 20 61 20  eter which is a 
40e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
40f0: 74 65 67 65 72 20 61 6e 64 20 77 72 69 74 65 73  teger and writes
4100: 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74   into.      ** t
4110: 68 61 74 20 69 6e 74 65 67 65 72 20 74 68 65 20  hat integer the 
4120: 6e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  number of extra 
4130: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 72  bytes per page r
4140: 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68  equired for each
4150: 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
4160: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  n SQLITE_CONFIG_
4170: 50 41 47 45 43 41 43 48 45 2e 20 2a 2f 0a 20 20  PAGECACHE. */.  
4180: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
4190: 69 6e 74 2a 29 20 3d 20 0a 20 20 20 20 20 20 20  int*) = .       
41a0: 20 20 20 73 71 6c 69 74 65 33 48 65 61 64 65 72     sqlite3Header
41b0: 53 69 7a 65 42 74 72 65 65 28 29 20 2b 0a 20 20  SizeBtree() +.  
41c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
41d0: 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 28  eaderSizePcache(
41e0: 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ) +.          sq
41f0: 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 50  lite3HeaderSizeP
4200: 63 61 63 68 65 31 28 29 3b 0a 20 20 20 20 20 20  cache1();.      
4210: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
4220: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
4230: 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20  NFIG_PCACHE: {. 
4240: 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f       /* no-op */
4250: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4260: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
4270: 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43  ITE_CONFIG_GETPC
4280: 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ACHE: {.      /*
4290: 20 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a 2f   now an error */
42a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
42b0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
42c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
42d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
42e0: 4e 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b 0a  NFIG_PCACHE2: {.
42f0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
4300: 45 2d 4f 46 3a 20 52 2d 36 33 33 32 35 2d 34 38  E-OF: R-63325-48
4310: 33 37 38 20 54 68 65 20 53 51 4c 49 54 45 5f 43  378 The SQLITE_C
4320: 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 20 6f 70  ONFIG_PCACHE2 op
4330: 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20  tion takes a.   
4340: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67     ** single arg
4350: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61  ument which is a
4360: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
4370: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
4380: 74 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20  thods2.      ** 
4390: 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 6f 62 6a  object. This obj
43a0: 65 63 74 20 73 70 65 63 69 66 69 65 73 20 74 68  ect specifies th
43b0: 65 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 61  e interface to a
43c0: 20 63 75 73 74 6f 6d 20 70 61 67 65 20 63 61 63   custom page cac
43d0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  he.      ** impl
43e0: 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20  ementation. */. 
43f0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4400: 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32  alConfig.pcache2
4410: 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73   = *va_arg(ap, s
4420: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
4430: 74 68 6f 64 73 32 2a 29 3b 0a 20 20 20 20 20 20  thods2*);.      
4440: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4450: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4460: 46 49 47 5f 47 45 54 50 43 41 43 48 45 32 3a 20  FIG_GETPCACHE2: 
4470: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
4480: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 30 33 35 2d  NCE-OF: R-22035-
4490: 34 36 31 38 32 20 54 68 65 20 53 51 4c 49 54 45  46182 The SQLITE
44a0: 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48  _CONFIG_GETPCACH
44b0: 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  E2 option takes 
44c0: 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c  a.      ** singl
44d0: 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68  e argument which
44e0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
44f0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 70 63 61 63   an sqlite3_pcac
4500: 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20 20  he_methods2.    
4510: 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 53 51 4c    ** object. SQL
4520: 69 74 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ite copies of th
4530: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
4540: 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ache implementat
4550: 69 6f 6e 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a  ion into.      *
4560: 2a 20 74 68 61 74 20 6f 62 6a 65 63 74 2e 20 2a  * that object. *
4570: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
4580: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4590: 70 63 61 63 68 65 32 2e 78 49 6e 69 74 3d 3d 30  pcache2.xInit==0
45a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
45b0: 74 65 33 50 43 61 63 68 65 53 65 74 44 65 66 61  te3PCacheSetDefa
45c0: 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ult();.      }. 
45d0: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
45e0: 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f   sqlite3_pcache_
45f0: 6d 65 74 68 6f 64 73 32 2a 29 20 3d 20 73 71 6c  methods2*) = sql
4600: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4610: 2e 70 63 61 63 68 65 32 3b 0a 20 20 20 20 20 20  .pcache2;.      
4620: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 2f 2a  break;.    }../*
4630: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
4640: 30 36 36 32 36 2d 31 32 39 31 31 20 54 68 65 20  06626-12911 The 
4650: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45  SQLITE_CONFIG_HE
4660: 41 50 20 6f 70 74 69 6f 6e 20 69 73 20 6f 6e 6c  AP option is onl
4670: 79 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 69  y.** available i
4680: 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  f SQLite is comp
4690: 69 6c 65 64 20 77 69 74 68 20 65 69 74 68 65 72  iled with either
46a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
46b0: 45 4d 53 59 53 33 20 6f 72 0a 2a 2a 20 53 51 4c  EMSYS3 or.** SQL
46c0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
46d0: 53 35 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53  S5 and returns S
46e0: 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 69  QLITE_ERROR if i
46f0: 6e 76 6f 6b 65 64 20 6f 74 68 65 72 77 69 73 65  nvoked otherwise
4700: 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  . */.#if defined
4710: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d  (SQLITE_ENABLE_M
4720: 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69 6e  EMSYS3) || defin
4730: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
4740: 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63 61  _MEMSYS5).    ca
4750: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
4760: 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20 2f  _HEAP: {.      /
4770: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
4780: 2d 31 39 38 35 34 2d 34 32 31 32 36 20 54 68 65  -19854-42126 The
4790: 72 65 20 61 72 65 20 74 68 72 65 65 20 61 72 67  re are three arg
47a0: 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20 20  uments to.      
47b0: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ** SQLITE_CONFIG
47c0: 5f 48 45 41 50 3a 20 41 6e 20 38 2d 62 79 74 65  _HEAP: An 8-byte
47d0: 20 61 6c 69 67 6e 65 64 20 70 6f 69 6e 74 65 72   aligned pointer
47e0: 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20   to the memory, 
47f0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d  the.      ** num
4800: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
4810: 74 68 65 20 6d 65 6d 6f 72 79 20 62 75 66 66 65  the memory buffe
4820: 72 2c 20 61 6e 64 20 74 68 65 20 6d 69 6e 69 6d  r, and the minim
4830: 75 6d 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69  um allocation si
4840: 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
4850: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4860: 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 76  Config.pHeap = v
4870: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
4880: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4890: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61  lobalConfig.nHea
48a0: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  p = va_arg(ap, i
48b0: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
48c0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
48d0: 6e 52 65 71 20 3d 20 76 61 5f 61 72 67 28 61 70  nReq = va_arg(ap
48e0: 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20 20 20 69  , int);..      i
48f0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
4900: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c 31 20 29  Config.mnReq<1 )
4910: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4920: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
4930: 52 65 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Req = 1;.      }
4940: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
4950: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52  GlobalConfig.mnR
4960: 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b 0a 20 20  eq>(1<<12) ){.  
4970: 20 20 20 20 20 20 2f 2a 20 63 61 70 20 6d 69 6e        /* cap min
4980: 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 61 74   request size at
4990: 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20 20 20 20   2^12 */.       
49a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
49b0: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 28 31 3c  nfig.mnReq = (1<
49c0: 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  <12);.      }.. 
49d0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
49e0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
49f0: 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ap==0 ){.       
4a00: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
4a10: 20 52 2d 34 39 39 32 30 2d 36 30 31 38 39 20 49   R-49920-60189 I
4a20: 66 20 74 68 65 20 66 69 72 73 74 20 70 6f 69 6e  f the first poin
4a30: 74 65 72 20 28 74 68 65 20 6d 65 6d 6f 72 79 20  ter (the memory 
4a40: 70 6f 69 6e 74 65 72 29 0a 20 20 20 20 20 20 20  pointer).       
4a50: 20 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65   ** is NULL, the
4a60: 6e 20 53 51 4c 69 74 65 20 72 65 76 65 72 74 73  n SQLite reverts
4a70: 20 74 6f 20 75 73 69 6e 67 20 69 74 73 20 64 65   to using its de
4a80: 66 61 75 6c 74 20 6d 65 6d 6f 72 79 20 61 6c 6c  fault memory all
4a90: 6f 63 61 74 6f 72 0a 20 20 20 20 20 20 20 20 2a  ocator.        *
4aa0: 2a 20 28 74 68 65 20 73 79 73 74 65 6d 20 6d 61  * (the system ma
4ab0: 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e 74  lloc() implement
4ac0: 61 74 69 6f 6e 29 2c 20 75 6e 64 6f 69 6e 67 20  ation), undoing 
4ad0: 61 6e 79 20 70 72 69 6f 72 20 69 6e 76 6f 63 61  any prior invoca
4ae0: 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 20 20  tion of.        
4af0: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ** SQLITE_CONFIG
4b00: 5f 4d 41 4c 4c 4f 43 2e 0a 20 20 20 20 20 20 20  _MALLOC..       
4b10: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 53   **.        ** S
4b20: 65 74 74 69 6e 67 20 73 71 6c 69 74 65 33 47 6c  etting sqlite3Gl
4b30: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 74 6f 20  obalConfig.m to 
4b40: 61 6c 6c 20 7a 65 72 6f 73 20 77 69 6c 6c 20 63  all zeros will c
4b50: 61 75 73 65 20 6d 61 6c 6c 6f 63 20 74 6f 0a 20  ause malloc to. 
4b60: 20 20 20 20 20 20 20 2a 2a 20 72 65 76 65 72 74         ** revert
4b70: 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c 74 20   to its default 
4b80: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77  implementation w
4b90: 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  hen sqlite3_init
4ba0: 69 61 6c 69 7a 65 28 29 20 69 73 20 72 75 6e 0a  ialize() is run.
4bb0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
4bc0: 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74     memset(&sqlit
4bd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4be0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
4bf0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4c00: 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  m));.      }else
4c10: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
4c20: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 30 30  DENCE-OF: R-6100
4c30: 36 2d 30 38 39 31 38 20 49 66 20 74 68 65 20 6d  6-08918 If the m
4c40: 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 20 69 73  emory pointer is
4c50: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 74   not NULL then t
4c60: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  he.        ** al
4c70: 74 65 72 6e 61 74 69 76 65 20 6d 65 6d 6f 72 79  ternative memory
4c80: 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6e   allocator is en
4c90: 67 61 67 65 64 20 74 6f 20 68 61 6e 64 6c 65 20  gaged to handle 
4ca0: 61 6c 6c 20 6f 66 20 53 51 4c 69 74 65 73 0a 20  all of SQLites. 
4cb0: 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79         ** memory
4cc0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6e 65 65 64   allocation need
4cd0: 73 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s. */.#ifdef SQL
4ce0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4cf0: 53 33 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  S3.        sqlit
4d00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4d10: 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65   = *sqlite3MemGe
4d20: 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23 65 6e 64  tMemsys3();.#end
4d30: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
4d40: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 0a  _ENABLE_MEMSYS5.
4d50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
4d60: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20  lobalConfig.m = 
4d70: 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65  *sqlite3MemGetMe
4d80: 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64 69 66 0a  msys5();.#endif.
4d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4da0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
4db0: 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  f..    case SQLI
4dc0: 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53  TE_CONFIG_LOOKAS
4dd0: 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  IDE: {.      sql
4de0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4df0: 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76  .szLookaside = v
4e00: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
4e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4e20: 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61  balConfig.nLooka
4e30: 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70  side = va_arg(ap
4e40: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
4e50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a  eak;.    }.    .
4e60: 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 61 20      /* Record a 
4e70: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c  pointer to the l
4e80: 6f 67 67 65 72 20 66 75 6e 63 74 69 6f 6e 20 61  ogger function a
4e90: 6e 64 20 69 74 73 20 66 69 72 73 74 20 61 72 67  nd its first arg
4ea0: 75 6d 65 6e 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ument..    ** Th
4eb0: 65 20 64 65 66 61 75 6c 74 20 69 73 20 4e 55 4c  e default is NUL
4ec0: 4c 2e 20 20 4c 6f 67 67 69 6e 67 20 69 73 20 64  L.  Logging is d
4ed0: 69 73 61 62 6c 65 64 20 69 66 20 74 68 65 20 66  isabled if the f
4ee0: 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20  unction pointer 
4ef0: 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e 0a  is.    ** NULL..
4f00: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
4f10: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f  SQLITE_CONFIG_LO
4f20: 47 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53  G: {.      /* MS
4f30: 56 43 20 69 73 20 70 69 63 6b 79 20 61 62 6f 75  VC is picky abou
4f40: 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70  t pulling func p
4f50: 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69 73 74  trs from va list
4f60: 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74 74 70  s..      ** http
4f70: 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f  ://support.micro
4f80: 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36  soft.com/kb/4796
4f90: 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  1.      ** sqlit
4fa0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
4fb0: 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Log = va_arg(ap,
4fc0: 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 2a 2c 69   void(*)(void*,i
4fd0: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  nt,const char*))
4fe0: 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ;.      */.     
4ff0: 20 74 79 70 65 64 65 66 20 76 6f 69 64 28 2a 4c   typedef void(*L
5000: 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c  OGFUNC_t)(void*,
5010: 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  int,const char*)
5020: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
5030: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
5040: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 4c 4f   = va_arg(ap, LO
5050: 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  GFUNC_t);.      
5060: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
5070: 66 69 67 2e 70 4c 6f 67 41 72 67 20 3d 20 76 61  fig.pLogArg = va
5080: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
5090: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
50a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44    }..    /* EVID
50b0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 34 38  ENCE-OF: R-55548
50c0: 2d 33 33 38 31 37 20 54 68 65 20 63 6f 6d 70 69  -33817 The compi
50d0: 6c 65 2d 74 69 6d 65 20 73 65 74 74 69 6e 67 20  le-time setting 
50e0: 66 6f 72 20 55 52 49 20 66 69 6c 65 6e 61 6d 65  for URI filename
50f0: 73 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20  s.    ** can be 
5100: 63 68 61 6e 67 65 64 20 61 74 20 73 74 61 72 74  changed at start
5110: 2d 74 69 6d 65 20 75 73 69 6e 67 20 74 68 65 0a  -time using the.
5120: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
5130: 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
5140: 46 49 47 5f 55 52 49 2c 31 29 20 6f 72 0a 20 20  FIG_URI,1) or.  
5150: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e    ** sqlite3_con
5160: 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
5170: 47 5f 55 52 49 2c 30 29 20 63 6f 6e 66 69 67 75  G_URI,0) configu
5180: 72 61 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 20 20  ration calls..  
5190: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
51a0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 3a  LITE_CONFIG_URI:
51b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
51c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 34 35 31  ENCE-OF: R-25451
51d0: 2d 36 31 31 32 35 20 54 68 65 20 53 51 4c 49 54  -61125 The SQLIT
51e0: 45 5f 43 4f 4e 46 49 47 5f 55 52 49 20 6f 70 74  E_CONFIG_URI opt
51f0: 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e 67  ion takes a sing
5200: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75  le.      ** argu
5210: 6d 65 6e 74 20 6f 66 20 74 79 70 65 20 69 6e 74  ment of type int
5220: 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  . If non-zero, t
5230: 68 65 6e 20 55 52 49 20 68 61 6e 64 6c 69 6e 67  hen URI handling
5240: 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a 20 20 20   is globally.   
5250: 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49     ** enabled. I
5260: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
5270: 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52  is zero, then UR
5280: 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c  I handling is gl
5290: 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  obally.      ** 
52a0: 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20 20 20  disabled. */.   
52b0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
52c0: 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 20  Config.bOpenUri 
52d0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
52e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
52f0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
5300: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f  SQLITE_CONFIG_CO
5310: 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41  VERING_INDEX_SCA
5320: 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  N: {.      /* EV
5330: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 36 35  IDENCE-OF: R-365
5340: 39 32 2d 30 32 37 37 32 20 54 68 65 20 53 51 4c  92-02772 The SQL
5350: 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52  ITE_CONFIG_COVER
5360: 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41 4e 0a 20  ING_INDEX_SCAN. 
5370: 20 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 74       ** option t
5380: 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  akes a single in
5390: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 20 77  teger argument w
53a0: 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
53b0: 74 65 64 20 61 73 20 61 0a 20 20 20 20 20 20 2a  ted as a.      *
53c0: 2a 20 62 6f 6f 6c 65 61 6e 20 69 6e 20 6f 72 64  * boolean in ord
53d0: 65 72 20 74 6f 20 65 6e 61 62 6c 65 20 6f 72 20  er to enable or 
53e0: 64 69 73 61 62 6c 65 20 74 68 65 20 75 73 65 20  disable the use 
53f0: 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 69  of covering indi
5400: 63 65 73 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  ces for.      **
5410: 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
5420: 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 6f  s in the query o
5430: 70 74 69 6d 69 7a 65 72 2e 20 2a 2f 0a 20 20 20  ptimizer. */.   
5440: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
5450: 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 20 3d  Config.bUseCis =
5460: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
5470: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5480: 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
5490: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
54a0: 47 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  G.    case SQLIT
54b0: 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 3a  E_CONFIG_SQLLOG:
54c0: 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65 66   {.      typedef
54d0: 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47 46 55 4e   void(*SQLLOGFUN
54e0: 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73 71 6c 69  C_t)(void*, sqli
54f0: 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  te3*, const char
5500: 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  *, int);.      s
5510: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
5520: 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20 76 61 5f  ig.xSqllog = va_
5530: 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f 47 46 55  arg(ap, SQLLOGFU
5540: 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  NC_t);.      sql
5550: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5560: 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d 20 76 61  .pSqllogArg = va
5570: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 20 2a 29  _arg(ap, void *)
5580: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5590: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
55a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
55b0: 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b  FIG_MMAP_SIZE: {
55c0: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
55d0: 43 45 2d 4f 46 3a 20 52 2d 35 38 30 36 33 2d 33  CE-OF: R-58063-3
55e0: 38 32 35 38 20 53 51 4c 49 54 45 5f 43 4f 4e 46  8258 SQLITE_CONF
55f0: 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 20 74 61 6b  IG_MMAP_SIZE tak
5600: 65 73 20 74 77 6f 20 36 34 2d 62 69 74 0a 20 20  es two 64-bit.  
5610: 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 28      ** integer (
5620: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20 76  sqlite3_int64) v
5630: 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20 74  alues that are t
5640: 68 65 20 64 65 66 61 75 6c 74 20 6d 6d 61 70 20  he default mmap 
5650: 73 69 7a 65 20 6c 69 6d 69 74 0a 20 20 20 20 20  size limit.     
5660: 20 2a 2a 20 28 74 68 65 20 64 65 66 61 75 6c 74   ** (the default
5670: 20 73 65 74 74 69 6e 67 20 66 6f 72 20 50 52 41   setting for PRA
5680: 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65 29 20 61  GMA mmap_size) a
5690: 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  nd the maximum a
56a0: 6c 6c 6f 77 65 64 0a 20 20 20 20 20 20 2a 2a 20  llowed.      ** 
56b0: 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d 69 74 2e  mmap size limit.
56c0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
56d0: 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 20 3d  3_int64 szMmap =
56e0: 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
56f0: 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20  te3_int64);.    
5700: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
5710: 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28  mxMmap = va_arg(
5720: 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ap, sqlite3_int6
5730: 34 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  4);.      /* EVI
5740: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 33 33 36  DENCE-OF: R-5336
5750: 37 2d 34 33 31 39 30 20 49 66 20 65 69 74 68 65  7-43190 If eithe
5760: 72 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  r argument to th
5770: 69 73 20 6f 70 74 69 6f 6e 20 69 73 0a 20 20 20  is option is.   
5780: 20 20 20 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20     ** negative, 
5790: 74 68 65 6e 20 74 68 61 74 20 61 72 67 75 6d 65  then that argume
57a0: 6e 74 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  nt is changed to
57b0: 20 69 74 73 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   its compile-tim
57c0: 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 20 20 20  e default..     
57d0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49   **.      ** EVI
57e0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 39  DENCE-OF: R-3499
57f0: 33 2d 34 35 30 33 31 20 54 68 65 20 6d 61 78 69  3-45031 The maxi
5800: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 6d 6d 61 70  mum allowed mmap
5810: 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 0a 20 20   size will be.  
5820: 20 20 20 20 2a 2a 20 73 69 6c 65 6e 74 6c 79 20      ** silently 
5830: 74 72 75 6e 63 61 74 65 64 20 69 66 20 6e 65 63  truncated if nec
5840: 65 73 73 61 72 79 20 73 6f 20 74 68 61 74 20 69  essary so that i
5850: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 63 65 65  t does not excee
5860: 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  d the.      ** c
5870: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6d 61 78 69  ompile-time maxi
5880: 6d 75 6d 20 6d 6d 61 70 20 73 69 7a 65 20 73 65  mum mmap size se
5890: 74 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  t by the SQLITE_
58a0: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 0a 20 20  MAX_MMAP_SIZE.  
58b0: 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74      ** compile-t
58c0: 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20 20 20 20  ime option..    
58d0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6d    */.      if( m
58e0: 78 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d 61  xMmap<0 || mxMma
58f0: 70 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  p>SQLITE_MAX_MMA
5900: 50 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  P_SIZE ){.      
5910: 20 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49 54    mxMmap = SQLIT
5920: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b  E_MAX_MMAP_SIZE;
5930: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5940: 66 28 20 73 7a 4d 6d 61 70 3c 30 20 29 20 73 7a  f( szMmap<0 ) sz
5950: 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mmap = SQLITE_DE
5960: 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 3b  FAULT_MMAP_SIZE;
5970: 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 6d 61  .      if( szMma
5980: 70 3e 6d 78 4d 6d 61 70 29 20 73 7a 4d 6d 61 70  p>mxMmap) szMmap
5990: 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20   = mxMmap;.     
59a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
59b0: 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78  nfig.mxMmap = mx
59c0: 4d 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mmap;.      sqli
59d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
59e0: 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b  szMmap = szMmap;
59f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5a00: 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
5a10: 4f 53 5f 57 49 4e 20 26 26 20 64 65 66 69 6e 65  OS_WIN && define
5a20: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
5a30: 41 4c 4c 4f 43 29 20 2f 2a 20 49 4d 50 3a 20 52  ALLOC) /* IMP: R
5a40: 2d 30 34 37 38 30 2d 35 35 38 31 35 20 2a 2f 0a  -04780-55815 */.
5a50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5a60: 43 4f 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41  CONFIG_WIN32_HEA
5a70: 50 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 2f  PSIZE: {.      /
5a80: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5a90: 2d 33 34 39 32 36 2d 30 33 33 36 30 20 53 51 4c  -34926-03360 SQL
5aa0: 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e 33 32  ITE_CONFIG_WIN32
5ab0: 5f 48 45 41 50 53 49 5a 45 20 74 61 6b 65 73 20  _HEAPSIZE takes 
5ac0: 61 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20 2a  a 32-bit.      *
5ad0: 2a 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  * unsigned integ
5ae0: 65 72 20 76 61 6c 75 65 20 74 68 61 74 20 73 70  er value that sp
5af0: 65 63 69 66 69 65 73 20 74 68 65 20 6d 61 78 69  ecifies the maxi
5b00: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20  mum size of the 
5b10: 63 72 65 61 74 65 64 0a 20 20 20 20 20 20 2a 2a  created.      **
5b20: 20 68 65 61 70 2e 20 2a 2f 0a 20 20 20 20 20 20   heap. */.      
5b30: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
5b40: 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61  fig.nHeap = va_a
5b50: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
5b60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5b70: 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65  #endif..    case
5b80: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
5b90: 4d 41 53 5a 3a 20 7b 0a 20 20 20 20 20 20 73 71  MASZ: {.      sq
5ba0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
5bb0: 67 2e 73 7a 50 6d 61 20 3d 20 76 61 5f 61 72 67  g.szPma = va_arg
5bc0: 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  (ap, unsigned in
5bd0: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
5be0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61  .    }..    defa
5bf0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  ult: {.      rc 
5c00: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
5c10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5c20: 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28   }.  }.  va_end(
5c30: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ap);.  return rc
5c40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75  ;.}../*.** Set u
5c50: 70 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  p the lookaside 
5c60: 62 75 66 66 65 72 73 20 66 6f 72 20 61 20 64 61  buffers for a da
5c70: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
5c80: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  n..** Return SQL
5c90: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
5ca0: 73 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61  s.  .** If looka
5cb0: 73 69 64 65 20 69 73 20 61 6c 72 65 61 64 79 20  side is already 
5cc0: 61 63 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53  active, return S
5cd0: 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a  QLITE_BUSY..**.*
5ce0: 2a 20 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74  * The sz paramet
5cf0: 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  er is the number
5d00: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 65 61 63   of bytes in eac
5d10: 68 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74  h lookaside slot
5d20: 2e 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72  ..** The cnt par
5d30: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75  ameter is the nu
5d40: 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20  mber of slots.  
5d50: 49 66 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c  If pStart is NUL
5d60: 4c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66  L the.** space f
5d70: 6f 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  or the lookaside
5d80: 20 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69   memory is obtai
5d90: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
5da0: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66  _malloc()..** If
5db0: 20 70 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e   pStart is not N
5dc0: 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73  ULL then it is s
5dd0: 7a 2a 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d  z*cnt bytes of m
5de0: 65 6d 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72  emory to use for
5df0: 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64  .** the lookasid
5e00: 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  e memory..*/.sta
5e10: 74 69 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f  tic int setupLoo
5e20: 6b 61 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a  kaside(sqlite3 *
5e30: 64 62 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  db, void *pBuf, 
5e40: 69 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29  int sz, int cnt)
5e50: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
5e60: 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 0a  _OMIT_LOOKASIDE.
5e70: 20 20 76 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a    void *pStart;.
5e80: 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73    if( db->lookas
5e90: 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20 20 20 20  ide.nOut ){.    
5ea0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
5eb0: 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 72 65  SY;.  }.  /* Fre
5ec0: 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6c  e any existing l
5ed0: 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72 20  ookaside buffer 
5ee0: 66 6f 72 20 74 68 69 73 20 68 61 6e 64 6c 65 20  for this handle 
5ef0: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f  before.  ** allo
5f00: 63 61 74 69 6e 67 20 61 20 6e 65 77 20 6f 6e 65  cating a new one
5f10: 20 73 6f 20 77 65 20 64 6f 6e 27 74 20 68 61 76   so we don't hav
5f20: 65 20 74 6f 20 68 61 76 65 20 73 70 61 63 65 20  e to have space 
5f30: 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74 68 20 61  for .  ** both a
5f40: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
5f50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
5f60: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
5f70: 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ced ){.    sqlit
5f80: 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b  e3_free(db->look
5f90: 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20  aside.pStart);. 
5fa0: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 69 7a 65   }.  /* The size
5fb0: 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20   of a lookaside 
5fc0: 73 6c 6f 74 20 61 66 74 65 72 20 52 4f 55 4e 44  slot after ROUND
5fd0: 44 4f 57 4e 38 20 6e 65 65 64 73 20 74 6f 20 62  DOWN8 needs to b
5fe0: 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a 20 74 68  e larger.  ** th
5ff0: 61 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  an a pointer to 
6000: 62 65 20 75 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a  be useful..  */.
6010: 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e    sz = ROUNDDOWN
6020: 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d 50 3a 20  8(sz);  /* IMP: 
6030: 52 2d 33 33 30 33 38 2d 30 39 33 38 32 20 2a 2f  R-33038-09382 */
6040: 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69 6e 74 29  .  if( sz<=(int)
6050: 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65  sizeof(Lookaside
6060: 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d 20 30 3b  Slot*) ) sz = 0;
6070: 0a 20 20 69 66 28 20 63 6e 74 3c 30 20 29 20 63  .  if( cnt<0 ) c
6080: 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 7a  nt = 0;.  if( sz
6090: 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b  ==0 || cnt==0 ){
60a0: 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20  .    sz = 0;.   
60b0: 20 70 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 7d   pStart = 0;.  }
60c0: 65 6c 73 65 20 69 66 28 20 70 42 75 66 3d 3d 30  else if( pBuf==0
60d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
60e0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
60f0: 28 29 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d  ();.    pStart =
6100: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
6110: 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a 20 49 4d  sz*cnt );  /* IM
6120: 50 3a 20 52 2d 36 31 39 34 39 2d 33 35 37 32 37  P: R-61949-35727
6130: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
6140: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
6150: 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  ;.    if( pStart
6160: 20 29 20 63 6e 74 20 3d 20 73 71 6c 69 74 65 33   ) cnt = sqlite3
6170: 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53 74 61 72  MallocSize(pStar
6180: 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t)/sz;.  }else{.
6190: 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 42 75      pStart = pBu
61a0: 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f  f;.  }.  db->loo
61b0: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20 3d 20  kaside.pStart = 
61c0: 70 53 74 61 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f  pStart;.  db->lo
61d0: 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20  okaside.pFree = 
61e0: 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  0;.  db->lookasi
61f0: 64 65 2e 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b  de.sz = (u16)sz;
6200: 0a 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b  .  if( pStart ){
6210: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
6220: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70  LookasideSlot *p
6230: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
6240: 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c   > (int)sizeof(L
6250: 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29  ookasideSlot*) )
6260: 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61  ;.    p = (Looka
6270: 73 69 64 65 53 6c 6f 74 2a 29 70 53 74 61 72 74  sideSlot*)pStart
6280: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d  ;.    for(i=cnt-
6290: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
62a0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
62b0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46  db->lookaside.pF
62c0: 72 65 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c  ree;.      db->l
62d0: 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d  ookaside.pFree =
62e0: 20 70 3b 0a 20 20 20 20 20 20 70 20 3d 20 28 4c   p;.      p = (L
62f0: 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 26 28  ookasideSlot*)&(
6300: 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20  (u8*)p)[sz];.   
6310: 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61   }.    db->looka
6320: 73 69 64 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20  side.pEnd = p;. 
6330: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
6340: 2e 62 45 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 20  .bEnabled = 1;. 
6350: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
6360: 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 70 42 75  .bMalloced = pBu
6370: 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c  f==0 ?1:0;.  }el
6380: 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  se{.    db->look
6390: 61 73 69 64 65 2e 70 53 74 61 72 74 20 3d 20 64  aside.pStart = d
63a0: 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  b;.    db->looka
63b0: 73 69 64 65 2e 70 45 6e 64 20 3d 20 64 62 3b 0a  side.pEnd = db;.
63c0: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
63d0: 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a  e.bEnabled = 0;.
63e0: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
63f0: 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 30 3b  e.bMalloced = 0;
6400: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
6410: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41  QLITE_OMIT_LOOKA
6420: 53 49 44 45 20 2a 2f 0a 20 20 72 65 74 75 72 6e  SIDE */.  return
6430: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
6440: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6450: 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64  mutex associated
6460: 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
6470: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
6480: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 73  sqlite3_mutex *s
6490: 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28  qlite3_db_mutex(
64a0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
64b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
64c0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
64d0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
64e0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
64f0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
6500: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
6510: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6520: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
6530: 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a  db->mutex;.}../*
6540: 0a 2a 2a 20 46 72 65 65 20 75 70 20 61 73 20 6d  .** Free up as m
6550: 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 77 65  uch memory as we
6560: 20 63 61 6e 20 66 72 6f 6d 20 74 68 65 20 67 69   can from the gi
6570: 76 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ven database.** 
6580: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  connection..*/.i
6590: 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  nt sqlite3_db_re
65a0: 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c  lease_memory(sql
65b0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
65c0: 20 69 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   i;..#ifdef SQLI
65d0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
65e0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
65f0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
6600: 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
6610: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
6620: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
6630: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
6640: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69  ->mutex);.  sqli
6650: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
6660: 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  (db);.  for(i=0;
6670: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
6680: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
6690: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
66a0: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 29  t;.    if( pBt )
66b0: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70  {.      Pager *p
66c0: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
66d0: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
66e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
66f0: 65 72 53 68 72 69 6e 6b 28 70 50 61 67 65 72 29  erShrink(pPager)
6700: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
6710: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
6720: 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  ll(db);.  sqlite
6730: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
6740: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
6750: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6760: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61  ./*.** Configura
6770: 74 69 6f 6e 20 73 65 74 74 69 6e 67 73 20 66 6f  tion settings fo
6780: 72 20 61 6e 20 69 6e 64 69 76 69 64 75 61 6c 20  r an individual 
6790: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
67a0: 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ion.*/.int sqlit
67b0: 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 73 71 6c  e3_db_config(sql
67c0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 70  ite3 *db, int op
67d0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
67e0: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  t ap;.  int rc;.
67f0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f    va_start(ap, o
6800: 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p);.  switch( op
6810: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
6820: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f  ITE_DBCONFIG_LOO
6830: 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20  KASIDE: {.      
6840: 76 6f 69 64 20 2a 70 42 75 66 20 3d 20 76 61 5f  void *pBuf = va_
6850: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20  arg(ap, void*); 
6860: 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d  /* IMP: R-26835-
6870: 31 30 39 36 34 20 2a 2f 0a 20 20 20 20 20 20 69  10964 */.      i
6880: 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
6890: 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20 2f  p, int);       /
68a0: 2a 20 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32  * IMP: R-47871-2
68b0: 35 39 39 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e  5994 */.      in
68c0: 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61  t cnt = va_arg(a
68d0: 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a  p, int);      /*
68e0: 20 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35 33   IMP: R-04460-53
68f0: 33 38 36 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  386 */.      rc 
6900: 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65  = setupLookaside
6910: 28 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63  (db, pBuf, sz, c
6920: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
6930: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
6940: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61  ult: {.      sta
6950: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
6960: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f   {.        int o
6970: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  p;      /* The o
6980: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20  pcode */.       
6990: 20 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a   u32 mask;    /*
69a0: 20 4d 61 73 6b 20 6f 66 20 74 68 65 20 62 69 74   Mask of the bit
69b0: 20 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67   in sqlite3.flag
69c0: 73 20 74 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a  s to set/clear *
69d0: 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c 61 67 4f  /.      } aFlagO
69e0: 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  p[] = {.        
69f0: 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  { SQLITE_DBCONFI
6a00: 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20  G_ENABLE_FKEY,  
6a10: 20 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e    SQLITE_Foreign
6a20: 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20 20 20 20  Keys    },.     
6a30: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
6a40: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47  NFIG_ENABLE_TRIG
6a50: 47 45 52 2c 20 53 51 4c 49 54 45 5f 45 6e 61 62  GER, SQLITE_Enab
6a60: 6c 65 54 72 69 67 67 65 72 20 20 7d 2c 0a 20 20  leTrigger  },.  
6a70: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 75 6e 73      };.      uns
6a80: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20  igned int i;.   
6a90: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
6aa0: 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  RROR; /* IMP: R-
6ab0: 34 32 37 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20  42790-23372 */. 
6ac0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
6ad0: 41 72 72 61 79 53 69 7a 65 28 61 46 6c 61 67 4f  ArraySize(aFlagO
6ae0: 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  p); i++){.      
6af0: 20 20 69 66 28 20 61 46 6c 61 67 4f 70 5b 69 5d    if( aFlagOp[i]
6b00: 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 20  .op==op ){.     
6b10: 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 20 3d       int onoff =
6b20: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
6b30: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
6b40: 2a 70 52 65 73 20 3d 20 76 61 5f 61 72 67 28 61  *pRes = va_arg(a
6b50: 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20  p, int*);.      
6b60: 20 20 20 20 69 6e 74 20 6f 6c 64 46 6c 61 67 73      int oldFlags
6b70: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
6b80: 20 20 20 20 20 20 20 20 69 66 28 20 6f 6e 6f 66          if( onof
6b90: 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  f>0 ){.         
6ba0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
6bb0: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b  aFlagOp[i].mask;
6bc0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
6bd0: 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b   if( onoff==0 ){
6be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
6bf0: 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46 6c 61 67  >flags &= ~aFlag
6c00: 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20  Op[i].mask;.    
6c10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6c20: 20 20 69 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d    if( oldFlags!=
6c30: 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20  db->flags ){.   
6c40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6c50: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
6c60: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
6c70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6c80: 20 20 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a      if( pRes ){.
6c90: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
6ca0: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
6cb0: 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b   aFlagOp[i].mask
6cc0: 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )!=0;.          
6cd0: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
6ce0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
6cf0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6d00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6d10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6d20: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
6d30: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
6d40: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
6d50: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 62 75  n true if the bu
6d60: 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63  ffer z[0..n-1] c
6d70: 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70 61 63  ontains all spac
6d80: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
6d90: 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73  t allSpaces(cons
6da0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
6db0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  ){.  while( n>0 
6dc0: 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29  && z[n-1]==' ' )
6dd0: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72  { n--; }.  retur
6de0: 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n n==0;.}../*.**
6df0: 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
6e00: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66  ault collating f
6e10: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42  unction named "B
6e20: 49 4e 41 52 59 22 20 77 68 69 63 68 20 69 73 20  INARY" which is 
6e30: 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61  always.** availa
6e40: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
6e50: 65 20 70 61 64 46 6c 61 67 20 61 72 67 75 6d 65  e padFlag argume
6e60: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  nt is not NULL t
6e70: 68 65 6e 20 73 70 61 63 65 20 70 61 64 64 69 6e  hen space paddin
6e80: 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20  g at the end.** 
6e90: 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20 69 67  of strings is ig
6ea0: 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 6d 70  nored.  This imp
6eb0: 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54 52 49  lements the RTRI
6ec0: 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  M collation..*/.
6ed0: 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e 43 6f  static int binCo
6ee0: 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  llFunc(.  void *
6ef0: 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e  padFlag,.  int n
6f00: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
6f10: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
6f20: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
6f30: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
6f40: 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b   rc, n;.  n = nK
6f50: 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79  ey1<nKey2 ? nKey
6f60: 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 2f 2a 20  1 : nKey2;.  /* 
6f70: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
6f80: 35 30 33 33 2d 32 38 34 34 39 20 54 68 65 20 62  5033-28449 The b
6f90: 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52 59 20 63  uilt-in BINARY c
6fa0: 6f 6c 6c 61 74 69 6f 6e 20 63 6f 6d 70 61 72 65  ollation compare
6fb0: 73 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 62  s.  ** strings b
6fc0: 79 74 65 20 62 79 20 62 79 74 65 20 75 73 69 6e  yte by byte usin
6fd0: 67 20 74 68 65 20 6d 65 6d 63 6d 70 28 29 20 66  g the memcmp() f
6fe0: 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  unction from the
6ff0: 20 73 74 61 6e 64 61 72 64 20 43 0a 20 20 2a 2a   standard C.  **
7000: 20 6c 69 62 72 61 72 79 2e 20 2a 2f 0a 20 20 72   library. */.  r
7010: 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31  c = memcmp(pKey1
7020: 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69  , pKey2, n);.  i
7030: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
7040: 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20 20 20  if( padFlag.    
7050: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
7060: 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20  char*)pKey1)+n, 
7070: 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20 26 26  nKey1-n).     &&
7080: 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61   allSpaces(((cha
7090: 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65  r*)pKey2)+n, nKe
70a0: 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20  y2-n).    ){.   
70b0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
70c0: 46 3a 20 52 2d 33 31 36 32 34 2d 32 34 37 33 37  F: R-31624-24737
70d0: 20 52 54 52 49 4d 20 69 73 20 6c 69 6b 65 20 42   RTRIM is like B
70e0: 49 4e 41 52 59 20 65 78 63 65 70 74 20 74 68 61  INARY except tha
70f0: 74 20 65 78 74 72 61 0a 20 20 20 20 20 20 2a 2a  t extra.      **
7100: 20 73 70 61 63 65 73 20 61 74 20 74 68 65 20 65   spaces at the e
7110: 6e 64 20 6f 66 20 65 69 74 68 65 72 20 73 74 72  nd of either str
7120: 69 6e 67 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67  ing do not chang
7130: 65 20 74 68 65 20 72 65 73 75 6c 74 2e 20 49 6e  e the result. In
7140: 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20   other.      ** 
7150: 77 6f 72 64 73 2c 20 73 74 72 69 6e 67 73 20 77  words, strings w
7160: 69 6c 6c 20 63 6f 6d 70 61 72 65 20 65 71 75 61  ill compare equa
7170: 6c 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72  l to one another
7180: 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 79   as long as they
7190: 0a 20 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72  .      ** differ
71a0: 20 6f 6e 6c 79 20 69 6e 20 74 68 65 20 6e 75 6d   only in the num
71b0: 62 65 72 20 6f 66 20 73 70 61 63 65 73 20 61 74  ber of spaces at
71c0: 20 74 68 65 20 65 6e 64 2e 0a 20 20 20 20 20 20   the end..      
71d0: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
71e0: 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d      rc = nKey1 -
71f0: 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20   nKey2;.    }.  
7200: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
7210: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20  ../*.** Another 
7220: 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69  built-in collati
7230: 6e 67 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43  ng sequence: NOC
7240: 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ASE. .**.** This
7250: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
7260: 6e 63 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20  nce is intended 
7270: 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 22  to be used for "
7280: 63 61 73 65 20 69 6e 64 65 70 65 6e 64 65 6e 74  case independent
7290: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e  .** comparison".
72a0: 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65   SQLite's knowle
72b0: 64 67 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64  dge of upper and
72c0: 20 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75 69   lower case equi
72d0: 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e  valents.** exten
72e0: 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32  ds only to the 2
72f0: 36 20 63 68 61 72 61 63 74 65 72 73 20 75 73 65  6 characters use
7300: 64 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68  d in the English
7310: 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a   language..**.**
7320: 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74   At the moment t
7330: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55  here is only a U
7340: 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74  TF-8 implementat
7350: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
7360: 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69  nt nocaseCollati
7370: 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  ngFunc(.  void *
7380: 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e  NotUsed,.  int n
7390: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
73a0: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
73b0: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
73c0: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
73d0: 20 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e   r = sqlite3StrN
73e0: 49 43 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e  ICmp(.      (con
73f0: 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c  st char *)pKey1,
7400: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
7410: 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65  Key2, (nKey1<nKe
7420: 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29  y2)?nKey1:nKey2)
7430: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
7440: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
7450: 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20   if( 0==r ){.   
7460: 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32   r = nKey1-nKey2
7470: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
7480: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7490: 6e 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74  n the ROWID of t
74a0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69  he most recent i
74b0: 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f  nsert.*/.sqlite_
74c0: 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c 61  int64 sqlite3_la
74d0: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
74e0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
74f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7500: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
7510: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
7520: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
7530: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
7540: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
7550: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7560: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
7570: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d  db->lastRowid;.}
7580: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7590: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
75a0: 6e 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74  nges in the most
75b0: 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20   recent call to 
75c0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a  sqlite3_exec()..
75d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
75e0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
75f0: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
7600: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
7610: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
7620: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
7630: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
7640: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
7650: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
7660: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
7670: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e  return db->nChan
7680: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ge;.}../*.** Ret
7690: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
76a0: 66 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65 20  f changes since 
76b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
76c0: 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  dle was opened..
76d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  */.int sqlite3_t
76e0: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c  otal_changes(sql
76f0: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65  ite3 *db){.#ifde
7700: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7710: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
7720: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
7730: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
7740: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
7750: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
7760: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
7770: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  dif.  return db-
7780: 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d  >nTotalChange;.}
7790: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
77a0: 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
77b0: 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
77c0: 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65   only manipulate
77d0: 73 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a  s fields of the.
77e0: 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
77f0: 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f  le object, it do
7800: 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79  es not close any
7810: 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74   savepoints that
7820: 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20   may be open.** 
7830: 61 74 20 74 68 65 20 62 2d 74 72 65 65 2f 70 61  at the b-tree/pa
7840: 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f  ger level..*/.vo
7850: 69 64 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53  id sqlite3CloseS
7860: 61 76 65 70 6f 69 6e 74 73 28 73 71 6c 69 74 65  avepoints(sqlite
7870: 33 20 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65 28  3 *db){.  while(
7880: 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
7890: 29 7b 0a 20 20 20 20 53 61 76 65 70 6f 69 6e 74  ){.    Savepoint
78a0: 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61   *pTmp = db->pSa
78b0: 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d  vepoint;.    db-
78c0: 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54  >pSavepoint = pT
78d0: 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  mp->pNext;.    s
78e0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
78f0: 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62   pTmp);.  }.  db
7900: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->nSavepoint = 0
7910: 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  ;.  db->nStateme
7920: 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73  nt = 0;.  db->is
7930: 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70  TransactionSavep
7940: 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  oint = 0;.}../*.
7950: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 64 65  ** Invoke the de
7960: 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f  structor functio
7970: 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  n associated wit
7980: 68 20 46 75 6e 63 44 65 66 20 70 2c 20 69 66 20  h FuncDef p, if 
7990: 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20  any. Except,.** 
79a0: 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  if this is not t
79b0: 68 65 20 6c 61 73 74 20 63 6f 70 79 20 6f 66 20  he last copy of 
79c0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f  the function, do
79d0: 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20   not invoke it. 
79e0: 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69  Multiple.** copi
79f0: 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 66  es of a single f
7a00: 75 6e 63 74 69 6f 6e 20 61 72 65 20 63 72 65 61  unction are crea
7a10: 74 65 64 20 77 68 65 6e 20 63 72 65 61 74 65 5f  ted when create_
7a20: 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 63 61  function() is ca
7a30: 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c  lled.** with SQL
7a40: 49 54 45 5f 41 4e 59 20 61 73 20 74 68 65 20 65  ITE_ANY as the e
7a50: 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ncoding..*/.stat
7a60: 69 63 20 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e  ic void function
7a70: 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33 20  Destroy(sqlite3 
7a80: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 29  *db, FuncDef *p)
7a90: 7b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74  {.  FuncDestruct
7aa0: 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 20  or *pDestructor 
7ab0: 3d 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72  = p->pDestructor
7ac0: 3b 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63  ;.  if( pDestruc
7ad0: 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74  tor ){.    pDest
7ae0: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a  ructor->nRef--;.
7af0: 20 20 20 20 69 66 28 20 70 44 65 73 74 72 75 63      if( pDestruc
7b00: 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  tor->nRef==0 ){.
7b10: 20 20 20 20 20 20 70 44 65 73 74 72 75 63 74 6f        pDestructo
7b20: 72 2d 3e 78 44 65 73 74 72 6f 79 28 70 44 65 73  r->xDestroy(pDes
7b30: 74 72 75 63 74 6f 72 2d 3e 70 55 73 65 72 44 61  tructor->pUserDa
7b40: 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ta);.      sqlit
7b50: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65  e3DbFree(db, pDe
7b60: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d  structor);.    }
7b70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  .  }.}../*.** Di
7b80: 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71 6c  sconnect all sql
7b90: 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74  ite3_vtab object
7ba0: 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  s that belong to
7bb0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
7bc0: 74 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69 73  tion.** db. This
7bd0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
7be0: 64 62 20 69 73 20 62 65 69 6e 67 20 63 6c 6f 73  db is being clos
7bf0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
7c00: 69 64 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c  id disconnectAll
7c10: 56 74 61 62 28 73 71 6c 69 74 65 33 20 2a 64 62  Vtab(sqlite3 *db
7c20: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
7c30: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
7c40: 42 4c 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20 48  BLE.  int i;.  H
7c50: 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 73 71  ashElem *p;.  sq
7c60: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
7c70: 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d  ll(db);.  for(i=
7c80: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
7c90: 2b 29 7b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a  +){.    Schema *
7ca0: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
7cb0: 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  b[i].pSchema;.  
7cc0: 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d    if( db->aDb[i]
7cd0: 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
7ce0: 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61    for(p=sqliteHa
7cf0: 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61  shFirst(&pSchema
7d00: 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 3b 20 70  ->tblHash); p; p
7d10: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
7d20: 70 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62  p)){.        Tab
7d30: 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c  le *pTab = (Tabl
7d40: 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  e *)sqliteHashDa
7d50: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  ta(p);.        i
7d60: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
7d70: 62 29 20 29 20 73 71 6c 69 74 65 33 56 74 61 62  b) ) sqlite3Vtab
7d80: 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70  Disconnect(db, p
7d90: 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
7da0: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 3d    }.  }.  for(p=
7db0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
7dc0: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 70  &db->aModule); p
7dd0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
7de0: 78 74 28 70 29 29 7b 0a 20 20 20 20 4d 6f 64 75  xt(p)){.    Modu
7df0: 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75  le *pMod = (Modu
7e00: 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  le *)sqliteHashD
7e10: 61 74 61 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ata(p);.    if( 
7e20: 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 20 29 7b  pMod->pEpoTab ){
7e30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
7e40: 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c  abDisconnect(db,
7e50: 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 29 3b   pMod->pEpoTab);
7e60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
7e70: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
7e80: 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  st(db);.  sqlite
7e90: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
7ea0: 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  b);.#else.  UNUS
7eb0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
7ec0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
7ed0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
7ee0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
7ef0: 74 69 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69  tion db has unfi
7f00: 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64  nalized prepared
7f10: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  .** statements o
7f20: 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c  r unfinished sql
7f30: 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65  ite3_backup obje
7f40: 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  cts.  .*/.static
7f50: 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49   int connectionI
7f60: 73 42 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64  sBusy(sqlite3 *d
7f70: 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61  b){.  int j;.  a
7f80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7f90: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
7fa0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62  tex) );.  if( db
7fb0: 2d 3e 70 56 64 62 65 20 29 20 72 65 74 75 72 6e  ->pVdbe ) return
7fc0: 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   1;.  for(j=0; j
7fd0: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
7fe0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
7ff0: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b   db->aDb[j].pBt;
8000: 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
8010: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
8020: 42 61 63 6b 75 70 28 70 42 74 29 20 29 20 72 65  Backup(pBt) ) re
8030: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
8040: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
8050: 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69   Close an existi
8060: 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ng SQLite databa
8070: 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  se.*/.static int
8080: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71   sqlite3Close(sq
8090: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66  lite3 *db, int f
80a0: 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69  orceZombie){.  i
80b0: 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 2f 2a  f( !db ){.    /*
80c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
80d0: 36 33 32 35 37 2d 31 31 37 34 30 20 43 61 6c 6c  63257-11740 Call
80e0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  ing sqlite3_clos
80f0: 65 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  e() or.    ** sq
8100: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29  lite3_close_v2()
8110: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f 69   with a NULL poi
8120: 6e 74 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73  nter argument is
8130: 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f   a harmless no-o
8140: 70 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  p. */.    return
8150: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
8160: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
8170: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
8180: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
8190: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
81a0: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71  E_BKPT;.  }.  sq
81b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
81c0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  r(db->mutex);.. 
81d0: 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73 63 6f   /* Force xDisco
81e0: 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e 20 61  nnect calls on a
81f0: 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ll virtual table
8200: 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e 65 63  s */.  disconnec
8210: 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a 0a 20  tAllVtab(db);.. 
8220: 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63   /* If a transac
8230: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68  tion is open, th
8240: 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56  e disconnectAllV
8250: 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f 76 65  tab() call above
8260: 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68  .  ** will not h
8270: 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20 78  ave called the x
8280: 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74  Disconnect() met
8290: 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74 75  hod on any virtu
82a0: 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 69  al.  ** tables i
82b0: 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e  n the db->aVTran
82c0: 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20 66  s[] array. The f
82d0: 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
82e0: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20  VtabRollback(). 
82f0: 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f   ** call will do
8300: 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f 20   so. We need to 
8310: 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 74  do this before t
8320: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63 74  he check for act
8330: 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  ive.  ** SQL sta
8340: 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61  tements below, a
8350: 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69 6d  s the v-table im
8360: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79  plementation may
8370: 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a   be storing.  **
8380: 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20 73   some prepared s
8390: 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e  tatements intern
83a0: 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ally..  */.  sql
83b0: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
83c0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65 67 61  (db);..  /* Lega
83d0: 63 79 20 62 65 68 61 76 69 6f 72 20 28 73 71 6c  cy behavior (sql
83e0: 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62 65 68  ite3_close() beh
83f0: 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72 65 74  avior) is to ret
8400: 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
8410: 42 55 53 59 20 69 66 20 74 68 65 20 63 6f 6e 6e  BUSY if the conn
8420: 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74 20 62  ection can not b
8430: 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61  e closed immedia
8440: 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
8450: 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20 26 26   !forceZombie &&
8460: 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73   connectionIsBus
8470: 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  y(db) ){.    sql
8480: 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
8490: 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  (db, SQLITE_BUSY
84a0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f  , "unable to clo
84b0: 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 61  se due to unfina
84c0: 6c 69 7a 65 64 20 22 0a 20 20 20 20 20 20 20 22  lized ".       "
84d0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e  statements or un
84e0: 66 69 6e 69 73 68 65 64 20 62 61 63 6b 75 70 73  finished backups
84f0: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ");.    sqlite3_
8500: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
8510: 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75  mutex);.    retu
8520: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
8530: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
8540: 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47  TE_ENABLE_SQLLOG
8550: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
8560: 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
8570: 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6c 6f  og ){.    /* Clo
8580: 73 69 6e 67 20 74 68 65 20 68 61 6e 64 6c 65 2e  sing the handle.
8590: 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65   Fourth paramete
85a0: 72 20 69 73 20 70 61 73 73 65 64 20 74 68 65 20  r is passed the 
85b0: 76 61 6c 75 65 20 32 2e 20 2a 2f 0a 20 20 20 20  value 2. */.    
85c0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
85d0: 66 69 67 2e 78 53 71 6c 6c 6f 67 28 73 71 6c 69  fig.xSqllog(sqli
85e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
85f0: 70 53 71 6c 6c 6f 67 41 72 67 2c 20 64 62 2c 20  pSqllogArg, db, 
8600: 30 2c 20 32 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 2);.  }.#endi
8610: 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  f..  /* Convert 
8620: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
8630: 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20 61 6e 64  nto a zombie and
8640: 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 2e 0a   then close it..
8650: 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61 67 69 63    */.  db->magic
8660: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
8670: 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c 69 74 65  ZOMBIE;.  sqlite
8680: 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c  3LeaveMutexAndCl
8690: 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29 3b 0a 20  oseZombie(db);. 
86a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
86b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20  K;.}../*.** Two 
86c0: 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20 74 68  variations on th
86d0: 65 20 70 75 62 6c 69 63 20 69 6e 74 65 72 66 61  e public interfa
86e0: 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 61  ce for closing a
86f0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
8700: 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 73 71 6c  nection. The sql
8710: 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 76 65 72  ite3_close() ver
8720: 73 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  sion returns SQL
8730: 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20  ITE_BUSY and.** 
8740: 6c 65 61 76 65 73 20 74 68 65 20 63 6f 6e 6e 65  leaves the conne
8750: 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20 69 66 20  ction option if 
8760: 74 68 65 72 65 20 61 72 65 20 75 6e 66 69 6e 61  there are unfina
8770: 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a  lized prepared.*
8780: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20  * statements or 
8790: 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74  unfinished sqlit
87a0: 65 33 5f 62 61 63 6b 75 70 73 2e 20 20 54 68 65  e3_backups.  The
87b0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
87c0: 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 66  2().** version f
87d0: 6f 72 63 65 73 20 74 68 65 20 63 6f 6e 6e 65 63  orces the connec
87e0: 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d 65 20 61  tion to become a
87f0: 20 7a 6f 6d 62 69 65 20 69 66 20 74 68 65 72 65   zombie if there
8800: 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65 64   are.** unclosed
8810: 20 72 65 73 6f 75 72 63 65 73 2c 20 61 6e 64 20   resources, and 
8820: 61 72 72 61 6e 67 65 73 20 66 6f 72 20 64 65 61  arranges for dea
8830: 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65 6e 20 74  llocation when t
8840: 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72 65 70 61  he last.** prepa
8850: 72 65 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20  re statement or 
8860: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 63  sqlite3_backup c
8870: 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  loses..*/.int sq
8880: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69  lite3_close(sqli
8890: 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e  te3 *db){ return
88a0: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62   sqlite3Close(db
88b0: 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74  ,0); }.int sqlit
88c0: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73 71 6c 69  e3_close_v2(sqli
88d0: 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e  te3 *db){ return
88e0: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62   sqlite3Close(db
88f0: 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ,1); }.../*.** C
8900: 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 6f  lose the mutex o
8910: 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  n database conne
8920: 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a 20  ction db..**.** 
8930: 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 66 20  Furthermore, if 
8940: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
8950: 69 6f 6e 20 64 62 20 69 73 20 61 20 7a 6f 6d 62  ion db is a zomb
8960: 69 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74  ie (meaning that
8970: 20 74 68 65 72 65 0a 2a 2a 20 68 61 73 20 62 65   there.** has be
8980: 65 6e 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  en a prior call 
8990: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  to sqlite3_close
89a0: 28 64 62 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  (db) or sqlite3_
89b0: 63 6c 6f 73 65 5f 76 32 28 64 62 29 29 20 61 6e  close_v2(db)) an
89c0: 64 0a 2a 2a 20 65 76 65 72 79 20 73 71 6c 69 74  d.** every sqlit
89d0: 65 33 5f 73 74 6d 74 20 68 61 73 20 6e 6f 77 20  e3_stmt has now 
89e0: 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61  been finalized a
89f0: 6e 64 20 65 76 65 72 79 20 73 71 6c 69 74 65 33  nd every sqlite3
8a00: 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a 2a 20 66  _backup has.** f
8a10: 69 6e 69 73 68 65 64 2c 20 74 68 65 6e 20 66 72  inished, then fr
8a20: 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73  ee all resources
8a30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8a40: 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c  3LeaveMutexAndCl
8a50: 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c 69 74 65  oseZombie(sqlite
8a60: 33 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c  3 *db){.  HashEl
8a70: 65 6d 20 2a 69 3b 20 20 20 20 20 20 20 20 20 20  em *i;          
8a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
8a90: 68 20 74 61 62 6c 65 20 69 74 65 72 61 74 6f 72  h table iterator
8aa0: 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20   */.  int j;..  
8ab0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
8ac0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 73 71 6c 69  outstanding sqli
8ad0: 74 65 33 5f 73 74 6d 74 20 6f 72 20 73 71 6c 69  te3_stmt or sqli
8ae0: 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63  te3_backup objec
8af0: 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  ts.  ** or if th
8b00: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  e connection has
8b10: 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6c   not yet been cl
8b20: 6f 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  osed by sqlite3_
8b30: 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20 20 2a 2a  close_v2(),.  **
8b40: 20 74 68 65 6e 20 6a 75 73 74 20 6c 65 61 76 65   then just leave
8b50: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 72   the mutex and r
8b60: 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  eturn..  */.  if
8b70: 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c  ( db->magic!=SQL
8b80: 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45  ITE_MAGIC_ZOMBIE
8b90: 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73   || connectionIs
8ba0: 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20  Busy(db) ){.    
8bb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
8bc0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
8bd0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8be0: 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
8bf0: 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
8c00: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
8c10: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
8c20: 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20 63 6c 6f  ion has.  ** clo
8c30: 73 65 64 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f  sed all sqlite3_
8c40: 73 74 6d 74 20 61 6e 64 20 73 71 6c 69 74 65 33  stmt and sqlite3
8c50: 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20  _backup objects 
8c60: 61 6e 64 20 68 61 73 20 62 65 65 6e 0a 20 20 2a  and has been.  *
8c70: 2a 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  * passed to sqli
8c80: 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65 61 6e 69  te3_close (meani
8c90: 6e 67 20 74 68 61 74 20 69 74 20 69 73 20 61 20  ng that it is a 
8ca0: 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65 72 65 66  zombie).  Theref
8cb0: 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20 61 68 65  ore,.  ** go ahe
8cc0: 61 64 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20  ad and free all 
8cd0: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 2a 2f 0a  resources..  */.
8ce0: 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73  .  /* If a trans
8cf0: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20  action is open, 
8d00: 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 54 68  roll it back. Th
8d10: 69 73 20 61 6c 73 6f 20 65 6e 73 75 72 65 73 20  is also ensures 
8d20: 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 61 6e 79  that if.  ** any
8d30: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
8d40: 73 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  s have been modi
8d50: 66 69 65 64 20 62 79 20 61 6e 20 75 6e 63 6f 6d  fied by an uncom
8d60: 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69  mitted transacti
8d70: 6f 6e 0a 20 20 2a 2a 20 74 68 65 79 20 61 72 65  on.  ** they are
8d80: 20 72 65 73 65 74 2e 20 41 6e 64 20 74 68 61 74   reset. And that
8d90: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 62 2d   the required b-
8da0: 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65  tree mutex is he
8db0: 6c 64 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20  ld to make.  ** 
8dc0: 74 68 65 20 70 61 67 65 72 20 72 6f 6c 6c 62 61  the pager rollba
8dd0: 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65  ck and schema re
8de0: 73 65 74 20 61 6e 20 61 74 6f 6d 69 63 20 6f 70  set an atomic op
8df0: 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71  eration. */.  sq
8e00: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
8e10: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
8e20: 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  ..  /* Free any 
8e30: 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61 76 65  outstanding Save
8e40: 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 73  point structures
8e50: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c  . */.  sqlite3Cl
8e60: 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
8e70: 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  );..  /* Close a
8e80: 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ll database conn
8e90: 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72  ections */.  for
8ea0: 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b  (j=0; j<db->nDb;
8eb0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   j++){.    struc
8ec0: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
8ed0: 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  >aDb[j];.    if(
8ee0: 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20   pDb->pBt ){.   
8ef0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
8f00: 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a  lose(pDb->pBt);.
8f10: 20 20 20 20 20 20 70 44 62 2d 3e 70 42 74 20 3d        pDb->pBt =
8f20: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 21   0;.      if( j!
8f30: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  =1 ){.        pD
8f40: 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a  b->pSchema = 0;.
8f50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8f60: 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65  }.  /* Clear the
8f70: 20 54 45 4d 50 20 73 63 68 65 6d 61 20 73 65 70   TEMP schema sep
8f80: 61 72 61 74 65 6c 79 20 61 6e 64 20 6c 61 73 74  arately and last
8f90: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 44   */.  if( db->aD
8fa0: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
8fb0: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
8fc0: 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b 31  aClear(db->aDb[1
8fd0: 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ].pSchema);.  }.
8fe0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c    sqlite3VtabUnl
8ff0: 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20 20  ockList(db);..  
9000: 2f 2a 20 46 72 65 65 20 75 70 20 74 68 65 20 61  /* Free up the a
9010: 72 72 61 79 20 6f 66 20 61 75 78 69 6c 69 61 72  rray of auxiliar
9020: 79 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  y databases */. 
9030: 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65   sqlite3Collapse
9040: 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62  DatabaseArray(db
9050: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
9060: 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73  >nDb<=2 );.  ass
9070: 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62  ert( db->aDb==db
9080: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a 0a  ->aDbStatic );..
9090: 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f    /* Tell the co
90a0: 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74  de in notify.c t
90b0: 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  hat the connecti
90c0: 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c  on no longer hol
90d0: 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b  ds any.  ** lock
90e0: 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72  s and does not r
90f0: 65 71 75 69 72 65 20 61 6e 79 20 66 75 72 74 68  equire any furth
9100: 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79  er unlock-notify
9110: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f   callbacks..  */
9120: 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  .  sqlite3Connec
9130: 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a  tionClosed(db);.
9140: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72  .  for(j=0; j<Ar
9150: 72 61 79 53 69 7a 65 28 64 62 2d 3e 61 46 75 6e  raySize(db->aFun
9160: 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  c.a); j++){.    
9170: 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c 20  FuncDef *pNext, 
9180: 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20 20 20  *pHash, *p;.    
9190: 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e 63 2e  for(p=db->aFunc.
91a0: 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61 73 68  a[j]; p; p=pHash
91b0: 29 7b 0a 20 20 20 20 20 20 70 48 61 73 68 20 3d  ){.      pHash =
91c0: 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20 20   p->pHash;.     
91d0: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
91e0: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73       functionDes
91f0: 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20  troy(db, p);.   
9200: 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e       pNext = p->
9210: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73  pNext;.        s
9220: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9230: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d   p);.        p =
9240: 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a   pNext;.      }.
9250: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
9260: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
9270: 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  t(&db->aCollSeq)
9280: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
9290: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43  hNext(i)){.    C
92a0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
92b0: 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74  (CollSeq *)sqlit
92c0: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
92d0: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20    /* Invoke any 
92e0: 64 65 73 74 72 75 63 74 6f 72 73 20 72 65 67 69  destructors regi
92f0: 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61  stered for colla
9300: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73  tion sequence us
9310: 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  er data. */.    
9320: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b  for(j=0; j<3; j+
9330: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  +){.      if( pC
9340: 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20  oll[j].xDel ){. 
9350: 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e         pColl[j].
9360: 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55  xDel(pColl[j].pU
9370: 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ser);.      }.  
9380: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
9390: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29  bFree(db, pColl)
93a0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
93b0: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43  ashClear(&db->aC
93c0: 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66  ollSeq);.#ifndef
93d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
93e0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28  TUALTABLE.  for(
93f0: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
9400: 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
9410: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
9420: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f  Next(i)){.    Mo
9430: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
9440: 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73  dule *)sqliteHas
9450: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
9460: 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79  ( pMod->xDestroy
9470: 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e   ){.      pMod->
9480: 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70  xDestroy(pMod->p
9490: 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Aux);.    }.    
94a0: 73 71 6c 69 74 65 33 56 74 61 62 45 70 6f 6e 79  sqlite3VtabEpony
94b0: 6d 6f 75 73 54 61 62 6c 65 43 6c 65 61 72 28 64  mousTableClear(d
94c0: 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 20 20 73 71  b, pMod);.    sq
94d0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
94e0: 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pMod);.  }.  sql
94f0: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
9500: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
9510: 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72  dif..  sqlite3Er
9520: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
9530: 4b 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  K); /* Deallocat
9540: 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72  es any cached er
9550: 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a  ror strings. */.
9560: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
9570: 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  ee(db->pErr);.  
9580: 73 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65  sqlite3CloseExte
9590: 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 23 69 66 20  nsions(db);.#if 
95a0: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
95b0: 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 73 71 6c  ENTICATION.  sql
95c0: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75  ite3_free(db->au
95d0: 74 68 2e 7a 41 75 74 68 55 73 65 72 29 3b 0a 20  th.zAuthUser);. 
95e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
95f0: 2d 3e 61 75 74 68 2e 7a 41 75 74 68 50 57 29 3b  ->auth.zAuthPW);
9600: 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d  .#endif..  db->m
9610: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
9620: 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a  GIC_ERROR;..  /*
9630: 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61   The temp-databa
9640: 73 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c  se schema is all
9650: 6f 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74  ocated different
9660: 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  ly from the othe
9670: 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62  r schema.  ** ob
9680: 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c  jects (using sql
9690: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65  iteMalloc() dire
96a0: 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66  ctly, instead of
96b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
96c0: 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20  ema())..  ** So 
96d0: 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  it needs to be f
96e0: 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a  reed here. Todo:
96f0: 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68   Why not roll th
9700: 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e  e temp schema in
9710: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  to.  ** the same
9720: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
9730: 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20  as the one that 
9740: 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61  allocates the da
9750: 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72  tabase .  ** str
9760: 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73  ucture?.  */.  s
9770: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9780: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
9790: 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ema);.  sqlite3_
97a0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
97b0: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61  mutex);.  db->ma
97c0: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
97d0: 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c  IC_CLOSED;.  sql
97e0: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
97f0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
9800: 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73  sert( db->lookas
9810: 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20  ide.nOut==0 );  
9820: 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f  /* Fails on a lo
9830: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c  okaside memory l
9840: 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  eak */.  if( db-
9850: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
9860: 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  oced ){.    sqli
9870: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f  te3_free(db->loo
9880: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a  kaside.pStart);.
9890: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
98a0: 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee(db);.}../*.**
98b0: 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61   Rollback all da
98c0: 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 20 49  tabase files.  I
98d0: 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f  f tripCode is no
98e0: 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65  t SQLITE_OK, the
98f0: 6e 0a 2a 2a 20 61 6e 79 20 77 72 69 74 65 20 63  n.** any write c
9900: 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c  ursors are inval
9910: 69 64 61 74 65 64 20 28 22 74 72 69 70 70 65 64  idated ("tripped
9920: 22 20 2d 20 61 73 20 69 6e 20 22 74 72 69 70 70  " - as in "tripp
9930: 69 6e 67 20 61 20 63 69 72 63 75 69 74 0a 2a 2a  ing a circuit.**
9940: 20 62 72 65 61 6b 65 72 22 29 20 61 6e 64 20 6d   breaker") and m
9950: 61 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74 72  ade to return tr
9960: 69 70 43 6f 64 65 20 69 66 20 74 68 65 72 65 20  ipCode if there 
9970: 61 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 0a  are any further.
9980: 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75  ** attempts to u
9990: 73 65 20 74 68 61 74 20 63 75 72 73 6f 72 2e 20  se that cursor. 
99a0: 20 52 65 61 64 20 63 75 72 73 6f 72 73 20 72 65   Read cursors re
99b0: 6d 61 69 6e 20 6f 70 65 6e 20 61 6e 64 20 76 61  main open and va
99c0: 6c 69 64 0a 2a 2a 20 62 75 74 20 61 72 65 20 22  lid.** but are "
99d0: 73 61 76 65 64 22 20 69 6e 20 63 61 73 65 20 74  saved" in case t
99e0: 68 65 20 74 61 62 6c 65 20 70 61 67 65 73 20 61  he table pages a
99f0: 72 65 20 6d 6f 76 65 64 20 61 72 6f 75 6e 64 2e  re moved around.
9a00: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9a10: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69  RollbackAll(sqli
9a20: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 74 72 69  te3 *db, int tri
9a30: 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pCode){.  int i;
9a40: 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d  .  int inTrans =
9a50: 20 30 3b 0a 20 20 69 6e 74 20 73 63 68 65 6d 61   0;.  int schema
9a60: 43 68 61 6e 67 65 3b 0a 20 20 61 73 73 65 72 74  Change;.  assert
9a70: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9a80: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
9a90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
9aa0: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
9ab0: 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 6c  ..  /* Obtain al
9ac0: 6c 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73  l b-tree mutexes
9ad0: 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 20 61   before making a
9ae0: 6e 79 20 63 61 6c 6c 73 20 74 6f 20 42 74 72 65  ny calls to Btre
9af0: 65 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 0a 20 20  eRollback(). .  
9b00: 2a 2a 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  ** This is impor
9b10: 74 61 6e 74 20 69 6e 20 63 61 73 65 20 74 68 65  tant in case the
9b20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69   transaction bei
9b30: 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 68  ng rolled back h
9b40: 61 73 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64  as.  ** modified
9b50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
9b60: 68 65 6d 61 2e 20 49 66 20 74 68 65 20 62 2d 74  hema. If the b-t
9b70: 72 65 65 20 6d 75 74 65 78 65 73 20 61 72 65 20  ree mutexes are 
9b80: 6e 6f 74 20 74 61 6b 65 6e 0a 20 20 2a 2a 20 68  not taken.  ** h
9b90: 65 72 65 2c 20 74 68 65 6e 20 61 6e 6f 74 68 65  ere, then anothe
9ba0: 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
9bb0: 6f 6e 6e 65 63 74 69 6f 6e 20 6d 69 67 68 74 20  onnection might 
9bc0: 73 6e 65 61 6b 20 69 6e 20 62 65 74 77 65 65 6e  sneak in between
9bd0: 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61  .  ** the databa
9be0: 73 65 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  se rollback and 
9bf0: 73 63 68 65 6d 61 20 72 65 73 65 74 2c 20 77 68  schema reset, wh
9c00: 69 63 68 20 63 61 6e 20 63 61 75 73 65 20 66 61  ich can cause fa
9c10: 6c 73 65 0a 20 20 2a 2a 20 63 6f 72 72 75 70 74  lse.  ** corrupt
9c20: 69 6f 6e 20 72 65 70 6f 72 74 73 20 69 6e 20 73  ion reports in s
9c30: 6f 6d 65 20 63 61 73 65 73 2e 20 20 2a 2f 0a 20  ome cases.  */. 
9c40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
9c50: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 73 63 68  erAll(db);.  sch
9c60: 65 6d 61 43 68 61 6e 67 65 20 3d 20 28 64 62 2d  emaChange = (db-
9c70: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
9c80: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21 3d  InternChanges)!=
9c90: 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75  0 && db->init.bu
9ca0: 73 79 3d 3d 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  sy==0;..  for(i=
9cb0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
9cc0: 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  +){.    Btree *p
9cd0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
9ce0: 74 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  t;.    if( p ){.
9cf0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9d00: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
9d10: 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  p) ){.        in
9d20: 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20  Trans = 1;.     
9d30: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
9d40: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c  BtreeRollback(p,
9d50: 20 74 72 69 70 43 6f 64 65 2c 20 21 73 63 68 65   tripCode, !sche
9d60: 6d 61 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 7d  maChange);.    }
9d70: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74  .  }.  sqlite3Vt
9d80: 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a  abRollback(db);.
9d90: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
9da0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69  gnMalloc();..  i
9db0: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51  f( (db->flags&SQ
9dc0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
9dd0: 65 73 29 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e  es)!=0 && db->in
9de0: 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20  it.busy==0 ){.  
9df0: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
9e00: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
9e10: 73 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  s(db);.    sqlit
9e20: 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61  e3ResetAllSchema
9e30: 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62  sOfConnection(db
9e40: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
9e50: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
9e60: 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66  );..  /* Any def
9e70: 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
9e80: 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65   violations have
9e90: 20 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c 76   now been resolv
9ea0: 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65  ed. */.  db->nDe
9eb0: 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a  ferredCons = 0;.
9ec0: 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49    db->nDeferredI
9ed0: 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62  mmCons = 0;.  db
9ee0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
9ef0: 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 0a 20 20  TE_DeferFKs;..  
9f00: 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62 65  /* If one has be
9f10: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69  en configured, i
9f20: 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61  nvoke the rollba
9f30: 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b  ck-hook callback
9f40: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 52   */.  if( db->xR
9f50: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20  ollbackCallback 
9f60: 26 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21  && (inTrans || !
9f70: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20  db->autoCommit) 
9f80: 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c  ){.    db->xRoll
9f90: 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d  backCallback(db-
9fa0: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a  >pRollbackArg);.
9fb0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
9fc0: 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72  urn a static str
9fd0: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
9fe0: 68 65 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f  he name correspo
9ff0: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 65 72 72  nding to the err
a000: 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70 65 63 69  or code.** speci
a010: 66 69 65 64 20 69 6e 20 74 68 65 20 61 72 67 75  fied in the argu
a020: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  ment..*/.#if def
a030: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 45 45 44  ined(SQLITE_NEED
a040: 5f 45 52 52 5f 4e 41 4d 45 29 0a 63 6f 6e 73 74  _ERR_NAME).const
a050: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72   char *sqlite3Er
a060: 72 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a 20  rName(int rc){. 
a070: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
a080: 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c  me = 0;.  int i,
a090: 20 6f 72 69 67 52 63 20 3d 20 72 63 3b 0a 20 20   origRc = rc;.  
a0a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 20 26 26 20  for(i=0; i<2 && 
a0b0: 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20 72  zName==0; i++, r
a0c0: 63 20 26 3d 20 30 78 66 66 29 7b 0a 20 20 20 20  c &= 0xff){.    
a0d0: 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20  switch( rc ){.  
a0e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a0f0: 4f 4b 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  OK:             
a100: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a110: 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20  ITE_OK";        
a120: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a130: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a140: 5f 45 52 52 4f 52 3a 20 20 20 20 20 20 20 20 20  _ERROR:         
a150: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a160: 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20  LITE_ERROR";    
a170: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a180: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a190: 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20 20 20 20  E_INTERNAL:     
a1a0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a1b0: 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b  QLITE_INTERNAL";
a1c0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a1d0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a1e0: 54 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20 20  TE_PERM:        
a1f0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a200: 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20 20  SQLITE_PERM";   
a210: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
a220: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a230: 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20  ITE_ABORT:      
a240: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a250: 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20  "SQLITE_ABORT"; 
a260: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a270: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a280: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
a290: 41 43 4b 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ACK:     zName =
a2a0: 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52   "SQLITE_ABORT_R
a2b0: 4f 4c 4c 42 41 43 4b 22 3b 20 20 20 20 62 72 65  OLLBACK";    bre
a2c0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a2d0: 51 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20  QLITE_BUSY:     
a2e0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a2f0: 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 22 3b  = "SQLITE_BUSY";
a300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
a310: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a320: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f  SQLITE_BUSY_RECO
a330: 56 45 52 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65  VERY:      zName
a340: 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f   = "SQLITE_BUSY_
a350: 52 45 43 4f 56 45 52 59 22 3b 20 20 20 20 20 62  RECOVERY";     b
a360: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a370: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41   SQLITE_BUSY_SNA
a380: 50 53 48 4f 54 3a 20 20 20 20 20 20 7a 4e 61 6d  PSHOT:      zNam
a390: 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59  e = "SQLITE_BUSY
a3a0: 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20 20 20 20  _SNAPSHOT";     
a3b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a3c0: 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a  e SQLITE_LOCKED:
a3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
a3e0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43  me = "SQLITE_LOC
a3f0: 4b 45 44 22 3b 20 20 20 20 20 20 20 20 20 20 20  KED";           
a400: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a410: 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  se SQLITE_LOCKED
a420: 5f 53 48 41 52 45 44 43 41 43 48 45 3a 20 7a 4e  _SHAREDCACHE: zN
a430: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f  ame = "SQLITE_LO
a440: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
a450: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
a460: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ase SQLITE_NOMEM
a470: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
a480: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
a490: 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 20 20 20  OMEM";          
a4a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a4b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
a4c0: 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20 20 20 20  ONLY:           
a4d0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a4e0: 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20  READONLY";      
a4f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a500: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
a510: 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 3a 20  DONLY_RECOVERY: 
a520: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a530: 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45  _READONLY_RECOVE
a540: 52 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  RY"; break;.    
a550: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
a560: 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 3a  ADONLY_CANTLOCK:
a570: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a580: 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c  E_READONLY_CANTL
a590: 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  OCK"; break;.   
a5a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
a5b0: 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b  EADONLY_ROLLBACK
a5c0: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
a5d0: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c  TE_READONLY_ROLL
a5e0: 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20  BACK"; break;.  
a5f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a600: 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44  READONLY_DBMOVED
a610: 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  :   zName = "SQL
a620: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
a630: 4f 56 45 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20  OVED";  break;. 
a640: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a650: 5f 49 4e 54 45 52 52 55 50 54 3a 20 20 20 20 20  _INTERRUPT:     
a660: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a670: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 22 3b  LITE_INTERRUPT";
a680: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a690: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a6a0: 45 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 20 20  E_IOERR:        
a6b0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a6c0: 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20 20 20  QLITE_IOERR";   
a6d0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a6e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a6f0: 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3a 20 20  TE_IOERR_READ:  
a700: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a710: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
a720: 44 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  D";        break
a730: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a740: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
a750: 52 45 41 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20  READ:   zName = 
a760: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
a770: 4f 52 54 5f 52 45 41 44 22 3b 20 20 62 72 65 61  ORT_READ";  brea
a780: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a790: 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
a7a0: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
a7b0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57   "SQLITE_IOERR_W
a7c0: 52 49 54 45 22 3b 20 20 20 20 20 20 20 62 72 65  RITE";       bre
a7d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a7e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
a7f0: 43 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  C:        zName 
a800: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
a810: 46 53 59 4e 43 22 3b 20 20 20 20 20 20 20 62 72  FSYNC";       br
a820: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a830: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
a840: 5f 46 53 59 4e 43 3a 20 20 20 20 7a 4e 61 6d 65  _FSYNC:    zName
a850: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
a860: 5f 44 49 52 5f 46 53 59 4e 43 22 3b 20 20 20 62  _DIR_FSYNC";   b
a870: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a880: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
a890: 55 4e 43 41 54 45 3a 20 20 20 20 20 7a 4e 61 6d  UNCATE:     zNam
a8a0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
a8b0: 52 5f 54 52 55 4e 43 41 54 45 22 3b 20 20 20 20  R_TRUNCATE";    
a8c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a8d0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  e SQLITE_IOERR_F
a8e0: 53 54 41 54 3a 20 20 20 20 20 20 20 20 7a 4e 61  STAT:        zNa
a8f0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
a900: 52 52 5f 46 53 54 41 54 22 3b 20 20 20 20 20 20  RR_FSTAT";      
a910: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a920: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
a930: 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e  UNLOCK:       zN
a940: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
a950: 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20 20  ERR_UNLOCK";    
a960: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a970: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
a980: 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a  _RDLOCK:       z
a990: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
a9a0: 4f 45 52 52 5f 52 44 4c 4f 43 4b 22 3b 20 20 20  OERR_RDLOCK";   
a9b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a9c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
a9d0: 52 5f 44 45 4c 45 54 45 3a 20 20 20 20 20 20 20  R_DELETE:       
a9e0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a9f0: 49 4f 45 52 52 5f 44 45 4c 45 54 45 22 3b 20 20  IOERR_DELETE";  
aa00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
aa10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
aa20: 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20  RR_NOMEM:       
aa30: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
aa40: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20  _IOERR_NOMEM";  
aa50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aa60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
aa70: 45 52 52 5f 41 43 43 45 53 53 3a 20 20 20 20 20  ERR_ACCESS:     
aa80: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
aa90: 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 22 3b  E_IOERR_ACCESS";
aaa0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
aab0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
aac0: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
aad0: 45 44 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20  EDLOCK:.        
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aaf0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ab00: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48  "SQLITE_IOERR_CH
ab10: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 22  ECKRESERVEDLOCK"
ab20: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
ab30: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
ab40: 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 20 7a  _LOCK:         z
ab50: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
ab60: 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20 20 20 20 20  OERR_LOCK";     
ab70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ab80: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
ab90: 52 5f 43 4c 4f 53 45 3a 20 20 20 20 20 20 20 20  R_CLOSE:        
aba0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
abb0: 49 4f 45 52 52 5f 43 4c 4f 53 45 22 3b 20 20 20  IOERR_CLOSE";   
abc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
abd0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
abe0: 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3a 20 20 20  RR_DIR_CLOSE:   
abf0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ac00: 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45  _IOERR_DIR_CLOSE
ac10: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
ac20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
ac30: 45 52 52 5f 53 48 4d 4f 50 45 4e 3a 20 20 20 20  ERR_SHMOPEN:    
ac40: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ac50: 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 22  E_IOERR_SHMOPEN"
ac60: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
ac70: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
ac80: 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3a 20 20 20  OERR_SHMSIZE:   
ac90: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
aca0: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
acb0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
acc0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
acd0: 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20 20  IOERR_SHMLOCK:  
ace0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
acf0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43  ITE_IOERR_SHMLOC
ad00: 4b 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  K";     break;. 
ad10: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ad20: 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 3a 20 20  _IOERR_SHMMAP:  
ad30: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ad40: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
ad50: 50 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  P";      break;.
ad60: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ad70: 45 5f 49 4f 45 52 52 5f 53 45 45 4b 3a 20 20 20  E_IOERR_SEEK:   
ad80: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ad90: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
ada0: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
adb0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
adc0: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
add0: 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20 22  NOENT: zName = "
ade0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
adf0: 45 54 45 5f 4e 4f 45 4e 54 22 3b 62 72 65 61 6b  ETE_NOENT";break
ae00: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ae10: 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a 20  ITE_IOERR_MMAP: 
ae20: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ae30: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  "SQLITE_IOERR_MM
ae40: 41 50 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  AP";        brea
ae50: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ae60: 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
ae70: 4d 50 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d  MPPATH:  zName =
ae80: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47   "SQLITE_IOERR_G
ae90: 45 54 54 45 4d 50 50 41 54 48 22 3b 20 62 72 65  ETTEMPPATH"; bre
aea0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
aeb0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56  QLITE_IOERR_CONV
aec0: 50 41 54 48 3a 20 20 20 20 20 7a 4e 61 6d 65 20  PATH:     zName 
aed0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
aee0: 43 4f 4e 56 50 41 54 48 22 3b 20 20 20 20 62 72  CONVPATH";    br
aef0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
af00: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a 20  SQLITE_CORRUPT: 
af10: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
af20: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55   = "SQLITE_CORRU
af30: 50 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 62  PT";           b
af40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
af50: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
af60: 56 54 41 42 3a 20 20 20 20 20 20 20 7a 4e 61 6d  VTAB:       zNam
af70: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52  e = "SQLITE_CORR
af80: 55 50 54 5f 56 54 41 42 22 3b 20 20 20 20 20 20  UPT_VTAB";      
af90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
afa0: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  e SQLITE_NOTFOUN
afb0: 44 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  D:           zNa
afc0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54  me = "SQLITE_NOT
afd0: 46 4f 55 4e 44 22 3b 20 20 20 20 20 20 20 20 20  FOUND";         
afe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
aff0: 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20  se SQLITE_FULL: 
b000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
b010: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 55  ame = "SQLITE_FU
b020: 4c 4c 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  LL";            
b030: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b040: 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ase SQLITE_CANTO
b050: 50 45 4e 3a 20 20 20 20 20 20 20 20 20 20 20 7a  PEN:           z
b060: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b070: 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20 20 20 20  ANTOPEN";       
b080: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b090: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
b0a0: 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a 20  OPEN_NOTEMPDIR: 
b0b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b0c0: 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44  CANTOPEN_NOTEMPD
b0d0: 49 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  IR";break;.     
b0e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
b0f0: 54 4f 50 45 4e 5f 49 53 44 49 52 3a 20 20 20 20  TOPEN_ISDIR:    
b100: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b110: 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22  _CANTOPEN_ISDIR"
b120: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
b130: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
b140: 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3a  NTOPEN_FULLPATH:
b150: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b160: 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
b170: 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ATH"; break;.   
b180: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b190: 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48  ANTOPEN_CONVPATH
b1a0: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
b1b0: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56  TE_CANTOPEN_CONV
b1c0: 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  PATH"; break;.  
b1d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b1e0: 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 20 20 20 20  PROTOCOL:       
b1f0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b200: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20  ITE_PROTOCOL";  
b210: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b220: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b230: 5f 45 4d 50 54 59 3a 20 20 20 20 20 20 20 20 20  _EMPTY:         
b240: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b250: 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20 20 20 20  LITE_EMPTY";    
b260: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b270: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b280: 45 5f 53 43 48 45 4d 41 3a 20 20 20 20 20 20 20  E_SCHEMA:       
b290: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b2a0: 51 4c 49 54 45 5f 53 43 48 45 4d 41 22 3b 20 20  QLITE_SCHEMA";  
b2b0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b2c0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b2d0: 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20 20  TE_TOOBIG:      
b2e0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b2f0: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22 3b 20  SQLITE_TOOBIG"; 
b300: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b310: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b320: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20  ITE_CONSTRAINT: 
b330: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b340: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
b350: 4e 54 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  NT";        brea
b360: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b370: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b380: 55 4e 49 51 55 45 3a 20 20 7a 4e 61 6d 65 20 3d  UNIQUE:  zName =
b390: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
b3a0: 49 4e 54 5f 55 4e 49 51 55 45 22 3b 20 62 72 65  INT_UNIQUE"; bre
b3b0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b3c0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b3d0: 5f 54 52 49 47 47 45 52 3a 20 7a 4e 61 6d 65 20  _TRIGGER: zName 
b3e0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
b3f0: 41 49 4e 54 5f 54 52 49 47 47 45 52 22 3b 62 72  AINT_TRIGGER";br
b400: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b410: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b420: 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3a 0a 20 20  T_FOREIGNKEY:.  
b430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
b450: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b460: 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
b470: 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  KEY";   break;. 
b480: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b490: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43  _CONSTRAINT_CHEC
b4a0: 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  K:   zName = "SQ
b4b0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b4c0: 43 48 45 43 4b 22 3b 20 20 62 72 65 61 6b 3b 0a  CHECK";  break;.
b4d0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b4e0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49  E_CONSTRAINT_PRI
b4f0: 4d 41 52 59 4b 45 59 3a 0a 20 20 20 20 20 20 20  MARYKEY:.       
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b510: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b520: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
b530: 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 22 3b  INT_PRIMARYKEY";
b540: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b550: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
b560: 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a 20  TRAINT_NOTNULL: 
b570: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b580: 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55  CONSTRAINT_NOTNU
b590: 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  LL";break;.     
b5a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
b5b0: 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f  STRAINT_COMMITHO
b5c0: 4f 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK:.            
b5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5e0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b5f0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
b600: 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20 20 62 72  OMMITHOOK";   br
b610: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b620: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b630: 54 5f 56 54 41 42 3a 20 20 20 20 7a 4e 61 6d 65  T_VTAB:    zName
b640: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
b650: 52 41 49 4e 54 5f 56 54 41 42 22 3b 20 20 20 62  RAINT_VTAB";   b
b660: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b670: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
b680: 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  NT_FUNCTION:.   
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
b6b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
b6c0: 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e  STRAINT_FUNCTION
b6d0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
b6e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b6f0: 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44  CONSTRAINT_ROWID
b700: 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  :   zName = "SQL
b710: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52  ITE_CONSTRAINT_R
b720: 4f 57 49 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20  OWID";  break;. 
b730: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b740: 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20 20 20 20  _MISMATCH:      
b750: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b760: 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b 20  LITE_MISMATCH"; 
b770: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b780: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b790: 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20 20 20  E_MISUSE:       
b7a0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b7b0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b 20 20  QLITE_MISUSE";  
b7c0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b7d0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b7e0: 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20 20  TE_NOLFS:       
b7f0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b800: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b 20 20  SQLITE_NOLFS";  
b810: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b820: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b830: 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20 20  ITE_AUTH:       
b840: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b850: 22 53 51 4c 49 54 45 5f 41 55 54 48 22 3b 20 20  "SQLITE_AUTH";  
b860: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b870: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b880: 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20  LITE_FORMAT:    
b890: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b8a0: 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 22   "SQLITE_FORMAT"
b8b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
b8c0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b8d0: 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20 20 20  QLITE_RANGE:    
b8e0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b8f0: 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e 47 45 22  = "SQLITE_RANGE"
b900: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
b910: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b920: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20  SQLITE_NOTADB:  
b930: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b940: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 41 44   = "SQLITE_NOTAD
b950: 42 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  B";            b
b960: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b970: 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20 20 20   SQLITE_ROW:    
b980: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b990: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f 57 22  e = "SQLITE_ROW"
b9a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b9b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b9c0: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 3a  e SQLITE_NOTICE:
b9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
b9e0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54  me = "SQLITE_NOT
b9f0: 49 43 45 22 3b 20 20 20 20 20 20 20 20 20 20 20  ICE";           
ba00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ba10: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  se SQLITE_NOTICE
ba20: 5f 52 45 43 4f 56 45 52 5f 57 41 4c 3a 20 7a 4e  _RECOVER_WAL: zN
ba30: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
ba40: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c  TICE_RECOVER_WAL
ba50: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
ba60: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43  ase SQLITE_NOTIC
ba70: 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41  E_RECOVER_ROLLBA
ba80: 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  CK:.            
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bab0: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
bac0: 45 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72  ER_ROLLBACK"; br
bad0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bae0: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 3a 20  SQLITE_WARNING: 
baf0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bb00: 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49   = "SQLITE_WARNI
bb10: 4e 47 22 3b 20 20 20 20 20 20 20 20 20 20 20 62  NG";           b
bb20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bb30: 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f   SQLITE_WARNING_
bb40: 41 55 54 4f 49 4e 44 45 58 3a 20 20 7a 4e 61 6d  AUTOINDEX:  zNam
bb50: 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e  e = "SQLITE_WARN
bb60: 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 22 3b 20  ING_AUTOINDEX"; 
bb70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bb80: 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20  e SQLITE_DONE:  
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
bba0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e  me = "SQLITE_DON
bbb0: 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  E";             
bbc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
bbd0: 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  }.  if( zName==0
bbe0: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
bbf0: 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
bc00: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
bc10: 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
bc20: 20 7a 42 75 66 2c 20 22 53 51 4c 49 54 45 5f 55   zBuf, "SQLITE_U
bc30: 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c 20 6f 72 69  NKNOWN(%d)", ori
bc40: 67 52 63 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20  gRc);.    zName 
bc50: 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20 20 72 65  = zBuf;.  }.  re
bc60: 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65  turn zName;.}.#e
bc70: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
bc80: 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69  rn a static stri
bc90: 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
bca0: 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72  s the kind of er
bcb0: 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e  ror specified in
bcc0: 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   the.** argument
bcd0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
bce0: 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 69  *sqlite3ErrStr(i
bcf0: 6e 74 20 72 63 29 7b 0a 20 20 73 74 61 74 69 63  nt rc){.  static
bd00: 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e   const char* con
bd10: 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20  st aMsg[] = {.  
bd20: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20    /* SQLITE_OK  
bd30: 20 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20          */ "not 
bd40: 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f  an error",.    /
bd50: 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 20  * SQLITE_ERROR  
bd60: 20 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67       */ "SQL log
bd70: 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69 73 73  ic error or miss
bd80: 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c 0a 20  ing database",. 
bd90: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54     /* SQLITE_INT
bda0: 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20  ERNAL    */ 0,. 
bdb0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52     /* SQLITE_PER
bdc0: 4d 20 20 20 20 20 20 20 20 2a 2f 20 22 61 63 63  M        */ "acc
bdd0: 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 64  ess permission d
bde0: 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  enied",.    /* S
bdf0: 51 4c 49 54 45 5f 41 42 4f 52 54 20 20 20 20 20  QLITE_ABORT     
be00: 20 20 2a 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72    */ "callback r
be10: 65 71 75 65 73 74 65 64 20 71 75 65 72 79 20 61  equested query a
be20: 62 6f 72 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51  bort",.    /* SQ
be30: 4c 49 54 45 5f 42 55 53 59 20 20 20 20 20 20 20  LITE_BUSY       
be40: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 69 73   */ "database is
be50: 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a   locked",.    /*
be60: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20   SQLITE_LOCKED  
be70: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
be80: 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64   table is locked
be90: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
bea0: 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20  _NOMEM       */ 
beb0: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c  "out of memory",
bec0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52  .    /* SQLITE_R
bed0: 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61  EADONLY    */ "a
bee0: 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
bef0: 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62  a readonly datab
bf00: 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ase",.    /* SQL
bf10: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 20 20  ITE_INTERRUPT   
bf20: 2a 2f 20 22 69 6e 74 65 72 72 75 70 74 65 64 22  */ "interrupted"
bf30: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
bf40: 49 4f 45 52 52 20 20 20 20 20 20 20 2a 2f 20 22  IOERR       */ "
bf50: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c  disk I/O error",
bf60: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
bf70: 4f 52 52 55 50 54 20 20 20 20 20 2a 2f 20 22 64  ORRUPT     */ "d
bf80: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
bf90: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22  ge is malformed"
bfa0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
bfb0: 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22  NOTFOUND    */ "
bfc0: 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f  unknown operatio
bfd0: 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  n",.    /* SQLIT
bfe0: 45 5f 46 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f  E_FULL        */
bff0: 20 22 64 61 74 61 62 61 73 65 20 6f 72 20 64 69   "database or di
c000: 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20  sk is full",.   
c010: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f   /* SQLITE_CANTO
c020: 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c  PEN    */ "unabl
c030: 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  e to open databa
c040: 73 65 20 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a  se file",.    /*
c050: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
c060: 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20      */ "locking 
c070: 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f  protocol",.    /
c080: 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 20  * SQLITE_EMPTY  
c090: 20 20 20 20 20 2a 2f 20 22 74 61 62 6c 65 20 63       */ "table c
c0a0: 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 22  ontains no data"
c0b0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c0c0: 53 43 48 45 4d 41 20 20 20 20 20 20 2a 2f 20 22  SCHEMA      */ "
c0d0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
c0e0: 68 61 73 20 63 68 61 6e 67 65 64 22 2c 0a 20 20  has changed",.  
c0f0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42    /* SQLITE_TOOB
c100: 49 47 20 20 20 20 20 20 2a 2f 20 22 73 74 72 69  IG      */ "stri
c110: 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62  ng or blob too b
c120: 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ig",.    /* SQLI
c130: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a  TE_CONSTRAINT  *
c140: 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  / "constraint fa
c150: 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  iled",.    /* SQ
c160: 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 20 20  LITE_MISMATCH   
c170: 20 2a 2f 20 22 64 61 74 61 74 79 70 65 20 6d 69   */ "datatype mi
c180: 73 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20  smatch",.    /* 
c190: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 20 20  SQLITE_MISUSE   
c1a0: 20 20 20 2a 2f 20 22 6c 69 62 72 61 72 79 20 72     */ "library r
c1b0: 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75  outine called ou
c1c0: 74 20 6f 66 20 73 65 71 75 65 6e 63 65 22 2c 0a  t of sequence",.
c1d0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
c1e0: 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 22 6c 61  LFS       */ "la
c1f0: 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74  rge file support
c200: 20 69 73 20 64 69 73 61 62 6c 65 64 22 2c 0a 20   is disabled",. 
c210: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54     /* SQLITE_AUT
c220: 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61 75 74  H        */ "aut
c230: 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65  horization denie
c240: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
c250: 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f  E_FORMAT      */
c260: 20 22 61 75 78 69 6c 69 61 72 79 20 64 61 74 61   "auxiliary data
c270: 62 61 73 65 20 66 6f 72 6d 61 74 20 65 72 72 6f  base format erro
c280: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
c290: 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20 2a 2f  E_RANGE       */
c2a0: 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e   "bind or column
c2b0: 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61   index out of ra
c2c0: 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  nge",.    /* SQL
c2d0: 49 54 45 5f 4e 4f 54 41 44 42 20 20 20 20 20 20  ITE_NOTADB      
c2e0: 2a 2f 20 22 66 69 6c 65 20 69 73 20 65 6e 63 72  */ "file is encr
c2f0: 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f 74 20  ypted or is not 
c300: 61 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 7d  a database",.  }
c310: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
c320: 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20  zErr = "unknown 
c330: 65 72 72 6f 72 22 3b 0a 20 20 73 77 69 74 63 68  error";.  switch
c340: 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65  ( rc ){.    case
c350: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
c360: 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20  LLBACK: {.      
c370: 7a 45 72 72 20 3d 20 22 61 62 6f 72 74 20 64 75  zErr = "abort du
c380: 65 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a  e to ROLLBACK";.
c390: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c3a0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
c3b0: 7b 0a 20 20 20 20 20 20 72 63 20 26 3d 20 30 78  {.      rc &= 0x
c3c0: 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c  ff;.      if( AL
c3d0: 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72  WAYS(rc>=0) && r
c3e0: 63 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 73 67  c<ArraySize(aMsg
c3f0: 29 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30  ) && aMsg[rc]!=0
c400: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72   ){.        zErr
c410: 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20   = aMsg[rc];.   
c420: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
c430: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
c440: 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a  turn zErr;.}../*
c450: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c460: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75   implements a bu
c470: 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74  sy callback that
c480: 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65   sleeps and trie
c490: 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c  s.** again until
c4a0: 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65   a timeout value
c4b0: 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 54 68   is reached.  Th
c4c0: 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  e timeout value 
c4d0: 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72  is.** an integer
c4e0: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
c4f0: 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69  seconds passed i
c500: 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a  n as the first.*
c510: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  * argument..*/.s
c520: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
c530: 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62  DefaultBusyCallb
c540: 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c  ack(. void *ptr,
c550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c560: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
c570: 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f  ction */. int co
c580: 75 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  unt             
c590: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c5a0: 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20  times table has 
c5b0: 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a  been busy */.){.
c5c0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
c5d0: 4e 20 7c 7c 20 48 41 56 45 5f 55 53 4c 45 45 50  N || HAVE_USLEEP
c5e0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
c5f0: 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20  u8 delays[] =.  
c600: 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30     { 1, 2, 5, 10
c610: 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35  , 15, 20, 25, 25
c620: 2c 20 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c  ,  25,  50,  50,
c630: 20 31 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63   100 };.  static
c640: 20 63 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73   const u8 totals
c650: 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31  [] =.     { 0, 1
c660: 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c  , 3,  8, 18, 33,
c670: 20 35 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32   53, 78, 103, 12
c680: 38 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23  8, 178, 228 };.#
c690: 20 64 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 41   define NDELAY A
c6a0: 72 72 61 79 53 69 7a 65 28 64 65 6c 61 79 73 29  rraySize(delays)
c6b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c6c0: 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b   (sqlite3 *)ptr;
c6d0: 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d  .  int timeout =
c6e0: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
c6f0: 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70  ;.  int delay, p
c700: 72 69 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  rior;..  assert(
c710: 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69   count>=0 );.  i
c720: 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41  f( count < NDELA
c730: 59 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  Y ){.    delay =
c740: 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a   delays[count];.
c750: 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61      prior = tota
c760: 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c  ls[count];.  }el
c770: 73 65 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20  se{.    delay = 
c780: 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d  delays[NDELAY-1]
c790: 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f  ;.    prior = to
c7a0: 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b  tals[NDELAY-1] +
c7b0: 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e   delay*(count-(N
c7c0: 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20  DELAY-1));.  }. 
c7d0: 20 69 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c   if( prior + del
c7e0: 61 79 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a  ay > timeout ){.
c7f0: 20 20 20 20 64 65 6c 61 79 20 3d 20 74 69 6d 65      delay = time
c800: 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20  out - prior;.   
c810: 20 69 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20   if( delay<=0 ) 
c820: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c830: 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64  sqlite3OsSleep(d
c840: 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31  b->pVfs, delay*1
c850: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
c860: 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  ;.#else.  sqlite
c870: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
c880: 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69   *)ptr;.  int ti
c890: 6d 65 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65  meout = ((sqlite
c8a0: 33 20 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69  3 *)ptr)->busyTi
c8b0: 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20 28 63 6f  meout;.  if( (co
c8c0: 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 69  unt+1)*1000 > ti
c8d0: 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74  meout ){.    ret
c8e0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
c8f0: 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e  ite3OsSleep(db->
c900: 70 56 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a  pVfs, 1000000);.
c910: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
c920: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  if.}../*.** Invo
c930: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 62 75 73  ke the given bus
c940: 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a  y handler..**.**
c950: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
c960: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
c970: 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64  operation failed
c980: 20 77 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a   with a lock..**
c990: 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
c9a0: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
c9b0: 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72  o, the lock is r
c9c0: 65 74 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a  etried.  If it.*
c9d0: 2a 20 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65  * returns 0, the
c9e0: 20 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74   operation abort
c9f0: 73 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45  s with an SQLITE
ca00: 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a  _BUSY error..*/.
ca10: 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b  int sqlite3Invok
ca20: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73  eBusyHandler(Bus
ca30: 79 48 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20  yHandler *p){.  
ca40: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 4e 45  int rc;.  if( NE
ca50: 56 45 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e  VER(p==0) || p->
ca60: 78 46 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e  xFunc==0 || p->n
ca70: 42 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20  Busy<0 ) return 
ca80: 30 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46 75  0;.  rc = p->xFu
ca90: 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e  nc(p->pArg, p->n
caa0: 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63 3d  Busy);.  if( rc=
cab0: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75  =0 ){.    p->nBu
cac0: 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  sy = -1;.  }else
cad0: 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b  {.    p->nBusy++
cae0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
caf0: 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c; .}../*.** Thi
cb00: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
cb10: 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
cb20: 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64   for an Sqlite d
cb30: 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a  atabase to the.*
cb40: 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  * given callback
cb50: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
cb60: 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e  he given argumen
cb70: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
cb80: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a  3_busy_handler(.
cb90: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
cba0: 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f   int (*xBusy)(vo
cbb0: 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  id*,int),.  void
cbc0: 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66   *pArg.){.#ifdef
cbd0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
cbe0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
cbf0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
cc00: 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
cc10: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
cc20: 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
cc30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
cc40: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
cc50: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
cc60: 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79 3b 0a  .xFunc = xBusy;.
cc70: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
cc80: 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  r.pArg = pArg;. 
cc90: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
cca0: 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 64 62  .nBusy = 0;.  db
ccb0: 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20  ->busyTimeout = 
ccc0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
ccd0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
cce0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
ccf0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
cd00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cd10: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
cd20: 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  K./*.** This rou
cd30: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 70 72  tine sets the pr
cd40: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
cd50: 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61  for an Sqlite da
cd60: 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a  tabase to the.**
cd70: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
cd80: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
cd90: 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74  e given argument
cda0: 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63  . The progress c
cdb0: 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20  allback will.** 
cdc0: 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79  be invoked every
cdd0: 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a   nOps opcodes..*
cde0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70  /.void sqlite3_p
cdf0: 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
ce00: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
ce10: 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69  .  int nOps,.  i
ce20: 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28  nt (*xProgress)(
ce30: 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20  void*), .  void 
ce40: 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20  *pArg.){.#ifdef 
ce50: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
ce60: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
ce70: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
ce80: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
ce90: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
cea0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
ceb0: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
cec0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ced0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
cee0: 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30 20 29  ;.  if( nOps>0 )
cef0: 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72  {.    db->xProgr
cf00: 65 73 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b  ess = xProgress;
cf10: 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65  .    db->nProgre
cf20: 73 73 4f 70 73 20 3d 20 28 75 6e 73 69 67 6e 65  ssOps = (unsigne
cf30: 64 29 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e  d)nOps;.    db->
cf40: 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70  pProgressArg = p
cf50: 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Arg;.  }else{.  
cf60: 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20    db->xProgress 
cf70: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72  = 0;.    db->nPr
cf80: 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20  ogressOps = 0;. 
cf90: 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73     db->pProgress
cfa0: 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  Arg = 0;.  }.  s
cfb0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
cfc0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ve(db->mutex);.}
cfd0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
cfe0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73  This routine ins
cff0: 74 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20  talls a default 
d000: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61  busy handler tha
d010: 74 20 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a  t waits for the.
d020: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d  ** specified num
d030: 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
d040: 6e 64 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nds before retur
d050: 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  ning 0..*/.int s
d060: 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
d070: 6f 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  out(sqlite3 *db,
d080: 20 69 6e 74 20 6d 73 29 7b 0a 23 69 66 64 65 66   int ms){.#ifdef
d090: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
d0a0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
d0b0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
d0c0: 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
d0d0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
d0e0: 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69  BKPT;.#endif.  i
d0f0: 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73  f( ms>0 ){.    s
d100: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
d110: 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44 65  ler(db, sqliteDe
d120: 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63  faultBusyCallbac
d130: 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20  k, (void*)db);. 
d140: 20 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f     db->busyTimeo
d150: 75 74 20 3d 20 6d 73 3b 0a 20 20 7d 65 6c 73 65  ut = ms;.  }else
d160: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  {.    sqlite3_bu
d170: 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30  sy_handler(db, 0
d180: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
d190: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d1a0: 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79  ./*.** Cause any
d1b0: 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69   pending operati
d1c0: 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74  on to stop at it
d1d0: 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72  s earliest oppor
d1e0: 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20  tunity..*/.void 
d1f0: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
d200: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
d210: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d220: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
d230: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
d240: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
d250: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
d260: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
d270: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d280: 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e 75 31 2e  #endif.  db->u1.
d290: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20  isInterrupted = 
d2a0: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  1;.}.../*.** Thi
d2b0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78  s function is ex
d2c0: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61  actly the same a
d2d0: 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  s sqlite3_create
d2e0: 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63  _function(), exc
d2f0: 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ept.** that it i
d300: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65  s designed to be
d310: 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72   called by inter
d320: 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69  nal code. The di
d330: 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74  fference is.** t
d340: 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  hat if a malloc(
d350: 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74  ) fails in sqlit
d360: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
d370: 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63  on(), an error c
d380: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ode.** is return
d390: 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f  ed and the mallo
d3a0: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65  cFailed flag cle
d3b0: 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  ared. .*/.int sq
d3c0: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
d3d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
d3e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
d3f0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69  unctionName,.  i
d400: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
d410: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65  nc,.  void *pUse
d420: 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a  rData,.  void (*
d430: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
d440: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
d450: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
d460: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
d470: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
d480: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
d490: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
d4a0: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
d4b0: 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75 6e  context*),.  Fun
d4c0: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65  cDestructor *pDe
d4d0: 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75  structor.){.  Fu
d4e0: 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20  ncDef *p;.  int 
d4f0: 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65 78 74  nName;.  int ext
d500: 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73 73 65  raFlags;..  asse
d510: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d520: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
d530: 29 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63  ) );.  if( zFunc
d540: 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20  tionName==0 ||. 
d550: 20 20 20 20 20 28 78 46 75 6e 63 20 26 26 20 28       (xFunc && (
d560: 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29  xFinal || xStep)
d570: 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 46  ) || .      (!xF
d580: 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26  unc && (xFinal &
d590: 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20  & !xStep)) ||.  
d5a0: 20 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28      (!xFunc && (
d5b0: 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70  !xFinal && xStep
d5c0: 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72  )) ||.      (nAr
d5d0: 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c  g<-1 || nArg>SQL
d5e0: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
d5f0: 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28  _ARG) ||.      (
d600: 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c  255<(nName = sql
d610: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 20 7a 46  ite3Strlen30( zF
d620: 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29  unctionName))) )
d630: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
d640: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
d650: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
d660: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53  SQLITE_FUNC_CONS
d670: 54 41 4e 54 3d 3d 53 51 4c 49 54 45 5f 44 45 54  TANT==SQLITE_DET
d680: 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20 20  ERMINISTIC );.  
d690: 65 78 74 72 61 46 6c 61 67 73 20 3d 20 65 6e 63  extraFlags = enc
d6a0: 20 26 20 20 53 51 4c 49 54 45 5f 44 45 54 45 52   &  SQLITE_DETER
d6b0: 4d 49 4e 49 53 54 49 43 3b 0a 20 20 65 6e 63 20  MINISTIC;.  enc 
d6c0: 26 3d 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f  &= (SQLITE_FUNC_
d6d0: 45 4e 43 4d 41 53 4b 7c 53 51 4c 49 54 45 5f 41  ENCMASK|SQLITE_A
d6e0: 4e 59 29 3b 0a 20 20 0a 23 69 66 6e 64 65 66 20  NY);.  .#ifndef 
d6f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
d700: 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45  6.  /* If SQLITE
d710: 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66  _UTF16 is specif
d720: 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ied as the encod
d730: 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66  ing type, transf
d740: 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f  orm this.  ** to
d750: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55   one of SQLITE_U
d760: 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45  TF16LE or SQLITE
d770: 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74  _UTF16BE using t
d780: 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55  he.  ** SQLITE_U
d790: 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f  TF16NATIVE macro
d7a0: 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  . SQLITE_UTF16 i
d7b0: 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
d7c0: 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nally..  **.  **
d7d0: 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69   If SQLITE_ANY i
d7e0: 73 20 73 70 65 63 69 66 69 65 64 2c 20 61 64 64  s specified, add
d7f0: 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20   three versions 
d800: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  of the function.
d810: 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68    ** to the hash
d820: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
d830: 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  f( enc==SQLITE_U
d840: 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20  TF16 ){.    enc 
d850: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
d860: 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TIVE;.  }else if
d870: 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e  ( enc==SQLITE_AN
d880: 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  Y ){.    int rc;
d890: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
d8a0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
d8b0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
d8c0: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
d8d0: 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20 20  |extraFlags,.   
d8e0: 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c        pUserData,
d8f0: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
d900: 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63 74  Final, pDestruct
d910: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  or);.    if( rc=
d920: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d930: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d940: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
d950: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41  FunctionName, nA
d960: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  rg, SQLITE_UTF16
d970: 4c 45 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20  LE|extraFlags,. 
d980: 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61           pUserDa
d990: 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70  ta, xFunc, xStep
d9a0: 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72  , xFinal, pDestr
d9b0: 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  uctor);.    }.  
d9c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d9d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
d9e0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
d9f0: 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55    enc = SQLITE_U
da00: 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73  TF16BE;.  }.#els
da10: 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45  e.  enc = SQLITE
da20: 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20  _UTF8;.#endif.  
da30: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
da40: 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63 74  n existing funct
da50: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76 65  ion is being ove
da60: 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65 74  rridden or delet
da70: 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20  ed. If so,.  ** 
da80: 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63  and there are ac
da90: 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20 72  tive VMs, then r
daa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
dab0: 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f 6e  Y. If a function
dac0: 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f  .  ** is being o
dad0: 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74 65  verridden/delete
dae0: 64 20 62 75 74 20 74 68 65 72 65 20 61 72 65 20  d but there are 
daf0: 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 61  no active VMs, a
db00: 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70  llow the.  ** op
db10: 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69  eration to conti
db20: 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64 61  nue but invalida
db30: 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c  te all precompil
db40: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
db50: 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   */.  p = sqlite
db60: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
db70: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
db80: 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75   nName, nArg, (u
db90: 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28  8)enc, 0);.  if(
dba0: 20 70 20 26 26 20 28 70 2d 3e 66 75 6e 63 46 6c   p && (p->funcFl
dbb0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
dbc0: 43 5f 45 4e 43 4d 41 53 4b 29 3d 3d 65 6e 63 20  C_ENCMASK)==enc 
dbd0: 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67  && p->nArg==nArg
dbe0: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
dbf0: 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20  nVdbeActive ){. 
dc00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
dc10: 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c  rWithMsg(db, SQL
dc20: 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20  ITE_BUSY, .     
dc30: 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65     "unable to de
dc40: 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72  lete/modify user
dc50: 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f  -function due to
dc60: 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
dc70: 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ts");.      asse
dc80: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
dc90: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
dca0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
dcb0: 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  Y;.    }else{.  
dcc0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
dcd0: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
dce0: 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20  nts(db);.    }. 
dcf0: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
dd00: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
dd10: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
dd20: 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75   nName, nArg, (u
dd30: 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73  8)enc, 1);.  ass
dd40: 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c  ert(p || db->mal
dd50: 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66  locFailed);.  if
dd60: 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ( !p ){.    retu
dd70: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
dd80: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
dd90: 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20 6f   older version o
dda0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77  f the function w
ddb0: 69 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65 64  ith a configured
ddc0: 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 20   destructor is. 
ddd0: 20 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61 63   ** being replac
dde0: 65 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65  ed invoke the de
ddf0: 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f  structor functio
de00: 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75 6e  n here. */.  fun
de10: 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c  ctionDestroy(db,
de20: 20 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65 73   p);..  if( pDes
de30: 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70  tructor ){.    p
de40: 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66  Destructor->nRef
de50: 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 44 65  ++;.  }.  p->pDe
de60: 73 74 72 75 63 74 6f 72 20 3d 20 70 44 65 73 74  structor = pDest
de70: 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 75 6e  ructor;.  p->fun
de80: 63 46 6c 61 67 73 20 3d 20 28 70 2d 3e 66 75 6e  cFlags = (p->fun
de90: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
dea0: 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 20 7c 20  FUNC_ENCMASK) | 
deb0: 65 78 74 72 61 46 6c 61 67 73 3b 0a 20 20 74 65  extraFlags;.  te
dec0: 73 74 63 61 73 65 28 20 70 2d 3e 66 75 6e 63 46  stcase( p->funcF
ded0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44 45  lags & SQLITE_DE
dee0: 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20  TERMINISTIC );. 
def0: 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78 46 75 6e   p->xFunc = xFun
df00: 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70 20 3d 20  c;.  p->xStep = 
df10: 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e  xStep;.  p->xFin
df20: 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a  alize = xFinal;.
df30: 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20 3d    p->pUserData =
df40: 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20 70 2d   pUserData;.  p-
df50: 3e 6e 41 72 67 20 3d 20 28 75 31 36 29 6e 41 72  >nArg = (u16)nAr
df60: 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
df70: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
df80: 43 72 65 61 74 65 20 6e 65 77 20 75 73 65 72 20  Create new user 
df90: 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e  functions..*/.in
dfa0: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
dfb0: 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  _function(.  sql
dfc0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
dfd0: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20  t char *zFunc,. 
dfe0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
dff0: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c   enc,.  void *p,
e000: 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29  .  void (*xFunc)
e010: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e020: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
e030: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
e040: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
e050: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
e060: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
e070: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
e080: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e090: 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  t*).){.  return 
e0a0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
e0b0: 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a  unction_v2(db, z
e0c0: 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Func, nArg, enc,
e0d0: 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70   p, xFunc, xStep
e0e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 29        xFinal, 0)
e110: 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
e120: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
e130: 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
e140: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
e150: 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   *zFunc,.  int n
e160: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
e170: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
e180: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
e190: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
e1a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
e1b0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
e1c0: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
e1d0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
e1e0: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
e1f0: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
e200: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20  te3_context*),. 
e210: 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 6f 79   void (*xDestroy
e220: 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 69  )(void *).){.  i
e230: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
e240: 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44 65 73 74  RROR;.  FuncDest
e250: 72 75 63 74 6f 72 20 2a 70 41 72 67 20 3d 20 30  ructor *pArg = 0
e260: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
e270: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
e280: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
e290: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
e2a0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
e2b0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
e2c0: 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  PT;.  }.#endif. 
e2d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
e2e0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
e2f0: 0a 20 20 69 66 28 20 78 44 65 73 74 72 6f 79 20  .  if( xDestroy 
e300: 29 7b 0a 20 20 20 20 70 41 72 67 20 3d 20 28 46  ){.    pArg = (F
e310: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 29  uncDestructor *)
e320: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
e330: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 46  ero(db, sizeof(F
e340: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 29 29 3b  uncDestructor));
e350: 0a 20 20 20 20 69 66 28 20 21 70 41 72 67 20 29  .    if( !pArg )
e360: 7b 0a 20 20 20 20 20 20 78 44 65 73 74 72 6f 79  {.      xDestroy
e370: 28 70 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  (p);.      goto 
e380: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
e390: 41 72 67 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20  Arg->xDestroy = 
e3a0: 78 44 65 73 74 72 6f 79 3b 0a 20 20 20 20 70 41  xDestroy;.    pA
e3b0: 72 67 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20  rg->pUserData = 
e3c0: 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  p;.  }.  rc = sq
e3d0: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
e3e0: 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c  db, zFunc, nArg,
e3f0: 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20   enc, p, xFunc, 
e400: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70  xStep, xFinal, p
e410: 41 72 67 29 3b 0a 20 20 69 66 28 20 70 41 72 67  Arg);.  if( pArg
e420: 20 26 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d   && pArg->nRef==
e430: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
e440: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e450: 3b 0a 20 20 20 20 78 44 65 73 74 72 6f 79 28 70  ;.    xDestroy(p
e460: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
e470: 46 72 65 65 28 64 62 2c 20 70 41 72 67 29 3b 0a  Free(db, pArg);.
e480: 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20    }.. out:.  rc 
e490: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
e4a0: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
e4b0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
e4c0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
e4d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
e4e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e4f0: 55 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65  UTF16.int sqlite
e500: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
e510: 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  n16(.  sqlite3 *
e520: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  db,.  const void
e530: 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c   *zFunctionName,
e540: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
e550: 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76  nt eTextRep,.  v
e560: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
e570: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
e580: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
e590: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20  ite3_value**),. 
e5a0: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
e5b0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
e5c0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
e5d0: 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  e**),.  void (*x
e5e0: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
e5f0: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e  ontext*).){.  in
e600: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46  t rc;.  char *zF
e610: 75 6e 63 38 3b 0a 0a 23 69 66 64 65 66 20 53 51  unc8;..#ifdef SQ
e620: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
e630: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
e640: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
e650: 6b 28 64 62 29 20 7c 7c 20 7a 46 75 6e 63 74 69  k(db) || zFuncti
e660: 6f 6e 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  onName==0 ) retu
e670: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
e680: 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
e690: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
e6a0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
e6b0: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
e6c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
e6d0: 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65   zFunc8 = sqlite
e6e0: 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46  3Utf16to8(db, zF
e6f0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c  unctionName, -1,
e700: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
e710: 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  IVE);.  rc = sql
e720: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
e730: 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c  b, zFunc8, nArg,
e740: 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46   eTextRep, p, xF
e750: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
e760: 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  al,0);.  sqlite3
e770: 44 62 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63  DbFree(db, zFunc
e780: 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  8);.  rc = sqlit
e790: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
e7a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
e7b0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
e7c0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
e7d0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
e7e0: 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20  ** Declare that 
e7f0: 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  a function has b
e800: 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62  een overloaded b
e810: 79 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  y a virtual tabl
e820: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
e830: 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  function already
e840: 20 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67   exists as a reg
e850: 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ular global func
e860: 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tion, then.** th
e870: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
e880: 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66  no-op.  If the f
e890: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
e8a0: 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65   exist, then cre
e8b0: 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65  ate.** a new one
e8c0: 20 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72   that always thr
e8d0: 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65  ows a run-time e
e8e0: 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  rror.  .**.** Wh
e8f0: 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  en virtual table
e900: 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76  s intend to prov
e910: 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65  ide an overloade
e920: 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79  d function, they
e930: 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  .** should call 
e940: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
e950: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c  make sure the gl
e960: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78  obal function ex
e970: 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61  ists..** A globa
e980: 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  l function must 
e990: 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66  exist in order f
e9a0: 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  or name resoluti
e9b0: 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72  on to work.** pr
e9c0: 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  operly..*/.int s
e9d0: 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f  qlite3_overload_
e9e0: 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  function(.  sqli
e9f0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
ea00: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
ea10: 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e  int nArg.){.  in
ea20: 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  t nName = sqlite
ea30: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
ea40: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
ea50: 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20  ITE_OK;..#ifdef 
ea60: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
ea70: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
ea80: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
ea90: 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65  kOk(db) || zName
eaa0: 3d 3d 30 20 7c 7c 20 6e 41 72 67 3c 2d 32 20 29  ==0 || nArg<-2 )
eab0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
eac0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
ead0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
eae0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
eaf0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
eb00: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 46  if( sqlite3FindF
eb10: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  unction(db, zNam
eb20: 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  e, nName, nArg, 
eb30: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3d  SQLITE_UTF8, 0)=
eb40: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
eb50: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
eb60: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67  (db, zName, nArg
eb70: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20  , SQLITE_UTF8,. 
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb90: 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c            0, sql
eba0: 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e 63 74  ite3InvalidFunct
ebb0: 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ion, 0, 0, 0);. 
ebc0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
ebd0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
ebe0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
ebf0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
ec00: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
ec10: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
ec20: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
ec30: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 74  .** Register a t
ec40: 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20  race function.  
ec50: 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68  The pArg from th
ec60: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  e previously reg
ec70: 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a  istered trace.**
ec80: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a   is returned.  .
ec90: 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61  **.** A NULL tra
eca0: 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  ce function mean
ecb0: 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e  s that no tracin
ecc0: 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20  g is executes.  
ecd0: 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72  A non-NULL.** tr
ece0: 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ace is a pointer
ecf0: 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
ed00: 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  hat is invoked a
ed10: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
ed20: 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65  ach.** SQL state
ed30: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ment..*/.void *s
ed40: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c  qlite3_trace(sql
ed50: 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 28  ite3 *db, void (
ed60: 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63  *xTrace)(void*,c
ed70: 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69  onst char*), voi
ed80: 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64  d *pArg){.  void
ed90: 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20   *pOld;..#ifdef 
eda0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
edb0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
edc0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
edd0: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
ede0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
edf0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
ee00: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
ee10: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
ee20: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
ee30: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
ee40: 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62  >pTraceArg;.  db
ee50: 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63  ->xTrace = xTrac
ee60: 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41  e;.  db->pTraceA
ee70: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
ee80: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
ee90: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
eea0: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a  eturn pOld;.}./*
eeb0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 70  .** Register a p
eec0: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e  rofile function.
eed0: 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
eee0: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
eef0: 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72  egistered .** pr
ef00: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69  ofile function i
ef10: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
ef20: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69  .** A NULL profi
ef30: 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  le function mean
ef40: 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c  s that no profil
ef50: 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
ef60: 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
ef70: 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69  profile is a poi
ef80: 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
ef90: 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b  on that is invok
efa0: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
efb0: 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20  sion of.** each 
efc0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68  SQL statement th
efd0: 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f  at is run..*/.vo
efe0: 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66  id *sqlite3_prof
eff0: 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ile(.  sqlite3 *
f000: 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72  db,.  void (*xPr
f010: 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  ofile)(void*,con
f020: 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f  st char*,sqlite_
f030: 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  uint64),.  void 
f040: 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20  *pArg.){.  void 
f050: 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53  *pOld;..#ifdef S
f060: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
f070: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
f080: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
f090: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
f0a0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
f0b0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
f0c0: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
f0d0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f0e0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
f0f0: 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e  );.  pOld = db->
f100: 70 50 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64  pProfileArg;.  d
f110: 62 2d 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78 50  b->xProfile = xP
f120: 72 6f 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50  rofile;.  db->pP
f130: 72 6f 66 69 6c 65 41 72 67 20 3d 20 70 41 72 67  rofileArg = pArg
f140: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
f150: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
f160: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
f170: 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  d;.}.#endif /* S
f180: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
f190: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73   */../*.** Regis
f1a0: 74 65 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 74  ter a function t
f1b0: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 77 68 65  o be invoked whe
f1c0: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
f1d0: 63 6f 6d 6d 69 74 73 2e 0a 2a 2a 20 49 66 20 74  commits..** If t
f1e0: 68 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74  he invoked funct
f1f0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ion returns non-
f200: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63  zero, then the c
f210: 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20 61 0a  ommit becomes a.
f220: 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  ** rollback..*/.
f230: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f  void *sqlite3_co
f240: 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  mmit_hook(.  sql
f250: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
f260: 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
f270: 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
f280: 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
f290: 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  int (*xCallback)
f2a0: 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e  (void*),  /* Fun
f2b0: 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20  ction to invoke 
f2c0: 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a  on each commit *
f2d0: 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  /.  void *pArg  
f2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f2f0: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
f300: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
f310: 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23    void *pOld;..#
f320: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f330: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
f340: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
f350: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
f360: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
f370: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
f380: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f390: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
f3a0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
f3b0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64  ->mutex);.  pOld
f3c0: 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72   = db->pCommitAr
f3d0: 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  g;.  db->xCommit
f3e0: 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
f3f0: 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d  back;.  db->pCom
f400: 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  mitArg = pArg;. 
f410: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
f420: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
f430: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
f440: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
f450: 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
f460: 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
f470: 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70  time a row is up
f480: 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74  dated,.** insert
f490: 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73  ed or deleted us
f4a0: 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61 73  ing this databas
f4b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
f4c0: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 75  .void *sqlite3_u
f4d0: 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71  pdate_hook(.  sq
f4e0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
f4f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
f500: 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
f510: 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
f520: 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63   void (*xCallbac
f530: 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61  k)(void*,int,cha
f540: 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20 63  r const *,char c
f550: 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69 6e  onst *,sqlite_in
f560: 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  t64),.  void *pA
f570: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
f580: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
f590: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
f5a0: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  .){.  void *pRet
f5b0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
f5c0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
f5d0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
f5e0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
f5f0: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
f600: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
f610: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
f620: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
f630: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
f640: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
f650: 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70 64 61  pRet = db->pUpda
f660: 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55 70  teArg;.  db->xUp
f670: 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78  dateCallback = x
f680: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
f690: 70 55 70 64 61 74 65 41 72 67 20 3d 20 70 41 72  pUpdateArg = pAr
f6a0: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
f6b0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
f6c0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ex);.  return pR
f6d0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  et;.}../*.** Reg
f6e0: 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
f6f0: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
f700: 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73  ach time a trans
f710: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
f720: 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68 69 73  .** back by this
f730: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
f740: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
f750: 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f  qlite3_rollback_
f760: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
f770: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
f780: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
f790: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
f7a0: 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20  abase */.  void 
f7b0: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
f7c0: 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b  d*), /* Callback
f7d0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
f7e0: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
f7f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
f800: 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
f810: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
f820: 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66  d *pRet;..#ifdef
f830: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
f840: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
f850: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
f860: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
f870: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
f880: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
f890: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
f8a0: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
f8b0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
f8c0: 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
f8d0: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a  ->pRollbackArg;.
f8e0: 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43    db->xRollbackC
f8f0: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
f900: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c  ack;.  db->pRoll
f910: 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a  backArg = pArg;.
f920: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f930: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
f940: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
f950: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
f960: 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
f970: 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 52 65  TE_HOOK./*.** Re
f980: 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
f990: 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
f9a0: 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20  each time a row 
f9b0: 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69  is updated,.** i
f9c0: 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74  nserted or delet
f9d0: 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61  ed using this da
f9e0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
f9f0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
fa00: 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f 68 6f  te3_preupdate_ho
fa10: 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
fa20: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
fa30: 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
fa40: 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ok to this datab
fa50: 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 28 2a 78  ase */.  void(*x
fa60: 43 61 6c 6c 62 61 63 6b 29 28 20 20 20 20 20 20  Callback)(      
fa70: 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66     /* Callback f
fa80: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 76  unction */.    v
fa90: 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e  oid*,sqlite3*,in
faa0: 74 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c 63 68  t,char const*,ch
fab0: 61 72 20 63 6f 6e 73 74 2a 2c 73 71 6c 69 74 65  ar const*,sqlite
fac0: 33 5f 69 6e 74 36 34 2c 73 71 6c 69 74 65 33 5f  3_int64,sqlite3_
fad0: 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a  int64),.  void *
fae0: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
faf0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63 61 6c      /* First cal
fb00: 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 2a  lback argument *
fb10: 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  /.){.  void *pRe
fb20: 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  t;.  sqlite3_mut
fb30: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
fb40: 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
fb50: 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 3b  ->pPreUpdateArg;
fb60: 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74  .  db->xPreUpdat
fb70: 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  eCallback = xCal
fb80: 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 50 72  lback;.  db->pPr
fb90: 65 55 70 64 61 74 65 41 72 67 20 3d 20 70 41 72  eUpdateArg = pAr
fba0: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
fbb0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
fbc0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ex);.  return pR
fbd0: 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  et;.}.#endif /* 
fbe0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
fbf0: 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a  EUPDATE_HOOK */.
fc00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
fc10: 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54  OMIT_WAL./*.** T
fc20: 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  he sqlite3_wal_h
fc30: 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 72  ook() callback r
fc40: 65 67 69 73 74 65 72 65 64 20 62 79 20 73 71 6c  egistered by sql
fc50: 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
fc60: 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e  ckpoint()..** In
fc70: 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77 61 6c  voke sqlite3_wal
fc80: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74  _checkpoint if t
fc90: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61  he number of fra
fca0: 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66  mes in the log f
fcb0: 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65  ile.** is greate
fcc0: 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33 2e 70  r than sqlite3.p
fcd0: 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f 20 61  WalArg cast to a
fce0: 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65 20 76  n integer (the v
fcf0: 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20  alue configured 
fd00: 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68  by.** wal_autoch
fd10: 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20  eckpoint())..*/ 
fd20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 44  .int sqlite3WalD
fd30: 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f  efaultHook(.  vo
fd40: 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c  id *pClientData,
fd50: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
fd60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
fd70: 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b,           /* 
fd80: 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  Connection */.  
fd90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
fda0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
fdb0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61  se */.  int nFra
fdc0: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  me             /
fdd0: 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f  * Size of WAL */
fde0: 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d 65  .){.  if( nFrame
fdf0: 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  >=SQLITE_PTR_TO_
fe00: 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74 61 29  INT(pClientData)
fe10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
fe20: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
fe30: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ();.    sqlite3_
fe40: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64  wal_checkpoint(d
fe50: 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c  b, zDb);.    sql
fe60: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
fe70: 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  loc();.  }.  ret
fe80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
fe90: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
fea0: 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
feb0: 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61  *.** Configure a
fec0: 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  n sqlite3_wal_ho
fed0: 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f  ok() callback to
fee0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
fef0: 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64  heckpoint.** a d
ff00: 61 74 61 62 61 73 65 20 61 66 74 65 72 20 63 6f  atabase after co
ff10: 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73  mmitting a trans
ff20: 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20  action if there 
ff30: 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a  are nFrame or.**
ff40: 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69 6e 20   more frames in 
ff50: 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61  the log file. Pa
ff60: 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20  ssing zero or a 
ff70: 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 61  negative value a
ff80: 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20  s the.** nFrame 
ff90: 70 61 72 61 6d 65 74 65 72 20 64 69 73 61 62 6c  parameter disabl
ffa0: 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65  es automatic che
ffb0: 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c  ckpoints entirel
ffc0: 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  y..**.** The cal
ffd0: 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64  lback registered
ffe0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
fff0: 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79 20 65  n replaces any e
10000 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b  xisting callback
10010 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20 75  .** registered u
10020 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c  sing sqlite3_wal
10030 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73  _hook(). Likewis
10040 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67 20 61  e, registering a
10050 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69   callback.** usi
10060 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  ng sqlite3_wal_h
10070 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73 20 74  ook() disables t
10080 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65  he automatic che
10090 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73  ckpoint mechanis
100a0 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20  m.** configured 
100b0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
100c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
100d0 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
100e0 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  int(sqlite3 *db,
100f0 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69   int nFrame){.#i
10100 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
10110 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41  _WAL.  UNUSED_PA
10120 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55  RAMETER(db);.  U
10130 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
10140 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 23  nFrame);.#else.#
10150 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10160 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
10170 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
10180 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
10190 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
101a0 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
101b0 66 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 30  f.  if( nFrame>0
101c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
101d0 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c  wal_hook(db, sql
101e0 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f  ite3WalDefaultHo
101f0 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54  ok, SQLITE_INT_T
10200 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a  O_PTR(nFrame));.
10210 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
10220 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62  ite3_wal_hook(db
10230 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 0);.  }.#en
10240 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
10250 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10260 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c   Register a call
10270 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b  back to be invok
10280 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74  ed each time a t
10290 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 77 72  ransaction is wr
102a0 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68  itten.** into th
102b0 65 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f  e write-ahead-lo
102c0 67 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  g by this databa
102d0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
102e0 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
102f0 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  wal_hook(.  sqli
10300 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
10310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
10320 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
10330 6f 20 74 68 69 73 20 64 62 20 68 61 6e 64 6c 65  o this db handle
10340 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c   */.  int(*xCall
10350 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71  back)(void *, sq
10360 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68  lite3*, const ch
10370 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69  ar*, int),.  voi
10380 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
10390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
103a0 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  First argument p
103b0 61 73 73 65 64 20 74 6f 20 78 43 61 6c 6c 62 61  assed to xCallba
103c0 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  ck() */.){.#ifnd
103d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
103e0 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b  AL.  void *pRet;
103f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10400 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
10410 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
10420 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
10430 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
10440 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
10450 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
10460 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
10470 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
10480 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52  db->mutex);.  pR
10490 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67  et = db->pWalArg
104a0 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c  ;.  db->xWalCall
104b0 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
104c0 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67 20  ;.  db->pWalArg 
104d0 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
104e0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
104f0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
10500 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20  rn pRet;.#else. 
10510 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
10520 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  f.}../*.** Check
10530 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a  point database z
10540 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  Db..*/.int sqlit
10550 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
10560 74 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20  t_v2(.  sqlite3 
10570 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
10580 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
10590 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
105a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
105b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105c0 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63  /* Name of attac
105d0 68 65 64 20 64 61 74 61 62 61 73 65 20 28 6f 72  hed database (or
105e0 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20   NULL) */.  int 
105f0 65 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  eMode,          
10600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10610 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
10620 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  _* value */.  in
10630 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20  t *pnLog,       
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10650 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57 41   OUT: Size of WA
10660 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73 20  L log in frames 
10670 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74  */.  int *pnCkpt
10680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10690 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74       /* OUT: Tot
106a0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61  al number of fra
106b0 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  mes checkpointed
106c0 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51   */.){.#ifdef SQ
106d0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
106e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
106f0 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
10700 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
10720 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
10730 74 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d  t iDb = SQLITE_M
10740 41 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f 2a  AX_ATTACHED;  /*
10750 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69   sqlite3.aDb[] i
10760 6e 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63 68  ndex of db to ch
10770 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 23 69 66  eckpoint */..#if
10780 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
10790 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
107a0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
107b0 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
107c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
107d0 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
107e0 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
107f0 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
10800 61 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e 20 63  ables to -1 in c
10810 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  ase an error occ
10820 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e  urs. */.  if( pn
10830 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d  Log ) *pnLog = -
10840 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70 74 20  1;.  if( pnCkpt 
10850 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a  ) *pnCkpt = -1;.
10860 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
10870 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
10880 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20 61 73 73  SIVE==0 );.  ass
10890 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
108a0 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29  KPOINT_FULL==1 )
108b0 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
108c0 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45  TE_CHECKPOINT_RE
108d0 53 54 41 52 54 3d 3d 32 20 29 3b 0a 20 20 61 73  START==2 );.  as
108e0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
108f0 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45  CKPOINT_TRUNCATE
10900 3d 3d 33 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f  ==3 );.  if( eMo
10910 64 65 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  de<SQLITE_CHECKP
10920 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 7c 7c 20  OINT_PASSIVE || 
10930 65 4d 6f 64 65 3e 53 51 4c 49 54 45 5f 43 48 45  eMode>SQLITE_CHE
10940 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45  CKPOINT_TRUNCATE
10950 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
10960 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 39 39 36 2d  NCE-OF: R-03996-
10970 31 32 30 38 38 20 54 68 65 20 4d 20 70 61 72 61  12088 The M para
10980 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20 61 20  meter must be a 
10990 76 61 6c 69 64 20 63 68 65 63 6b 70 6f 69 6e 74  valid checkpoint
109a0 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 3a 20 2a 2f  .    ** mode: */
109b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
109c0 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a  TE_MISUSE;.  }..
109d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
109e0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
109f0 3b 0a 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a  ;.  if( zDb && z
10a00 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44 62  Db[0] ){.    iDb
10a10 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
10a20 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20  Name(db, zDb);. 
10a30 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29   }.  if( iDb<0 )
10a40 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
10a50 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  E_ERROR;.    sql
10a60 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
10a70 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f  (db, SQLITE_ERRO
10a80 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  R, "unknown data
10a90 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62 29 3b  base: %s", zDb);
10aa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
10ab0 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42  ->busyHandler.nB
10ac0 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  usy = 0;.    rc 
10ad0 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f  = sqlite3Checkpo
10ae0 69 6e 74 28 64 62 2c 20 69 44 62 2c 20 65 4d 6f  int(db, iDb, eMo
10af0 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70  de, pnLog, pnCkp
10b00 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
10b10 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20  rror(db, rc);.  
10b20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
10b30 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
10b40 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10b50 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
10b60 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
10b70 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
10b80 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61   Checkpoint data
10b90 62 61 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62  base zDb. If zDb
10ba0 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20   is NULL, or if 
10bb0 74 68 65 20 62 75 66 66 65 72 20 7a 44 62 20 70  the buffer zDb p
10bc0 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74  oints.** to cont
10bd0 61 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67  ains a zero-leng
10be0 74 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61  th string, all a
10bf0 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
10c00 73 20 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70  s are .** checkp
10c10 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ointed..*/.int s
10c20 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
10c30 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
10c40 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
10c50 44 62 29 7b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  Db){.  /* EVIDEN
10c60 43 45 2d 4f 46 3a 20 52 2d 34 31 36 31 33 2d 32  CE-OF: R-41613-2
10c70 30 35 35 33 20 54 68 65 20 73 71 6c 69 74 65 33  0553 The sqlite3
10c80 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
10c90 44 2c 58 29 20 69 73 20 65 71 75 69 76 61 6c 65  D,X) is equivale
10ca0 6e 74 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74  nt to.  ** sqlit
10cb0 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
10cc0 74 5f 76 32 28 44 2c 58 2c 53 51 4c 49 54 45 5f  t_v2(D,X,SQLITE_
10cd0 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
10ce0 56 45 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20 72 65  VE,0,0). */.  re
10cf0 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c  turn sqlite3_wal
10d00 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64  _checkpoint_v2(d
10d10 62 2c 7a 44 62 2c 53 51 4c 49 54 45 5f 43 48 45  b,zDb,SQLITE_CHE
10d20 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c  CKPOINT_PASSIVE,
10d30 30 2c 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  0,0);.}..#ifndef
10d40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
10d50 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65  ./*.** Run a che
10d60 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62  ckpoint on datab
10d70 61 73 65 20 69 44 62 2e 20 54 68 69 73 20 69 73  ase iDb. This is
10d80 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61   a no-op if data
10d90 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e  base iDb is.** n
10da0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  ot currently ope
10db0 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a  n in WAL mode..*
10dc0 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
10dd0 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e  ction is open on
10de0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
10df0 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  ing checkpointed
10e00 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  , this .** funct
10e10 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
10e20 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20  TE_LOCKED and a 
10e30 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f  checkpoint is no
10e40 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49 66 20  t attempted. If 
10e50 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  .** an error occ
10e60 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e  urs while runnin
10e70 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  g the checkpoint
10e80 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
10e90 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65  r code is .** re
10ea0 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c  turned (i.e. SQL
10eb0 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65  ITE_IOERR). Othe
10ec0 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
10ed0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65  ..**.** The mute
10ee0 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61  x on database ha
10ef0 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64 20 62  ndle db should b
10f00 65 20 68 65 6c 64 20 62 79 20 74 68 65 20 63 61  e held by the ca
10f10 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65 78 0a  ller. The mutex.
10f20 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ** associated wi
10f30 74 68 20 74 68 65 20 73 70 65 63 69 66 69 63 20  th the specific 
10f40 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63 68 65  b-tree being che
10f50 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74 61 6b  ckpointed is tak
10f60 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 75  en by.** this fu
10f70 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 65  nction while the
10f80 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 72   checkpoint is r
10f90 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  unning..**.** If
10fa0 20 69 44 62 20 69 73 20 70 61 73 73 65 64 20 53   iDb is passed S
10fb0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
10fc0 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74 74  ED, then all att
10fd0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
10fe0 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e  are.** checkpoin
10ff0 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ted. If an error
11000 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
11010 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  it is returned i
11020 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20  mmediately -.** 
11030 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  no attempt is ma
11040 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74  de to checkpoint
11050 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 64   any remaining d
11060 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20  atabases..**.** 
11070 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20  Parameter eMode 
11080 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  is one of SQLITE
11090 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
110a0 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20 52 45 53  IVE, FULL or RES
110b0 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  TART..*/.int sql
110c0 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 73  ite3Checkpoint(s
110d0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
110e0 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c 20  iDb, int eMode, 
110f0 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20  int *pnLog, int 
11100 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74 20  *pnCkpt){.  int 
11110 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
11120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11130 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
11140 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11160 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
11170 74 65 20 74 68 72 6f 75 67 68 20 61 74 74 61 63  te through attac
11180 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e 74  hed dbs */.  int
11190 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20 20 20   bBusy = 0;     
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
111b0 54 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f 42  True if SQLITE_B
111c0 55 53 59 20 68 61 73 20 62 65 65 6e 20 65 6e 63  USY has been enc
111d0 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20 61  ountered */..  a
111e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
111f0 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
11200 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
11210 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c  ( !pnLog || *pnL
11220 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65  og==-1 );.  asse
11230 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20 2a  rt( !pnCkpt || *
11240 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20  pnCkpt==-1 );.. 
11250 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
11260 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  nDb && rc==SQLIT
11270 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
11280 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44  if( i==iDb || iD
11290 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  b==SQLITE_MAX_AT
112a0 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20 20 20  TACHED ){.      
112b0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
112c0 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e  eCheckpoint(db->
112d0 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f 64  aDb[i].pBt, eMod
112e0 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74  e, pnLog, pnCkpt
112f0 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20 3d  );.      pnLog =
11300 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70 74   0;.      pnCkpt
11310 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
11320 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
11330 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75 73 79  ){.        bBusy
11340 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63   = 1;.        rc
11350 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11360 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11370 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
11380 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42 75 73  QLITE_OK && bBus
11390 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59  y) ? SQLITE_BUSY
113a0 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20   : rc;.}.#endif 
113b0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
113c0 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  AL */../*.** Thi
113d0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
113e0 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69 6e 2d  ns true if main-
113f0 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62 65  memory should be
11400 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66   used instead of
11410 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20  .** a temporary 
11420 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73 69 65  file for transie
11430 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73 20 61  nt pager files a
11440 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  nd statement jou
11450 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61  rnals..** The va
11460 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64 65 70  lue returned dep
11470 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75  ends on the valu
11480 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74  e of db->temp_st
11490 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20  ore (runtime.** 
114a0 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64 20 74  parameter) and t
114b0 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20  he compile time 
114c0 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f  value of SQLITE_
114d0 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a  TEMP_STORE. The.
114e0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  ** following tab
114f0 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
11500 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65   relationship be
11510 74 77 65 65 6e 20 74 68 65 73 65 20 74 77 6f 20  tween these two 
11520 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68  values.** and th
11530 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74  is functions ret
11540 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  urn value..**.**
11550 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53     SQLITE_TEMP_S
11560 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d  TORE     db->tem
11570 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61  p_store     Loca
11580 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72  tion of temporar
11590 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  y database.**   
115a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
115b0 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
115c0 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
115d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
115e0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20  -------.**   0  
115f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11600 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20     any          
11610 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
11620 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
11630 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
11640 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
11650 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
11660 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
11670 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
11680 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
11690 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
116a0 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
116b0 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20  .**   1         
116c0 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
116d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
116e0 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
116f0 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20   0).**   2      
11700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
11710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11720 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
11730 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20  urn 0).**   2   
11740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11750 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
11760 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
11770 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32  return 1).**   2
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11790 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
117a0 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
117b0 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
117c0 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20    3             
117d0 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20          any     
117e0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
117f0 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a  y    (return 1).
11800 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65  */.int sqlite3Te
11810 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74  mpInMemory(const
11820 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23   sqlite3 *db){.#
11830 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
11840 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e  TORE==1.  return
11850 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72   ( db->temp_stor
11860 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23  e==2 );.#endif.#
11870 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
11880 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e  TORE==2.  return
11890 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72   ( db->temp_stor
118a0 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23  e!=1 );.#endif.#
118b0 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
118c0 54 4f 52 45 3d 3d 33 0a 20 20 55 4e 55 53 45 44  TORE==3.  UNUSED
118d0 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
118e0 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
118f0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  if.#if SQLITE_TE
11900 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51  MP_STORE<1 || SQ
11910 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e  LITE_TEMP_STORE>
11920 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  3.  UNUSED_PARAM
11930 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65 74 75  ETER(db);.  retu
11940 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 0;.#endif.}..
11950 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46  /*.** Return UTF
11960 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69  -8 encoded Engli
11970 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c  sh language expl
11980 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  anation of the m
11990 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72  ost recent.** er
119a0 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ror..*/.const ch
119b0 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d  ar *sqlite3_errm
119c0 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  sg(sqlite3 *db){
119d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
119e0 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20  ;.  if( !db ){. 
119f0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
11a00 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e  3ErrStr(SQLITE_N
11a10 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  OMEM);.  }.  if(
11a20 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
11a30 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
11a40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
11a50 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c  qlite3ErrStr(SQL
11a60 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29  ITE_MISUSE_BKPT)
11a70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
11a80 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
11a90 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
11aa0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
11ab0 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  {.    z = sqlite
11ac0 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e  3ErrStr(SQLITE_N
11ad0 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  OMEM);.  }else{.
11ae0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62      testcase( db
11af0 2d 3e 70 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20  ->pErr==0 );.   
11b00 20 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69   z = (char*)sqli
11b10 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64  te3_value_text(d
11b20 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73  b->pErr);.    as
11b30 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
11b40 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69  cFailed );.    i
11b50 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( z==0 ){.     
11b60 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53   z = sqlite3ErrS
11b70 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b  tr(db->errCode);
11b80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
11b90 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
11ba0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
11bb0 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e  eturn z;.}..#ifn
11bc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11bd0 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75  UTF16./*.** Retu
11be0 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65  rn UTF-16 encode
11bf0 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  d English langua
11c00 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ge explanation o
11c10 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
11c20 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63  t.** error..*/.c
11c30 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
11c40 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69  e3_errmsg16(sqli
11c50 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74  te3 *db){.  stat
11c60 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74  ic const u16 out
11c70 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20  OfMem[] = {.    
11c80 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27  'o', 'u', 't', '
11c90 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20   ', 'o', 'f', ' 
11ca0 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27  ', 'm', 'e', 'm'
11cb0 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c  , 'o', 'r', 'y',
11cc0 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63   0.  };.  static
11cd0 20 63 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73   const u16 misus
11ce0 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c  e[] = {.    'l',
11cf0 20 27 69 27 2c 20 27 62 27 2c 20 27 72 27 2c 20   'i', 'b', 'r', 
11d00 27 61 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 27  'a', 'r', 'y', '
11d10 20 27 2c 20 0a 20 20 20 20 27 72 27 2c 20 27 6f   ', .    'r', 'o
11d20 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 69 27  ', 'u', 't', 'i'
11d30 2c 20 27 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c  , 'n', 'e', ' ',
11d40 20 0a 20 20 20 20 27 63 27 2c 20 27 61 27 2c 20   .    'c', 'a', 
11d50 27 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27  'l', 'l', 'e', '
11d60 64 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f  d', ' ', .    'o
11d70 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27  ', 'u', 't', ' '
11d80 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 66 27 2c  , .    'o', 'f',
11d90 20 27 20 27 2c 20 0a 20 20 20 20 27 73 27 2c 20   ' ', .    's', 
11da0 27 65 27 2c 20 27 71 27 2c 20 27 75 27 2c 20 27  'e', 'q', 'u', '
11db0 65 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27 65  e', 'n', 'c', 'e
11dc0 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e  ', 0.  };..  con
11dd0 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66  st void *z;.  if
11de0 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
11df0 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f  urn (void *)outO
11e00 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  fMem;.  }.  if( 
11e10 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
11e20 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
11e30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76  ){.    return (v
11e40 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20  oid *)misuse;.  
11e50 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
11e60 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
11e70 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  x);.  if( db->ma
11e80 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
11e90 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75    z = (void *)ou
11ea0 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b  tOfMem;.  }else{
11eb0 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
11ec0 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62  _value_text16(db
11ed0 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28  ->pErr);.    if(
11ee0 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   z==0 ){.      s
11ef0 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
11f00 73 67 28 64 62 2c 20 64 62 2d 3e 65 72 72 43 6f  sg(db, db->errCo
11f10 64 65 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  de, sqlite3ErrSt
11f20 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 29 3b  r(db->errCode));
11f30 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
11f40 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
11f50 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d  db->pErr);.    }
11f60 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  .    /* A malloc
11f70 28 29 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c  () may have fail
11f80 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61  ed within the ca
11f90 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61  ll to sqlite3_va
11fa0 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20  lue_text16().   
11fb0 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68   ** above. If th
11fc0 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
11fd0 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c  then the db->mal
11fe0 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e  locFailed flag n
11ff0 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62  eeds to.    ** b
12000 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65  e cleared before
12010 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74   returning. Do t
12020 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e  his directly, in
12030 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20  stead of via.   
12040 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78   ** sqlite3ApiEx
12050 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73  it(), to avoid s
12060 65 74 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  etting the datab
12070 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72  ase handle error
12080 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f   message..    */
12090 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
120a0 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  ailed = 0;.  }. 
120b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
120c0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
120d0 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23  .  return z;.}.#
120e0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
120f0 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f  OMIT_UTF16 */../
12100 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
12110 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f  most recent erro
12120 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  r code generated
12130 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f   by an SQLite ro
12140 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69  utine. If NULL i
12150 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74  s.** passed to t
12160 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65  his function, we
12170 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63   assume a malloc
12180 28 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67  () failed during
12190 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e   sqlite3_open().
121a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
121b0 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20  errcode(sqlite3 
121c0 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26  *db){.  if( db &
121d0 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  & !sqlite3Safety
121e0 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
121f0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
12200 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
12210 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64  PT;.  }.  if( !d
12220 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  b || db->mallocF
12230 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
12240 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
12250 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
12260 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d  b->errCode & db-
12270 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20  >errMask;.}.int 
12280 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
12290 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33  _errcode(sqlite3
122a0 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20   *db){.  if( db 
122b0 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  && !sqlite3Safet
122c0 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
122d0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
122e0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
122f0 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  KPT;.  }.  if( !
12300 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  db || db->malloc
12310 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
12320 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12330 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
12340 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a  db->errCode;.}..
12350 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
12360 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
12370 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66  ibes the kind of
12380 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64   error specified
12390 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d   in the.** argum
123a0 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 74  ent.  For now, t
123b0 68 69 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c 73  his simply calls
123c0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 71   the internal sq
123d0 6c 69 74 65 33 45 72 72 53 74 72 28 29 0a 2a 2a  lite3ErrStr().**
123e0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f   function..*/.co
123f0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
12400 33 5f 65 72 72 73 74 72 28 69 6e 74 20 72 63 29  3_errstr(int rc)
12410 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
12420 65 33 45 72 72 53 74 72 28 72 63 29 3b 0a 7d 0a  e3ErrStr(rc);.}.
12430 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
12440 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  new collating fu
12450 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62  nction for datab
12460 61 73 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e  ase "db".  The n
12470 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20  ame is zName.** 
12480 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  and the encoding
12490 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74   is enc..*/.stat
124a0 69 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c  ic int createCol
124b0 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  lation(.  sqlite
124c0 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3* db,.  const c
124d0 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75  har *zName, .  u
124e0 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70  8 enc,.  void* p
124f0 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
12500 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
12510 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
12520 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20  const void*),.  
12530 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64  void(*xDel)(void
12540 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  *).){.  CollSeq 
12550 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e  *pColl;.  int en
12560 63 32 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  c2;.  .  assert(
12570 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12580 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
12590 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54  ;..  /* If SQLIT
125a0 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69  E_UTF16 is speci
125b0 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f  fied as the enco
125c0 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73  ding type, trans
125d0 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74  form this.  ** t
125e0 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  o one of SQLITE_
125f0 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54  UTF16LE or SQLIT
12600 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20  E_UTF16BE using 
12610 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
12620 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72  UTF16NATIVE macr
12630 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  o. SQLITE_UTF16 
12640 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65  is not used inte
12650 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65  rnally..  */.  e
12660 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73  nc2 = enc;.  tes
12670 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c  tcase( enc2==SQL
12680 49 54 45 5f 55 54 46 31 36 20 29 3b 0a 20 20 74  ITE_UTF16 );.  t
12690 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53  estcase( enc2==S
126a0 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
126b0 4e 45 44 20 29 3b 0a 20 20 69 66 28 20 65 6e 63  NED );.  if( enc
126c0 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20  2==SQLITE_UTF16 
126d0 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  || enc2==SQLITE_
126e0 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b  UTF16_ALIGNED ){
126f0 0a 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49  .    enc2 = SQLI
12700 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
12710 20 20 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c 53    }.  if( enc2<S
12720 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e  QLITE_UTF8 || en
12730 63 32 3e 53 51 4c 49 54 45 5f 55 54 46 31 36 42  c2>SQLITE_UTF16B
12740 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  E ){.    return 
12750 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
12760 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  PT;.  }..  /* Ch
12770 65 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c  eck if this call
12780 20 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20   is removing or 
12790 72 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69  replacing an exi
127a0 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20  sting collation 
127b0 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20  .  ** sequence. 
127c0 49 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65  If so, and there
127d0 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c   are active VMs,
127e0 20 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66   return busy. If
127f0 20 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20   there.  ** are 
12800 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69  no active VMs, i
12810 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72  nvalidate any pr
12820 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  e-compiled state
12830 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43  ments..  */.  pC
12840 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
12850 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38  dCollSeq(db, (u8
12860 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29  )enc2, zName, 0)
12870 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26  ;.  if( pColl &&
12880 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a   pColl->xCmp ){.
12890 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62      if( db->nVdb
128a0 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20  eActive ){.     
128b0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
128c0 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  hMsg(db, SQLITE_
128d0 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22  BUSY, .        "
128e0 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
128f0 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f  /modify collatio
12900 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65 20 74  n sequence due t
12910 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  o active stateme
12920 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74  nts");.      ret
12930 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
12940 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
12950 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
12960 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
12970 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61  .    /* If colla
12980 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43  tion sequence pC
12990 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  oll was created 
129a0 64 69 72 65 63 74 6c 79 20 62 79 20 61 20 63 61  directly by a ca
129b0 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
129c0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
129d0 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67  ation, and not g
129e0 65 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e 74  enerated by synt
129f0 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20  hCollSeq(),.    
12a00 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69  ** then any copi
12a10 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68  es made by synth
12a20 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74  CollSeq() need t
12a30 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  o be invalidated
12a40 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63  ..    ** Also, c
12a50 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63  ollation destruc
12a60 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44  tor - CollSeq.xD
12a70 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20  el() - function 
12a80 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  may need.    ** 
12a90 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20  to be called..  
12aa0 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70    */ .    if( (p
12ab0 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c  Coll->enc & ~SQL
12ac0 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
12ad0 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20  D)==enc2 ){.    
12ae0 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c    CollSeq *aColl
12af0 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
12b00 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  nd(&db->aCollSeq
12b10 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
12b20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
12b30 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
12b40 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
12b50 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b   *p = &aColl[j];
12b60 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
12b70 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20  enc==pColl->enc 
12b80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
12b90 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20   p->xDel ){.    
12ba0 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28          p->xDel(
12bb0 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20  p->pUser);.     
12bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12bd0 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20   p->xCmp = 0;.  
12be0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12bf0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f      }.  }..  pCo
12c00 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
12c10 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
12c20 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b  enc2, zName, 1);
12c30 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20  .  if( pColl==0 
12c40 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
12c50 4e 4f 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e  NOMEM;.  pColl->
12c60 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b  xCmp = xCompare;
12c70 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20  .  pColl->pUser 
12c80 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d  = pCtx;.  pColl-
12c90 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20  >xDel = xDel;.  
12ca0 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38  pColl->enc = (u8
12cb0 29 28 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20  )(enc2 | (enc & 
12cc0 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
12cd0 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c 69 74 65  GNED));.  sqlite
12ce0 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
12cf0 45 5f 4f 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20  E_OK);.  return 
12d00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
12d10 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72 61 79 20  *.** This array 
12d20 64 65 66 69 6e 65 73 20 68 61 72 64 20 75 70 70  defines hard upp
12d30 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d  er bounds on lim
12d40 69 74 20 76 61 6c 75 65 73 2e 20 20 54 68 65 0a  it values.  The.
12d50 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d  ** initializer m
12d60 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e 20 73  ust be kept in s
12d70 79 6e 63 20 77 69 74 68 20 74 68 65 20 53 51 4c  ync with the SQL
12d80 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23  ITE_LIMIT_*.** #
12d90 64 65 66 69 6e 65 73 20 69 6e 20 73 71 6c 69 74  defines in sqlit
12da0 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e3.h..*/.static 
12db0 63 6f 6e 73 74 20 69 6e 74 20 61 48 61 72 64 4c  const int aHardL
12dc0 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c  imit[] = {.  SQL
12dd0 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a  ITE_MAX_LENGTH,.
12de0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c    SQLITE_MAX_SQL
12df0 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
12e00 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20  E_MAX_COLUMN,.  
12e10 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
12e20 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  DEPTH,.  SQLITE_
12e30 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
12e40 45 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  ECT,.  SQLITE_MA
12e50 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c  X_VDBE_OP,.  SQL
12e60 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
12e70 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  _ARG,.  SQLITE_M
12e80 41 58 5f 41 54 54 41 43 48 45 44 2c 0a 20 20 53  AX_ATTACHED,.  S
12e90 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
12ea0 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20  ATTERN_LENGTH,. 
12eb0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49   SQLITE_MAX_VARI
12ec0 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 20 20 20 20  ABLE_NUMBER,    
12ed0 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 38 30 39    /* IMP: R-3809
12ee0 31 2d 33 32 33 35 32 20 2a 2f 0a 20 20 53 51 4c  1-32352 */.  SQL
12ef0 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
12f00 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  DEPTH,.  SQLITE_
12f10 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
12f20 44 53 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61  DS,.};../*.** Ma
12f30 6b 65 20 73 75 72 65 20 74 68 65 20 68 61 72 64  ke sure the hard
12f40 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65 74 20   limits are set 
12f50 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20 76 61  to reasonable va
12f60 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  lues.*/.#if SQLI
12f70 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30  TE_MAX_LENGTH<10
12f80 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
12f90 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _MAX_LENGTH must
12fa0 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30   be at least 100
12fb0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
12fc0 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
12fd0 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51  H<100.# error SQ
12fe0 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
12ff0 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
13000 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a  east 100.#endif.
13010 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  #if SQLITE_MAX_S
13020 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45  QL_LENGTH>SQLITE
13030 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72  _MAX_LENGTH.# er
13040 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ror SQLITE_MAX_S
13050 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e  QL_LENGTH must n
13060 6f 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ot be greater th
13070 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  an SQLITE_MAX_LE
13080 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69 66 20  NGTH.#endif.#if 
13090 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
130a0 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65  UND_SELECT<2.# e
130b0 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
130c0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
130d0 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
130e0 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   2.#endif.#if SQ
130f0 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
13100 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  <40.# error SQLI
13110 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d  TE_MAX_VDBE_OP m
13120 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
13130 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  40.#endif.#if SQ
13140 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
13150 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54  N_ARG<0 || SQLIT
13160 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
13170 52 47 3e 31 30 30 30 0a 23 20 65 72 72 6f 72 20  RG>1000.# error 
13180 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
13190 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65 20  ION_ARG must be 
131a0 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 30  between 0 and 10
131b0 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
131c0 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
131d0 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  D<0 || SQLITE_MA
131e0 58 5f 41 54 54 41 43 48 45 44 3e 31 32 35 0a 23  X_ATTACHED>125.#
131f0 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
13200 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74 20  X_ATTACHED must 
13210 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
13220 20 31 32 35 0a 23 65 6e 64 69 66 0a 23 69 66 20   125.#endif.#if 
13230 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
13240 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31  PATTERN_LENGTH<1
13250 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
13260 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
13270 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
13280 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69  at least 1.#endi
13290 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
132a0 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20  _COLUMN>32767.# 
132b0 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
132c0 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74  _COLUMN must not
132d0 20 65 78 63 65 65 64 20 33 32 37 36 37 0a 23 65   exceed 32767.#e
132e0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
132f0 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
13300 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  H<1.# error SQLI
13310 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
13320 45 50 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  EPTH must be at 
13330 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23  least 1.#endif.#
13340 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  if SQLITE_MAX_WO
13350 52 4b 45 52 5f 54 48 52 45 41 44 53 3c 30 20 7c  RKER_THREADS<0 |
13360 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  | SQLITE_MAX_WOR
13370 4b 45 52 5f 54 48 52 45 41 44 53 3e 35 30 0a 23  KER_THREADS>50.#
13380 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
13390 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
133a0 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
133b0 20 30 20 61 6e 64 20 35 30 0a 23 65 6e 64 69 66   0 and 50.#endif
133c0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  .../*.** Change 
133d0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 6c  the value of a l
133e0 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20 74 68  imit.  Report th
133f0 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20  e old value..** 
13400 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69  If an invalid li
13410 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73 75 70  mit index is sup
13420 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20 2d 31  plied, report -1
13430 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61  ..** Make no cha
13440 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c 20 72  nges but still r
13450 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61  eport the old va
13460 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65  lue if the.** ne
13470 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74  w limit is negat
13480 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  ive..**.** A new
13490 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f 65   lower limit doe
134a0 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78 69  s not shrink exi
134b0 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 73  sting constructs
134c0 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 70  ..** It merely p
134d0 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73  revents new cons
134e0 74 72 75 63 74 73 20 74 68 61 74 20 65 78 63 65  tructs that exce
134f0 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20  ed the limit.** 
13500 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f  from forming..*/
13510 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d  .int sqlite3_lim
13520 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
13530 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74  int limitId, int
13540 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e   newLimit){.  in
13550 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 23 69 66  t oldLimit;..#if
13560 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
13570 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
13580 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
13590 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
135a0 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
135b0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
135c0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
135d0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 56 49  #endif..  /* EVI
135e0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31 38  DENCE-OF: R-3018
135f0 39 2d 35 34 30 39 37 20 46 6f 72 20 65 61 63 68  9-54097 For each
13600 20 6c 69 6d 69 74 20 63 61 74 65 67 6f 72 79 20   limit category 
13610 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d  SQLITE_LIMIT_NAM
13620 45 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  E.  ** there is 
13630 61 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75  a hard upper bou
13640 6e 64 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c  nd set at compil
13650 65 2d 74 69 6d 65 20 62 79 20 61 20 43 20 70 72  e-time by a C pr
13660 65 70 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a 20  eprocessor.  ** 
13670 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20 53 51 4c  macro called SQL
13680 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28 54  ITE_MAX_NAME. (T
13690 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e 20  he "_LIMIT_" in 
136a0 74 68 65 20 6e 61 6d 65 20 69 73 20 63 68 61 6e  the name is chan
136b0 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41  ged to.  ** "_MA
136c0 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73 73  X_".).  */.  ass
136d0 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
136e0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
136f0 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  GTH]==SQLITE_MAX
13700 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
13710 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
13720 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c  SQLITE_LIMIT_SQL
13730 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45  _LENGTH]==SQLITE
13740 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
13750 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
13760 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
13770 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51  IMIT_COLUMN]==SQ
13780 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20  LITE_MAX_COLUMN 
13790 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
137a0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
137b0 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d  IMIT_EXPR_DEPTH]
137c0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  ==SQLITE_MAX_EXP
137d0 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  R_DEPTH );.  ass
137e0 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
137f0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
13800 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d 53  POUND_SELECT]==S
13810 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
13820 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61 73  ND_SELECT);.  as
13830 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
13840 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44  [SQLITE_LIMIT_VD
13850 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d  BE_OP]==SQLITE_M
13860 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20 20  AX_VDBE_OP );.  
13870 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
13880 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
13890 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53  FUNCTION_ARG]==S
138a0 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
138b0 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61 73 73 65  ON_ARG );.  asse
138c0 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
138d0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41  QLITE_LIMIT_ATTA
138e0 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  CHED]==SQLITE_MA
138f0 58 5f 41 54 54 41 43 48 45 44 20 29 3b 0a 20 20  X_ATTACHED );.  
13900 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
13910 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
13920 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
13930 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20 20  GTH]==.         
13940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13960 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58        SQLITE_MAX
13970 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
13980 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  NGTH );.  assert
13990 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
139a0 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
139b0 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c 49  LE_NUMBER]==SQLI
139c0 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
139d0 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73 73 65 72  NUMBER);.  asser
139e0 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
139f0 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
13a00 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54  ER_DEPTH]==SQLIT
13a10 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
13a20 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
13a30 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
13a40 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
13a50 54 48 52 45 41 44 53 5d 3d 3d 53 51 4c 49 54 45  THREADS]==SQLITE
13a60 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
13a70 41 44 53 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ADS );.  assert(
13a80 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f   SQLITE_LIMIT_WO
13a90 52 4b 45 52 5f 54 48 52 45 41 44 53 3d 3d 28 53  RKER_THREADS==(S
13aa0 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29  QLITE_N_LIMIT-1)
13ab0 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d 69   );...  if( limi
13ac0 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64  tId<0 || limitId
13ad0 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54  >=SQLITE_N_LIMIT
13ae0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d   ){.    return -
13af0 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69  1;.  }.  oldLimi
13b00 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c  t = db->aLimit[l
13b10 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e  imitId];.  if( n
13b20 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20 20  ewLimit>=0 ){   
13b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b40 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34 37 36 2d  /* IMP: R-52476-
13b50 32 38 37 33 32 20 2a 2f 0a 20 20 20 20 69 66 28  28732 */.    if(
13b60 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c   newLimit>aHardL
13b70 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b  imit[limitId] ){
13b80 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20  .      newLimit 
13b90 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  = aHardLimit[lim
13ba0 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20  itId];  /* IMP: 
13bb0 52 2d 35 31 34 36 33 2d 32 35 36 33 34 20 2a 2f  R-51463-25634 */
13bc0 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61  .    }.    db->a
13bd0 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d  Limit[limitId] =
13be0 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20   newLimit;.  }. 
13bf0 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74   return oldLimit
13c00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13c10 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
13c20 35 33 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a 7d  53341-35419 */.}
13c30 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
13c40 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
13c50 20 70 61 72 73 65 20 62 6f 74 68 20 55 52 49 73   parse both URIs
13c60 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20 66 69 6c   and non-URI fil
13c70 65 6e 61 6d 65 73 20 70 61 73 73 65 64 20 62 79  enames passed by
13c80 20 74 68 65 0a 2a 2a 20 75 73 65 72 20 74 6f 20   the.** user to 
13c90 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20 73 71  API functions sq
13ca0 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 6f 72 20  lite3_open() or 
13cb0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
13cc0 29 2c 20 61 6e 64 20 66 6f 72 20 64 61 74 61 62  ), and for datab
13cd0 61 73 65 0a 2a 2a 20 55 52 49 73 20 73 70 65 63  ase.** URIs spec
13ce0 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66  ified as part of
13cf0 20 41 54 54 41 43 48 20 73 74 61 74 65 6d 65 6e   ATTACH statemen
13d00 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ts..**.** The fi
13d10 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
13d20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
13d30 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
13d40 20 56 46 53 20 74 6f 20 75 73 65 20 28 6f 72 0a   VFS to use (or.
13d50 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20 73 69 67  ** a NULL to sig
13d60 6e 69 66 79 20 74 68 65 20 64 65 66 61 75 6c 74  nify the default
13d70 20 56 46 53 29 20 69 66 20 74 68 65 20 55 52 49   VFS) if the URI
13d80 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
13d90 6e 20 61 20 22 76 66 73 3d 78 78 78 22 0a 2a 2a  n a "vfs=xxx".**
13da0 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
13db0 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
13dc0 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74  ument contains t
13dd0 68 65 20 55 52 49 20 28 6f 72 20 6e 6f 6e 2d 55  he URI (or non-U
13de0 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20  RI filename).** 
13df0 69 74 73 65 6c 66 2e 20 57 68 65 6e 20 74 68 69  itself. When thi
13e00 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
13e10 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c 61 67 73  lled the *pFlags
13e20 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64   variable should
13e30 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68 65 20   contain.** the 
13e40 64 65 66 61 75 6c 74 20 66 6c 61 67 73 20 74 6f  default flags to
13e50 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   open the databa
13e60 73 65 20 68 61 6e 64 6c 65 20 77 69 74 68 2e 20  se handle with. 
13e70 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  The value stored
13e80 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73 20 6d   in.** *pFlags m
13e90 61 79 20 62 65 20 75 70 64 61 74 65 64 20 62 65  ay be updated be
13ea0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
13eb0 66 20 74 68 65 20 55 52 49 20 66 69 6c 65 6e 61  f the URI filena
13ec0 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20  me contains .** 
13ed0 22 63 61 63 68 65 3d 78 78 78 22 20 6f 72 20 22  "cache=xxx" or "
13ee0 6d 6f 64 65 3d 78 78 78 22 20 71 75 65 72 79 20  mode=xxx" query 
13ef0 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a  parameters..**.*
13f00 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
13f10 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
13f20 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  turned. In this 
13f30 63 61 73 65 20 2a 70 70 56 66 73 20 69 73 20 73  case *ppVfs is s
13f40 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  et to point to.*
13f50 2a 20 74 68 65 20 56 46 53 20 74 68 61 74 20 73  * the VFS that s
13f60 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f  hould be used to
13f70 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   open the databa
13f80 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46 69 6c 65  se file. *pzFile
13f90 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f   is set to.** po
13fa0 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
13fb0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
13fc0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
13fd0 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69 73 20 74  to open. It is t
13fe0 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
13ff0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
14000 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
14010 79 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66  y call sqlite3_f
14020 72 65 65 28 29 20 74 6f 20 72 65 6c 65 61 73 65  ree() to release
14030 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 2e  .** this buffer.
14040 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
14050 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
14060 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
14070 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
14080 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67 0a 2a   and *pzErrMsg.*
14090 2a 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  * may be set to 
140a0 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
140b0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20  r containing an 
140c0 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
140d0 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61   error .** messa
140e0 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ge. It is the re
140f0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
14100 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
14110 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65  entually release
14120 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20  .** this buffer 
14130 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  by calling sqlit
14140 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e  e3_free()..*/.in
14150 74 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72  t sqlite3ParseUr
14160 69 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i(.  const char 
14170 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c 20 20 20  *zDefaultVfs,   
14180 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75       /* VFS to u
14190 73 65 20 69 66 20 6e 6f 20 22 76 66 73 3d 78 78  se if no "vfs=xx
141a0 78 22 20 71 75 65 72 79 20 6f 70 74 69 6f 6e 20  x" query option 
141b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
141c0 2a 7a 55 72 69 2c 20 20 20 20 20 20 20 20 20 20  *zUri,          
141d0 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d       /* Nul-term
141e0 69 6e 61 74 65 64 20 55 52 49 20 74 6f 20 70 61  inated URI to pa
141f0 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  rse */.  unsigne
14200 64 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20  d int *pFlags,  
14210 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
14220 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  UT: SQLITE_OPEN_
14230 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73  XXX flags */.  s
14240 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a 70 70 56  qlite3_vfs **ppV
14250 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
14260 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f 20 75 73  * OUT: VFS to us
14270 65 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a 2a 70  e */ .  char **p
14280 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  zFile,          
14290 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
142a0 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65  Filename compone
142b0 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a 20 20 63  nt of URI */.  c
142c0 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20  har **pzErrMsg  
142d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
142e0 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73  * OUT: Error mes
142f0 73 61 67 65 20 28 69 66 20 72 63 21 3d 53 51 4c  sage (if rc!=SQL
14300 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20  ITE_OK) */.){.  
14310 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14320 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  OK;.  unsigned i
14330 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70 46 6c 61  nt flags = *pFla
14340 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  gs;.  const char
14350 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66 61 75 6c   *zVfs = zDefaul
14360 74 56 66 73 3b 0a 20 20 63 68 61 72 20 2a 7a 46  tVfs;.  char *zF
14370 69 6c 65 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20  ile;.  char c;. 
14380 20 69 6e 74 20 6e 55 72 69 20 3d 20 73 71 6c 69   int nUri = sqli
14390 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 72 69  te3Strlen30(zUri
143a0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70  );..  assert( *p
143b0 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20  zErrMsg==0 );.. 
143c0 20 69 66 28 20 28 28 66 6c 61 67 73 20 26 20 53   if( ((flags & S
143d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20  QLITE_OPEN_URI) 
143e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
143f0 4d 50 3a 20 52 2d 34 38 37 32 35 2d 33 32 32 30  MP: R-48725-3220
14400 36 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  6 */.           
14410 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   || sqlite3Globa
14420 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69  lConfig.bOpenUri
14430 29 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 36 38  ) /* IMP: R-5168
14440 39 2d 34 36 35 34 38 20 2a 2f 0a 20 20 20 26 26  9-46548 */.   &&
14450 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63   nUri>=5 && memc
14460 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22  mp(zUri, "file:"
14470 2c 20 35 29 3d 3d 30 20 2f 2a 20 49 4d 50 3a 20  , 5)==0 /* IMP: 
14480 52 2d 35 37 38 38 34 2d 33 37 34 39 36 20 2a 2f  R-57884-37496 */
14490 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  .  ){.    char *
144a0 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20 65 53  zOpt;.    int eS
144b0 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
144c0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
144d0 72 20 73 74 61 74 65 20 77 68 65 6e 20 70 61 72  r state when par
144e0 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20 20 20  sing URI */.    
144f0 69 6e 74 20 69 49 6e 3b 20 20 20 20 20 20 20 20  int iIn;        
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14510 20 49 6e 70 75 74 20 63 68 61 72 61 63 74 65 72   Input character
14520 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
14530 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20 20 20  t iOut = 0;     
14540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
14550 75 74 70 75 74 20 63 68 61 72 61 63 74 65 72 20  utput character 
14560 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 75 36 34  index */.    u64
14570 20 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b 32 3b   nByte = nUri+2;
14580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
14590 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20  tes of space to 
145a0 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20  allocate */..   
145b0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
145c0 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  e SQLITE_OPEN_UR
145d0 49 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  I flag is set to
145e0 20 69 6e 64 69 63 61 74 65 20 74 6f 20 74 68 65   indicate to the
145f0 20 56 46 53 20 78 4f 70 65 6e 20 0a 20 20 20 20   VFS xOpen .    
14600 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61 74 20 74  ** method that t
14610 68 65 72 65 20 6d 61 79 20 62 65 20 65 78 74 72  here may be extr
14620 61 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f 6c  a parameters fol
14630 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 2d  lowing the file-
14640 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 66 6c  name.  */.    fl
14650 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
14660 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66 6f 72  EN_URI;..    for
14670 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72 69  (iIn=0; iIn<nUri
14680 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65 20 2b  ; iIn++) nByte +
14690 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27 26  = (zUri[iIn]=='&
146a0 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20  ');.    zFile = 
146b0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
146c0 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
146d0 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e   !zFile ) return
146e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a   SQLITE_NOMEM;..
146f0 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66      iIn = 5;.#if
14700 64 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57  def SQLITE_ALLOW
14710 5f 55 52 49 5f 41 55 54 48 4f 52 49 54 59 0a 20  _URI_AUTHORITY. 
14720 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
14730 55 72 69 2b 35 2c 20 22 2f 2f 2f 22 2c 20 33 29  Uri+5, "///", 3)
14740 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 49 6e  ==0 ){.      iIn
14750 20 3d 20 37 3b 0a 20 20 20 20 20 20 2f 2a 20 54   = 7;.      /* T
14760 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
14770 64 69 74 69 6f 6e 20 63 61 75 73 65 73 20 55 52  dition causes UR
14780 49 73 20 77 69 74 68 20 66 69 76 65 20 6c 65 61  Is with five lea
14790 64 69 6e 67 20 2f 20 63 68 61 72 61 63 74 65 72  ding / character
147a0 73 0a 20 20 20 20 20 20 2a 2a 20 6c 69 6b 65 20  s.      ** like 
147b0 66 69 6c 65 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70  file://///host/p
147c0 61 74 68 20 74 6f 20 62 65 20 63 6f 6e 76 65 72  ath to be conver
147d0 74 65 64 20 69 6e 74 6f 20 55 4e 43 73 20 6c 69  ted into UNCs li
147e0 6b 65 20 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 0a  ke //host/path..
147f0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 63 6f 72        ** The cor
14800 72 65 63 74 20 55 52 49 20 66 6f 72 20 74 68 61  rect URI for tha
14810 74 20 55 4e 43 20 68 61 73 20 6f 6e 6c 79 20 74  t UNC has only t
14820 77 6f 20 6f 72 20 66 6f 75 72 20 6c 65 61 64 69  wo or four leadi
14830 6e 67 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a  ng / characters.
14840 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f        ** file://
14850 68 6f 73 74 2f 70 61 74 68 20 6f 72 20 66 69 6c  host/path or fil
14860 65 3a 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 2e  e:////host/path.
14870 20 20 42 75 74 20 35 20 6c 65 61 64 69 6e 67 20    But 5 leading 
14880 73 6c 61 73 68 65 73 20 69 73 20 61 20 0a 20 20  slashes is a .  
14890 20 20 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72      ** common er
148a0 72 6f 72 2c 20 77 65 20 61 72 65 20 74 6f 6c 64  ror, we are told
148b0 2c 20 73 6f 20 77 65 20 68 61 6e 64 6c 65 20 69  , so we handle i
148c0 74 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63  t as a special c
148d0 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ase. */.      if
148e0 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 37  ( strncmp(zUri+7
148f0 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29  , "///", 3)==0 )
14900 7b 20 69 49 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d  { iIn++; }.    }
14910 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
14920 28 7a 55 72 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61  (zUri+5, "//loca
14930 6c 68 6f 73 74 2f 22 2c 20 31 32 29 3d 3d 30 20  lhost/", 12)==0 
14940 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 31  ){.      iIn = 1
14950 36 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  6;.    }.#else. 
14960 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
14970 65 20 73 63 68 65 6d 65 20 61 6e 64 20 61 75 74  e scheme and aut
14980 68 6f 72 69 74 79 20 73 65 67 6d 65 6e 74 73 20  hority segments 
14990 6f 66 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20  of the URI. */. 
149a0 20 20 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d     if( zUri[5]==
149b0 27 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d  '/' && zUri[6]==
149c0 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e  '/' ){.      iIn
149d0 20 3d 20 37 3b 0a 20 20 20 20 20 20 77 68 69 6c   = 7;.      whil
149e0 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20  e( zUri[iIn] && 
149f0 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29  zUri[iIn]!='/' )
14a00 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66   iIn++;.      if
14a10 28 20 69 49 6e 21 3d 37 20 26 26 20 28 69 49 6e  ( iIn!=7 && (iIn
14a20 21 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22  !=16 || memcmp("
14a30 6c 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72  localhost", &zUr
14a40 69 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20  i[7], 9)) ){.   
14a50 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
14a60 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
14a70 28 22 69 6e 76 61 6c 69 64 20 75 72 69 20 61 75  ("invalid uri au
14a80 74 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20  thority: %.*s", 
14a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e  .            iIn
14aa0 2d 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20  -7, &zUri[7]);. 
14ab0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
14ac0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
14ad0 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69    goto parse_uri
14ae0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
14af0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
14b00 2f 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c 65  /* Copy the file
14b10 6e 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75 65  name and any que
14b20 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e  ry parameters in
14b30 74 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75 66  to the zFile buf
14b40 66 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63  fer. .    ** Dec
14b50 6f 64 65 20 25 48 48 20 65 73 63 61 70 65 20 63  ode %HH escape c
14b60 6f 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20 77  odes along the w
14b70 61 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ay. .    **.    
14b80 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c  ** Within this l
14b90 6f 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65 53  oop, variable eS
14ba0 74 61 74 65 20 6d 61 79 20 62 65 20 73 65 74 20  tate may be set 
14bb0 74 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64 65  to 0, 1 or 2, de
14bc0 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f  pending.    ** o
14bd0 6e 20 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f  n the parsing co
14be0 6e 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77  ntext. As follow
14bf0 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
14c00 20 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66 69     0: Parsing fi
14c10 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20  le-name..    ** 
14c20 20 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d    1: Parsing nam
14c30 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e  e section of a n
14c40 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20  ame=value query 
14c50 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a  parameter..    *
14c60 2a 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20 76  *   2: Parsing v
14c70 61 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66 20  alue section of 
14c80 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65  a name=value que
14c90 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20  ry parameter..  
14ca0 20 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65 20    */.    eState 
14cb0 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
14cc0 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21  (c = zUri[iIn])!
14cd0 3d 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b 0a  =0 && c!='#' ){.
14ce0 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20        iIn++;.   
14cf0 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a 20     if( c=='%' . 
14d00 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
14d10 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49  Isxdigit(zUri[iI
14d20 6e 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20 73  n]) .       && s
14d30 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a  qlite3Isxdigit(z
14d40 55 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20  Uri[iIn+1]) .   
14d50 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e     ){.        in
14d60 74 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69 74  t octet = (sqlit
14d70 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b  e3HexToInt(zUri[
14d80 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20  iIn++]) << 4);. 
14d90 20 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20         octet += 
14da0 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28  sqlite3HexToInt(
14db0 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20  zUri[iIn++]);.. 
14dc0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f         assert( o
14dd0 63 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65 74  ctet>=0 && octet
14de0 3c 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20 20  <256 );.        
14df0 69 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a  if( octet==0 ){.
14e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
14e10 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
14e20 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61 70 70  n when "%00" app
14e30 65 61 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  ears within the 
14e40 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20  URI. In this.   
14e50 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77         ** case w
14e60 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78  e ignore all tex
14e70 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64  t in the remaind
14e80 65 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20  er of the path, 
14e90 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20  name or.        
14ea0 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65    ** value curre
14eb0 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65  ntly being parse
14ec0 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65  d. So ignore the
14ed0 20 63 75 72 72 65 6e 74 20 63 68 61 72 61 63 74   current charact
14ee0 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
14ef0 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20  and skip to the 
14f00 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72  next "?", "=" or
14f10 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72   "&", as appropr
14f20 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  iate. */.       
14f30 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a     while( (c = z
14f40 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20  Uri[iIn])!=0 && 
14f50 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20  c!='#' .        
14f60 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65        && (eState
14f70 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20  !=0 || c!='?'). 
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
14f90 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63  (eState!=1 || (c
14fa0 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29  !='=' && c!='&')
14fb0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
14fc0 26 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c  && (eState!=2 ||
14fd0 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20   c!='&').       
14fe0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
14ff0 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20    iIn++;.       
15000 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
15010 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
15020 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 6f   }.        c = o
15030 63 74 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ctet;.      }els
15040 65 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20  e if( eState==1 
15050 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63 3d  && (c=='&' || c=
15060 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ='=') ){.       
15070 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74 2d   if( zFile[iOut-
15080 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]==0 ){.       
15090 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20 6f     /* An empty o
150a0 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f  ption name. Igno
150b0 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 61  re this option a
150c0 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20  ltogether. */.  
150d0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
150e0 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69  Uri[iIn] && zUri
150f0 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a 55  [iIn]!='#' && zU
15100 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20 29  ri[iIn-1]!='&' )
15110 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20   iIn++;.        
15120 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
15130 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
15140 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20  ( c=='&' ){.    
15150 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74        zFile[iOut
15160 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
15170 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15180 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 32 3b       eState = 2;
15190 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
151a0 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
151b0 7d 65 6c 73 65 20 69 66 28 20 28 65 53 74 61 74  }else if( (eStat
151c0 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29 20  e==0 && c=='?') 
151d0 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32 20 26 26  || (eState==2 &&
151e0 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20 20   c=='&') ){.    
151f0 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20      c = 0;.     
15200 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b 0a 20     eState = 1;. 
15210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69       }.      zFi
15220 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a  le[iOut++] = c;.
15230 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 53      }.    if( eS
15240 74 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65 5b  tate==1 ) zFile[
15250 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  iOut++] = '\0';.
15260 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
15270 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
15280 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
15290 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  0';..    /* Chec
152a0 6b 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20  k if there were 
152b0 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70 65 63  any options spec
152c0 69 66 69 65 64 20 74 68 61 74 20 73 68 6f 75 6c  ified that shoul
152d0 64 20 62 65 20 69 6e 74 65 72 70 72 65 74 65 64  d be interpreted
152e0 20 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 4f   .    ** here. O
152f0 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ptions that are 
15300 69 6e 74 65 72 70 72 65 74 65 64 20 68 65 72 65  interpreted here
15310 20 69 6e 63 6c 75 64 65 20 22 76 66 73 22 20 61   include "vfs" a
15320 6e 64 20 74 68 6f 73 65 20 74 68 61 74 0a 20 20  nd those that.  
15330 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20    ** correspond 
15340 74 6f 20 66 6c 61 67 73 20 74 68 61 74 20 6d 61  to flags that ma
15350 79 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 74  y be passed to t
15360 68 65 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  he sqlite3_open_
15370 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74 68  v2().    ** meth
15380 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74 20  od. */.    zOpt 
15390 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65 33  = &zFile[sqlite3
153a0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
153b0 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a  1];.    while( z
153c0 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  Opt[0] ){.      
153d0 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69 74  int nOpt = sqlit
153e0 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 29  e3Strlen30(zOpt)
153f0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56  ;.      char *zV
15400 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b  al = &zOpt[nOpt+
15410 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 56  1];.      int nV
15420 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  al = sqlite3Strl
15430 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20 20  en30(zVal);..   
15440 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20 26     if( nOpt==3 &
15450 26 20 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c 20  & memcmp("vfs", 
15460 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a 20  zOpt, 3)==0 ){. 
15470 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20 7a 56         zVfs = zV
15480 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  al;.      }else{
15490 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
154a0 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20 20  OpenMode {.     
154b0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
154c0 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  *z;.          in
154d0 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  t mode;.        
154e0 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  } *aMode = 0;.  
154f0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64        char *zMod
15500 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 20  eType = 0;.     
15510 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b     int mask = 0;
15520 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d  .        int lim
15530 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20  it = 0;..       
15540 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26 20   if( nOpt==5 && 
15550 6d 65 6d 63 6d 70 28 22 63 61 63 68 65 22 2c 20  memcmp("cache", 
15560 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a 20  zOpt, 5)==0 ){. 
15570 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
15580 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20  struct OpenMode 
15590 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b  aCacheMode[] = {
155a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
155b0 73 68 61 72 65 64 22 2c 20 20 53 51 4c 49 54 45  shared",  SQLITE
155c0 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
155d0 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  E },.           
155e0 20 7b 20 22 70 72 69 76 61 74 65 22 2c 20 53 51   { "private", SQ
155f0 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
15600 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20  ECACHE },.      
15610 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20        { 0, 0 }. 
15620 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20           };..   
15630 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51         mask = SQ
15640 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
15650 43 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50 45  CACHE|SQLITE_OPE
15660 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 3b 0a  N_PRIVATECACHE;.
15670 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20            aMode 
15680 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20 20  = aCacheMode;.  
15690 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20          limit = 
156a0 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  mask;.          
156b0 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 63 61 63  zModeType = "cac
156c0 68 65 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  he";.        }. 
156d0 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d         if( nOpt=
156e0 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d 6f  =4 && memcmp("mo
156f0 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d 30  de", zOpt, 4)==0
15700 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
15710 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e  atic struct Open
15720 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d  Mode aOpenMode[]
15730 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
15740 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49 54 45   { "ro",  SQLITE
15750 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d  _OPEN_READONLY }
15760 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
15770 22 72 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50  "rw",  SQLITE_OP
15780 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 20  EN_READWRITE }, 
15790 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
157a0 72 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  rwc", SQLITE_OPE
157b0 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
157c0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
157d0 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
157e0 7b 20 22 6d 65 6d 6f 72 79 22 2c 20 53 51 4c 49  { "memory", SQLI
157f0 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d  TE_OPEN_MEMORY }
15800 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
15810 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20  0, 0 }.         
15820 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d   };..          m
15830 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ask = SQLITE_OPE
15840 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 53 51 4c  N_READONLY | SQL
15850 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
15860 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  TE.             
15870 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f        | SQLITE_O
15880 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c  PEN_CREATE | SQL
15890 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b  ITE_OPEN_MEMORY;
158a0 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65  .          aMode
158b0 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20   = aOpenMode;.  
158c0 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20          limit = 
158d0 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20 20  mask & flags;.  
158e0 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70          zModeTyp
158f0 65 20 3d 20 22 61 63 63 65 73 73 22 3b 0a 20 20  e = "access";.  
15900 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
15910 20 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20 20   if( aMode ){.  
15920 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
15930 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64           int mod
15940 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
15950 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65 5b   for(i=0; aMode[
15960 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i].z; i++){.    
15970 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
15980 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d  ar *z = aMode[i]
15990 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  .z;.            
159a0 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74 65  if( nVal==sqlite
159b0 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 26 26 20  3Strlen30(z) && 
159c0 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c 20  0==memcmp(zVal, 
159d0 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20  z, nVal) ){.    
159e0 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 20 3d            mode =
159f0 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a   aMode[i].mode;.
15a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
15a10 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
15a20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
15a30 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 6f 64           if( mod
15a40 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
15a50 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
15a60 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
15a70 22 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f 64 65  "no such %s mode
15a80 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70 65  : %s", zModeType
15a90 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  , zVal);.       
15aa0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15ab0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
15ac0 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75      goto parse_u
15ad0 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ri_out;.        
15ae0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
15af0 28 20 28 6d 6f 64 65 20 26 20 7e 53 51 4c 49 54  ( (mode & ~SQLIT
15b00 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c  E_OPEN_MEMORY)>l
15b10 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
15b20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
15b30 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
15b40 22 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c  "%s mode not all
15b50 6f 77 65 64 3a 20 25 73 22 2c 0a 20 20 20 20 20  owed: %s",.     
15b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b80 20 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56     zModeType, zV
15b90 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  al);.           
15ba0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 45 52   rc = SQLITE_PER
15bb0 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  M;.            g
15bc0 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75  oto parse_uri_ou
15bd0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
15be0 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d           flags =
15bf0 20 28 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b 29   (flags & ~mask)
15c00 20 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20   | mode;.       
15c10 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
15c20 20 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c 5b 6e    zOpt = &zVal[n
15c30 56 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20  Val+1];.    }.. 
15c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69 6c   }else{.    zFil
15c50 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
15c60 6f 63 36 34 28 6e 55 72 69 2b 32 29 3b 0a 20 20  oc64(nUri+2);.  
15c70 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72    if( !zFile ) r
15c80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
15c90 45 4d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  EM;.    memcpy(z
15ca0 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69  File, zUri, nUri
15cb0 29 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72  );.    zFile[nUr
15cc0 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a  i] = '\0';.    z
15cd0 46 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27  File[nUri+1] = '
15ce0 5c 30 27 3b 0a 20 20 20 20 66 6c 61 67 73 20 26  \0';.    flags &
15cf0 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  = ~SQLITE_OPEN_U
15d00 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66  RI;.  }..  *ppVf
15d10 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  s = sqlite3_vfs_
15d20 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66  find(zVfs);.  if
15d30 28 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20  ( *ppVfs==0 ){. 
15d40 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
15d50 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
15d60 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73 22  no such vfs: %s"
15d70 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20  , zVfs);.    rc 
15d80 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
15d90 20 20 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f    }. parse_uri_o
15da0 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
15db0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
15dc0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c  qlite3_free(zFil
15dd0 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20  e);.    zFile = 
15de0 30 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73  0;.  }.  *pFlags
15df0 20 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46   = flags;.  *pzF
15e00 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72  ile = zFile;.  r
15e10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
15e20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15e30 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f   does the work o
15e40 66 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61  f opening a data
15e50 62 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f  base on behalf o
15e60 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  f.** sqlite3_ope
15e70 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  n() and sqlite3_
15e80 6f 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61  open16(). The da
15e90 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
15ea0 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a  "zFilename"  .**
15eb0 20 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65   is UTF-8 encode
15ec0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15ed0 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20   openDatabase(. 
15ee0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
15ef0 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62  lename, /* Datab
15f00 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46  ase filename UTF
15f10 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20  -8 encoded */.  
15f20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20  sqlite3 **ppDb, 
15f30 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
15f40 65 74 75 72 6e 65 64 20 64 61 74 61 62 61 73 65  eturned database
15f50 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73   handle */.  uns
15f60 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c  igned int flags,
15f70 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e      /* Operation
15f80 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  al flags */.  co
15f90 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
15fa0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
15fb0 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a  the VFS to use *
15fc0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
15fd0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
15fe0 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
15ff0 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65  allocated handle
16000 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72   here */.  int r
16010 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
16020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
16030 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
16040 6e 74 20 69 73 54 68 72 65 61 64 73 61 66 65 3b  nt isThreadsafe;
16050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16060 2a 20 54 72 75 65 20 66 6f 72 20 74 68 72 65 61  * True for threa
16070 64 73 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  dsafe connection
16080 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70  s */.  char *zOp
16090 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  en = 0;         
160a0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61         /* Filena
160b0 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70  me argument to p
160c0 61 73 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e  ass to BtreeOpen
160d0 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  () */.  char *zE
160e0 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20  rrMsg = 0;      
160f0 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
16100 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71   message from sq
16110 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 29 20  lite3ParseUri() 
16120 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
16130 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
16140 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30  OR.  if( ppDb==0
16150 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
16160 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
16170 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30  ndif.  *ppDb = 0
16180 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
16190 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
161a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e   rc = sqlite3_in
161b0 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66  itialize();.  if
161c0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
161d0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f  ;.#endif..  /* O
161e0 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62  nly allow sensib
161f0 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  le combinations 
16200 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 66  of bits in the f
16210 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 2e 20 20  lags argument.  
16220 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65  .  ** Throw an e
16230 72 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d  rror if any non-
16240 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f  sense combinatio
16250 6e 20 69 73 20 75 73 65 64 2e 20 20 49 66 20 77  n is used.  If w
16260 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c  e.  ** do not bl
16270 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62  ock illegal comb
16280 69 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c 20 69  inations here, i
16290 74 20 63 6f 75 6c 64 20 74 72 69 67 67 65 72 0a  t could trigger.
162a0 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 73 74    ** assert() st
162b0 61 74 65 6d 65 6e 74 73 20 69 6e 20 64 65 65 70  atements in deep
162c0 65 72 20 6c 61 79 65 72 73 2e 20 20 53 65 6e 73  er layers.  Sens
162d0 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ible combination
162e0 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a  s.  ** are:.  **
162f0 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54  .  **  1:  SQLIT
16300 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a  E_OPEN_READONLY.
16310 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54 45    **  2:  SQLITE
16320 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a  _OPEN_READWRITE.
16330 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54 45    **  6:  SQLITE
16340 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
16350 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
16360 45 41 54 45 0a 20 20 2a 2f 0a 20 20 61 73 73 65  EATE.  */.  asse
16370 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  rt( SQLITE_OPEN_
16380 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78 30  READONLY  == 0x0
16390 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  1 );.  assert( S
163a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
163b0 52 49 54 45 20 3d 3d 20 30 78 30 32 20 29 3b 0a  RITE == 0x02 );.
163c0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
163d0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 20 20 20  _OPEN_CREATE    
163e0 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20 74 65 73  == 0x04 );.  tes
163f0 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67  tcase( (1<<(flag
16400 73 26 37 29 29 3d 3d 30 78 30 32 20 29 3b 20 2f  s&7))==0x02 ); /
16410 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20  * READONLY */.  
16420 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
16430 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 34 20 29  lags&7))==0x04 )
16440 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 2a  ; /* READWRITE *
16450 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31  /.  testcase( (1
16460 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78  <<(flags&7))==0x
16470 34 30 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49  40 ); /* READWRI
16480 54 45 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a 20  TE | CREATE */. 
16490 20 69 66 28 20 28 28 31 3c 3c 28 66 6c 61 67 73   if( ((1<<(flags
164a0 26 37 29 29 20 26 20 30 78 34 36 29 3d 3d 30 20  &7)) & 0x46)==0 
164b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
164c0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
164d0 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 35 34  ;  /* IMP: R-654
164e0 39 37 2d 34 34 35 39 34 20 2a 2f 0a 20 20 7d 0a  97-44594 */.  }.
164f0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
16500 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
16510 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Mutex==0 ){.    
16520 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30  isThreadsafe = 0
16530 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
16540 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
16550 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20  N_NOMUTEX ){.   
16560 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
16570 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  0;.  }else if( f
16580 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
16590 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a  EN_FULLMUTEX ){.
165a0 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
165b0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
165c0 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
165d0 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
165e0 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
165f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
16600 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
16610 50 52 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a  PRIVATECACHE ){.
16620 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
16630 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
16640 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69  CACHE;.  }else i
16650 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
16660 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
16670 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20  heEnabled ){.   
16680 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
16690 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
166a0 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d  E;.  }..  /* Rem
166b0 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73  ove harmful bits
166c0 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20   from the flags 
166d0 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20  parameter.  **. 
166e0 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f   ** The SQLITE_O
166f0 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20  PEN_NOMUTEX and 
16700 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
16710 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65 72 65  MUTEX flags were
16720 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68  .  ** dealt with
16730 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
16740 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65   code block.  Be
16750 73 69 64 65 73 20 74 68 65 73 65 2c 20 74 68 65  sides these, the
16760 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64   only.  ** valid
16770 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72   input flags for
16780 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
16790 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50  () are SQLITE_OP
167a0 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a  EN_READONLY,.  *
167b0 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  * SQLITE_OPEN_RE
167c0 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f  ADWRITE, SQLITE_
167d0 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c  OPEN_CREATE, SQL
167e0 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
167f0 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54  ACHE,.  ** SQLIT
16800 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
16810 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65  CHE, and some re
16820 73 65 72 76 65 64 20 62 69 74 73 2e 20 20 53 69  served bits.  Si
16830 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a  lently mask.  **
16840 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66   off all other f
16850 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61  lags..  */.  fla
16860 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45  gs &=  ~( SQLITE
16870 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
16880 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  OSE |.          
16890 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
168a0 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20  _EXCLUSIVE |.   
168b0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
168c0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
168d0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
168e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
168f0 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20  P_DB | .        
16900 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
16910 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
16920 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
16930 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
16940 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  IN_JOURNAL | .  
16950 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
16960 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
16970 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20  URNAL | .       
16980 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
16990 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c  PEN_SUBJOURNAL |
169a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
169b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53   SQLITE_OPEN_MAS
169c0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20  TER_JOURNAL |.  
169d0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
169e0 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
169f0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
16a00 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55    SQLITE_OPEN_FU
16a10 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20  LLMUTEX |.      
16a20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
16a30 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20  OPEN_WAL.       
16a40 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41        );..  /* A
16a50 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
16a60 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  te data structur
16a70 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69  e */.  db = sqli
16a80 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
16a90 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29  izeof(sqlite3) )
16aa0 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20  ;.  if( db==0 ) 
16ab0 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
16ac0 0a 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73  .  if( isThreads
16ad0 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  afe ){.    db->m
16ae0 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
16af0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
16b00 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29  MUTEX_RECURSIVE)
16b10 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75  ;.    if( db->mu
16b20 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
16b30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29  sqlite3_free(db)
16b40 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a  ;.      db = 0;.
16b50 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64        goto opend
16b60 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  b_out;.    }.  }
16b70 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
16b80 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
16b90 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b  );.  db->errMask
16ba0 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e   = 0xff;.  db->n
16bb0 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61  Db = 2;.  db->ma
16bc0 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
16bd0 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61  IC_BUSY;.  db->a
16be0 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74  Db = db->aDbStat
16bf0 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ic;..  assert( s
16c00 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74  izeof(db->aLimit
16c10 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c  )==sizeof(aHardL
16c20 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70  imit) );.  memcp
16c30 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48  y(db->aLimit, aH
16c40 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66  ardLimit, sizeof
16c50 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20  (db->aLimit));. 
16c60 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
16c70 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
16c80 54 48 52 45 41 44 53 5d 20 3d 20 53 51 4c 49 54  THREADS] = SQLIT
16c90 45 5f 44 45 46 41 55 4c 54 5f 57 4f 52 4b 45 52  E_DEFAULT_WORKER
16ca0 5f 54 48 52 45 41 44 53 3b 0a 20 20 64 62 2d 3e  _THREADS;.  db->
16cb0 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
16cc0 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61    db->nextAutova
16cd0 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a  c = -1;.  db->sz
16ce0 4d 6d 61 70 20 3d 20 73 71 6c 69 74 65 33 47 6c  Mmap = sqlite3Gl
16cf0 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61  obalConfig.szMma
16d00 70 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67  p;.  db->nextPag
16d10 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d  esize = 0;.  db-
16d20 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20  >nMaxSorterMmap 
16d30 3d 20 30 78 37 46 46 46 46 46 46 46 3b 0a 20 20  = 0x7FFFFFFF;.  
16d40 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
16d50 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
16d60 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c  s | SQLITE_Enabl
16d70 65 54 72 69 67 67 65 72 20 7c 20 53 51 4c 49 54  eTrigger | SQLIT
16d80 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a 23 69 66  E_CacheSpill.#if
16d90 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
16da0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54  _DEFAULT_AUTOMAT
16db0 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51 4c  IC_INDEX) || SQL
16dc0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
16dd0 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20  MATIC_INDEX.    
16de0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
16df0 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a  QLITE_AutoIndex.
16e00 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
16e10 45 5f 44 45 46 41 55 4c 54 5f 43 4b 50 54 46 55  E_DEFAULT_CKPTFU
16e20 4c 4c 46 53 59 4e 43 0a 20 20 20 20 20 20 20 20  LLFSYNC.        
16e30 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
16e40 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63 0a  E_CkptFullFSync.
16e50 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
16e60 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46  E_DEFAULT_FILE_F
16e70 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20  ORMAT<4.        
16e80 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
16e90 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a  E_LegacyFileFmt.
16ea0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
16eb0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44  LITE_ENABLE_LOAD
16ec0 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20  _EXTENSION.     
16ed0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
16ee0 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69  LITE_LoadExtensi
16ef0 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  on.#endif.#if SQ
16f00 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43  LITE_DEFAULT_REC
16f10 55 52 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a  URSIVE_TRIGGERS.
16f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f30 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69   | SQLITE_RecTri
16f40 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66  ggers.#endif.#if
16f50 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
16f60 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f  DEFAULT_FOREIGN_
16f70 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f  KEYS) && SQLITE_
16f80 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f  DEFAULT_FOREIGN_
16f90 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20 20 20  KEYS.           
16fa0 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46        | SQLITE_F
16fb0 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69  oreignKeys.#endi
16fc0 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
16fd0 4c 49 54 45 5f 52 45 56 45 52 53 45 5f 55 4e 4f  LITE_REVERSE_UNO
16fe0 52 44 45 52 45 44 5f 53 45 4c 45 43 54 53 29 0a  RDERED_SELECTS).
16ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17000 20 7c 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73   | SQLITE_Revers
17010 65 4f 72 64 65 72 0a 23 65 6e 64 69 66 0a 23 69  eOrder.#endif.#i
17020 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
17030 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
17040 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20  _CELL_CHECK).   
17050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
17060 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43  SQLITE_CellSizeC
17070 6b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b  k.#endif.      ;
17080 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
17090 69 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  it(&db->aCollSeq
170a0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
170b0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
170c0 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73  BLE.  sqlite3Has
170d0 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75  hInit(&db->aModu
170e0 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  le);.#endif..  /
170f0 2a 20 41 64 64 20 74 68 65 20 64 65 66 61 75 6c  * Add the defaul
17100 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  t collation sequ
17110 65 6e 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e  ence BINARY. BIN
17120 41 52 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f  ARY works for bo
17130 74 68 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e  th UTF-8.  ** an
17140 64 20 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64  d UTF-16, so add
17150 20 61 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65   a version for e
17160 61 63 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79  ach to avoid any
17170 20 75 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a   unnecessary.  *
17180 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54  * conversions. T
17190 68 65 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68  he only error th
171a0 61 74 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72  at can occur her
171b0 65 20 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20  e is a malloc() 
171c0 66 61 69 6c 75 72 65 2e 0a 20 20 2a 2a 0a 20 20  failure..  **.  
171d0 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
171e0 52 2d 35 32 37 38 36 2d 34 34 38 37 38 20 53 51  R-52786-44878 SQ
171f0 4c 69 74 65 20 64 65 66 69 6e 65 73 20 74 68 72  Lite defines thr
17200 65 65 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  ee built-in coll
17210 61 74 69 6e 67 0a 20 20 2a 2a 20 66 75 6e 63 74  ating.  ** funct
17220 69 6f 6e 73 3a 0a 20 20 2a 2f 0a 20 20 63 72 65  ions:.  */.  cre
17230 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
17240 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54   "BINARY", SQLIT
17250 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f  E_UTF8, 0, binCo
17260 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
17270 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
17280 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49  , "BINARY", SQLI
17290 54 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62  TE_UTF16BE, 0, b
172a0 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
172b0 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
172c0 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20  n(db, "BINARY", 
172d0 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20  SQLITE_UTF16LE, 
172e0 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20  0, binCollFunc, 
172f0 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c  0);.  createColl
17300 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53  ation(db, "NOCAS
17310 45 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  E", SQLITE_UTF8,
17320 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74   0, nocaseCollat
17330 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ingFunc, 0);.  c
17340 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
17350 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49  b, "RTRIM", SQLI
17360 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29  TE_UTF8, (void*)
17370 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20  1, binCollFunc, 
17380 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  0);.  if( db->ma
17390 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
173a0 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
173b0 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20 45 56 49 44  t;.  }.  /* EVID
173c0 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 33 30 38  ENCE-OF: R-08308
173d0 2d 31 37 32 32 34 20 54 68 65 20 64 65 66 61 75  -17224 The defau
173e0 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  lt collating fun
173f0 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 0a 20 20  ction for all.  
17400 2a 2a 20 73 74 72 69 6e 67 73 20 69 73 20 42 49  ** strings is BI
17410 4e 41 52 59 2e 20 0a 20 20 2a 2f 0a 20 20 64 62  NARY. .  */.  db
17420 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71  ->pDfltColl = sq
17430 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
17440 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (db, SQLITE_UTF8
17450 2c 20 22 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a  , "BINARY", 0);.
17460 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44    assert( db->pD
17470 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20  fltColl!=0 );.. 
17480 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 66 69   /* Parse the fi
17490 6c 65 6e 61 6d 65 2f 55 52 49 20 61 72 67 75 6d  lename/URI argum
174a0 65 6e 74 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70  ent. */.  db->op
174b0 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  enFlags = flags;
174c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
174d0 61 72 73 65 55 72 69 28 7a 56 66 73 2c 20 7a 46  arseUri(zVfs, zF
174e0 69 6c 65 6e 61 6d 65 2c 20 26 66 6c 61 67 73 2c  ilename, &flags,
174f0 20 26 64 62 2d 3e 70 56 66 73 2c 20 26 7a 4f 70   &db->pVfs, &zOp
17500 65 6e 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  en, &zErrMsg);. 
17510 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17520 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
17530 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
17540 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
17550 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  d = 1;.    sqlit
17560 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
17570 62 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f  b, rc, zErrMsg ?
17580 20 22 25 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d   "%s" : 0, zErrM
17590 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
175a0 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
175b0 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
175c0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  out;.  }..  /* O
175d0 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20  pen the backend 
175e0 64 61 74 61 62 61 73 65 20 64 72 69 76 65 72 20  database driver 
175f0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
17600 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70  3BtreeOpen(db->p
17610 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20  Vfs, zOpen, db, 
17620 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c  &db->aDb[0].pBt,
17630 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
17640 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67              flag
17650 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s | SQLITE_OPEN_
17660 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20  MAIN_DB);.  if( 
17670 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17680 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
17690 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
176a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
176b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
176c0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
176d0 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 20 20  or(db, rc);.    
176e0 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
176f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
17700 72 65 65 45 6e 74 65 72 28 64 62 2d 3e 61 44 62  reeEnter(db->aDb
17710 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e  [0].pBt);.  db->
17720 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[0].pSchema =
17730 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
17740 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d  t(db, db->aDb[0]
17750 2e 70 42 74 29 3b 0a 20 20 69 66 28 20 21 64 62  .pBt);.  if( !db
17760 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
17770 20 45 4e 43 28 64 62 29 20 3d 20 53 43 48 45 4d   ENC(db) = SCHEM
17780 41 5f 45 4e 43 28 64 62 29 3b 0a 20 20 73 71 6c  A_ENC(db);.  sql
17790 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 64  ite3BtreeLeave(d
177a0 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
177b0 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63    db->aDb[1].pSc
177c0 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63  hema = sqlite3Sc
177d0 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a  hemaGet(db, 0);.
177e0 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c  .  /* The defaul
177f0 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66  t safety_level f
17800 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  or the main data
17810 62 61 73 65 20 69 73 20 27 66 75 6c 6c 27 3b 20  base is 'full'; 
17820 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a  for the temp.  *
17830 2a 20 64 61 74 61 62 61 73 65 20 69 74 20 69 73  * database it is
17840 20 27 4e 4f 4e 45 27 2e 20 54 68 69 73 20 6d 61   'NONE'. This ma
17850 74 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20  tches the pager 
17860 6c 61 79 65 72 20 64 65 66 61 75 6c 74 73 2e 20  layer defaults. 
17870 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62   .  */.  db->aDb
17880 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61 69  [0].zName = "mai
17890 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d  n";.  db->aDb[0]
178a0 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
178b0 33 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  3;.  db->aDb[1].
178c0 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a  zName = "temp";.
178d0 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66    db->aDb[1].saf
178e0 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a 0a  ety_level = 1;..
178f0 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
17900 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b  LITE_MAGIC_OPEN;
17910 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
17920 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
17930 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
17940 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74    }..  /* Regist
17950 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20  er all built-in 
17960 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20 64  functions, but d
17970 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  o not attempt to
17980 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20 64   read the.  ** d
17990 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 79  atabase schema y
179a0 65 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c 61  et. This is dela
179b0 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69  yed until the fi
179c0 72 73 74 20 74 69 6d 65 20 74 68 65 20 64 61 74  rst time the dat
179d0 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61 63  abase.  ** is ac
179e0 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73  cessed..  */.  s
179f0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
17a00 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71  SQLITE_OK);.  sq
17a10 6c 69 74 65 33 52 65 67 69 73 74 65 72 42 75 69  lite3RegisterBui
17a20 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62  ltinFunctions(db
17a30 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75  );..  /* Load au
17a40 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f  tomatic extensio
17a50 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20  ns - extensions 
17a60 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 72  that have been r
17a70 65 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75  egistered.  ** u
17a80 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
17a90 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e  _automatic_exten
17aa0 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f  sion() API..  */
17ab0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
17ac0 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 69  errcode(db);.  i
17ad0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17ae0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41   ){.    sqlite3A
17af0 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  utoLoadExtension
17b00 73 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20  s(db);.    rc = 
17b10 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
17b20 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  db);.    if( rc!
17b30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17b40 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
17b50 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
17b60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
17b70 41 42 4c 45 5f 46 54 53 31 0a 20 20 69 66 28 20  ABLE_FTS1.  if( 
17b80 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
17b90 64 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  d ){.    extern 
17ba0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 31 49  int sqlite3Fts1I
17bb0 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20  nit(sqlite3*);. 
17bc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
17bd0 74 73 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts1Init(db);.  }
17be0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
17bf0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
17c00 53 32 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S2.  if( !db->ma
17c10 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
17c20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17c30 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
17c40 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 73 71  lite3Fts2Init(sq
17c50 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20  lite3*);.    rc 
17c60 3d 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69  = sqlite3Fts2Ini
17c70 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
17c80 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
17c90 5f 45 4e 41 42 4c 45 5f 46 54 53 33 20 2f 2a 20  _ENABLE_FTS3 /* 
17ca0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
17cb0 66 69 6e 65 64 20 62 79 20 53 51 4c 49 54 45 5f  fined by SQLITE_
17cc0 45 4e 41 42 4c 45 5f 46 54 53 34 20 2a 2f 0a 20  ENABLE_FTS4 */. 
17cd0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
17ce0 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
17cf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
17d00 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49  c = sqlite3Fts3I
17d10 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
17d20 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
17d30 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 20  TE_ENABLE_FTS5. 
17d40 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
17d50 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
17d60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
17d70 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  c = sqlite3Fts5I
17d80 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
17d90 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
17da0 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20  TE_ENABLE_ICU.  
17db0 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
17dc0 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
17dd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
17de0 20 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69   = sqlite3IcuIni
17df0 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
17e00 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
17e10 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20  _ENABLE_RTREE.  
17e20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
17e30 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
17e40 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20  ITE_OK){.    rc 
17e50 3d 20 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e  = sqlite3RtreeIn
17e60 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
17e70 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
17e80 45 5f 45 4e 41 42 4c 45 5f 44 42 53 54 41 54 5f  E_ENABLE_DBSTAT_
17e90 56 54 41 42 0a 20 20 69 66 28 20 21 64 62 2d 3e  VTAB.  if( !db->
17ea0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
17eb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a  rc==SQLITE_OK){.
17ec0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17ed0 44 62 73 74 61 74 52 65 67 69 73 74 65 72 28 64  DbstatRegister(d
17ee0 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
17ef0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
17f00 41 42 4c 45 5f 4a 53 4f 4e 31 0a 20 20 69 66 28  ABLE_JSON1.  if(
17f10 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
17f20 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
17f30 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  _OK){.    rc = s
17f40 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28  qlite3Json1Init(
17f50 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
17f60 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44  .  /* -DSQLITE_D
17f70 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
17f80 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c  ODE=1 makes EXCL
17f90 55 53 49 56 45 20 74 68 65 20 64 65 66 61 75 6c  USIVE the defaul
17fa0 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d  t locking.  ** m
17fb0 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44  ode.  -DSQLITE_D
17fc0 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
17fd0 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41  ODE=0 make NORMA
17fe0 4c 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  L the default lo
17ff0 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e  cking.  ** mode.
18000 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20    Doing nothing 
18010 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65  at all also make
18020 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66  s NORMAL the def
18030 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  ault..  */.#ifde
18040 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
18050 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20  _LOCKING_MODE.  
18060 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65  db->dfltLockMode
18070 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
18080 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a  T_LOCKING_MODE;.
18090 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f    sqlite3PagerLo
180a0 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65  ckingMode(sqlite
180b0 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e  3BtreePager(db->
180c0 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20  aDb[0].pBt),.   
180d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180e0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
180f0 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
18100 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  DE);.#endif..  i
18110 66 28 20 72 63 20 29 20 73 71 6c 69 74 65 33 45  f( rc ) sqlite3E
18120 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 0a 20  rror(db, rc);.. 
18130 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c   /* Enable the l
18140 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20  ookaside-malloc 
18150 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73  subsystem */.  s
18160 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62  etupLookaside(db
18170 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62  , 0, sqlite3Glob
18180 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61  alConfig.szLooka
18190 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  side,.          
181a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
181b0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
181c0 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a  g.nLookaside);..
181d0 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75    sqlite3_wal_au
181e0 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  tocheckpoint(db,
181f0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
18200 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49  WAL_AUTOCHECKPOI
18210 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74  NT);..opendb_out
18220 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
18230 28 7a 4f 70 65 6e 29 3b 0a 20 20 69 66 28 20 64  (zOpen);.  if( d
18240 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
18250 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c   db->mutex!=0 ||
18260 20 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30   isThreadsafe==0
18270 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  .           || s
18280 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
18290 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30  ig.bFullMutex==0
182a0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
182b0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
182c0 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63  mutex);.  }.  rc
182d0 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
182e0 64 65 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74  de(db);.  assert
182f0 28 20 64 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  ( db!=0 || rc==S
18300 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
18310 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18320 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c  NOMEM ){.    sql
18330 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  ite3_close(db);.
18340 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65      db = 0;.  }e
18350 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
18360 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d  TE_OK ){.    db-
18370 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
18380 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a  MAGIC_SICK;.  }.
18390 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 23 69    *ppDb = db;.#i
183a0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
183b0 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20  LE_SQLLOG.  if( 
183c0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
183d0 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20  fig.xSqllog ){. 
183e0 20 20 20 2f 2a 20 4f 70 65 6e 69 6e 67 20 61 20     /* Opening a 
183f0 64 62 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74  db handle. Fourt
18400 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70  h parameter is p
18410 61 73 73 65 64 20 30 2e 20 2a 2f 0a 20 20 20 20  assed 0. */.    
18420 76 6f 69 64 20 2a 70 41 72 67 20 3d 20 73 71 6c  void *pArg = sql
18430 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
18440 2e 70 53 71 6c 6c 6f 67 41 72 67 3b 0a 20 20 20  .pSqllogArg;.   
18450 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
18460 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 70 41 72  nfig.xSqllog(pAr
18470 67 2c 20 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65  g, db, zFilename
18480 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
18490 0a 20 20 72 65 74 75 72 6e 20 72 63 20 26 20 30  .  return rc & 0
184a0 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  xff;.}../*.** Op
184b0 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
184c0 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
184d0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20   sqlite3_open(. 
184e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
184f0 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74  lename, .  sqlit
18500 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20  e3 **ppDb .){.  
18510 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62  return openDatab
18520 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  ase(zFilename, p
18530 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pDb,.           
18540 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
18550 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
18560 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
18570 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74  REATE, 0);.}.int
18580 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
18590 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
185a0 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44  filename,   /* D
185b0 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
185c0 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71   (UTF-8) */.  sq
185d0 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20  lite3 **ppDb,   
185e0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51        /* OUT: SQ
185f0 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a  Lite db handle *
18600 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
18610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18620 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
18630 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20  char *zVfs      
18640 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53    /* Name of VFS
18650 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a   module to use *
18660 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70  /.){.  return op
18670 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e  enDatabase(filen
18680 61 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e 73 69  ame, ppDb, (unsi
18690 67 6e 65 64 20 69 6e 74 29 66 6c 61 67 73 2c 20  gned int)flags, 
186a0 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  zVfs);.}..#ifnde
186b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
186c0 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  F16./*.** Open a
186d0 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61   new database ha
186e0 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
186f0 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63  ite3_open16(.  c
18700 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65  onst void *zFile
18710 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33  name, .  sqlite3
18720 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61   **ppDb.){.  cha
18730 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61  r const *zFilena
18740 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e  me8;   /* zFilen
18750 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55  ame encoded in U
18760 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20  TF-8 instead of 
18770 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69  UTF-16 */.  sqli
18780 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
18790 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64  .  int rc;..#ifd
187a0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
187b0 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
187c0 20 70 70 44 62 3d 3d 30 20 29 20 72 65 74 75 72   ppDb==0 ) retur
187d0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
187e0 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a  BKPT;.#endif.  *
187f0 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65  ppDb = 0;.#ifnde
18800 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
18810 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71  TOINIT.  rc = sq
18820 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
18830 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ();.  if( rc ) r
18840 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
18850 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
18860 3d 3d 30 20 29 20 7a 46 69 6c 65 6e 61 6d 65 20  ==0 ) zFilename 
18870 3d 20 22 5c 30 30 30 5c 30 30 30 22 3b 0a 20 20  = "\000\000";.  
18880 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
18890 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c  lueNew(0);.  sql
188a0 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
188b0 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e  pVal, -1, zFilen
188c0 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  ame, SQLITE_UTF1
188d0 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f  6NATIVE, SQLITE_
188e0 53 54 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65  STATIC);.  zFile
188f0 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56  name8 = sqlite3V
18900 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53  alueText(pVal, S
18910 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69  QLITE_UTF8);.  i
18920 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b  f( zFilename8 ){
18930 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61  .    rc = openDa
18940 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65  tabase(zFilename
18950 38 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20  8, ppDb,.       
18960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
18970 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
18980 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
18990 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20  EN_CREATE, 0);. 
189a0 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 44 62     assert( *ppDb
189b0 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
189c0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20  OMEM );.    if( 
189d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
189e0 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28   !DbHasProperty(
189f0 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68  *ppDb, 0, DB_Sch
18a00 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20  emaLoaded) ){.  
18a10 20 20 20 20 53 43 48 45 4d 41 5f 45 4e 43 28 2a      SCHEMA_ENC(*
18a20 70 70 44 62 29 20 3d 20 45 4e 43 28 2a 70 70 44  ppDb) = ENC(*ppD
18a30 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  b) = SQLITE_UTF1
18a40 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20  6NATIVE;.    }. 
18a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
18a60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
18a70 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75   }.  sqlite3Valu
18a80 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20  eFree(pVal);..  
18a90 72 65 74 75 72 6e 20 72 63 20 26 20 30 78 66 66  return rc & 0xff
18aa0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
18ab0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
18ac0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  */../*.** Regist
18ad0 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  er a new collati
18ae0 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68  on sequence with
18af0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
18b00 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  ndle db..*/.int 
18b10 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
18b20 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69  ollation(.  sqli
18b30 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73  te3* db, .  cons
18b40 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
18b50 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f    int enc, .  vo
18b60 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
18b70 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
18b80 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
18b90 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
18ba0 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  ).){.  return sq
18bb0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
18bc0 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 4e  lation_v2(db, zN
18bd0 61 6d 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20  ame, enc, pCtx, 
18be0 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 7d 0a  xCompare, 0);.}.
18bf0 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
18c00 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  a new collation 
18c10 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68  sequence with th
18c20 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
18c30 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
18c40 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
18c50 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69  ation_v2(.  sqli
18c60 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73  te3* db, .  cons
18c70 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
18c80 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f    int enc, .  vo
18c90 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
18ca0 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
18cb0 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
18cc0 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
18cd0 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29  ),.  void(*xDel)
18ce0 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74  (void*).){.  int
18cf0 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c   rc;..#ifdef SQL
18d00 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
18d10 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
18d20 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
18d30 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30  (db) || zName==0
18d40 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
18d50 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
18d60 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
18d70 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
18d80 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
18d90 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
18da0 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65  ed );.  rc = cre
18db0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
18dc0 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c   zName, (u8)enc,
18dd0 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
18de0 20 78 44 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73   xDel);.  rc = s
18df0 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
18e00 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
18e10 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
18e20 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
18e30 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
18e40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
18e50 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  16./*.** Registe
18e60 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f  r a new collatio
18e70 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  n sequence with 
18e80 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
18e90 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  dle db..*/.int s
18ea0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
18eb0 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  llation16(.  sql
18ec0 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e  ite3* db, .  con
18ed0 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a  st void *zName,.
18ee0 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f    int enc, .  vo
18ef0 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
18f00 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
18f10 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
18f20 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
18f30 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ).){.  int rc = 
18f40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61  SQLITE_OK;.  cha
18f50 72 20 2a 7a 4e 61 6d 65 38 3b 0a 0a 23 69 66 64  r *zName8;..#ifd
18f60 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
18f70 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
18f80 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
18f90 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e  heckOk(db) || zN
18fa0 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ame==0 ) return 
18fb0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
18fc0 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
18fd0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
18fe0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
18ff0 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
19000 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e  ocFailed );.  zN
19010 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 55 74  ame8 = sqlite3Ut
19020 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65  f16to8(db, zName
19030 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
19040 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 69 66 28  16NATIVE);.  if(
19050 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72   zName8 ){.    r
19060 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  c = createCollat
19070 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20  ion(db, zName8, 
19080 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78  (u8)enc, pCtx, x
19090 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 20  Compare, 0);.   
190a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
190b0 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a  b, zName8);.  }.
190c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
190d0 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
190e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
190f0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
19100 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19110 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
19120 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
19130 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
19140 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
19150 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c  nce factory call
19160 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61  back with the da
19170 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
19180 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79   db. Replace any
19190 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74   previously inst
191a0 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  alled collation 
191b0 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
191c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
191d0 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
191e0 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  d(.  sqlite3 *db
191f0 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c  , .  void *pColl
19200 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f  NeededArg, .  vo
19210 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29  id(*xCollNeeded)
19220 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c  (void*,sqlite3*,
19230 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e  int eTextRep,con
19240 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 23 69 66  st char*).){.#if
19250 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
19260 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
19270 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
19280 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
19290 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
192a0 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
192b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
192c0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
192d0 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
192e0 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65  ded = xCollNeede
192f0 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  d;.  db->xCollNe
19300 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64 62  eded16 = 0;.  db
19310 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
19320 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72   = pCollNeededAr
19330 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
19340 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
19350 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
19360 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
19370 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19380 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69  UTF16./*.** Regi
19390 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e  ster a collation
193a0 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
193b0 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  y callback with 
193c0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
193d0 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61  dle.** db. Repla
193e0 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c  ce any previousl
193f0 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c  y installed coll
19400 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
19410 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73  actory..*/.int s
19420 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
19430 5f 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71 6c  _needed16(.  sql
19440 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69  ite3 *db, .  voi
19450 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  d *pCollNeededAr
19460 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c  g, .  void(*xCol
19470 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64 2a  lNeeded16)(void*
19480 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54  ,sqlite3*,int eT
19490 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69  extRep,const voi
194a0 64 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51  d*).){.#ifdef SQ
194b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
194c0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
194d0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
194e0 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
194f0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
19500 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
19510 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
19520 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
19530 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20  ->xCollNeeded = 
19540 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  0;.  db->xCollNe
19550 65 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65  eded16 = xCollNe
19560 65 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43  eded16;.  db->pC
19570 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70  ollNeededArg = p
19580 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20  CollNeededArg;. 
19590 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
195a0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
195b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
195c0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
195d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
195e0 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  16 */..#ifndef S
195f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
19600 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CATED./*.** This
19610 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77   function is now
19620 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e   an anachronism.
19630 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 20 75   It used to be u
19640 73 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66  sed to recover f
19650 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28  rom a.** malloc(
19660 29 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53  ) failure, but S
19670 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74  QLite now does t
19680 68 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  his automaticall
19690 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
196a0 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72  3_global_recover
196b0 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
196c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
196d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  ndif../*.** Test
196e0 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20   to see whether 
196f0 6f 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  or not the datab
19700 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ase connection i
19710 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a  s in autocommit.
19720 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e  ** mode.  Return
19730 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 61   TRUE if it is a
19740 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e  nd FALSE if not.
19750 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64    Autocommit mod
19760 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65  e is on.** by de
19770 66 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d  fault.  Autocomm
19780 69 74 20 69 73 20 64 69 73 61 62 6c 65 64 20 62  it is disabled b
19790 79 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d  y a BEGIN statem
197a0 65 6e 74 20 61 6e 64 20 72 65 65 6e 61 62 6c 65  ent and reenable
197b0 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65 78 74  d.** by the next
197c0 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42   COMMIT or ROLLB
197d0 41 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ACK..*/.int sqli
197e0 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
197f0 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
19800 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
19810 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
19820 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
19830 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
19840 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
19850 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
19860 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
19870 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
19880 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  rn db->autoCommi
19890 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  t;.}../*.** The 
198a0 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
198b0 65 73 20 61 72 65 20 73 75 62 73 74 69 74 75 74  es are substitut
198c0 65 73 20 66 6f 72 20 63 6f 6e 73 74 61 6e 74 73  es for constants
198d0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
198e0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  .** SQLITE_MISUS
198f0 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  E, SQLITE_CANTOP
19900 45 4e 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  EN, SQLITE_IOERR
19910 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 74   and possibly ot
19920 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e  her error.** con
19930 73 74 61 6e 74 73 2e 20 20 54 68 65 79 20 73 65  stants.  They se
19940 72 76 65 20 74 77 6f 20 70 75 72 70 6f 73 65 73  rve two purposes
19950 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65  :.**.**   1.  Se
19960 72 76 65 20 61 73 20 61 20 63 6f 6e 76 65 6e 69  rve as a conveni
19970 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74  ent place to set
19980 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e   a breakpoint in
19990 20 61 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 20   a debugger.**  
199a0 20 20 20 20 20 74 6f 20 64 65 74 65 63 74 20 77       to detect w
199b0 68 65 6e 20 76 65 72 73 69 6f 6e 20 65 72 72 6f  hen version erro
199c0 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63  r conditions occ
199d0 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20  urs..**.**   2. 
199e0 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f   Invoke sqlite3_
199f0 6c 6f 67 28 29 20 74 6f 20 70 72 6f 76 69 64 65  log() to provide
19a00 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65   the source code
19a10 20 6c 6f 63 61 74 69 6f 6e 20 77 68 65 72 65 0a   location where.
19a20 2a 2a 20 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c  **       a low-l
19a30 65 76 65 6c 20 65 72 72 6f 72 20 69 73 20 66 69  evel error is fi
19a40 72 73 74 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f  rst detected..*/
19a50 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72  .int sqlite3Corr
19a60 75 70 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  uptError(int lin
19a70 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
19a80 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
19a90 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
19aa0 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53  .  sqlite3_log(S
19ab0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 20  QLITE_CORRUPT,. 
19ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 64 61               "da
19ad0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
19ae0 6e 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20  n at line %d of 
19af0 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20  [%.10s]",.      
19b00 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20          lineno, 
19b10 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63  20+sqlite3_sourc
19b20 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e  eid());.  return
19b30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
19b40 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69  .}.int sqlite3Mi
19b50 73 75 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69  suseError(int li
19b60 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
19b70 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
19b80 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
19b90 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
19ba0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 0a  SQLITE_MISUSE, .
19bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6d                "m
19bc0 69 73 75 73 65 20 61 74 20 6c 69 6e 65 20 25 64  isuse at line %d
19bd0 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20   of [%.10s]",.  
19be0 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65              line
19bf0 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73  no, 20+sqlite3_s
19c00 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65  ourceid());.  re
19c10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
19c20 53 45 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  SE;.}.int sqlite
19c30 33 43 61 6e 74 6f 70 65 6e 45 72 72 6f 72 28 69  3CantopenError(i
19c40 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
19c50 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
19c60 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
19c70 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
19c80 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 41 4e 54  _log(SQLITE_CANT
19c90 4f 50 45 4e 2c 20 0a 20 20 20 20 20 20 20 20 20  OPEN, .         
19ca0 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 6f 70 65       "cannot ope
19cb0 6e 20 66 69 6c 65 20 61 74 20 6c 69 6e 65 20 25  n file at line %
19cc0 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20  d of [%.10s]",. 
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e               lin
19ce0 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f  eno, 20+sqlite3_
19cf0 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72  sourceid());.  r
19d00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
19d10 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  TOPEN;.}...#ifnd
19d20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
19d30 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20  EPRECATED./*.** 
19d40 54 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e  This is a conven
19d50 69 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68  ience routine th
19d60 61 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  at makes sure th
19d70 61 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70  at all thread-sp
19d80 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66  ecific.** data f
19d90 6f 72 20 74 68 69 73 20 74 68 72 65 61 64 20 68  or this thread h
19da0 61 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61  as been dealloca
19db0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ted..**.** SQLit
19dc0 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73  e no longer uses
19dd0 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63   thread-specific
19de0 20 64 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f   data so this ro
19df0 75 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a  utine is now a.*
19e00 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20  * no-op.  It is 
19e10 72 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73  retained for his
19e20 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62  torical compatib
19e30 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ility..*/.void s
19e40 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c  qlite3_thread_cl
19e50 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23  eanup(void){.}.#
19e60 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
19e70 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  urn meta informa
19e80 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65  tion about a spe
19e90 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20  cific column of 
19ea0 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
19eb0 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ..** See comment
19ec0 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73   in sqlite3.h (s
19ed0 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20  qlite.h.in) for 
19ee0 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20  details..*/.int 
19ef0 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
19f00 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20  lumn_metadata(. 
19f10 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19f30 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c  Connection handl
19f40 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
19f50 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20  r *zDbName,     
19f60 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
19f70 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ame or NULL */. 
19f80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
19f90 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  bleName,     /* 
19fa0 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  Table name */.  
19fb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
19fc0 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43  umnName,    /* C
19fd0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
19fe0 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44  char const **pzD
19ff0 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f  ataType,    /* O
1a000 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20  UTPUT: Declared 
1a010 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63  data type */.  c
1a020 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f  har const **pzCo
1a030 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55  llSeq,     /* OU
1a040 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20  TPUT: Collation 
1a050 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f  sequence name */
1a060 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c  .  int *pNotNull
1a070 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1a080 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
1a090 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74  f NOT NULL const
1a0a0 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a  raint exists */.
1a0b0 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b    int *pPrimaryK
1a0c0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey,           /*
1a0d0 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
1a0e0 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20   column part of 
1a0f0 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75  PK */.  int *pAu
1a100 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20 20  toinc           
1a110 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
1a120 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73  rue if column is
1a130 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20   auto-increment 
1a140 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
1a150 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
1a160 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  = 0;.  Table *pT
1a170 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e  ab = 0;.  Column
1a180 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e   *pCol = 0;.  in
1a190 74 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 63 68  t iCol = 0;.  ch
1a1a0 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54  ar const *zDataT
1a1b0 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ype = 0;.  char 
1a1c0 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20  const *zCollSeq 
1a1d0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75  = 0;.  int notnu
1a1e0 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72  ll = 0;.  int pr
1a1f0 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20  imarykey = 0;.  
1a200 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b  int autoinc = 0;
1a210 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
1a220 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1a230 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1a240 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1a250 29 20 7c 7c 20 7a 54 61 62 6c 65 4e 61 6d 65 3d  ) || zTableName=
1a260 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1a270 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
1a280 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
1a290 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65  .  /* Ensure the
1a2a0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
1a2b0 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64   has been loaded
1a2c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1a2d0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1a2e0 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  tex);.  sqlite3B
1a2f0 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
1a300 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1a310 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73  Init(db, &zErrMs
1a320 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  g);.  if( SQLITE
1a330 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67  _OK!=rc ){.    g
1a340 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
1a350 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
1a360 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65  the table in que
1a370 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20  stion */.  pTab 
1a380 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
1a390 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d  le(db, zTableNam
1a3a0 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69  e, zDbName);.  i
1a3b0 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62  f( !pTab || pTab
1a3c0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1a3d0 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67   pTab = 0;.    g
1a3e0 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
1a3f0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68   }..  /* Find th
1a400 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69  e column for whi
1a410 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65  ch info is reque
1a420 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a 43  sted */.  if( zC
1a430 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29 7b 0a  olumnName==0 ){.
1a440 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6f 72      /* Query for
1a450 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 74 61   existance of ta
1a460 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d 65  ble only */.  }e
1a470 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f  lse{.    for(iCo
1a480 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  l=0; iCol<pTab->
1a490 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20  nCol; iCol++){. 
1a4a0 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61       pCol = &pTa
1a4b0 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  b->aCol[iCol];. 
1a4c0 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
1a4d0 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
1a4e0 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e  >zName, zColumnN
1a4f0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ame) ){.        
1a500 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1a510 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f     }.    if( iCo
1a520 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  l==pTab->nCol ){
1a530 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f  .      if( HasRo
1a540 77 69 64 28 70 54 61 62 29 20 26 26 20 73 71 6c  wid(pTab) && sql
1a550 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c  ite3IsRowid(zCol
1a560 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  umnName) ){.    
1a570 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
1a580 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  >iPKey;.        
1a590 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f  pCol = iCol>=0 ?
1a5a0 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
1a5b0 6c 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 65  l] : 0;.      }e
1a5c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61  lse{.        pTa
1a5d0 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  b = 0;.        g
1a5e0 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
1a5f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1a600 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
1a610 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65  wing block store
1a620 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72  s the meta infor
1a630 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c  mation that will
1a640 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a   be returned.  *
1a650 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  * to the caller 
1a660 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  in local variabl
1a670 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43  es zDataType, zC
1a680 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c  ollSeq, notnull,
1a690 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a   primarykey.  **
1a6a0 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74   and autoinc. At
1a6b0 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72   this point ther
1a6c0 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62  e are two possib
1a6d0 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20  ilities:.  ** . 
1a6e0 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73   **     1. The s
1a6f0 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20  pecified column 
1a700 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c  name was rowid",
1a710 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69   "oid" or "_rowi
1a720 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20  d_" .  **       
1a730 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
1a740 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c   explicitly decl
1a750 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e  ared IPK column.
1a760 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20   .  **.  **     
1a770 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  2. The table is 
1a780 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20 74  not a view and t
1a790 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69  he column name i
1a7a0 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20  dentified an .  
1a7b0 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69 63  **        explic
1a7c0 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f  itly declared co
1a7d0 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20  lumn. Copy meta 
1a7e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
1a7f0 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20   *pCol..  */ .  
1a800 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20  if( pCol ){.    
1a810 7a 44 61 74 61 54 79 70 65 20 3d 20 70 43 6f 6c  zDataType = pCol
1a820 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43 6f  ->zType;.    zCo
1a830 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43  llSeq = pCol->zC
1a840 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c  oll;.    notnull
1a850 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c   = pCol->notNull
1a860 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79  !=0;.    primary
1a870 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f  key  = (pCol->co
1a880 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
1a890 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20  _PRIMKEY)!=0;.  
1a8a0 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62    autoinc = pTab
1a8b0 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26  ->iPKey==iCol &&
1a8c0 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
1a8d0 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
1a8e0 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ent)!=0;.  }else
1a8f0 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20  {.    zDataType 
1a900 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
1a910 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b   primarykey = 1;
1a920 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c  .  }.  if( !zCol
1a930 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c  lSeq ){.    zCol
1a940 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59 22 3b  lSeq = "BINARY";
1a950 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a  .  }..error_out:
1a960 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1a970 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20  eaveAll(db);..  
1a980 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65 20 66  /* Whether the f
1a990 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63  unction call suc
1a9a0 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65 64  ceeded or failed
1a9b0 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74  , set the output
1a9c0 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a   parameters.  **
1a9d0 20 74 6f 20 77 68 61 74 65 76 65 72 20 74 68 65   to whatever the
1a9e0 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72  ir local counter
1a9f0 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49  parts contain. I
1aa00 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6f  f an error did o
1aa10 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20  ccur,.  ** this 
1aa20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
1aa30 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75  f zeroing all ou
1aa40 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e  tput parameters.
1aa50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61  .  */.  if( pzDa
1aa60 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74 61  taType ) *pzData
1aa70 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70 65  Type = zDataType
1aa80 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65  ;.  if( pzCollSe
1aa90 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d  q ) *pzCollSeq =
1aaa0 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28   zCollSeq;.  if(
1aab0 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f   pNotNull ) *pNo
1aac0 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b  tNull = notnull;
1aad0 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72 79 4b  .  if( pPrimaryK
1aae0 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b 65  ey ) *pPrimaryKe
1aaf0 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a  y = primarykey;.
1ab00 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20 29    if( pAutoinc )
1ab10 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75 74   *pAutoinc = aut
1ab20 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c  oinc;..  if( SQL
1ab30 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70  ITE_OK==rc && !p
1ab40 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
1ab50 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
1ab60 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d  rMsg);.    zErrM
1ab70 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
1ab80 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75 63 68  ntf(db, "no such
1ab90 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25   table column: %
1aba0 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d  s.%s", zTableNam
1abb0 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75  e,.        zColu
1abc0 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20  mnName);.    rc 
1abd0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
1abe0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
1abf0 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63  orWithMsg(db, rc
1ac00 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a  , (zErrMsg?"%s":
1ac10 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0), zErrMsg);.  
1ac20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1ac30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 63  , zErrMsg);.  rc
1ac40 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
1ac50 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
1ac60 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1ac70 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
1ac80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ac90 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c  ** Sleep for a l
1aca0 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65  ittle while.  Re
1acb0 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  turn the amount 
1acc0 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a  of time slept..*
1acd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c  /.int sqlite3_sl
1ace0 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73  eep(int ms){.  s
1acf0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1ad00 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 56  ;.  int rc;.  pV
1ad10 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
1ad20 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20  _find(0);.  if( 
1ad30 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72 6e  pVfs==0 ) return
1ad40 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   0;..  /* This f
1ad50 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e  unction works in
1ad60 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62   milliseconds, b
1ad70 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ut the underlyin
1ad80 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20 20 2a  g OsSleep() .  *
1ad90 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63 72 6f  * API uses micro
1ada0 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74  seconds. Hence t
1adb0 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a  he 1000's..  */.
1adc0 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4f    rc = (sqlite3O
1add0 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31 30 30  sSleep(pVfs, 100
1ade0 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20 72  0*ms)/1000);.  r
1adf0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ae00 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  ** Enable or dis
1ae10 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64 65  able the extende
1ae20 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a  d result codes..
1ae30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  */.int sqlite3_e
1ae40 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
1ae50 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  odes(sqlite3 *db
1ae60 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 23 69  , int onoff){.#i
1ae70 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1ae80 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1ae90 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1aea0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
1aeb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1aec0 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
1aed0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1aee0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1aef0 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b  );.  db->errMask
1af00 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66   = onoff ? 0xfff
1af10 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20  fffff : 0xff;.  
1af20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1af30 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1af40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1af50 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  OK;.}../*.** Inv
1af60 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e  oke the xFileCon
1af70 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61  trol method on a
1af80 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
1af90 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
1afa0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
1afb0 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  l(sqlite3 *db, c
1afc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1afd0 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  me, int op, void
1afe0 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72   *pArg){.  int r
1aff0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1b000 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  ;.  Btree *pBtre
1b010 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e;..#ifdef SQLIT
1b020 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1b030 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1b040 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1b050 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
1b060 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1b070 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1b080 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1b090 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74 72 65  >mutex);.  pBtre
1b0a0 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d  e = sqlite3DbNam
1b0b0 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62  eToBtree(db, zDb
1b0c0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 42 74  Name);.  if( pBt
1b0d0 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ree ){.    Pager
1b0e0 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71   *pPager;.    sq
1b0f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a  lite3_file *fd;.
1b100 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b110 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
1b120 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
1b130 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
1b140 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72  tree);.    asser
1b150 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
1b160 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74 65 33      fd = sqlite3
1b170 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72  PagerFile(pPager
1b180 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 66  );.    assert( f
1b190 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  d!=0 );.    if( 
1b1a0 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c  op==SQLITE_FCNTL
1b1b0 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29 7b  _FILE_POINTER ){
1b1c0 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33  .      *(sqlite3
1b1d0 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 66  _file**)pArg = f
1b1e0 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  d;.      rc = SQ
1b1f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1b200 73 65 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68  se if( fd->pMeth
1b210 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ods ){.      rc 
1b220 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
1b230 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70  ontrol(fd, op, p
1b240 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Arg);.    }else{
1b250 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1b260 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20  TE_NOTFOUND;.   
1b270 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
1b280 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
1b290 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1b2a0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1b2b0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1b2c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e   rc;.}../*.** In
1b2d0 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 74  terface to the t
1b2e0 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f  esting logic..*/
1b2f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73  .int sqlite3_tes
1b300 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70  t_control(int op
1b310 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63  , ...){.  int rc
1b320 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
1b330 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
1b340 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50  _TEST.  UNUSED_P
1b350 41 52 41 4d 45 54 45 52 28 6f 70 29 3b 0a 23 65  ARAMETER(op);.#e
1b360 6c 73 65 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  lse.  va_list ap
1b370 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
1b380 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20   op);.  switch( 
1b390 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20  op ){..    /*.  
1b3a0 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75    ** Save the cu
1b3b0 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74  rrent state of t
1b3c0 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a  he PRNG..    */.
1b3d0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b3e0 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41  TESTCTRL_PRNG_SA
1b3f0 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  VE: {.      sqli
1b400 74 65 33 50 72 6e 67 53 61 76 65 53 74 61 74 65  te3PrngSaveState
1b410 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
1b420 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1b430 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20 74 68     ** Restore th
1b440 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  e state of the P
1b450 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73 74 20  RNG to the last 
1b460 73 74 61 74 65 20 73 61 76 65 64 20 75 73 69 6e  state saved usin
1b470 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41  g.    ** PRNG_SA
1b480 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53 41 56  VE.  If PRNG_SAV
1b490 45 20 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f  E has never befo
1b4a0 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  re been called, 
1b4b0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73  then.    ** this
1b4c0 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b 65 20   verb acts like 
1b4d0 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20 20  PRNG_RESET..    
1b4e0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1b4f0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
1b500 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20  _RESTORE: {.    
1b510 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73    sqlite3PrngRes
1b520 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20 20 20  toreState();.   
1b530 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1b540 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52  .    /*.    ** R
1b550 65 73 65 74 20 74 68 65 20 50 52 4e 47 20 62 61  eset the PRNG ba
1b560 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e 69 74  ck to its uninit
1b570 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e 20 20  ialized state.  
1b580 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20  The next call.  
1b590 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
1b5a0 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c  randomness() wil
1b5b0 6c 20 72 65 73 65 65 64 20 74 68 65 20 50 52 4e  l reseed the PRN
1b5c0 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  G using a single
1b5d0 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
1b5e0 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20  the xRandomness 
1b5f0 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 64 65  method of the de
1b600 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a  fault VFS..    *
1b610 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1b620 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
1b630 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20 73  RESET: {.      s
1b640 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
1b650 73 28 30 2c 30 29 3b 0a 20 20 20 20 20 20 62 72  s(0,0);.      br
1b660 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1b670 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1b680 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1b690 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73 69 7a  BITVEC_TEST, siz
1b6a0 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20 20 20  e, program).    
1b6b0 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61 20  **.    ** Run a 
1b6c0 74 65 73 74 20 61 67 61 69 6e 73 74 20 61 20 42  test against a B
1b6d0 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f 66 20  itvec object of 
1b6e0 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f 67 72  size.  The progr
1b6f0 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20  am argument.    
1b700 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  ** is an array o
1b710 66 20 69 6e 74 65 67 65 72 73 20 74 68 61 74 20  f integers that 
1b720 64 65 66 69 6e 65 73 20 74 68 65 20 74 65 73 74  defines the test
1b730 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20  .  Return -1 on 
1b740 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  a.    ** memory 
1b750 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
1b760 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  , 0 on success, 
1b770 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20  or non-zero for 
1b780 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a  an error..    **
1b790 20 53 65 65 20 74 68 65 20 73 71 6c 69 74 65 33   See the sqlite3
1b7a0 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73  BitvecBuiltinTes
1b7b0 74 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  t() for addition
1b7c0 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
1b7d0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1b7e0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1b7f0 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20  BITVEC_TEST: {. 
1b800 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61       int sz = va
1b810 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
1b820 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f 67 20       int *aProg 
1b830 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
1b840 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  *);.      rc = s
1b850 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c  qlite3BitvecBuil
1b860 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50 72 6f  tinTest(sz, aPro
1b870 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
1b880 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1b890 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
1b8a0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 46 41 55 4c  est_control(FAUL
1b8b0 54 5f 49 4e 53 54 41 4c 4c 2c 20 78 43 61 6c 6c  T_INSTALL, xCall
1b8c0 62 61 63 6b 29 0a 20 20 20 20 2a 2a 0a 20 20 20  back).    **.   
1b8d0 20 2a 2a 20 41 72 72 61 6e 67 65 20 74 6f 20 69   ** Arrange to i
1b8e0 6e 76 6f 6b 65 20 78 43 61 6c 6c 62 61 63 6b 28  nvoke xCallback(
1b8f0 29 20 77 68 65 6e 65 76 65 72 20 73 71 6c 69 74  ) whenever sqlit
1b900 65 33 46 61 75 6c 74 53 69 6d 28 29 20 69 73 20  e3FaultSim() is 
1b910 63 61 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a 20 69  called,.    ** i
1b920 66 20 78 43 61 6c 6c 62 61 63 6b 20 69 73 20 6e  f xCallback is n
1b930 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 0a  ot NULL..    **.
1b940 20 20 20 20 2a 2a 20 41 73 20 61 20 74 65 73 74      ** As a test
1b950 20 6f 66 20 74 68 65 20 66 61 75 6c 74 20 73 69   of the fault si
1b960 6d 75 6c 61 74 6f 72 20 6d 65 63 68 61 6e 69 73  mulator mechanis
1b970 6d 20 69 74 73 65 6c 66 2c 20 73 71 6c 69 74 65  m itself, sqlite
1b980 33 46 61 75 6c 74 53 69 6d 28 30 29 0a 20 20 20  3FaultSim(0).   
1b990 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 69 6d   ** is called im
1b9a0 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
1b9b0 69 6e 73 74 61 6c 6c 69 6e 67 20 74 68 65 20 6e  installing the n
1b9c0 65 77 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20  ew callback and 
1b9d0 74 68 65 20 72 65 74 75 72 6e 0a 20 20 20 20 2a  the return.    *
1b9e0 2a 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 71 6c  * value from sql
1b9f0 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 20  ite3FaultSim(0) 
1ba00 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65 74 75  becomes the retu
1ba10 72 6e 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73  rn from.    ** s
1ba20 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1ba30 72 6f 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  rol()..    */.  
1ba40 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1ba50 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53  STCTRL_FAULT_INS
1ba60 54 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  TALL: {.      /*
1ba70 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20 61   MSVC is picky a
1ba80 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e  bout pulling fun
1ba90 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c  c ptrs from va l
1baa0 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68  ists..      ** h
1bab0 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69  ttp://support.mi
1bac0 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34  crosoft.com/kb/4
1bad0 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71  7961.      ** sq
1bae0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1baf0 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20  g.xTestCallback 
1bb00 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
1bb10 28 2a 29 28 69 6e 74 29 29 3b 0a 20 20 20 20 20  (*)(int));.     
1bb20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65   */.      typede
1bb30 66 20 69 6e 74 28 2a 54 45 53 54 43 41 4c 4c 42  f int(*TESTCALLB
1bb40 41 43 4b 46 55 4e 43 5f 74 29 28 69 6e 74 29 3b  ACKFUNC_t)(int);
1bb50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1bb60 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74  obalConfig.xTest
1bb70 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72  Callback = va_ar
1bb80 67 28 61 70 2c 20 54 45 53 54 43 41 4c 4c 42 41  g(ap, TESTCALLBA
1bb90 43 4b 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20  CKFUNC_t);.     
1bba0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 61 75   rc = sqlite3Fau
1bbb0 6c 74 53 69 6d 28 30 29 3b 0a 20 20 20 20 20 20  ltSim(0);.      
1bbc0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1bbd0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1bbe0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1bbf0 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f  l(BENIGN_MALLOC_
1bc00 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78  HOOKS, xBegin, x
1bc10 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  End).    **.    
1bc20 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f 6b  ** Register hook
1bc30 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64  s to call to ind
1bc40 69 63 61 74 65 20 77 68 69 63 68 20 6d 61 6c 6c  icate which mall
1bc50 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20 0a 20  oc() failures . 
1bc60 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e     ** are benign
1bc70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1bc80 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1bc90 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f  L_BENIGN_MALLOC_
1bca0 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74  HOOKS: {.      t
1bcb0 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 76 6f  ypedef void (*vo
1bcc0 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69  id_function)(voi
1bcd0 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66  d);.      void_f
1bce0 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42  unction xBenignB
1bcf0 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64  egin;.      void
1bd00 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67  _function xBenig
1bd10 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42 65 6e  nEnd;.      xBen
1bd20 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61 72  ignBegin = va_ar
1bd30 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74  g(ap, void_funct
1bd40 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42 65 6e  ion);.      xBen
1bd50 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67 28  ignEnd = va_arg(
1bd60 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f  ap, void_functio
1bd70 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
1bd80 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f  3BenignMallocHoo
1bd90 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c  ks(xBenignBegin,
1bda0 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20   xBenignEnd);.  
1bdb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bdc0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1bdd0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1bde0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1bdf0 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59  TCTRL_PENDING_BY
1be00 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  TE, unsigned int
1be10 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   X).    **.    *
1be20 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44 49 4e  * Set the PENDIN
1be30 47 20 62 79 74 65 20 74 6f 20 74 68 65 20 76 61  G byte to the va
1be40 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67 75 6d  lue in the argum
1be50 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20  ent, if X>0..   
1be60 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e   ** Make no chan
1be70 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20 52 65  ges if X==0.  Re
1be80 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
1be90 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20 62 79  f the pending by
1bea0 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69 74 20  te.    ** as it 
1beb0 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72 65 20  existing before 
1bec0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
1bed0 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a   called..    **.
1bee0 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54      ** IMPORTANT
1bef0 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20  :  Changing the 
1bf00 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66 72 6f  PENDING byte fro
1bf10 6d 20 30 78 34 30 30 30 30 30 30 30 20 72 65 73  m 0x40000000 res
1bf20 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61  ults in.    ** a
1bf30 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64  n incompatible d
1bf40 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
1bf50 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67 20 74  mat.  Changing t
1bf60 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 0a  he PENDING byte.
1bf70 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79      ** while any
1bf80 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1bf90 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65 73  tion is open res
1bfa0 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69 6e 65  ults in undefine
1bfb0 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c  d and.    ** del
1bfc0 65 74 65 72 69 6f 75 73 20 62 65 68 61 76 69 6f  eterious behavio
1bfd0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
1bfe0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1bff0 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a  RL_PENDING_BYTE:
1c000 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 50 45   {.      rc = PE
1c010 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66 6e  NDING_BYTE;.#ifn
1c020 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c030 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  WSD.      {.    
1c040 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
1c050 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61 72 67   newVal = va_arg
1c060 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  (ap, unsigned in
1c070 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
1c080 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74 65 33  newVal ) sqlite3
1c090 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e 65  PendingByte = ne
1c0a0 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65  wVal;.      }.#e
1c0b0 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b  ndif.      break
1c0c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1c0d0 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1c0e0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1c0f0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
1c100 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20 20 20  ERT, int X).    
1c110 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61  **.    ** This a
1c120 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61  ction provides a
1c130 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74   run-time test t
1c140 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72  o see whether or
1c150 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73 65   not.    ** asse
1c160 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c 65 64  rt() was enabled
1c170 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1c180 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20  .  If X is true 
1c190 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20 20 20  and assert().   
1c1a0 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c 20   ** is enabled, 
1c1b0 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
1c1c0 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e 20 20  value is true.  
1c1d0 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e 64  If X is true and
1c1e0 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29  .    ** assert()
1c1f0 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68   is disabled, th
1c200 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
1c210 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20 49 66  lue is zero.  If
1c220 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66 61 6c   X is.    ** fal
1c230 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20  se and assert() 
1c240 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
1c250 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e 20 66   the assertion f
1c260 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20 20 20  ires and the.   
1c270 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62 6f 72   ** process abor
1c280 74 73 2e 20 20 49 66 20 58 20 69 73 20 66 61 6c  ts.  If X is fal
1c290 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20  se and assert() 
1c2a0 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65  is disabled, the
1c2b0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 74  n the.    ** ret
1c2c0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72  urn value is zer
1c2d0 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  o..    */.    ca
1c2e0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1c2f0 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20 20  RL_ASSERT: {.   
1c300 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20     volatile int 
1c310 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  x = 0;.      ass
1c320 65 72 74 28 20 28 78 20 3d 20 76 61 5f 61 72 67  ert( (x = va_arg
1c330 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a  (ap,int))!=0 );.
1c340 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a 20 20        rc = x;.  
1c350 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c360 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
1c370 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1c380 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1c390 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69  STCTRL_ALWAYS, i
1c3a0 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
1c3b0 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20   ** This action 
1c3c0 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74  provides a run-t
1c3d0 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20  ime test to see 
1c3e0 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53 20 61  how the ALWAYS a
1c3f0 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52 20  nd.    ** NEVER 
1c400 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65 66 69  macros were defi
1c410 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ned at compile-t
1c420 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ime..    **.    
1c430 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
1c440 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28 58 29  lue is ALWAYS(X)
1c450 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  .  .    **.    *
1c460 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65  * The recommende
1c470 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32 2e 20  d test is X==2. 
1c480 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
1c490 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61 74 20  alue is 2, that 
1c4a0 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c 57  means.    ** ALW
1c4b0 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28  AYS() and NEVER(
1c4c0 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f 70  ) are both no-op
1c4d0 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61   pass-through ma
1c4e0 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20 74  cros, which is t
1c4f0 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  he.    ** defaul
1c500 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66 20 74  t setting.  If t
1c510 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1c520 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57 41 59  is 1, then ALWAY
1c530 53 28 29 20 69 73 20 65 69 74 68 65 72 0a 20 20  S() is either.  
1c540 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64 20    ** hard-coded 
1c550 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73 65 20  to true or else 
1c560 69 74 20 61 73 73 65 72 74 73 20 69 66 20 69 74  it asserts if it
1c570 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61  s argument is fa
1c580 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  lse..    ** The 
1c590 66 69 72 73 74 20 62 65 68 61 76 69 6f 72 20 28  first behavior (
1c5a0 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72  hard-coded to tr
1c5b0 75 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20  ue) is the case 
1c5c0 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  if.    ** SQLITE
1c5d0 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
1c5e0 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65   shows that asse
1c5f0 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  rt() is disabled
1c600 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 0a   and the second.
1c610 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 20      ** behavior 
1c620 28 61 73 73 65 72 74 20 69 66 20 74 68 65 20 61  (assert if the a
1c630 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41 59  rgument to ALWAY
1c640 53 28 29 20 69 73 20 66 61 6c 73 65 29 20 69 73  S() is false) is
1c650 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20 20   the case if.   
1c660 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43   ** SQLITE_TESTC
1c670 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73  TRL_ASSERT shows
1c680 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20 69   that assert() i
1c690 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 2a  s enabled..    *
1c6a0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75 6e  *.    ** The run
1c6b0 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f 63 65  -time test proce
1c6c0 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b 20  dure might look 
1c6d0 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 74  something like t
1c6e0 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  his:.    **.    
1c6f0 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  **    if( sqlite
1c700 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1c710 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1c720 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b 0a  LWAYS, 2)==2 ){.
1c730 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
1c740 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45  LWAYS() and NEVE
1c750 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70 61  R() are no-op pa
1c760 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f  ss-through macro
1c770 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73  s.    **    }els
1c780 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65  e if( sqlite3_te
1c790 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1c7a0 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
1c7b0 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a 20  T, 1) ){.    ** 
1c7c0 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78       // ALWAYS(x
1c7d0 29 20 61 73 73 65 72 74 73 20 74 68 61 74 20 78  ) asserts that x
1c7e0 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45 52 28   is true. NEVER(
1c7f0 78 29 20 61 73 73 65 72 74 73 20 78 20 69 73 20  x) asserts x is 
1c800 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20 20  false..    **   
1c810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20   }else{.    **  
1c820 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29      // ALWAYS(x)
1c830 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 31   is a constant 1
1c840 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73 20 61  .  NEVER(x) is a
1c850 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20 20   constant 0..   
1c860 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f 0a   **    }.    */.
1c870 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1c880 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a  TESTCTRL_ALWAYS:
1c890 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d   {.      int x =
1c8a0 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b   va_arg(ap,int);
1c8b0 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c 57 41  .      rc = ALWA
1c8c0 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62 72 65  YS(x);.      bre
1c8d0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1c8e0 2a 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c 69 74  *.    **   sqlit
1c8f0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1c900 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1c910 42 59 54 45 4f 52 44 45 52 29 3b 0a 20 20 20 20  BYTEORDER);.    
1c920 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 69 6e  **.    ** The in
1c930 74 65 67 65 72 20 72 65 74 75 72 6e 65 64 20 72  teger returned r
1c940 65 76 65 61 6c 73 20 74 68 65 20 62 79 74 65 2d  eveals the byte-
1c950 6f 72 64 65 72 20 6f 66 20 74 68 65 20 63 6f 6d  order of the com
1c960 70 75 74 65 72 20 6f 6e 20 77 68 69 63 68 0a 20  puter on which. 
1c970 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 69 73 20     ** SQLite is 
1c980 72 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a  running:.    **.
1c990 20 20 20 20 2a 2a 20 20 20 20 20 20 20 31 20 20      **       1  
1c9a0 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20     big-endian,  
1c9b0 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20    determined at 
1c9c0 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20  run-time.    ** 
1c9d0 20 20 20 20 20 31 30 20 20 20 20 20 6c 69 74 74       10     litt
1c9e0 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72  le-endian, deter
1c9f0 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d  mined at run-tim
1ca00 65 0a 20 20 20 20 2a 2a 20 20 34 33 32 31 30 31  e.    **  432101
1ca10 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c       big-endian,
1ca20 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61      determined a
1ca30 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20  t compile-time. 
1ca40 20 20 20 2a 2a 20 20 31 32 33 34 31 30 20 20 20     **  123410   
1ca50 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c    little-endian,
1ca60 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63   determined at c
1ca70 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20  ompile-time.    
1ca80 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 53 51 4c  */ .    case SQL
1ca90 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54  ITE_TESTCTRL_BYT
1caa0 45 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20 20 20  EORDER: {.      
1cab0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 59 54 45  rc = SQLITE_BYTE
1cac0 4f 52 44 45 52 2a 31 30 30 20 2b 20 53 51 4c 49  ORDER*100 + SQLI
1cad0 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e 2a  TE_LITTLEENDIAN*
1cae0 31 30 20 2b 20 53 51 4c 49 54 45 5f 42 49 47 45  10 + SQLITE_BIGE
1caf0 4e 44 49 41 4e 3b 0a 20 20 20 20 20 20 62 72 65  NDIAN;.      bre
1cb00 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1cb10 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1cb20 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1cb30 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45  TESTCTRL_RESERVE
1cb40 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  , sqlite3 *db, i
1cb50 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt N).    **.   
1cb60 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65 73   ** Set the nRes
1cb70 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20 66  erve size to N f
1cb80 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  or the main data
1cb90 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74 61  base on the data
1cba0 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e  base.    ** conn
1cbb0 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a  ection db..    *
1cbc0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1cbd0 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
1cbe0 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  VE: {.      sqli
1cbf0 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67  te3 *db = va_arg
1cc00 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a  (ap, sqlite3*);.
1cc10 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61        int x = va
1cc20 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20  _arg(ap,int);.  
1cc30 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1cc40 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1cc50 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x);.      sqlite
1cc60 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
1cc70 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
1cc80 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20  , 0, x, 0);.    
1cc90 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1cca0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1ccb0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ccc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71     }..    /*  sq
1ccd0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1cce0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1ccf0 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
1cd00 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  , sqlite3 *db, i
1cd10 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt N).    **.   
1cd20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69   ** Enable or di
1cd30 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f 70  sable various op
1cd40 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20  timizations for 
1cd50 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
1cd60 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20 61  .  The .    ** a
1cd70 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20 62  rgument N is a b
1cd80 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69  itmask of optimi
1cd90 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64 69  zations to be di
1cda0 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72  sabled.  For nor
1cdb0 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  mal.    ** opera
1cdc0 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65  tion N should be
1cdd0 20 30 2e 20 20 54 68 65 20 69 64 65 61 20 69 73   0.  The idea is
1cde0 20 74 68 61 74 20 61 20 74 65 73 74 20 70 72 6f   that a test pro
1cdf0 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20  gram (like the. 
1ce00 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20     ** SQL Logic 
1ce10 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73 74  Test or SLT test
1ce20 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75 6e   module) can run
1ce30 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d 75   the same SQL mu
1ce40 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20 20  ltiple times.   
1ce50 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75 73   ** with various
1ce60 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64   optimizations d
1ce70 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69 66  isabled to verif
1ce80 79 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  y that the same 
1ce90 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69 73  answer.    ** is
1cea0 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76 65   obtained in eve
1ceb0 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  ry case..    */.
1cec0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ced0 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
1cee0 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20  ATIONS: {.      
1cef0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61  sqlite3 *db = va
1cf00 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
1cf10 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 64 62  *);.      db->db
1cf20 4f 70 74 46 6c 61 67 73 20 3d 20 28 75 31 36 29  OptFlags = (u16)
1cf30 28 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29  (va_arg(ap, int)
1cf40 20 26 20 30 78 66 66 66 66 29 3b 0a 20 20 20 20   & 0xffff);.    
1cf50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1cf60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f  #ifdef SQLITE_N_
1cf70 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73  KEYWORD.    /* s
1cf80 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1cf90 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1cfa0 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63  TRL_ISKEYWORD, c
1cfb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64  onst char *zWord
1cfc0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1cfd0 49 66 20 7a 57 6f 72 64 20 69 73 20 61 20 6b 65  If zWord is a ke
1cfe0 79 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a 65 64  yword recognized
1cff0 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2c 20   by the parser, 
1d000 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a  then return the.
1d010 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
1d020 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 69   keywords.  Or i
1d030 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74 20 61  f zWord is not a
1d040 20 6b 65 79 77 6f 72 64 2c 20 72 65 74 75 72 6e   keyword, return
1d050 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20   0..    ** .    
1d060 2a 2a 20 54 68 69 73 20 74 65 73 74 20 66 65 61  ** This test fea
1d070 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 61 76 61  ture is only ava
1d080 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 61 6d  ilable in the am
1d090 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65  algamation since
1d0a0 0a 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 49  .    ** the SQLI
1d0b0 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63  TE_N_KEYWORD mac
1d0c0 72 6f 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  ro is not define
1d0d0 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69  d in this file i
1d0e0 66 20 53 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20  f SQLite.    ** 
1d0f0 69 73 20 62 75 69 6c 74 20 75 73 69 6e 67 20 73  is built using s
1d100 65 70 61 72 61 74 65 20 73 6f 75 72 63 65 20 66  eparate source f
1d110 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  iles..    */.   
1d120 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1d130 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a  TCTRL_ISKEYWORD:
1d140 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63   {.      const c
1d150 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f  har *zWord = va_
1d160 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68  arg(ap, const ch
1d170 61 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  ar*);.      int 
1d180 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
1d190 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20  n30(zWord);.    
1d1a0 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4b    rc = (sqlite3K
1d1b0 65 79 77 6f 72 64 43 6f 64 65 28 28 75 38 2a 29  eywordCode((u8*)
1d1c0 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44  zWord, n)!=TK_ID
1d1d0 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59  ) ? SQLITE_N_KEY
1d1e0 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20 20 20  WORD : 0;.      
1d1f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1d200 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20 73 71 6c  dif ..    /* sql
1d210 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1d220 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1d230 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 2c  L_SCRATCHMALLOC,
1d240 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70 46 72 65   sz, &pNew, pFre
1d250 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  e);.    **.    *
1d260 2a 20 50 61 73 73 20 70 46 72 65 65 20 69 6e 74  * Pass pFree int
1d270 6f 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68  o sqlite3Scratch
1d280 46 72 65 65 28 29 2e 20 0a 20 20 20 20 2a 2a 20  Free(). .    ** 
1d290 49 66 20 73 7a 3e 30 20 74 68 65 6e 20 61 6c 6c  If sz>0 then all
1d2a0 6f 63 61 74 65 20 61 20 73 63 72 61 74 63 68 20  ocate a scratch 
1d2b0 62 75 66 66 65 72 20 69 6e 74 6f 20 70 4e 65 77  buffer into pNew
1d2c0 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  .  .    */.    c
1d2d0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1d2e0 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f  TRL_SCRATCHMALLO
1d2f0 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  C: {.      void 
1d300 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e 65 77 3b  *pFree, **ppNew;
1d310 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20  .      int sz;. 
1d320 20 20 20 20 20 73 7a 20 3d 20 76 61 5f 61 72 67       sz = va_arg
1d330 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
1d340 20 70 70 4e 65 77 20 3d 20 76 61 5f 61 72 67 28   ppNew = va_arg(
1d350 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20 20 20  ap, void**);.   
1d360 20 20 20 70 46 72 65 65 20 3d 20 76 61 5f 61 72     pFree = va_ar
1d370 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
1d380 20 20 20 20 69 66 28 20 73 7a 20 29 20 2a 70 70      if( sz ) *pp
1d390 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 63 72  New = sqlite3Scr
1d3a0 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a  atchMalloc(sz);.
1d3b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 72        sqlite3Scr
1d3c0 61 74 63 68 46 72 65 65 28 70 46 72 65 65 29 3b  atchFree(pFree);
1d3d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d3e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71    }..    /*   sq
1d3f0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1d400 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1d410 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55  RL_LOCALTIME_FAU
1d420 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a  LT, int onoff);.
1d430 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
1d440 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66   parameter onoff
1d450 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f   is non-zero, co
1d460 6e 66 69 67 75 72 65 20 74 68 65 20 77 72 61 70  nfigure the wrap
1d470 70 65 72 73 20 73 6f 20 74 68 61 74 20 61 6c 6c  pers so that all
1d480 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65  .    ** subseque
1d490 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61  nt calls to loca
1d4a0 6c 74 69 6d 65 28 29 20 61 6e 64 20 76 61 72 69  ltime() and vari
1d4b0 61 6e 74 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e  ants fail. If on
1d4c0 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a 20 20 20  off is zero,.   
1d4d0 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73 20 73 65   ** undo this se
1d4e0 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  tting..    */.  
1d4f0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1d500 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45  STCTRL_LOCALTIME
1d510 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20  _FAULT: {.      
1d520 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1d530 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61  fig.bLocaltimeFa
1d540 75 6c 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ult = va_arg(ap,
1d550 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
1d560 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1d570 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1d580 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1d590 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43  TESTCTRL_NEVER_C
1d5a0 4f 52 52 55 50 54 2c 20 69 6e 74 29 3b 0a 20 20  ORRUPT, int);.  
1d5b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20    **.    ** Set 
1d5c0 6f 72 20 63 6c 65 61 72 20 61 20 66 6c 61 67 20  or clear a flag 
1d5d0 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 74  that indicates t
1d5e0 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
1d5f0 20 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73 20   file is always 
1d600 77 65 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f 72  well-.    ** for
1d610 6d 65 64 20 61 6e 64 20 6e 65 76 65 72 20 63 6f  med and never co
1d620 72 72 75 70 74 2e 20 20 54 68 69 73 20 66 6c 61  rrupt.  This fla
1d630 67 20 69 73 20 63 6c 65 61 72 20 62 79 20 64 65  g is clear by de
1d640 66 61 75 6c 74 2c 20 69 6e 64 69 63 61 74 69 6e  fault, indicatin
1d650 67 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 64 61  g that.    ** da
1d660 74 61 62 61 73 65 20 66 69 6c 65 73 20 6d 69 67  tabase files mig
1d670 68 74 20 68 61 76 65 20 61 72 62 69 74 72 61 72  ht have arbitrar
1d680 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 53  y corruption.  S
1d690 65 74 74 69 6e 67 20 74 68 65 20 66 6c 61 67 20  etting the flag 
1d6a0 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74 65  during.    ** te
1d6b0 73 74 69 6e 67 20 63 61 75 73 65 73 20 63 65 72  sting causes cer
1d6c0 74 61 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  tain assert() st
1d6d0 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
1d6e0 63 6f 64 65 20 74 6f 20 62 65 20 61 63 74 69 76  code to be activ
1d6f0 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 68 61 74  ated.    ** that
1d700 20 64 65 6d 6f 6e 73 74 72 61 74 20 69 6e 76 61   demonstrat inva
1d710 72 69 61 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d 66  riants on well-f
1d720 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
1d730 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  iles..    */.   
1d740 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1d750 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52  TCTRL_NEVER_CORR
1d760 55 50 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  UPT: {.      sql
1d770 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1d780 2e 6e 65 76 65 72 43 6f 72 72 75 70 74 20 3d 20  .neverCorrupt = 
1d790 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1d7a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d7b0 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 20 20 73    }...    /*   s
1d7c0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1d7d0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1d7e0 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  TRL_VDBE_COVERAG
1d7f0 45 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70 74  E, xCallback, pt
1d800 72 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  r);.    **.    *
1d810 2a 20 53 65 74 20 74 68 65 20 56 44 42 45 20 63  * Set the VDBE c
1d820 6f 76 65 72 61 67 65 20 63 61 6c 6c 62 61 63 6b  overage callback
1d830 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 78 43 61   function to xCa
1d840 6c 6c 62 61 63 6b 20 77 69 74 68 20 63 6f 6e 74  llback with cont
1d850 65 78 74 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  ext .    ** poin
1d860 74 65 72 20 70 74 72 2e 0a 20 20 20 20 2a 2f 0a  ter ptr..    */.
1d870 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1d880 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f  TESTCTRL_VDBE_CO
1d890 56 45 52 41 47 45 3a 20 7b 0a 23 69 66 64 65 66  VERAGE: {.#ifdef
1d8a0 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
1d8b0 45 52 41 47 45 0a 20 20 20 20 20 20 74 79 70 65  ERAGE.      type
1d8c0 64 65 66 20 76 6f 69 64 20 28 2a 62 72 61 6e 63  def void (*branc
1d8d0 68 5f 63 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  h_callback)(void
1d8e0 2a 2c 69 6e 74 2c 75 38 2c 75 38 29 3b 0a 20 20  *,int,u8,u8);.  
1d8f0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1d900 6c 43 6f 6e 66 69 67 2e 78 56 64 62 65 42 72 61  lConfig.xVdbeBra
1d910 6e 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  nch = va_arg(ap,
1d920 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29  branch_callback)
1d930 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
1d940 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64 62  lobalConfig.pVdb
1d950 65 42 72 61 6e 63 68 41 72 67 20 3d 20 76 61 5f  eBranchArg = va_
1d960 61 72 67 28 61 70 2c 76 6f 69 64 2a 29 3b 0a 23  arg(ap,void*);.#
1d970 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
1d980 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1d990 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1d9a0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1d9b0 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d  ESTCTRL_SORTER_M
1d9c0 4d 41 50 2c 20 64 62 2c 20 6e 4d 61 78 29 3b 20  MAP, db, nMax); 
1d9d0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1d9e0 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54  TE_TESTCTRL_SORT
1d9f0 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20 20  ER_MMAP: {.     
1da00 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
1da10 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
1da20 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  3*);.      db->n
1da30 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20  MaxSorterMmap = 
1da40 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1da50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1da60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71    }..    /*   sq
1da70 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1da80 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1da90 52 4c 5f 49 53 49 4e 49 54 29 3b 0a 20 20 20 20  RL_ISINIT);.    
1daa0 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e  **.    ** Return
1dab0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 53 51   SQLITE_OK if SQ
1dac0 4c 69 74 65 20 68 61 73 20 62 65 65 6e 20 69 6e  Lite has been in
1dad0 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 53 51  itialized and SQ
1dae0 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 0a 20 20  LITE_ERROR if.  
1daf0 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f    ** not..    */
1db00 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1db10 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54  _TESTCTRL_ISINIT
1db20 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
1db30 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1db40 67 2e 69 73 49 6e 69 74 3d 3d 30 20 29 20 72 63  g.isInit==0 ) rc
1db50 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1db60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1db70 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c    }..    /*  sql
1db80 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1db90 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1dba0 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64 62 2c 20  L_IMPOSTER, db, 
1dbb0 64 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c 20 74  dbName, onOff, t
1dbc0 6e 75 6d 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  num);.    **.   
1dbd0 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 63 6f   ** This test co
1dbe0 6e 74 72 6f 6c 20 69 73 20 75 73 65 64 20 74 6f  ntrol is used to
1dbf0 20 63 72 65 61 74 65 20 69 6d 70 6f 73 74 65 72   create imposter
1dc00 20 74 61 62 6c 65 73 2e 20 20 22 64 62 22 20 69   tables.  "db" i
1dc10 73 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 20 20  s a pointer.    
1dc20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
1dc30 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20  se connection.  
1dc40 64 62 4e 61 6d 65 20 69 73 20 74 68 65 20 64 61  dbName is the da
1dc50 74 61 62 61 73 65 20 6e 61 6d 65 20 28 65 78 3a  tabase name (ex:
1dc60 20 22 6d 61 69 6e 22 20 6f 72 0a 20 20 20 20 2a   "main" or.    *
1dc70 2a 20 22 74 65 6d 70 22 29 20 77 68 69 63 68 20  * "temp") which 
1dc80 77 69 6c 6c 20 72 65 63 65 69 76 65 20 74 68 65  will receive the
1dc90 20 69 6d 70 6f 73 74 65 72 2e 20 20 22 6f 6e 4f   imposter.  "onO
1dca0 66 66 22 20 74 75 72 6e 73 20 69 6d 70 6f 73 74  ff" turns impost
1dcb0 65 72 20 6d 6f 64 65 20 6f 6e 0a 20 20 20 20 2a  er mode on.    *
1dcc0 2a 20 6f 72 20 6f 66 66 2e 20 20 22 74 6e 75 6d  * or off.  "tnum
1dcd0 22 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  " is the root pa
1dce0 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
1dcf0 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6d   to which the im
1dd00 70 6f 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61  poster.    ** ta
1dd10 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 6e 65  ble should conne
1dd20 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ct..    **.    *
1dd30 2a 20 45 6e 61 62 6c 65 20 69 6d 70 6f 73 74 65  * Enable imposte
1dd40 72 20 6d 6f 64 65 20 6f 6e 6c 79 20 77 68 65 6e  r mode only when
1dd50 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
1dd60 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 61 72  already been par
1dd70 73 65 64 2e 20 20 54 68 65 6e 0a 20 20 20 20 2a  sed.  Then.    *
1dd80 2a 20 72 75 6e 20 61 20 73 69 6e 67 6c 65 20 43  * run a single C
1dd90 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
1dda0 65 6d 65 6e 74 20 74 6f 20 63 6f 6e 73 74 72 75  ement to constru
1ddb0 63 74 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20  ct the imposter 
1ddc0 74 61 62 6c 65 20 69 6e 0a 20 20 20 20 2a 2a 20  table in.    ** 
1ddd0 74 68 65 20 70 61 72 73 65 64 20 73 63 68 65 6d  the parsed schem
1dde0 61 2e 20 20 54 68 65 6e 20 74 75 72 6e 20 69 6d  a.  Then turn im
1ddf0 70 6f 73 74 65 72 20 6d 6f 64 65 20 62 61 63 6b  poster mode back
1de00 20 6f 66 66 20 61 67 61 69 6e 2e 0a 20 20 20 20   off again..    
1de10 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 4f  **.    ** If onO
1de20 66 66 3d 3d 30 20 61 6e 64 20 74 6e 75 6d 3e 30  ff==0 and tnum>0
1de30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
1de40 73 63 68 65 6d 61 20 66 6f 72 20 61 6c 6c 20 64  schema for all d
1de50 61 74 61 62 61 73 65 73 2c 20 63 61 75 73 69 6e  atabases, causin
1de60 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68  g.    ** the sch
1de70 65 6d 61 20 74 6f 20 62 65 20 72 65 70 61 72 73  ema to be repars
1de80 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ed the next time
1de90 20 69 74 20 69 73 20 6e 65 65 64 65 64 2e 20 20   it is needed.  
1dea0 54 68 69 73 20 68 61 73 20 74 68 65 0a 20 20 20  This has the.   
1deb0 20 2a 2a 20 65 66 66 65 63 74 20 6f 66 20 65 72   ** effect of er
1dec0 61 73 69 6e 67 20 61 6c 6c 20 69 6d 70 6f 73 74  asing all impost
1ded0 65 72 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 2a  er tables..    *
1dee0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1def0 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
1df00 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
1df10 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
1df20 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
1df30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
1df40 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1df50 75 74 65 78 29 3b 0a 20 20 20 20 20 20 64 62 2d  utex);.      db-
1df60 3e 69 6e 69 74 2e 69 44 62 20 3d 20 73 71 6c 69  >init.iDb = sqli
1df70 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
1df80 2c 20 76 61 5f 61 72 67 28 61 70 2c 63 6f 6e 73  , va_arg(ap,cons
1df90 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20  t char*));.     
1dfa0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d   db->init.busy =
1dfb0 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74   db->init.impost
1dfc0 65 72 54 61 62 6c 65 20 3d 20 76 61 5f 61 72 67  erTable = va_arg
1dfd0 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
1dfe0 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
1dff0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
1e000 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
1e010 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 26 26  >init.busy==0 &&
1e020 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
1e030 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  m>0 ){.        s
1e040 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63  qlite3ResetAllSc
1e050 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f  hemasOfConnectio
1e060 6e 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n(db);.      }. 
1e070 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
1e080 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1e090 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
1e0a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
1e0b0 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69 66  _end(ap);.#endif
1e0c0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1e0d0 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f 0a  BUILTIN_TEST */.
1e0e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e0f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
1e100 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 2c  utility routine,
1e110 20 75 73 65 66 75 6c 20 74 6f 20 56 46 53 20 69   useful to VFS i
1e120 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20  mplementations, 
1e130 74 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  that checks.** t
1e140 6f 20 73 65 65 20 69 66 20 61 20 64 61 74 61 62  o see if a datab
1e150 61 73 65 20 66 69 6c 65 20 77 61 73 20 61 20 55  ase file was a U
1e160 52 49 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 65  RI that containe
1e170 64 20 61 20 73 70 65 63 69 66 69 63 20 71 75 65  d a specific que
1e180 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ry .** parameter
1e190 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f 62 74 61  , and if so obta
1e1a0 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ins the value of
1e1b0 20 74 68 65 20 71 75 65 72 79 20 70 61 72 61 6d   the query param
1e1c0 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eter..**.** The 
1e1d0 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65  zFilename argume
1e1e0 6e 74 20 69 73 20 74 68 65 20 66 69 6c 65 6e 61  nt is the filena
1e1f0 6d 65 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65  me pointer passe
1e200 64 20 69 6e 74 6f 20 74 68 65 20 78 4f 70 65 6e  d into the xOpen
1e210 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20  ().** method of 
1e220 61 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61  a VFS implementa
1e230 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72 61  tion.  The zPara
1e240 6d 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  m argument is th
1e250 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
1e260 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
1e270 20 77 65 20 73 65 65 6b 2e 20 20 54 68 69 73 20   we seek.  This 
1e280 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1e290 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1e2a0 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61 6d   zParam.** param
1e2b0 65 74 65 72 20 69 66 20 69 74 20 65 78 69 73 74  eter if it exist
1e2c0 73 2e 20 20 49 66 20 74 68 65 20 70 61 72 61 6d  s.  If the param
1e2d0 65 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 65 78  eter does not ex
1e2e0 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ist, this routin
1e2f0 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 4e  e.** returns a N
1e300 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ULL pointer..*/.
1e310 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
1e320 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
1e330 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  r(const char *zF
1e340 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63  ilename, const c
1e350 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20 20  har *zParam){.  
1e360 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
1e370 20 7c 7c 20 7a 50 61 72 61 6d 3d 3d 30 20 29 20   || zParam==0 ) 
1e380 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c  return 0;.  zFil
1e390 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33  ename += sqlite3
1e3a0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
1e3b0 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  me) + 1;.  while
1e3c0 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  ( zFilename[0] )
1e3d0 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 73 74  {.    int x = st
1e3e0 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  rcmp(zFilename, 
1e3f0 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69  zParam);.    zFi
1e400 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65  lename += sqlite
1e410 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
1e420 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 69 66  ame) + 1;.    if
1e430 28 20 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( x==0 ) return 
1e440 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a  zFilename;.    z
1e450 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
1e460 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
1e470 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a  ename) + 1;.  }.
1e480 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1e490 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6f  *.** Return a bo
1e4a0 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f 72 20  olean value for 
1e4b0 61 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  a query paramete
1e4c0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
1e4d0 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f  3_uri_boolean(co
1e4e0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1e4f0 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
1e500 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62 44 66  *zParam, int bDf
1e510 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  lt){.  const cha
1e520 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75  r *z = sqlite3_u
1e530 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69  ri_parameter(zFi
1e540 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b  lename, zParam);
1e550 0a 20 20 62 44 66 6c 74 20 3d 20 62 44 66 6c 74  .  bDflt = bDflt
1e560 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20  !=0;.  return z 
1e570 3f 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c  ? sqlite3GetBool
1e580 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20 3a 20  ean(z, bDflt) : 
1e590 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  bDflt;.}../*.** 
1e5a0 52 65 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20  Return a 64-bit 
1e5b0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f  integer value fo
1e5c0 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65  r a query parame
1e5d0 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  ter..*/.sqlite3_
1e5e0 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 75 72  int64 sqlite3_ur
1e5f0 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74  i_int64(.  const
1e600 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1e610 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65  ,    /* Filename
1e620 20 61 73 20 70 61 73 73 65 64 20 74 6f 20 78 4f   as passed to xO
1e630 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  pen */.  const c
1e640 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20  har *zParam,    
1e650 20 20 20 2f 2a 20 55 52 49 20 70 61 72 61 6d 65     /* URI parame
1e660 74 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a 20 20  ter sought */.  
1e670 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 62 44  sqlite3_int64 bD
1e680 66 6c 74 20 20 20 20 20 20 20 2f 2a 20 72 65 74  flt       /* ret
1e690 75 72 6e 20 69 66 20 70 61 72 61 6d 65 74 65 72  urn if parameter
1e6a0 20 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 29   is missing */.)
1e6b0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1e6c0 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  z = sqlite3_uri_
1e6d0 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e  parameter(zFilen
1e6e0 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20  ame, zParam);.  
1e6f0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b  sqlite3_int64 v;
1e700 0a 20 20 69 66 28 20 7a 20 26 26 20 73 71 6c 69  .  if( z && sqli
1e710 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34  te3DecOrHexToI64
1e720 28 7a 2c 20 26 76 29 3d 3d 53 51 4c 49 54 45 5f  (z, &v)==SQLITE_
1e730 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66 6c 74 20  OK ){.    bDflt 
1e740 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = v;.  }.  retur
1e750 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n bDflt;.}../*.*
1e760 2a 20 52 65 74 75 72 6e 20 74 68 65 20 42 74 72  * Return the Btr
1e770 65 65 20 70 6f 69 6e 74 65 72 20 69 64 65 6e 74  ee pointer ident
1e780 69 66 69 65 64 20 62 79 20 7a 44 62 4e 61 6d 65  ified by zDbName
1e790 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
1e7a0 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
1e7b0 42 74 72 65 65 20 2a 73 71 6c 69 74 65 33 44 62  Btree *sqlite3Db
1e7c0 4e 61 6d 65 54 6f 42 74 72 65 65 28 73 71 6c 69  NameToBtree(sqli
1e7d0 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
1e7e0 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20  har *zDbName){. 
1e7f0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1e800 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
1e810 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  +){.    if( db->
1e820 61 44 62 5b 69 5d 2e 70 42 74 0a 20 20 20 20 20  aDb[i].pBt.     
1e830 26 26 20 28 7a 44 62 4e 61 6d 65 3d 3d 30 20 7c  && (zDbName==0 |
1e840 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  | sqlite3StrICmp
1e850 28 7a 44 62 4e 61 6d 65 2c 20 64 62 2d 3e 61 44  (zDbName, db->aD
1e860 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 29 0a  b[i].zName)==0).
1e870 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1e880 75 72 6e 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  urn db->aDb[i].p
1e890 42 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  Bt;.    }.  }.  
1e8a0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1e8b0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69  ** Return the fi
1e8c0 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  lename of the da
1e8d0 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
1e8e0 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
1e8f0 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
1e900 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
1e910 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
1e920 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ame(sqlite3 *db,
1e930 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1e940 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a  Name){.  Btree *
1e950 70 42 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  pBt;.#ifdef SQLI
1e960 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1e970 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1e980 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1e990 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
1e9a0 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
1e9b0 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
1e9c0 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
1e9d0 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  pBt = sqlite3DbN
1e9e0 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
1e9f0 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  DbName);.  retur
1ea00 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42  n pBt ? sqlite3B
1ea10 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
1ea20 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a  pBt) : 0;.}../*.
1ea30 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 64  ** Return 1 if d
1ea40 61 74 61 62 61 73 65 20 69 73 20 72 65 61 64 2d  atabase is read-
1ea50 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20 72 65 61  only or 0 if rea
1ea60 64 2f 77 72 69 74 65 2e 20 20 52 65 74 75 72 6e  d/write.  Return
1ea70 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63   -1 if.** no suc
1ea80 68 20 64 61 74 61 62 61 73 65 20 65 78 69 73 74  h database exist
1ea90 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1eaa0 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 73 71  3_db_readonly(sq
1eab0 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1eac0 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b   char *zDbName){
1ead0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23  .  Btree *pBt;.#
1eae0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1eaf0 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1eb00 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1eb10 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
1eb20 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
1eb30 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
1eb40 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
1eb50 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d  }.#endif.  pBt =
1eb60 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f   sqlite3DbNameTo
1eb70 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d  Btree(db, zDbNam
1eb80 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  e);.  return pBt
1eb90 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   ? sqlite3BtreeI
1eba0 73 52 65 61 64 6f 6e 6c 79 28 70 42 74 29 20 3a  sReadonly(pBt) :
1ebb0 20 2d 31 3b 0a 7d 0a                              -1;.}.