/ Hex Artifact Content
Login

Artifact c7d4a1858446db5f611891ddce62572b1fdec040:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64  u.h".#endif.#ifd
0320: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0330: 5f 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74  _JSON1.int sqlit
0340: 65 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69  e3Json1Init(sqli
0350: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69  te3*);.#endif.#i
0360: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
0370: 4c 45 5f 46 54 53 35 0a 69 6e 74 20 73 71 6c 69  LE_FTS5.int sqli
0380: 74 65 33 46 74 73 35 49 6e 69 74 28 73 71 6c 69  te3Fts5Init(sqli
0390: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  te3*);.#endif..#
03a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d  ifndef SQLITE_AM
03b0: 41 4c 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d  ALGAMATION./* IM
03c0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
03d0: 20 52 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54   R-46656-45156 T
03e0: 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69  he sqlite3_versi
03f0: 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73  on[] string cons
0400: 74 61 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  tant.** contains
0410: 20 74 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c   the text of SQL
0420: 49 54 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72  ITE_VERSION macr
0430: 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  o. .*/.const cha
0440: 72 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  r sqlite3_versio
0450: 6e 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52  n[] = SQLITE_VER
0460: 53 49 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  SION;.#endif../*
0470: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0480: 4f 46 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37  OF: R-53536-4257
0490: 35 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  5 The sqlite3_li
04a0: 62 76 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74  bversion() funct
04b0: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61  ion returns.** a
04c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
04d0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  to the sqlite3_v
04e0: 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20  ersion[] string 
04f0: 63 6f 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f  constant. .*/.co
0500: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0510: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69  3_libversion(voi
0520: 64 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  d){ return sqlit
0530: 65 33 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f  e3_version; }../
0540: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
0550: 2d 4f 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33  -OF: R-63124-393
0560: 30 30 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73  00 The sqlite3_s
0570: 6f 75 72 63 65 69 64 28 29 20 66 75 6e 63 74 69  ourceid() functi
0580: 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20  on returns a.** 
0590: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
05a0: 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f  ing constant who
05b0: 73 65 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  se value is the 
05c0: 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53  same as the.** S
05d0: 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20  QLITE_SOURCE_ID 
05e0: 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d  C preprocessor m
05f0: 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20  acro. .*/.const 
0600: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f  char *sqlite3_so
0610: 75 72 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65  urceid(void){ re
0620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52  turn SQLITE_SOUR
0630: 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  CE_ID; }../* IMP
0640: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0650: 52 2d 33 35 32 31 30 2d 36 33 35 30 38 20 54 68  R-35210-63508 Th
0660: 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  e sqlite3_libver
0670: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75  sion_number() fu
0680: 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  nction.** return
0690: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75  s an integer equ
06a0: 61 6c 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52  al to SQLITE_VER
06b0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a  SION_NUMBER..*/.
06c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  int sqlite3_libv
06d0: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f  ersion_number(vo
06e0: 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  id){ return SQLI
06f0: 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
0700: 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  R; }../* IMPLEME
0710: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30  NTATION-OF: R-20
0720: 37 39 30 2d 31 34 30 32 35 20 54 68 65 20 73 71  790-14025 The sq
0730: 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65  lite3_threadsafe
0740: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
0750: 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61  rns.** zero if a
0760: 6e 64 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74  nd only if SQLit
0770: 65 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77  e was compiled w
0780: 69 74 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64  ith mutexing cod
0790: 65 20 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f  e omitted due to
07a0: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54  .** the SQLITE_T
07b0: 48 52 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c  HREADSAFE compil
07c0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65  e-time option be
07d0: 69 6e 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f  ing set to 0..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72  .int sqlite3_thr
07f0: 65 61 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72  eadsafe(void){ r
0800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52  eturn SQLITE_THR
0810: 45 41 44 53 41 46 45 3b 20 7d 0a 0a 2f 2a 0a 2a  EADSAFE; }../*.*
0820: 2a 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * When compiling
0830: 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72   the test fixtur
0840: 65 20 6f 72 20 77 69 74 68 20 64 65 62 75 67 67  e or with debugg
0850: 69 6e 67 20 65 6e 61 62 6c 65 64 20 28 6f 6e 20  ing enabled (on 
0860: 57 69 6e 33 32 29 2c 0a 2a 2a 20 74 68 69 73 20  Win32),.** this 
0870: 76 61 72 69 61 62 6c 65 20 62 65 69 6e 67 20 73  variable being s
0880: 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 77  et to non-zero w
0890: 69 6c 6c 20 63 61 75 73 65 20 4f 53 54 52 41 43  ill cause OSTRAC
08a0: 45 20 6d 61 63 72 6f 73 20 74 6f 20 65 6d 69 74  E macros to emit
08b0: 0a 2a 2a 20 65 78 74 72 61 20 64 69 61 67 6e 6f  .** extra diagno
08c0: 73 74 69 63 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  stic information
08d0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
08e0: 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
08f0: 0a 23 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  .# ifndef SQLITE
0900: 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 0a  _DEBUG_OS_TRACE.
0910: 23 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  #   define SQLIT
0920: 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45  E_DEBUG_OS_TRACE
0930: 20 30 0a 23 20 65 6e 64 69 66 0a 20 20 69 6e 74   0.# endif.  int
0940: 20 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 20   sqlite3OSTrace 
0950: 3d 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f  = SQLITE_DEBUG_O
0960: 53 5f 54 52 41 43 45 3b 0a 23 65 6e 64 69 66 0a  S_TRACE;.#endif.
0970: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0980: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
0990: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
09a0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
09b0: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E)./*.** If the 
09c0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
09d0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  on pointer is no
09e0: 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a 2a 2a  t NULL and if.**
09f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
0a00: 4f 54 52 41 43 45 20 69 73 20 65 6e 61 62 6c 65  OTRACE is enable
0a10: 64 2c 20 74 68 65 6e 20 6d 65 73 73 61 67 65 73  d, then messages
0a20: 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20 49   describing.** I
0a30: 2f 4f 20 61 63 74 69 76 65 20 61 72 65 20 77 72  /O active are wr
0a40: 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68 69 73  itten using this
0a50: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 73   function.  Thes
0a60: 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20 61 72  e messages.** ar
0a70: 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 64  e intended for d
0a80: 65 62 75 67 67 69 6e 67 20 61 63 74 69 76 69 74  ebugging activit
0a90: 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53 51 4c 49 54  y only..*/.SQLIT
0aa0: 45 5f 41 50 49 20 76 6f 69 64 20 28 53 51 4c 49  E_API void (SQLI
0ab0: 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74 65  TE_CDECL *sqlite
0ac0: 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20  3IoTrace)(const 
0ad0: 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b  char*, ...) = 0;
0ae0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
0af0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0b00: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
0b10: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
0b20: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  ng which is the.
0b30: 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  ** name of a dir
0b40: 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61  ectory, then tha
0b50: 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  t directory will
0b60: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
0b70: 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66  e.** temporary f
0b80: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  iles..**.** See 
0b90: 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41  also the "PRAGMA
0ba0: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
0bb0: 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61  ctory" SQL comma
0bc0: 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nd..*/.char *sql
0bd0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
0be0: 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ory = 0;../*.** 
0bf0: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0c00: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0c10: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0c20: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0c30: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0c40: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0c50: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0c60: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0c70: 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62 61  re.** all databa
0c80: 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66 69  se files specifi
0c90: 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ed with a relati
0ca0: 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a 0a  ve pathname..**.
0cb0: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  ** See also the 
0cc0: 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f  "PRAGMA data_sto
0cd0: 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53 51  re_directory" SQ
0ce0: 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68  L command..*/.ch
0cf0: 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74 61  ar *sqlite3_data
0d00: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  _directory = 0;.
0d10: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0d20: 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a 2a  e SQLite.  .**.*
0d30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0d40: 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ust be called to
0d50: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
0d60: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
0d70: 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20 6d  n,.** VFS, and m
0d80: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73 20  utex subsystems 
0d90: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61  prior to doing a
0da0: 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b 20  ny serious work 
0db0: 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e 20  with.** SQLite. 
0dc0: 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73 20   But as long as 
0dd0: 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70 69  you do not compi
0de0: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f  le with SQLITE_O
0df0: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a 20  MIT_AUTOINIT.** 
0e00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
0e10: 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74 6f  l be called auto
0e20: 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65 79  matically by key
0e30: 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20 61   routines such a
0e40: 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  s.** sqlite3_ope
0e50: 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  n().  .**.** Thi
0e60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
0e70: 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20 69  o-op except on i
0e80: 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63 61  ts very first ca
0e90: 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63 65  ll for the proce
0ea0: 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74 68  ss,.** or for th
0eb0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66 74  e first call aft
0ec0: 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
0ed0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a 2a  ite3_shutdown..*
0ee0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
0ef0: 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74 68  hread to call th
0f00: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
0f10: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
0f20: 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65 74  on to.** complet
0f30: 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71 75  ion.  If subsequ
0f40: 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c 6c  ent threads call
0f50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
0f60: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  fore the first.*
0f70: 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69 6e  * thread has fin
0f80: 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69 61  ished the initia
0f90: 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73  lization process
0fa0: 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73 65  , then the subse
0fb0: 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64 73  quent.** threads
0fc0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fd0: 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  l the first thre
0fe0: 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74 68  ad finishes with
0ff0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1000: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
1010: 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67 68  irst thread migh
1020: 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  t call this rout
1030: 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79 2e  ine recursively.
1040: 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20 63    Recursive.** c
1050: 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75  alls to this rou
1060: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tine should not 
1070: 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73 65  block, of course
1080: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
1090: 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  .** initializati
10a0: 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c 64  on process would
10b0: 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65 2e   never complete.
10c0: 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65 20  .**.** Let X be 
10d0: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  the first thread
10e0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 72   to enter this r
10f0: 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20 62  outine.  Let Y b
1100: 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  e some other.** 
1110: 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77 68  thread.  Then wh
1120: 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ile the initial 
1130: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  invocation of th
1140: 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58 20  is routine by X 
1150: 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74 65  is.** incomplete
1160: 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65 64  , it is required
1170: 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   that:.**.**    
1180: 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69 73  *  Calls to this
1190: 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59 20   routine from Y 
11a0: 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69 6c  must block until
11b0: 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74 0a   the outer-most.
11c0: 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62 79  **       call by
11d0: 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a 2a   X completes..**
11e0: 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72 73  .**    *  Recurs
11f0: 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68 69  ive calls to thi
1200: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
1210: 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20 69  hread X return i
1220: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
1230: 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f 63      without bloc
1240: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
1250: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1260: 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f 4c  void){.  MUTEX_L
1270: 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
1280: 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20  tex *pMaster; ) 
1290: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
12a0: 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a  n static mutex *
12b0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1300: 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69 6e  _EXTRA_INIT.  in
1310: 74 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20  t bRunExtraInit 
1320: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
1340: 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  tra initializati
1350: 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6e  on needed */.#en
1360: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1370: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63  TE_OMIT_WSD.  rc
1380: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
1390: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
13a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13b0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
13c0: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
13d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 6f 6c  .  /* If the fol
13e0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20  lowing assert() 
13f0: 66 61 69 6c 73 20 6f 6e 20 73 6f 6d 65 20 6f 62  fails on some ob
1400: 73 63 75 72 65 20 70 72 6f 63 65 73 73 6f 72 2f  scure processor/
1410: 63 6f 6d 70 69 6c 65 72 0a 20 20 2a 2a 20 63 6f  compiler.  ** co
1420: 6d 62 69 6e 61 74 69 6f 6e 2c 20 74 68 65 20 77  mbination, the w
1430: 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 74 6f  ork-around is to
1440: 20 73 65 74 20 74 68 65 20 63 6f 72 72 65 63 74   set the correct
1450: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 73 69   pointer.  ** si
1460: 7a 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ze at compile-ti
1470: 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  me using -DSQLIT
1480: 45 5f 50 54 52 53 49 5a 45 3d 6e 20 63 6f 6d 70  E_PTRSIZE=n comp
1490: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
14a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  */.  assert( SQL
14b0: 49 54 45 5f 50 54 52 53 49 5a 45 3d 3d 73 69 7a  ITE_PTRSIZE==siz
14c0: 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 0a 20  eof(char*) );.. 
14d0: 20 2f 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73   /* If SQLite is
14e0: 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c 65 74   already complet
14f0: 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  ely initialized,
1500: 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 0a   then this call.
1510: 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
1520: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 73 68 6f  initialize() sho
1530: 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20  uld be a no-op. 
1540: 20 42 75 74 20 74 68 65 20 69 6e 69 74 69 61 6c   But the initial
1550: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d 75 73  ization.  ** mus
1560: 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e 20 20  t be complete.  
1570: 53 6f 20 69 73 49 6e 69 74 20 6d 75 73 74 20 6e  So isInit must n
1580: 6f 74 20 62 65 20 73 65 74 20 75 6e 74 69 6c 20  ot be set until 
1590: 74 68 65 20 76 65 72 79 20 65 6e 64 0a 20 20 2a  the very end.  *
15a0: 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * of this routin
15b0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  e..  */.  if( sq
15c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15d0: 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72  g.isInit ) retur
15e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
15f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
1600: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
1610: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   is initialized.
1620: 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 0a    If unable to .
1630: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
1640: 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  the mutex subsys
1650: 74 65 6d 2c 20 72 65 74 75 72 6e 20 65 61 72 6c  tem, return earl
1660: 79 20 77 69 74 68 20 74 68 65 20 65 72 72 6f 72  y with the error
1670: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 79  ..  ** If the sy
1680: 73 74 65 6d 20 69 73 20 73 6f 20 73 69 63 6b 20  stem is so sick 
1690: 74 68 61 74 20 77 65 20 61 72 65 20 75 6e 61 62  that we are unab
16a0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  le to allocate a
16b0: 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20 74 68 65   mutex,.  ** the
16c0: 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 53  re is not much S
16d0: 51 4c 69 74 65 20 69 73 20 67 6f 69 6e 67 20 74  QLite is going t
16e0: 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 2e  o be able to do.
16f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d  .  **.  ** The m
1700: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 20 6d  utex subsystem m
1710: 75 73 74 20 74 61 6b 65 20 63 61 72 65 20 6f 66  ust take care of
1720: 20 73 65 72 69 61 6c 69 7a 69 6e 67 20 69 74 73   serializing its
1730: 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69 74 69 61   own.  ** initia
1740: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  lization..  */. 
1750: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 75 74   rc = sqlite3Mut
1760: 65 78 49 6e 69 74 28 29 3b 0a 20 20 69 66 28 20  exInit();.  if( 
1770: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1780: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1790: 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20 73 79   the malloc() sy
17a0: 73 74 65 6d 20 61 6e 64 20 74 68 65 20 72 65 63  stem and the rec
17b0: 75 72 73 69 76 65 20 70 49 6e 69 74 4d 75 74 65  ursive pInitMute
17c0: 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a 20 54 68  x mutex..  ** Th
17d0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  is operation is 
17e0: 70 72 6f 74 65 63 74 65 64 20 62 79 20 74 68 65  protected by the
17f0: 20 53 54 41 54 49 43 5f 4d 41 53 54 45 52 20 6d   STATIC_MASTER m
1800: 75 74 65 78 2e 20 20 4e 6f 74 65 20 74 68 61 74  utex.  Note that
1810: 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c 6c 6f 63  .  ** MutexAlloc
1820: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  () is called for
1830: 20 61 20 73 74 61 74 69 63 20 6d 75 74 65 78 20   a static mutex 
1840: 70 72 69 6f 72 20 74 6f 20 69 6e 69 74 69 61 6c  prior to initial
1850: 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6d  izing the.  ** m
1860: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20  alloc subsystem 
1870: 2d 20 74 68 69 73 20 69 6d 70 6c 69 65 73 20 74  - this implies t
1880: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
1890: 6f 6e 20 6f 66 20 61 20 73 74 61 74 69 63 0a 20  on of a static. 
18a0: 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74 20 6e   ** mutex must n
18b0: 6f 74 20 72 65 71 75 69 72 65 20 73 75 70 70 6f  ot require suppo
18c0: 72 74 20 66 72 6f 6d 20 74 68 65 20 6d 61 6c 6c  rt from the mall
18d0: 6f 63 20 73 75 62 73 79 73 74 65 6d 2e 0a 20 20  oc subsystem..  
18e0: 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  */.  MUTEX_LOGIC
18f0: 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69  ( pMaster = sqli
1900: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
1910: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1920: 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73  C_MASTER); ).  s
1930: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1940: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
1950: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1960: 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d  ig.isMutexInit =
1970: 20 31 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   1;.  if( !sqlit
1980: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1990: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
19a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
19b0: 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a 20 20 7d  allocInit();.  }
19c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
19e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
19f0: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 31  isMallocInit = 1
1a00: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
1a10: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1a20: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1a30: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1a40: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
1a50: 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 73  x =.           s
1a60: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1a70: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
1a80: 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20 20  CURSIVE);.      
1a90: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1aa0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
1ab0: 65 78 20 26 26 20 21 73 71 6c 69 74 65 33 47 6c  ex && !sqlite3Gl
1ac0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1ad0: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
1ae0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1af0: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
1b00: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
1b10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b20: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1b30: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
1b40: 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ex++;.  }.  sqli
1b50: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1b60: 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pMaster);..  /* 
1b70: 49 66 20 72 63 20 69 73 20 6e 6f 74 20 53 51 4c  If rc is not SQL
1b80: 49 54 45 5f 4f 4b 20 61 74 20 74 68 69 73 20 70  ITE_OK at this p
1b90: 6f 69 6e 74 2c 20 74 68 65 6e 20 65 69 74 68 65  oint, then eithe
1ba0: 72 20 74 68 65 20 6d 61 6c 6c 6f 63 0a 20 20 2a  r the malloc.  *
1bb0: 2a 20 73 75 62 73 79 73 74 65 6d 20 63 6f 75 6c  * subsystem coul
1bc0: 64 20 6e 6f 74 20 62 65 20 69 6e 69 74 69 61 6c  d not be initial
1bd0: 69 7a 65 64 20 6f 72 20 74 68 65 20 73 79 73 74  ized or the syst
1be0: 65 6d 20 66 61 69 6c 65 64 20 74 6f 20 61 6c 6c  em failed to all
1bf0: 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70  ocate.  ** the p
1c00: 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65 78 2e  InitMutex mutex.
1c10: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
1c20: 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e   in either case.
1c30: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53    */.  if( rc!=S
1c40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c50: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1c60: 20 20 2f 2a 20 44 6f 20 74 68 65 20 72 65 73 74    /* Do the rest
1c70: 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
1c80: 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20 74 68 65  zation under the
1c90: 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78   recursive mutex
1ca0: 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 77 65   so.  ** that we
1cb0: 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1cc0: 20 68 61 6e 64 6c 65 20 72 65 63 75 72 73 69 76   handle recursiv
1cd0: 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a 20 20 2a  e calls into.  *
1ce0: 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  * sqlite3_initia
1cf0: 6c 69 7a 65 28 29 2e 20 20 54 68 65 20 72 65 63  lize().  The rec
1d00: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6e 6f 72  ursive calls nor
1d10: 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68 72 6f 75  mally come throu
1d20: 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  gh.  ** sqlite3_
1d30: 6f 73 5f 69 6e 69 74 28 29 20 77 68 65 6e 20 69  os_init() when i
1d40: 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65  t invokes sqlite
1d50: 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 29  3_vfs_register()
1d60: 2c 20 62 75 74 20 6f 74 68 65 72 0a 20 20 2a 2a  , but other.  **
1d70: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1d80: 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 70   might also be p
1d90: 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  ossible..  **.  
1da0: 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
1db0: 4e 2d 4f 46 3a 20 52 2d 30 30 31 34 30 2d 33 37  N-OF: R-00140-37
1dc0: 34 34 35 20 53 51 4c 69 74 65 20 61 75 74 6f 6d  445 SQLite autom
1dd0: 61 74 69 63 61 6c 6c 79 20 73 65 72 69 61 6c 69  atically seriali
1de0: 7a 65 73 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 74  zes calls.  ** t
1df0: 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68  o the xInit meth
1e00: 6f 64 2c 20 73 6f 20 74 68 65 20 78 49 6e 69 74  od, so the xInit
1e10: 20 6d 65 74 68 6f 64 20 6e 65 65 64 20 6e 6f 74   method need not
1e20: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2e 0a   be threadsafe..
1e30: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f    **.  ** The fo
1e40: 6c 6c 6f 77 69 6e 67 20 6d 75 74 65 78 20 69 73  llowing mutex is
1e50: 20 77 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73   what serializes
1e60: 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 61   access to the a
1e70: 70 70 64 65 66 20 70 63 61 63 68 65 20 78 49 6e  ppdef pcache xIn
1e80: 69 74 0a 20 20 2a 2a 20 6d 65 74 68 6f 64 73 2e  it.  ** methods.
1e90: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 70 63    The sqlite3_pc
1ea0: 61 63 68 65 5f 6d 65 74 68 6f 64 73 2e 78 49 6e  ache_methods.xIn
1eb0: 69 74 28 29 20 61 6c 6c 20 69 73 20 65 6d 62 65  it() all is embe
1ec0: 64 64 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a  dded in the.  **
1ed0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1ee0: 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65  PcacheInitialize
1ef0: 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ()..  */.  sqlit
1f00: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
1f10: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1f20: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a  ig.pInitMutex);.
1f30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1f40: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
1f50: 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 47 6c  ==0 && sqlite3Gl
1f60: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
1f70: 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20  gress==0 ){.    
1f80: 46 75 6e 63 44 65 66 48 61 73 68 20 2a 70 48 61  FuncDefHash *pHa
1f90: 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28 46 75 6e  sh = &GLOBAL(Fun
1fa0: 63 44 65 66 48 61 73 68 2c 20 73 71 6c 69 74 65  cDefHash, sqlite
1fb0: 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73  3GlobalFunctions
1fc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
1fd0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
1fe0: 67 72 65 73 73 20 3d 20 31 3b 0a 23 69 66 64 65  gress = 1;.#ifde
1ff0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2000: 53 51 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20 20 20  SQLLOG.    {.   
2010: 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73     extern void s
2020: 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c  qlite3_init_sqll
2030: 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20  og(void);.      
2040: 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c  sqlite3_init_sql
2050: 6c 6f 67 28 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  log();.    }.#en
2060: 64 69 66 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  dif.    memset(p
2070: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
2080: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e  sqlite3GlobalFun
2090: 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20 73 71  ctions));.    sq
20a0: 6c 69 74 65 33 52 65 67 69 73 74 65 72 47 6c 6f  lite3RegisterGlo
20b0: 62 61 6c 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a  balFunctions();.
20c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
20d0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
20e0: 61 63 68 65 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  acheInit==0 ){. 
20f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2100: 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a  3PcacheInitializ
2110: 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  e();.    }.    i
2120: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2130: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2140: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
2150: 50 43 61 63 68 65 49 6e 69 74 20 3d 20 31 3b 0a  PCacheInit = 1;.
2160: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2170: 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20 20 20 20  e3OsInit();.    
2180: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2190: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21a0: 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 42 75   sqlite3PCacheBu
21b0: 66 66 65 72 53 65 74 75 70 28 20 73 71 6c 69 74  fferSetup( sqlit
21c0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
21d0: 50 61 67 65 2c 20 0a 20 20 20 20 20 20 20 20 20  Page, .         
21e0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
21f0: 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c  nfig.szPage, sql
2200: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2210: 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 73  .nPage);.      s
2220: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2230: 69 67 2e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 23  ig.isInit = 1;.#
2240: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54  ifdef SQLITE_EXT
2250: 52 41 5f 49 4e 49 54 0a 20 20 20 20 20 20 62 52  RA_INIT.      bR
2260: 75 6e 45 78 74 72 61 49 6e 69 74 20 3d 20 31 3b  unExtraInit = 1;
2270: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
2280: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2290: 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73  onfig.inProgress
22a0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
22b0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
22c0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
22d0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b  fig.pInitMutex);
22e0: 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75  ..  /* Go back u
22f0: 6e 64 65 72 20 74 68 65 20 73 74 61 74 69 63 20  nder the static 
2300: 6d 75 74 65 78 20 61 6e 64 20 63 6c 65 61 6e 20  mutex and clean 
2310: 75 70 20 74 68 65 20 72 65 63 75 72 73 69 76 65  up the recursive
2320: 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70  .  ** mutex to p
2330: 72 65 76 65 6e 74 20 61 20 72 65 73 6f 75 72 63  revent a resourc
2340: 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73  e leak..  */.  s
2350: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
2360: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
2370: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2380: 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78  ig.nRefInitMutex
2390: 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  --;.  if( sqlite
23a0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
23b0: 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29  efInitMutex<=0 )
23c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
23d0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
23e0: 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3d  g.nRefInitMutex=
23f0: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
2400: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 73 71 6c  3_mutex_free(sql
2410: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2420: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20  .pInitMutex);.  
2430: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2440: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
2450: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
2460: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2470: 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pMaster);..  /* 
2480: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
2490: 20 6a 75 73 74 20 61 20 73 61 6e 69 74 79 20 63   just a sanity c
24a0: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
24b0: 65 20 53 51 4c 69 74 65 20 68 61 73 0a 20 20 2a  e SQLite has.  *
24c0: 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20  * been compiled 
24d0: 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 74 20 69  correctly.  It i
24e0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72  s important to r
24f0: 75 6e 20 74 68 69 73 20 63 6f 64 65 2c 20 62 75  un this code, bu
2500: 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  t.  ** we don't 
2510: 77 61 6e 74 20 74 6f 20 72 75 6e 20 69 74 20 74  want to run it t
2520: 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61  oo often and soa
2530: 6b 20 75 70 20 43 50 55 20 63 79 63 6c 65 73 20  k up CPU cycles 
2540: 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73  for no.  ** reas
2550: 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75 6e 20 69  on.  So we run i
2560: 74 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 69 6e  t once during in
2570: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
2580: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
2590: 47 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  G.#ifndef SQLITE
25a0: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
25b0: 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69 73 20 73  OINT.  /* This s
25c0: 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73  ection of code's
25d0: 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74 22 20 69   only "output" i
25e0: 73 20 76 69 61 20 61 73 73 65 72 74 28 29 20 73  s via assert() s
25f0: 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  tatements. */.  
2600: 69 66 20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  if ( rc==SQLITE_
2610: 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34 20 78 20  OK ){.    u64 x 
2620: 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 36 33 29  = (((u64)1)<<63)
2630: 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79  -1;.    double y
2640: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73 69 7a  ;.    assert(siz
2650: 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20 20 20 20  eof(x)==8);.    
2660: 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29  assert(sizeof(x)
2670: 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b 0a 20 20  ==sizeof(y));.  
2680: 20 20 6d 65 6d 63 70 79 28 26 79 2c 20 26 78 2c    memcpy(&y, &x,
2690: 20 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   8);.    assert(
26a0: 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 79 29   sqlite3IsNaN(y)
26b0: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   );.  }.#endif.#
26c0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 65  endif..  /* Do e
26d0: 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74  xtra initializat
26e0: 69 6f 6e 20 73 74 65 70 73 20 72 65 71 75 65 73  ion steps reques
26f0: 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ted by the SQLIT
2700: 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 2a  E_EXTRA_INIT.  *
2710: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  * compile-time o
2720: 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  ption..  */.#ifd
2730: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
2740: 49 4e 49 54 0a 20 20 69 66 28 20 62 52 75 6e 45  INIT.  if( bRunE
2750: 78 74 72 61 49 6e 69 74 20 29 7b 0a 20 20 20 20  xtraInit ){.    
2760: 69 6e 74 20 53 51 4c 49 54 45 5f 45 58 54 52 41  int SQLITE_EXTRA
2770: 5f 49 4e 49 54 28 63 6f 6e 73 74 20 63 68 61 72  _INIT(const char
2780: 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  *);.    rc = SQL
2790: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 30  ITE_EXTRA_INIT(0
27a0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
27b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27c0: 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65 20 65 66  *.** Undo the ef
27d0: 66 65 63 74 73 20 6f 66 20 73 71 6c 69 74 65 33  fects of sqlite3
27e0: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20  _initialize().  
27f0: 4d 75 73 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c  Must not be call
2800: 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72  ed while.** ther
2810: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
2820: 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  g database conne
2830: 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79  ctions or memory
2840: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a   allocations or.
2850: 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 70 61 72  ** while any par
2860: 74 20 6f 66 20 53 51 4c 69 74 65 20 69 73 20 6f  t of SQLite is o
2870: 74 68 65 72 77 69 73 65 20 69 6e 20 75 73 65 20  therwise in use 
2880: 69 6e 20 61 6e 79 20 74 68 72 65 61 64 2e 20 20  in any thread.  
2890: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
28a0: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
28b0: 65 2e 20 20 42 75 74 20 69 74 20 69 73 20 73 61  e.  But it is sa
28c0: 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69  fe to invoke thi
28d0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20  s routine.** on 
28e0: 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20 61  when SQLite is a
28f0: 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e  lready shut down
2900: 2e 20 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  .  If SQLite is 
2910: 61 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f 77  already shut dow
2920: 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72  n.** when this r
2930: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
2940: 64 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  d, then this rou
2950: 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65  tine is a harmle
2960: 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74  ss no-op..*/.int
2970: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
2980: 6e 28 76 6f 69 64 29 7b 0a 23 69 66 64 65 66 20  n(void){.#ifdef 
2990: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
29a0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
29b0: 65 33 5f 77 73 64 5f 69 6e 69 74 28 34 30 39 36  e3_wsd_init(4096
29c0: 2c 20 32 34 29 3b 0a 20 20 69 66 28 20 72 63 21  , 24);.  if( rc!
29d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
29f0: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73  .#endif..  if( s
2a00: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2a10: 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a 23 69 66  ig.isInit ){.#if
2a20: 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41  def SQLITE_EXTRA
2a30: 5f 53 48 55 54 44 4f 57 4e 0a 20 20 20 20 76 6f  _SHUTDOWN.    vo
2a40: 69 64 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  id SQLITE_EXTRA_
2a50: 53 48 55 54 44 4f 57 4e 28 76 6f 69 64 29 3b 0a  SHUTDOWN(void);.
2a60: 20 20 20 20 53 51 4c 49 54 45 5f 45 58 54 52 41      SQLITE_EXTRA
2a70: 5f 53 48 55 54 44 4f 57 4e 28 29 3b 0a 23 65 6e  _SHUTDOWN();.#en
2a80: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
2a90: 6f 73 5f 65 6e 64 28 29 3b 0a 20 20 20 20 73 71  os_end();.    sq
2aa0: 6c 69 74 65 33 5f 72 65 73 65 74 5f 61 75 74 6f  lite3_reset_auto
2ab0: 5f 65 78 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20  _extension();.  
2ac0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2ad0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 30  onfig.isInit = 0
2ae0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
2af0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2b00: 69 73 50 43 61 63 68 65 49 6e 69 74 20 29 7b 0a  isPCacheInit ){.
2b10: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2b20: 65 53 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 20  eShutdown();.   
2b30: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2b40: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2b50: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
2b60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2b70: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
2b80: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2b90: 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 20  MallocEnd();.   
2ba0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2bb0: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
2bc0: 74 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20  t = 0;..#ifndef 
2bd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 55 54  SQLITE_OMIT_SHUT
2be0: 44 4f 57 4e 5f 44 49 52 45 43 54 4f 52 49 45 53  DOWN_DIRECTORIES
2bf0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70  .    /* The heap
2c00: 20 73 75 62 73 79 73 74 65 6d 20 68 61 73 20 6e   subsystem has n
2c10: 6f 77 20 62 65 65 6e 20 73 68 75 74 64 6f 77 6e  ow been shutdown
2c20: 20 61 6e 64 20 74 68 65 73 65 20 76 61 6c 75 65   and these value
2c30: 73 20 61 72 65 20 73 75 70 70 6f 73 65 64 0a 20  s are supposed. 
2c40: 20 20 20 2a 2a 20 74 6f 20 62 65 20 4e 55 4c 4c     ** to be NULL
2c50: 20 6f 72 20 70 6f 69 6e 74 20 74 6f 20 6d 65 6d   or point to mem
2c60: 6f 72 79 20 74 68 61 74 20 77 61 73 20 6f 62 74  ory that was obt
2c70: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
2c80: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 0a 20 20 20  e3_malloc(),.   
2c90: 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20   ** which would 
2ca0: 72 65 6c 79 20 6f 6e 20 74 68 61 74 20 68 65 61  rely on that hea
2cb0: 70 20 73 75 62 73 79 73 74 65 6d 3b 20 74 68 65  p subsystem; the
2cc0: 72 65 66 6f 72 65 2c 20 6d 61 6b 65 20 73 75 72  refore, make sur
2cd0: 65 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 76  e these.    ** v
2ce0: 61 6c 75 65 73 20 63 61 6e 6e 6f 74 20 72 65 66  alues cannot ref
2cf0: 65 72 20 74 6f 20 68 65 61 70 20 6d 65 6d 6f 72  er to heap memor
2d00: 79 20 74 68 61 74 20 77 61 73 20 6a 75 73 74 20  y that was just 
2d10: 69 6e 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e  invalidated when
2d20: 20 74 68 65 0a 20 20 20 20 2a 2a 20 68 65 61 70   the.    ** heap
2d30: 20 73 75 62 73 79 73 74 65 6d 20 77 61 73 20 73   subsystem was s
2d40: 68 75 74 64 6f 77 6e 2e 20 20 54 68 69 73 20 69  hutdown.  This i
2d50: 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 69 66 20 74  s only done if t
2d60: 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 20  he current call 
2d70: 74 6f 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66  to.    ** this f
2d80: 75 6e 63 74 69 6f 6e 20 72 65 73 75 6c 74 65 64  unction resulted
2d90: 20 69 6e 20 74 68 65 20 68 65 61 70 20 73 75 62   in the heap sub
2da0: 73 79 73 74 65 6d 20 61 63 74 75 61 6c 6c 79 20  system actually 
2db0: 62 65 69 6e 67 20 73 68 75 74 64 6f 77 6e 2e 0a  being shutdown..
2dc0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
2dd0: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
2de0: 79 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  y = 0;.    sqlit
2df0: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
2e00: 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  y = 0;.#endif.  
2e10: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2e20: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75  lobalConfig.isMu
2e30: 74 65 78 49 6e 69 74 20 29 7b 0a 20 20 20 20 73  texInit ){.    s
2e40: 71 6c 69 74 65 33 4d 75 74 65 78 45 6e 64 28 29  qlite3MutexEnd()
2e50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
2e60: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65  balConfig.isMute
2e70: 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  xInit = 0;.  }..
2e80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e90: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
2ea0: 73 20 41 50 49 20 61 6c 6c 6f 77 73 20 61 70 70  s API allows app
2eb0: 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64  lications to mod
2ec0: 69 66 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 63  ify the global c
2ed0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a  onfiguration of.
2ee0: 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  ** the SQLite li
2ef0: 62 72 61 72 79 20 61 74 20 72 75 6e 2d 74 69 6d  brary at run-tim
2f00: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
2f10: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
2f20: 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  y be called when
2f30: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
2f40: 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74  tstanding.** dat
2f50: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2f60: 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  s or memory allo
2f70: 63 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 72  cations.  This r
2f80: 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a  outine is not.**
2f90: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 46 61   threadsafe.  Fa
2fa0: 69 6c 75 72 65 20 74 6f 20 68 65 65 64 20 74 68  ilure to heed th
2fb0: 65 73 65 20 77 61 72 6e 69 6e 67 73 20 63 61 6e  ese warnings can
2fc0: 20 6c 65 61 64 20 74 6f 20 75 6e 70 72 65 64 69   lead to unpredi
2fd0: 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69  ctable.** behavi
2fe0: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
2ff0: 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70  e3_config(int op
3000: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
3010: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d  t ap;.  int rc =
3020: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
3030: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  * sqlite3_config
3040: 28 29 20 73 68 61 6c 6c 20 72 65 74 75 72 6e 20  () shall return 
3050: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66  SQLITE_MISUSE if
3060: 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 77   it is invoked w
3070: 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53 51  hile.  ** the SQ
3080: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 69 73 20  Lite library is 
3090: 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28  in use. */.  if(
30a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
30b0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65  nfig.isInit ) re
30c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
30d0: 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76 61 5f 73  SE_BKPT;..  va_s
30e0: 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
30f0: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20  switch( op ){.. 
3100: 20 20 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66     /* Mutex conf
3110: 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
3120: 73 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  s are only avail
3130: 61 62 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64  able in a thread
3140: 73 61 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  safe.    ** comp
3150: 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20  ile..    */.#if 
3160: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
3170: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
3180: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
3190: 30 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 34 34  0  /* IMP: R-544
31a0: 36 36 2d 34 36 37 35 36 20 2a 2f 0a 20 20 20 20  66-46756 */.    
31b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
31c0: 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 3a  IG_SINGLETHREAD:
31d0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
31e0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 32 37 34 38  ENCE-OF: R-02748
31f0: 2d 31 39 30 39 36 20 54 68 69 73 20 6f 70 74 69  -19096 This opti
3200: 6f 6e 20 73 65 74 73 20 74 68 65 20 74 68 72 65  on sets the thre
3210: 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20  ading mode to.  
3220: 20 20 20 20 2a 2a 20 53 69 6e 67 6c 65 2d 74 68      ** Single-th
3230: 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73  read. */.      s
3240: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3250: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
3260: 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d  0;  /* Disable m
3270: 75 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a  utex on core */.
3280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3290: 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
32a0: 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a 20 44 69  utex = 0;  /* Di
32b0: 73 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63  sable mutex on c
32c0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
32d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
32e0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
32f0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
3300: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3310: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a  _THREADSAFE>0 /*
3320: 20 49 4d 50 3a 20 52 2d 32 30 35 32 30 2d 35 34   IMP: R-20520-54
3330: 30 38 36 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  086 */.    case 
3340: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55  SQLITE_CONFIG_MU
3350: 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a 20 20 20  LTITHREAD: {.   
3360: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
3370: 46 3a 20 52 2d 31 34 33 37 34 2d 34 32 34 36 38  F: R-14374-42468
3380: 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73 65 74   This option set
3390: 73 20 74 68 65 20 74 68 72 65 61 64 69 6e 67 20  s the threading 
33a0: 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  mode to.      **
33b0: 20 4d 75 6c 74 69 2d 74 68 72 65 61 64 2e 20 2a   Multi-thread. *
33c0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
33d0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
33e0: 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20  eMutex = 1;  /* 
33f0: 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20  Enable mutex on 
3400: 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  core */.      sq
3410: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3420: 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30  g.bFullMutex = 0
3430: 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75  ;  /* Disable mu
3440: 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f  tex on connectio
3450: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ns */.      brea
3460: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3470: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3480: 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26  TE_THREADSAFE) &
3490: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
34a0: 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  AFE>0 /* IMP: R-
34b0: 35 39 35 39 33 2d 32 31 38 31 30 20 2a 2f 0a 20  59593-21810 */. 
34c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
34d0: 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49 5a 45 44  ONFIG_SERIALIZED
34e0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
34f0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 32 32  DENCE-OF: R-4122
3500: 30 2d 35 31 38 30 30 20 54 68 69 73 20 6f 70 74  0-51800 This opt
3510: 69 6f 6e 20 73 65 74 73 20 74 68 65 20 74 68 72  ion sets the thr
3520: 65 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f 0a 20  eading mode to. 
3530: 20 20 20 20 20 2a 2a 20 53 65 72 69 61 6c 69 7a       ** Serializ
3540: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ed. */.      sql
3550: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3560: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b  .bCoreMutex = 1;
3570: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65    /* Enable mute
3580: 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20  x on core */.   
3590: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
35a0: 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
35b0: 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62 6c  x = 1;  /* Enabl
35c0: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65  e mutex on conne
35d0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ctions */.      
35e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
35f0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3600: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3610: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3620: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
3630: 3a 20 52 2d 36 33 36 36 36 2d 34 38 37 35 35 20  : R-63666-48755 
3640: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3650: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a  TE_CONFIG_MUTEX:
3660: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63   {.      /* Spec
3670: 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  ify an alternati
3680: 76 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65  ve mutex impleme
3690: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
36a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
36b0: 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61  nfig.mutex = *va
36c0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
36d0: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29  _mutex_methods*)
36e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
36f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
3700: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
3710: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
3720: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
3730: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 34 34 35  0 /* IMP: R-1445
3740: 30 2d 33 37 35 39 37 20 2a 2f 0a 20 20 20 20 63  0-37597 */.    c
3750: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3760: 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b 0a 20 20  G_GETMUTEX: {.  
3770: 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20      /* Retrieve 
3780: 74 68 65 20 63 75 72 72 65 6e 74 20 6d 75 74 65  the current mute
3790: 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  x implementation
37a0: 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72   */.      *va_ar
37b0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75  g(ap, sqlite3_mu
37c0: 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20  tex_methods*) = 
37d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
37e0: 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20 20 20 20  fig.mutex;.     
37f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
3800: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
3810: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c  QLITE_CONFIG_MAL
3820: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
3830: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
3840: 35 35 39 34 2d 32 31 30 33 30 20 54 68 65 20 53  5594-21030 The S
3850: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c  QLITE_CONFIG_MAL
3860: 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73  LOC option takes
3870: 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
3880: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
3890: 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  h is a pointer t
38a0: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
38b0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71   the.      ** sq
38c0: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
38d0: 73 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  s structure. The
38e0: 20 61 72 67 75 6d 65 6e 74 20 73 70 65 63 69 66   argument specif
38f0: 69 65 73 20 61 6c 74 65 72 6e 61 74 69 76 65 0a  ies alternative.
3900: 20 20 20 20 20 20 2a 2a 20 6c 6f 77 2d 6c 65 76        ** low-lev
3910: 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  el memory alloca
3920: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 6f  tion routines to
3930: 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63   be used in plac
3940: 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 0a  e of the memory.
3950: 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
3960: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 62 75 69  ion routines bui
3970: 6c 74 20 69 6e 74 6f 20 53 51 4c 69 74 65 2e 20  lt into SQLite. 
3980: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3990: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d  GlobalConfig.m =
39a0: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
39b0: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
39c0: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
39d0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
39e0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
39f0: 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20  TMALLOC: {.     
3a00: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
3a10: 20 52 2d 35 31 32 31 33 2d 34 36 34 31 34 20 54   R-51213-46414 T
3a20: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
3a30: 5f 47 45 54 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f  _GETMALLOC optio
3a40: 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20  n takes a.      
3a50: 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65  ** single argume
3a60: 6e 74 20 77 68 69 63 68 20 69 73 20 61 20 70 6f  nt which is a po
3a70: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
3a80: 61 6e 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20  ance of the.    
3a90: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d    ** sqlite3_mem
3aa0: 5f 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75  _methods structu
3ab0: 72 65 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f  re. The sqlite3_
3ac0: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75  mem_methods stru
3ad0: 63 74 75 72 65 20 69 73 0a 20 20 20 20 20 20 2a  cture is.      *
3ae0: 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  * filled with th
3af0: 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
3b00: 6e 65 64 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ned memory alloc
3b10: 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 2e 20  ation routines. 
3b20: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
3b30: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3b40: 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20  .m.xMalloc==0 ) 
3b50: 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66  sqlite3MemSetDef
3b60: 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 2a 76  ault();.      *v
3b70: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
3b80: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 20  3_mem_methods*) 
3b90: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
3ba0: 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20 20 20 62  onfig.m;.      b
3bb0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3bc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3bd0: 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a 20 7b 0a  IG_MEMSTATUS: {.
3be0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3bf0: 45 2d 4f 46 3a 20 52 2d 36 31 32 37 35 2d 33 35  E-OF: R-61275-35
3c00: 31 35 37 20 54 68 65 20 53 51 4c 49 54 45 5f 43  157 The SQLITE_C
3c10: 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 20  ONFIG_MEMSTATUS 
3c20: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a 20 20 20  option takes.   
3c30: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67     ** single arg
3c40: 75 6d 65 6e 74 20 6f 66 20 74 79 70 65 20 69 6e  ument of type in
3c50: 74 2c 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  t, interpreted a
3c60: 73 20 61 20 62 6f 6f 6c 65 61 6e 2c 20 77 68 69  s a boolean, whi
3c70: 63 68 20 65 6e 61 62 6c 65 73 0a 20 20 20 20 20  ch enables.     
3c80: 20 2a 2a 20 6f 72 20 64 69 73 61 62 6c 65 73 20   ** or disables 
3c90: 74 68 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f  the collection o
3ca0: 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  f memory allocat
3cb0: 69 6f 6e 20 73 74 61 74 69 73 74 69 63 73 2e 20  ion statistics. 
3cc0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3cd0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65  GlobalConfig.bMe
3ce0: 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67 28 61  mstat = va_arg(a
3cf0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3d00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3d10: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3d20: 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20 20  IG_SCRATCH: {.  
3d30: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
3d40: 4f 46 3a 20 52 2d 30 38 34 30 34 2d 36 30 38 38  OF: R-08404-6088
3d50: 37 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65  7 There are thre
3d60: 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20  e arguments to. 
3d70: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43       ** SQLITE_C
3d80: 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 41  ONFIG_SCRATCH: A
3d90: 20 70 6f 69 6e 74 65 72 20 61 6e 20 38 2d 62 79   pointer an 8-by
3da0: 74 65 20 61 6c 69 67 6e 65 64 20 6d 65 6d 6f 72  te aligned memor
3db0: 79 20 62 75 66 66 65 72 20 66 72 6f 6d 0a 20 20  y buffer from.  
3dc0: 20 20 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65      ** which the
3dd0: 20 73 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74   scratch allocat
3de0: 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 64 72 61  ions will be dra
3df0: 77 6e 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 20  wn, the size of 
3e00: 65 61 63 68 20 73 63 72 61 74 63 68 0a 20 20 20  each scratch.   
3e10: 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e     ** allocation
3e20: 20 28 73 7a 29 2c 20 61 6e 64 20 74 68 65 20 6d   (sz), and the m
3e30: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
3e40: 20 73 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74   scratch allocat
3e50: 69 6f 6e 73 20 28 4e 29 2e 20 2a 2f 0a 20 20 20  ions (N). */.   
3e60: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3e70: 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63 68 20  Config.pScratch 
3e80: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
3e90: 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d*);.      sqlit
3ea0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
3eb0: 7a 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72  zScratch = va_ar
3ec0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3ed0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3ee0: 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 20 3d  onfig.nScratch =
3ef0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
3f00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3f10: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3f20: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45  LITE_CONFIG_PAGE
3f30: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
3f40: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
3f50: 2d 31 38 37 36 31 2d 33 36 36 30 31 20 54 68 65  -18761-36601 The
3f60: 72 65 20 61 72 65 20 74 68 72 65 65 20 61 72 67  re are three arg
3f70: 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20 20  uments to.      
3f80: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ** SQLITE_CONFIG
3f90: 5f 50 41 47 45 43 41 43 48 45 3a 20 41 20 70 6f  _PAGECACHE: A po
3fa0: 69 6e 74 65 72 20 74 6f 20 38 2d 62 79 74 65 20  inter to 8-byte 
3fb0: 61 6c 69 67 6e 65 64 20 6d 65 6d 6f 72 79 20 28  aligned memory (
3fc0: 70 4d 65 6d 29 2c 0a 20 20 20 20 20 20 2a 2a 20  pMem),.      ** 
3fd0: 74 68 65 20 73 69 7a 65 20 6f 66 20 65 61 63 68  the size of each
3fe0: 20 70 61 67 65 20 63 61 63 68 65 20 6c 69 6e 65   page cache line
3ff0: 20 28 73 7a 29 2c 20 61 6e 64 20 74 68 65 20 6e   (sz), and the n
4000: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 6c  umber of cache l
4010: 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 28 4e  ines.      ** (N
4020: 29 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ). */.      sqli
4030: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4040: 70 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  pPage = va_arg(a
4050: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
4060: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4070: 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d 20 76 61  nfig.szPage = va
4080: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
4090: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
40a0: 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d  alConfig.nPage =
40b0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
40c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
40d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
40e0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43  LITE_CONFIG_PCAC
40f0: 48 45 5f 48 44 52 53 5a 3a 20 7b 0a 20 20 20 20  HE_HDRSZ: {.    
4100: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
4110: 3a 20 52 2d 33 39 31 30 30 2d 32 37 33 31 37 20  : R-39100-27317 
4120: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
4130: 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 20 6f  G_PCACHE_HDRSZ o
4140: 70 74 69 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20  ption takes.    
4150: 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 70 61    ** a single pa
4160: 72 61 6d 65 74 65 72 20 77 68 69 63 68 20 69 73  rameter which is
4170: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
4180: 20 69 6e 74 65 67 65 72 20 61 6e 64 20 77 72 69   integer and wri
4190: 74 65 73 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a  tes into.      *
41a0: 2a 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 74  * that integer t
41b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 74  he number of ext
41c0: 72 61 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ra bytes per pag
41d0: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65  e required for e
41e0: 61 63 68 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ach page.      *
41f0: 2a 20 69 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46  * in SQLITE_CONF
4200: 49 47 5f 50 41 47 45 43 41 43 48 45 2e 20 2a 2f  IG_PAGECACHE. */
4210: 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61  .      *va_arg(a
4220: 70 2c 20 69 6e 74 2a 29 20 3d 20 0a 20 20 20 20  p, int*) = .    
4230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 65 61        sqlite3Hea
4240: 64 65 72 53 69 7a 65 42 74 72 65 65 28 29 20 2b  derSizeBtree() +
4250: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4260: 65 33 48 65 61 64 65 72 53 69 7a 65 50 63 61 63  e3HeaderSizePcac
4270: 68 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20 20  he() +.         
4280: 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53 69   sqlite3HeaderSi
4290: 7a 65 50 63 61 63 68 65 31 28 29 3b 0a 20 20 20  zePcache1();.   
42a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
42b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
42c0: 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 3a 20  _CONFIG_PCACHE: 
42d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70  {.      /* no-op
42e0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
42f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4300: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
4310: 54 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20  TPCACHE: {.     
4320: 20 2f 2a 20 6e 6f 77 20 61 6e 20 65 72 72 6f 72   /* now an error
4330: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
4340: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
4350: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4360: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4370: 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 3a  _CONFIG_PCACHE2:
4380: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
4390: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 33 32 35  ENCE-OF: R-63325
43a0: 2d 34 38 33 37 38 20 54 68 65 20 53 51 4c 49 54  -48378 The SQLIT
43b0: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 32  E_CONFIG_PCACHE2
43c0: 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a   option takes a.
43d0: 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
43e0: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
43f0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
4400: 6e 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  n sqlite3_pcache
4410: 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20 20 20 20  _methods2.      
4420: 2a 2a 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  ** object. This 
4430: 6f 62 6a 65 63 74 20 73 70 65 63 69 66 69 65 73  object specifies
4440: 20 74 68 65 20 69 6e 74 65 72 66 61 63 65 20 74   the interface t
4450: 6f 20 61 20 63 75 73 74 6f 6d 20 70 61 67 65 20  o a custom page 
4460: 63 61 63 68 65 0a 20 20 20 20 20 20 2a 2a 20 69  cache.      ** i
4470: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 2a  mplementation. *
4480: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
4490: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63  lobalConfig.pcac
44a0: 68 65 32 20 3d 20 2a 76 61 5f 61 72 67 28 61 70  he2 = *va_arg(ap
44b0: 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  , sqlite3_pcache
44c0: 5f 6d 65 74 68 6f 64 73 32 2a 29 3b 0a 20 20 20  _methods2*);.   
44d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
44e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
44f0: 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45  CONFIG_GETPCACHE
4500: 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  2: {.      /* EV
4510: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 30  IDENCE-OF: R-220
4520: 33 35 2d 34 36 31 38 32 20 54 68 65 20 53 51 4c  35-46182 The SQL
4530: 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43  ITE_CONFIG_GETPC
4540: 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b  ACHE2 option tak
4550: 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69  es a.      ** si
4560: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  ngle argument wh
4570: 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ich is a pointer
4580: 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 70   to an sqlite3_p
4590: 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20  cache_methods2. 
45a0: 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20       ** object. 
45b0: 53 51 4c 69 74 65 20 63 6f 70 69 65 73 20 6f 66  SQLite copies of
45c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
45d0: 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e  e cache implemen
45e0: 74 61 74 69 6f 6e 20 69 6e 74 6f 0a 20 20 20 20  tation into.    
45f0: 20 20 2a 2a 20 74 68 61 74 20 6f 62 6a 65 63 74    ** that object
4600: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  . */.      if( s
4610: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4620: 69 67 2e 70 63 61 63 68 65 32 2e 78 49 6e 69 74  ig.pcache2.xInit
4630: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
4640: 71 6c 69 74 65 33 50 43 61 63 68 65 53 65 74 44  qlite3PCacheSetD
4650: 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20  efault();.      
4660: 7d 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28  }.      *va_arg(
4670: 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63  ap, sqlite3_pcac
4680: 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29 20 3d 20  he_methods2*) = 
4690: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
46a0: 66 69 67 2e 70 63 61 63 68 65 32 3b 0a 20 20 20  fig.pcache2;.   
46b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
46c0: 0a 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ./* EVIDENCE-OF:
46d0: 20 52 2d 30 36 36 32 36 2d 31 32 39 31 31 20 54   R-06626-12911 T
46e0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
46f0: 5f 48 45 41 50 20 6f 70 74 69 6f 6e 20 69 73 20  _HEAP option is 
4700: 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  only.** availabl
4710: 65 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 63  e if SQLite is c
4720: 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 65 69 74  ompiled with eit
4730: 68 65 72 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  her SQLITE_ENABL
4740: 45 5f 4d 45 4d 53 59 53 33 20 6f 72 0a 2a 2a 20  E_MEMSYS3 or.** 
4750: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
4760: 4d 53 59 53 35 20 61 6e 64 20 72 65 74 75 72 6e  MSYS5 and return
4770: 73 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  s SQLITE_ERROR i
4780: 66 20 69 6e 76 6f 6b 65 64 20 6f 74 68 65 72 77  f invoked otherw
4790: 69 73 65 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69  ise. */.#if defi
47a0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
47b0: 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65  E_MEMSYS3) || de
47c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
47d0: 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20  BLE_MEMSYS5).   
47e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
47f0: 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20  FIG_HEAP: {.    
4800: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
4810: 3a 20 52 2d 31 39 38 35 34 2d 34 32 31 32 36 20  : R-19854-42126 
4820: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
4830: 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
4840: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     ** SQLITE_CON
4850: 46 49 47 5f 48 45 41 50 3a 20 41 6e 20 38 2d 62  FIG_HEAP: An 8-b
4860: 79 74 65 20 61 6c 69 67 6e 65 64 20 70 6f 69 6e  yte aligned poin
4870: 74 65 72 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72  ter to the memor
4880: 79 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  y, the.      ** 
4890: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
48a0: 69 6e 20 74 68 65 20 6d 65 6d 6f 72 79 20 62 75  in the memory bu
48b0: 66 66 65 72 2c 20 61 6e 64 20 74 68 65 20 6d 69  ffer, and the mi
48c0: 6e 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 69 6f 6e  nimum allocation
48d0: 20 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   size..      */.
48e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
48f0: 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20  balConfig.pHeap 
4900: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
4910: 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d*);.      sqlit
4920: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
4930: 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Heap = va_arg(ap
4940: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
4950: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4960: 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67  g.mnReq = va_arg
4970: 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20  (ap, int);..    
4980: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
4990: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c  balConfig.mnReq<
49a0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
49b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
49c0: 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20 20 20 20  .mnReq = 1;.    
49d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
49e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
49f0: 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b  mnReq>(1<<12) ){
4a00: 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 61 70 20  .        /* cap 
4a10: 6d 69 6e 20 72 65 71 75 65 73 74 20 73 69 7a 65  min request size
4a20: 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20   at 2^12 */.    
4a30: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4a40: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
4a50: 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d  (1<<12);.      }
4a60: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
4a70: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4a80: 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20  pHeap==0 ){.    
4a90: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4aa0: 4f 46 3a 20 52 2d 34 39 39 32 30 2d 36 30 31 38  OF: R-49920-6018
4ab0: 39 20 49 66 20 74 68 65 20 66 69 72 73 74 20 70  9 If the first p
4ac0: 6f 69 6e 74 65 72 20 28 74 68 65 20 6d 65 6d 6f  ointer (the memo
4ad0: 72 79 20 70 6f 69 6e 74 65 72 29 0a 20 20 20 20  ry pointer).    
4ae0: 20 20 20 20 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20      ** is NULL, 
4af0: 74 68 65 6e 20 53 51 4c 69 74 65 20 72 65 76 65  then SQLite reve
4b00: 72 74 73 20 74 6f 20 75 73 69 6e 67 20 69 74 73  rts to using its
4b10: 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f 72 79 20   default memory 
4b20: 61 6c 6c 6f 63 61 74 6f 72 0a 20 20 20 20 20 20  allocator.      
4b30: 20 20 2a 2a 20 28 74 68 65 20 73 79 73 74 65 6d    ** (the system
4b40: 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d   malloc() implem
4b50: 65 6e 74 61 74 69 6f 6e 29 2c 20 75 6e 64 6f 69  entation), undoi
4b60: 6e 67 20 61 6e 79 20 70 72 69 6f 72 20 69 6e 76  ng any prior inv
4b70: 6f 63 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20  ocation of.     
4b80: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     ** SQLITE_CON
4b90: 46 49 47 5f 4d 41 4c 4c 4f 43 2e 0a 20 20 20 20  FIG_MALLOC..    
4ba0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
4bb0: 2a 20 53 65 74 74 69 6e 67 20 73 71 6c 69 74 65  * Setting sqlite
4bc0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20  3GlobalConfig.m 
4bd0: 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 20 77 69 6c  to all zeros wil
4be0: 6c 20 63 61 75 73 65 20 6d 61 6c 6c 6f 63 20 74  l cause malloc t
4bf0: 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 76  o.        ** rev
4c00: 65 72 74 20 74 6f 20 69 74 73 20 64 65 66 61 75  ert to its defau
4c10: 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  lt implementatio
4c20: 6e 20 77 68 65 6e 20 73 71 6c 69 74 65 33 5f 69  n when sqlite3_i
4c30: 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73 20 72  nitialize() is r
4c40: 75 6e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  un.        */.  
4c50: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71        memset(&sq
4c60: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4c70: 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  g.m, 0, sizeof(s
4c80: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4c90: 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65  ig.m));.      }e
4ca0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
4cb0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
4cc0: 31 30 30 36 2d 30 38 39 31 38 20 49 66 20 74 68  1006-08918 If th
4cd0: 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72  e memory pointer
4ce0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
4cf0: 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  n the.        **
4d00: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 65 6d   alternative mem
4d10: 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73  ory allocator is
4d20: 20 65 6e 67 61 67 65 64 20 74 6f 20 68 61 6e 64   engaged to hand
4d30: 6c 65 20 61 6c 6c 20 6f 66 20 53 51 4c 69 74 65  le all of SQLite
4d40: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d  s.        ** mem
4d50: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6e  ory allocation n
4d60: 65 65 64 73 2e 20 2a 2f 0a 23 69 66 64 65 66 20  eeds. */.#ifdef 
4d70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
4d80: 4d 53 59 53 33 0a 20 20 20 20 20 20 20 20 73 71  MSYS3.        sq
4d90: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4da0: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
4db0: 6d 47 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23  mGetMemsys3();.#
4dc0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
4dd0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4de0: 53 35 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  S5.        sqlit
4df0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4e00: 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65   = *sqlite3MemGe
4e10: 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64  tMemsys5();.#end
4e20: 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
4e30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
4e40: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
4e50: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f  QLITE_CONFIG_LOO
4e60: 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20  KASIDE: {.      
4e70: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4e80: 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20  fig.szLookaside 
4e90: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
4ea0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4eb0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f  GlobalConfig.nLo
4ec0: 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67  okaside = va_arg
4ed0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4ee0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4ef0: 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64    .    /* Record
4f00: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
4f10: 65 20 6c 6f 67 67 65 72 20 66 75 6e 63 74 69 6f  e logger functio
4f20: 6e 20 61 6e 64 20 69 74 73 20 66 69 72 73 74 20  n and its first 
4f30: 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a 2a  argument..    **
4f40: 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
4f50: 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20 69  NULL.  Logging i
4f60: 73 20 64 69 73 61 62 6c 65 64 20 69 66 20 74 68  s disabled if th
4f70: 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  e function point
4f80: 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c  er is.    ** NUL
4f90: 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  L..    */.    ca
4fa0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
4fb0: 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  _LOG: {.      /*
4fc0: 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20 61   MSVC is picky a
4fd0: 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e  bout pulling fun
4fe0: 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c  c ptrs from va l
4ff0: 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68  ists..      ** h
5000: 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69  ttp://support.mi
5010: 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34  crosoft.com/kb/4
5020: 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71  7961.      ** sq
5030: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
5040: 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28  g.xLog = va_arg(
5050: 61 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69 64  ap, void(*)(void
5060: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  *,int,const char
5070: 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20  *));.      */.  
5080: 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64      typedef void
5090: 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69  (*LOGFUNC_t)(voi
50a0: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61  d*,int,const cha
50b0: 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r*);.      sqlit
50c0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
50d0: 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Log = va_arg(ap,
50e0: 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20   LOGFUNC_t);.   
50f0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
5100: 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20 3d  Config.pLogArg =
5110: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
5120: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
5130: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45  .    }..    /* E
5140: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35  VIDENCE-OF: R-55
5150: 35 34 38 2d 33 33 38 31 37 20 54 68 65 20 63 6f  548-33817 The co
5160: 6d 70 69 6c 65 2d 74 69 6d 65 20 73 65 74 74 69  mpile-time setti
5170: 6e 67 20 66 6f 72 20 55 52 49 20 66 69 6c 65 6e  ng for URI filen
5180: 61 6d 65 73 0a 20 20 20 20 2a 2a 20 63 61 6e 20  ames.    ** can 
5190: 62 65 20 63 68 61 6e 67 65 64 20 61 74 20 73 74  be changed at st
51a0: 61 72 74 2d 74 69 6d 65 20 75 73 69 6e 67 20 74  art-time using t
51b0: 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  he.    ** sqlite
51c0: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
51d0: 43 4f 4e 46 49 47 5f 55 52 49 2c 31 29 20 6f 72  CONFIG_URI,1) or
51e0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
51f0: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
5200: 4e 46 49 47 5f 55 52 49 2c 30 29 20 63 6f 6e 66  NFIG_URI,0) conf
5210: 69 67 75 72 61 74 69 6f 6e 20 63 61 6c 6c 73 2e  iguration calls.
5220: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5230: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55   SQLITE_CONFIG_U
5240: 52 49 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  RI: {.      /* E
5250: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35  VIDENCE-OF: R-25
5260: 34 35 31 2d 36 31 31 32 35 20 54 68 65 20 53 51  451-61125 The SQ
5270: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 20  LITE_CONFIG_URI 
5280: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73  option takes a s
5290: 69 6e 67 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61  ingle.      ** a
52a0: 72 67 75 6d 65 6e 74 20 6f 66 20 74 79 70 65 20  rgument of type 
52b0: 69 6e 74 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f  int. If non-zero
52c0: 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64 6c  , then URI handl
52d0: 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a  ing is globally.
52e0: 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64        ** enabled
52f0: 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  . If the paramet
5300: 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  er is zero, then
5310: 20 55 52 49 20 68 61 6e 64 6c 69 6e 67 20 69 73   URI handling is
5320: 20 67 6c 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20   globally.      
5330: 2a 2a 20 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a  ** disabled. */.
5340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5350: 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55  balConfig.bOpenU
5360: 72 69 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ri = va_arg(ap, 
5370: 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
5380: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
5390: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
53a0: 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f  _COVERING_INDEX_
53b0: 53 43 41 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  SCAN: {.      /*
53c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
53d0: 33 36 35 39 32 2d 30 32 37 37 32 20 54 68 65 20  36592-02772 The 
53e0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f  SQLITE_CONFIG_CO
53f0: 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41  VERING_INDEX_SCA
5400: 4e 0a 20 20 20 20 20 20 2a 2a 20 6f 70 74 69 6f  N.      ** optio
5410: 6e 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65  n takes a single
5420: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
5430: 74 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  t which is inter
5440: 70 72 65 74 65 64 20 61 73 20 61 0a 20 20 20 20  preted as a.    
5450: 20 20 2a 2a 20 62 6f 6f 6c 65 61 6e 20 69 6e 20    ** boolean in 
5460: 6f 72 64 65 72 20 74 6f 20 65 6e 61 62 6c 65 20  order to enable 
5470: 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 75  or disable the u
5480: 73 65 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69  se of covering i
5490: 6e 64 69 63 65 73 20 66 6f 72 0a 20 20 20 20 20  ndices for.     
54a0: 20 2a 2a 20 66 75 6c 6c 20 74 61 62 6c 65 20 73   ** full table s
54b0: 63 61 6e 73 20 69 6e 20 74 68 65 20 71 75 65 72  cans in the quer
54c0: 79 20 6f 70 74 69 6d 69 7a 65 72 2e 20 2a 2f 0a  y optimizer. */.
54d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
54e0: 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
54f0: 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  s = va_arg(ap, i
5500: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
5510: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
5520: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
5530: 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65 20 53 51  LLOG.    case SQ
5540: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
5550: 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65  OG: {.      type
5560: 64 65 66 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47  def void(*SQLLOG
5570: 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73  FUNC_t)(void*, s
5580: 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63  qlite3*, const c
5590: 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20  har*, int);.    
55a0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
55b0: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20  onfig.xSqllog = 
55c0: 76 61 5f 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f  va_arg(ap, SQLLO
55d0: 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  GFUNC_t);.      
55e0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
55f0: 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d  fig.pSqllogArg =
5600: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
5610: 20 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   *);.      break
5620: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
5630: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5640: 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45  CONFIG_MMAP_SIZE
5650: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
5660: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 36  DENCE-OF: R-5806
5670: 33 2d 33 38 32 35 38 20 53 51 4c 49 54 45 5f 43  3-38258 SQLITE_C
5680: 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 20  ONFIG_MMAP_SIZE 
5690: 74 61 6b 65 73 20 74 77 6f 20 36 34 2d 62 69 74  takes two 64-bit
56a0: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  .      ** intege
56b0: 72 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  r (sqlite3_int64
56c0: 29 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72  ) values that ar
56d0: 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 6d 6d  e the default mm
56e0: 61 70 20 73 69 7a 65 20 6c 69 6d 69 74 0a 20 20  ap size limit.  
56f0: 20 20 20 20 2a 2a 20 28 74 68 65 20 64 65 66 61      ** (the defa
5700: 75 6c 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20  ult setting for 
5710: 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65  PRAGMA mmap_size
5720: 29 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  ) and the maximu
5730: 6d 20 61 6c 6c 6f 77 65 64 0a 20 20 20 20 20 20  m allowed.      
5740: 2a 2a 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d  ** mmap size lim
5750: 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  it. */.      sql
5760: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61  ite3_int64 szMma
5770: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  p = va_arg(ap, s
5780: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20  qlite3_int64);. 
5790: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
57a0: 36 34 20 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61  64 mxMmap = va_a
57b0: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69  rg(ap, sqlite3_i
57c0: 6e 74 36 34 29 3b 0a 20 20 20 20 20 20 2f 2a 20  nt64);.      /* 
57d0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
57e0: 33 33 36 37 2d 34 33 31 39 30 20 49 66 20 65 69  3367-43190 If ei
57f0: 74 68 65 72 20 61 72 67 75 6d 65 6e 74 20 74 6f  ther argument to
5800: 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 0a   this option is.
5810: 20 20 20 20 20 20 2a 2a 20 6e 65 67 61 74 69 76        ** negativ
5820: 65 2c 20 74 68 65 6e 20 74 68 61 74 20 61 72 67  e, then that arg
5830: 75 6d 65 6e 74 20 69 73 20 63 68 61 6e 67 65 64  ument is changed
5840: 20 74 6f 20 69 74 73 20 63 6f 6d 70 69 6c 65 2d   to its compile-
5850: 74 69 6d 65 20 64 65 66 61 75 6c 74 2e 0a 20 20  time default..  
5860: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
5870: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
5880: 34 39 39 33 2d 34 35 30 33 31 20 54 68 65 20 6d  4993-45031 The m
5890: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 6d  aximum allowed m
58a0: 6d 61 70 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  map size will be
58b0: 0a 20 20 20 20 20 20 2a 2a 20 73 69 6c 65 6e 74  .      ** silent
58c0: 6c 79 20 74 72 75 6e 63 61 74 65 64 20 69 66 20  ly truncated if 
58d0: 6e 65 63 65 73 73 61 72 79 20 73 6f 20 74 68 61  necessary so tha
58e0: 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  t it does not ex
58f0: 63 65 65 64 20 74 68 65 0a 20 20 20 20 20 20 2a  ceed the.      *
5900: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6d  * compile-time m
5910: 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a 65  aximum mmap size
5920: 20 73 65 74 20 62 79 20 74 68 65 20 53 51 4c 49   set by the SQLI
5930: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
5940: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  .      ** compil
5950: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20  e-time option.. 
5960: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
5970: 28 20 6d 78 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78  ( mxMmap<0 || mx
5980: 4d 6d 61 70 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Mmap>SQLITE_MAX_
5990: 4d 4d 41 50 5f 53 49 5a 45 20 29 7b 0a 20 20 20  MMAP_SIZE ){.   
59a0: 20 20 20 20 20 6d 78 4d 6d 61 70 20 3d 20 53 51       mxMmap = SQ
59b0: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
59c0: 5a 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ZE;.      }.    
59d0: 20 20 69 66 28 20 73 7a 4d 6d 61 70 3c 30 20 29    if( szMmap<0 )
59e0: 20 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45   szMmap = SQLITE
59f0: 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49  _DEFAULT_MMAP_SI
5a00: 5a 45 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  ZE;.      if( sz
5a10: 4d 6d 61 70 3e 6d 78 4d 6d 61 70 29 20 73 7a 4d  Mmap>mxMmap) szM
5a20: 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20  map = mxMmap;.  
5a30: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
5a40: 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 3d  lConfig.mxMmap =
5a50: 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 73   mxMmap;.      s
5a60: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
5a70: 69 67 2e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d  ig.szMmap = szMm
5a80: 61 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ap;.      break;
5a90: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  .    }..#if SQLI
5aa0: 54 45 5f 4f 53 5f 57 49 4e 20 26 26 20 64 65 66  TE_OS_WIN && def
5ab0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5ac0: 32 5f 4d 41 4c 4c 4f 43 29 20 2f 2a 20 49 4d 50  2_MALLOC) /* IMP
5ad0: 3a 20 52 2d 30 34 37 38 30 2d 35 35 38 31 35 20  : R-04780-55815 
5ae0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
5af0: 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e 33 32 5f  TE_CONFIG_WIN32_
5b00: 48 45 41 50 53 49 5a 45 3a 20 7b 0a 20 20 20 20  HEAPSIZE: {.    
5b10: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
5b20: 3a 20 52 2d 33 34 39 32 36 2d 30 33 33 36 30 20  : R-34926-03360 
5b30: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49  SQLITE_CONFIG_WI
5b40: 4e 33 32 5f 48 45 41 50 53 49 5a 45 20 74 61 6b  N32_HEAPSIZE tak
5b50: 65 73 20 61 20 33 32 2d 62 69 74 0a 20 20 20 20  es a 32-bit.    
5b60: 20 20 2a 2a 20 75 6e 73 69 67 6e 65 64 20 69 6e    ** unsigned in
5b70: 74 65 67 65 72 20 76 61 6c 75 65 20 74 68 61 74  teger value that
5b80: 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6d   specifies the m
5b90: 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74  aximum size of t
5ba0: 68 65 20 63 72 65 61 74 65 64 0a 20 20 20 20 20  he created.     
5bb0: 20 2a 2a 20 68 65 61 70 2e 20 2a 2f 0a 20 20 20   ** heap. */.   
5bc0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
5bd0: 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76  Config.nHeap = v
5be0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
5bf0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5c00: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63   }.#endif..    c
5c10: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
5c20: 47 5f 50 4d 41 53 5a 3a 20 7b 0a 20 20 20 20 20  G_PMASZ: {.     
5c30: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5c40: 6e 66 69 67 2e 73 7a 50 6d 61 20 3d 20 76 61 5f  nfig.szPma = va_
5c50: 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64  arg(ap, unsigned
5c60: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
5c70: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  ak;.    }..    d
5c80: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5c90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
5ca0: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
5cb0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65      }.  }.  va_e
5cc0: 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e  nd(ap);.  return
5cd0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
5ce0: 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61 73 69  t up the lookasi
5cf0: 64 65 20 62 75 66 66 65 72 73 20 66 6f 72 20 61  de buffers for a
5d00: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
5d10: 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  tion..** Return 
5d20: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
5d30: 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f  cess.  .** If lo
5d40: 6f 6b 61 73 69 64 65 20 69 73 20 61 6c 72 65 61  okaside is alrea
5d50: 64 79 20 61 63 74 69 76 65 2c 20 72 65 74 75 72  dy active, retur
5d60: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a  n SQLITE_BUSY..*
5d70: 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61 72 61  *.** The sz para
5d80: 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d  meter is the num
5d90: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
5da0: 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65 20 73  each lookaside s
5db0: 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e 74 20  lot..** The cnt 
5dc0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
5dd0: 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   number of slots
5de0: 2e 20 20 49 66 20 70 53 74 61 72 74 20 69 73 20  .  If pStart is 
5df0: 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70 61 63  NULL the.** spac
5e00: 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b 61 73  e for the lookas
5e10: 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 6f 62  ide memory is ob
5e20: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
5e30: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
5e40: 20 49 66 20 70 53 74 61 72 74 20 69 73 20 6e 6f   If pStart is no
5e50: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69  t NULL then it i
5e60: 73 20 73 7a 2a 63 6e 74 20 62 79 74 65 73 20 6f  s sz*cnt bytes o
5e70: 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73 65 20  f memory to use 
5e80: 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61  for.** the looka
5e90: 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  side memory..*/.
5ea0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 75 70  static int setup
5eb0: 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69 74 65  Lookaside(sqlite
5ec0: 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70 42 75  3 *db, void *pBu
5ed0: 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 63  f, int sz, int c
5ee0: 6e 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nt){.#ifndef SQL
5ef0: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49  ITE_OMIT_LOOKASI
5f00: 44 45 0a 20 20 76 6f 69 64 20 2a 70 53 74 61 72  DE.  void *pStar
5f10: 74 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  t;.  if( db->loo
5f20: 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20  kaside.nOut ){. 
5f30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5f40: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  _BUSY;.  }.  /* 
5f50: 46 72 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e  Free any existin
5f60: 67 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66  g lookaside buff
5f70: 65 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64  er for this hand
5f80: 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  le before.  ** a
5f90: 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
5fa0: 6f 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20  one so we don't 
5fb0: 68 61 76 65 20 74 6f 20 68 61 76 65 20 73 70 61  have to have spa
5fc0: 63 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74  ce for .  ** bot
5fd0: 68 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  h at the same ti
5fe0: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  me..  */.  if( d
5ff0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
6000: 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71  lloced ){.    sq
6010: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c  lite3_free(db->l
6020: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29  ookaside.pStart)
6030: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
6040: 69 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69  ize of a lookasi
6050: 64 65 20 73 6c 6f 74 20 61 66 74 65 72 20 52 4f  de slot after RO
6060: 55 4e 44 44 4f 57 4e 38 20 6e 65 65 64 73 20 74  UNDDOWN8 needs t
6070: 6f 20 62 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a  o be larger.  **
6080: 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 20   than a pointer 
6090: 74 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20  to be useful..  
60a0: 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44  */.  sz = ROUNDD
60b0: 4f 57 4e 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d  OWN8(sz);  /* IM
60c0: 50 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32  P: R-33038-09382
60d0: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69   */.  if( sz<=(i
60e0: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
60f0: 69 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d  ideSlot*) ) sz =
6100: 20 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20   0;.  if( cnt<0 
6110: 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  ) cnt = 0;.  if(
6120: 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30   sz==0 || cnt==0
6130: 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a   ){.    sz = 0;.
6140: 20 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a      pStart = 0;.
6150: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66    }else if( pBuf
6160: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
6170: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
6180: 6c 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72  loc();.    pStar
6190: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
61a0: 63 28 20 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a  c( sz*cnt );  /*
61b0: 20 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35   IMP: R-61949-35
61c0: 37 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  727 */.    sqlit
61d0: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
61e0: 63 28 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74  c();.    if( pSt
61f0: 61 72 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69  art ) cnt = sqli
6200: 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53  te3MallocSize(pS
6210: 74 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73  tart)/sz;.  }els
6220: 65 7b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20  e{.    pStart = 
6230: 70 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  pBuf;.  }.  db->
6240: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
6250: 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d   = pStart;.  db-
6260: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65  >lookaside.pFree
6270: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b   = 0;.  db->look
6280: 61 73 69 64 65 2e 73 7a 20 3d 20 28 75 31 36 29  aside.sz = (u16)
6290: 73 7a 3b 0a 20 20 69 66 28 20 70 53 74 61 72 74  sz;.  if( pStart
62a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
62b0: 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74     LookasideSlot
62c0: 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28   *p;.    assert(
62d0: 20 73 7a 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f   sz > (int)sizeo
62e0: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
62f0: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f  ) );.    p = (Lo
6300: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70 53 74  okasideSlot*)pSt
6310: 61 72 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63  art;.    for(i=c
6320: 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  nt-1; i>=0; i--)
6330: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74  {.      p->pNext
6340: 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65   = db->lookaside
6350: 2e 70 46 72 65 65 3b 0a 20 20 20 20 20 20 64 62  .pFree;.      db
6360: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65  ->lookaside.pFre
6370: 65 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 20 3d  e = p;.      p =
6380: 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a   (LookasideSlot*
6390: 29 26 28 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a  )&((u8*)p)[sz];.
63a0: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f      }.    db->lo
63b0: 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 70  okaside.pEnd = p
63c0: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
63d0: 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 31  ide.bEnabled = 1
63e0: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
63f0: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20  ide.bMalloced = 
6400: 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20  pBuf==0 ?1:0;.  
6410: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c  }else{.    db->l
6420: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20  ookaside.pStart 
6430: 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = db;.    db->lo
6440: 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 64  okaside.pEnd = d
6450: 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  b;.    db->looka
6460: 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20  side.bEnabled = 
6470: 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  0;.    db->looka
6480: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d  side.bMalloced =
6490: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   0;.  }.#endif /
64a0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  * SQLITE_OMIT_LO
64b0: 4f 4b 41 53 49 44 45 20 2a 2f 0a 20 20 72 65 74  OKASIDE */.  ret
64c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
64d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
64e0: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
64f0: 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
6500: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
6510: 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  */.sqlite3_mutex
6520: 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74   *sqlite3_db_mut
6530: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ex(sqlite3 *db){
6540: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6550: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
6560: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
6570: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
6580: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
6590: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
65a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
65b0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
65c0: 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a  rn db->mutex;.}.
65d0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20 61  ./*.** Free up a
65e0: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
65f0: 20 77 65 20 63 61 6e 20 66 72 6f 6d 20 74 68 65   we can from the
6600: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a   given database.
6610: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ** connection..*
6620: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
6630: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
6640: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
6650: 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 53  int i;..#ifdef S
6660: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
6670: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
6680: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
6690: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
66a0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
66b0: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
66c0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
66d0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
66e0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
66f0: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
6700: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
6710: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
6720: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
6730: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
6740: 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  t ){.      Pager
6750: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
6760: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
6770: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6780: 50 61 67 65 72 53 68 72 69 6e 6b 28 70 50 61 67  PagerShrink(pPag
6790: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
67a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
67b0: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
67c0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
67d0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
67e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
67f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
6800: 61 6e 79 20 64 69 72 74 79 20 70 61 67 65 73 20  any dirty pages 
6810: 69 6e 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  in the pager-cac
6820: 68 65 20 66 6f 72 20 61 6e 79 20 61 74 74 61 63  he for any attac
6830: 68 65 64 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  hed database.** 
6840: 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  to disk..*/.int 
6850: 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65  sqlite3_db_cache
6860: 66 6c 75 73 68 28 73 71 6c 69 74 65 33 20 2a 64  flush(sqlite3 *d
6870: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
6880: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6890: 4b 3b 0a 20 20 69 6e 74 20 62 53 65 65 6e 42 75  K;.  int bSeenBu
68a0: 73 79 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  sy = 0;..#ifdef 
68b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
68c0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
68d0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
68e0: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
68f0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
6900: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
6910: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6920: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
6930: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
6940: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28  rAll(db);.  for(
6950: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
6960: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
6970: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
6980: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
6990: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
69a0: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
69b0: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
69c0: 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  ) ){.      Pager
69d0: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
69e0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
69f0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
6a00: 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28  lite3PagerFlush(
6a10: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
6a20: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
6a30: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53  SY ){.        bS
6a40: 65 65 6e 42 75 73 79 20 3d 20 31 3b 0a 20 20 20  eenBusy = 1;.   
6a50: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6a60: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
6a70: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
6a80: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
6a90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
6aa0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
6ab0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  ex);.  return ((
6ac0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
6ad0: 20 62 53 65 65 6e 42 75 73 79 29 20 3f 20 53 51   bSeenBusy) ? SQ
6ae0: 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 29 3b  LITE_BUSY : rc);
6af0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
6b00: 75 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73  uration settings
6b10: 20 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75   for an individu
6b20: 61 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  al database conn
6b30: 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71  ection.*/.int sq
6b40: 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
6b50: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
6b60: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
6b70: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
6b80: 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  c;.  va_start(ap
6b90: 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
6ba0: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
6bb0: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
6bc0: 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20  LOOKASIDE: {.   
6bd0: 20 20 20 76 6f 69 64 20 2a 70 42 75 66 20 3d 20     void *pBuf = 
6be0: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
6bf0: 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 38  ); /* IMP: R-268
6c00: 33 35 2d 31 30 39 36 34 20 2a 2f 0a 20 20 20 20  35-10964 */.    
6c10: 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72    int sz = va_ar
6c20: 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20  g(ap, int);     
6c30: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 37 38 37    /* IMP: R-4787
6c40: 31 2d 32 35 39 39 34 20 2a 2f 0a 20 20 20 20 20  1-25994 */.     
6c50: 20 69 6e 74 20 63 6e 74 20 3d 20 76 61 5f 61 72   int cnt = va_ar
6c60: 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20  g(ap, int);     
6c70: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 34 36 30   /* IMP: R-04460
6c80: 2d 35 33 33 38 36 20 2a 2f 0a 20 20 20 20 20 20  -53386 */.      
6c90: 72 63 20 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73  rc = setupLookas
6ca0: 69 64 65 28 64 62 2c 20 70 42 75 66 2c 20 73 7a  ide(db, pBuf, sz
6cb0: 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , cnt);.      br
6cc0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
6cd0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
6ce0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
6cf0: 75 63 74 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  uct {.        in
6d00: 74 20 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  t op;      /* Th
6d10: 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  e opcode */.    
6d20: 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 20 20 20      u32 mask;   
6d30: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 68 65 20   /* Mask of the 
6d40: 62 69 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 66  bit in sqlite3.f
6d50: 6c 61 67 73 20 74 6f 20 73 65 74 2f 63 6c 65 61  lags to set/clea
6d60: 72 20 2a 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c  r */.      } aFl
6d70: 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  agOp[] = {.     
6d80: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
6d90: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59  NFIG_ENABLE_FKEY
6da0: 2c 20 20 20 20 53 51 4c 49 54 45 5f 46 6f 72 65  ,    SQLITE_Fore
6db0: 69 67 6e 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20  ignKeys    },.  
6dc0: 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44        { SQLITE_D
6dd0: 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54  BCONFIG_ENABLE_T
6de0: 52 49 47 47 45 52 2c 20 53 51 4c 49 54 45 5f 45  RIGGER, SQLITE_E
6df0: 6e 61 62 6c 65 54 72 69 67 67 65 72 20 20 7d 2c  nableTrigger  },
6e00: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
6e10: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
6e20: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6e30: 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a  E_ERROR; /* IMP:
6e40: 20 52 2d 34 32 37 39 30 2d 32 33 33 37 32 20 2a   R-42790-23372 *
6e50: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
6e60: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 6c   i<ArraySize(aFl
6e70: 61 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  agOp); i++){.   
6e80: 20 20 20 20 20 69 66 28 20 61 46 6c 61 67 4f 70       if( aFlagOp
6e90: 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20  [i].op==op ){.  
6ea0: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66          int onof
6eb0: 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  f = va_arg(ap, i
6ec0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
6ed0: 6e 74 20 2a 70 52 65 73 20 3d 20 76 61 5f 61 72  nt *pRes = va_ar
6ee0: 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20  g(ap, int*);.   
6ef0: 20 20 20 20 20 20 20 69 6e 74 20 6f 6c 64 46 6c         int oldFl
6f00: 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b  ags = db->flags;
6f10: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
6f20: 6e 6f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  noff>0 ){.      
6f30: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
6f40: 7c 3d 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61  |= aFlagOp[i].ma
6f50: 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  sk;.          }e
6f60: 6c 73 65 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30  lse if( onoff==0
6f70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6f80: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46  db->flags &= ~aF
6f90: 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20  lagOp[i].mask;. 
6fa0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6fb0: 20 20 20 20 20 69 66 28 20 6f 6c 64 46 6c 61 67       if( oldFlag
6fc0: 73 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a  s!=db->flags ){.
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6fe0: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
6ff0: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
7000: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7010: 20 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20         if( pRes 
7020: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
7030: 70 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  pRes = (db->flag
7040: 73 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  s & aFlagOp[i].m
7050: 61 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20 20 20  ask)!=0;.       
7060: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
7070: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
7080: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7090: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
70a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
70b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e     }.  }.  va_en
70c0: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
70d0: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
70e0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
70f0: 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31   buffer z[0..n-1
7100: 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73  ] contains all s
7110: 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  paces..*/.static
7120: 20 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28 63   int allSpaces(c
7130: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
7140: 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e  t n){.  while( n
7150: 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20  >0 && z[n-1]==' 
7160: 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65  ' ){ n--; }.  re
7170: 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  turn n==0;.}../*
7180: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
7190: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
71a0: 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  g function named
71b0: 20 22 42 49 4e 41 52 59 22 20 77 68 69 63 68 20   "BINARY" which 
71c0: 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61  is always.** ava
71d0: 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ilable..**.** If
71e0: 20 74 68 65 20 70 61 64 46 6c 61 67 20 61 72 67   the padFlag arg
71f0: 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
7200: 4c 20 74 68 65 6e 20 73 70 61 63 65 20 70 61 64  L then space pad
7210: 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a  ding at the end.
7220: 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69 73  ** of strings is
7230: 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20   ignored.  This 
7240: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 52  implements the R
7250: 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a  TRIM collation..
7260: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69  */.static int bi
7270: 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69  nCollFunc(.  voi
7280: 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e  d *padFlag,.  in
7290: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
72a0: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
72b0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
72c0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
72d0: 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d  int rc, n;.  n =
72e0: 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e   nKey1<nKey2 ? n
72f0: 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20  Key1 : nKey2;.  
7300: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
7310: 52 2d 36 35 30 33 33 2d 32 38 34 34 39 20 54 68  R-65033-28449 Th
7320: 65 20 62 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52  e built-in BINAR
7330: 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 6f 6d 70  Y collation comp
7340: 61 72 65 73 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ares.  ** string
7350: 73 20 62 79 74 65 20 62 79 20 62 79 74 65 20 75  s byte by byte u
7360: 73 69 6e 67 20 74 68 65 20 6d 65 6d 63 6d 70 28  sing the memcmp(
7370: 29 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20  ) function from 
7380: 74 68 65 20 73 74 61 6e 64 61 72 64 20 43 0a 20  the standard C. 
7390: 20 2a 2a 20 6c 69 62 72 61 72 79 2e 20 2a 2f 0a   ** library. */.
73a0: 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b    rc = memcmp(pK
73b0: 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a  ey1, pKey2, n);.
73c0: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
73d0: 20 20 20 69 66 28 20 70 61 64 46 6c 61 67 0a 20     if( padFlag. 
73e0: 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73      && allSpaces
73f0: 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31 29 2b  (((char*)pKey1)+
7400: 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20  n, nKey1-n).    
7410: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
7420: 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20  char*)pKey2)+n, 
7430: 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a  nKey2-n).    ){.
7440: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
7450: 45 2d 4f 46 3a 20 52 2d 33 31 36 32 34 2d 32 34  E-OF: R-31624-24
7460: 37 33 37 20 52 54 52 49 4d 20 69 73 20 6c 69 6b  737 RTRIM is lik
7470: 65 20 42 49 4e 41 52 59 20 65 78 63 65 70 74 20  e BINARY except 
7480: 74 68 61 74 20 65 78 74 72 61 0a 20 20 20 20 20  that extra.     
7490: 20 2a 2a 20 73 70 61 63 65 73 20 61 74 20 74 68   ** spaces at th
74a0: 65 20 65 6e 64 20 6f 66 20 65 69 74 68 65 72 20  e end of either 
74b0: 73 74 72 69 6e 67 20 64 6f 20 6e 6f 74 20 63 68  string do not ch
74c0: 61 6e 67 65 20 74 68 65 20 72 65 73 75 6c 74 2e  ange the result.
74d0: 20 49 6e 20 6f 74 68 65 72 0a 20 20 20 20 20 20   In other.      
74e0: 2a 2a 20 77 6f 72 64 73 2c 20 73 74 72 69 6e 67  ** words, string
74f0: 73 20 77 69 6c 6c 20 63 6f 6d 70 61 72 65 20 65  s will compare e
7500: 71 75 61 6c 20 74 6f 20 6f 6e 65 20 61 6e 6f 74  qual to one anot
7510: 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  her as long as t
7520: 68 65 79 0a 20 20 20 20 20 20 2a 2a 20 64 69 66  hey.      ** dif
7530: 66 65 72 20 6f 6e 6c 79 20 69 6e 20 74 68 65 20  fer only in the 
7540: 6e 75 6d 62 65 72 20 6f 66 20 73 70 61 63 65 73  number of spaces
7550: 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 20 20 20   at the end..   
7560: 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b     */.    }else{
7570: 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79  .      rc = nKey
7580: 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d  1 - nKey2;.    }
7590: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
75a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68  ;.}../*.** Anoth
75b0: 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  er built-in coll
75c0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20  ating sequence: 
75d0: 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54  NOCASE. .**.** T
75e0: 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  his collating se
75f0: 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64  quence is intend
7600: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ed to be used fo
7610: 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64  r "case independ
7620: 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ent.** compariso
7630: 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f  n". SQLite's kno
7640: 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72 20  wledge of upper 
7650: 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65  and lower case e
7660: 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78  quivalents.** ex
7670: 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68  tends only to th
7680: 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73 20  e 26 characters 
7690: 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c  used in the Engl
76a0: 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a  ish language..**
76b0: 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e  .** At the momen
76c0: 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  t there is only 
76d0: 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e  a UTF-8 implemen
76e0: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  tation..*/.stati
76f0: 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c  c int nocaseColl
7700: 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69  atingFunc(.  voi
7710: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
7720: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
7730: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
7740: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
7750: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
7760: 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53  int r = sqlite3S
7770: 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28  trNICmp(.      (
7780: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
7790: 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y1, (const char 
77a0: 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c  *)pKey2, (nKey1<
77b0: 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65  nKey2)?nKey1:nKe
77c0: 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  y2);.  UNUSED_PA
77d0: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
77e0: 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a  ;.  if( 0==r ){.
77f0: 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b      r = nKey1-nK
7800: 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey2;.  }.  retur
7810: 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n r;.}../*.** Re
7820: 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f  turn the ROWID o
7830: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
7840: 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69  t insert.*/.sqli
7850: 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  te_int64 sqlite3
7860: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
7870: 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  id(sqlite3 *db){
7880: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7890: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
78a0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
78b0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
78c0: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
78d0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
78e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
78f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
7900: 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  rn db->lastRowid
7910: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7920: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
7930: 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 6d  changes in the m
7940: 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20  ost recent call 
7950: 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  to sqlite3_exec(
7960: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
7970: 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65  3_changes(sqlite
7980: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
7990: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
79a0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
79b0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
79c0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
79d0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
79e0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
79f0: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
7a00: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
7a10: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
7a20: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
7a30: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
7a40: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
7a50: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
7a60: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
7a70: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
7a80: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
7a90: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7aa0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
7ab0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
7ac0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
7ad0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
7ae0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
7af0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7b00: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
7b10: 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
7b20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
7b30: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
7b40: 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74  ints. This funct
7b50: 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c  ion only manipul
7b60: 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66 20 74  ates fields of t
7b70: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  he.** database h
7b80: 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74  andle object, it
7b90: 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20   does not close 
7ba0: 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74  any savepoints t
7bb0: 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a  hat may be open.
7bc0: 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72 65 65  ** at the b-tree
7bd0: 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f  /pager level..*/
7be0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 6f  .void sqlite3Clo
7bf0: 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73 71 6c  seSavepoints(sql
7c00: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77 68 69  ite3 *db){.  whi
7c10: 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  le( db->pSavepoi
7c20: 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65 70 6f  nt ){.    Savepo
7c30: 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e  int *pTmp = db->
7c40: 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  pSavepoint;.    
7c50: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
7c60: 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   pTmp->pNext;.  
7c70: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7c80: 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20  db, pTmp);.  }. 
7c90: 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20   db->nSavepoint 
7ca0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74  = 0;.  db->nStat
7cb0: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  ement = 0;.  db-
7cc0: 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
7cd0: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  vepoint = 0;.}..
7ce0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
7cf0: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
7d00: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
7d10: 77 69 74 68 20 46 75 6e 63 44 65 66 20 70 2c 20  with FuncDef p, 
7d20: 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a  if any. Except,.
7d30: 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ** if this is no
7d40: 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70 79 20  t the last copy 
7d50: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c  of the function,
7d60: 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69   do not invoke i
7d70: 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63  t. Multiple.** c
7d80: 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  opies of a singl
7d90: 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 63  e function are c
7da0: 72 65 61 74 65 64 20 77 68 65 6e 20 63 72 65 61  reated when crea
7db0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  te_function() is
7dc0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20   called.** with 
7dd0: 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20 74 68  SQLITE_ANY as th
7de0: 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  e encoding..*/.s
7df0: 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e 63 74  tatic void funct
7e00: 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c 69 74  ionDestroy(sqlit
7e10: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
7e20: 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73 74 72  *p){.  FuncDestr
7e30: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
7e40: 6f 72 20 3d 20 70 2d 3e 70 44 65 73 74 72 75 63  or = p->pDestruc
7e50: 74 6f 72 3b 0a 20 20 69 66 28 20 70 44 65 73 74  tor;.  if( pDest
7e60: 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44  ructor ){.    pD
7e70: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d  estructor->nRef-
7e80: 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 65 73 74  -;.    if( pDest
7e90: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20  ructor->nRef==0 
7ea0: 29 7b 0a 20 20 20 20 20 20 70 44 65 73 74 72 75  ){.      pDestru
7eb0: 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79 28 70  ctor->xDestroy(p
7ec0: 44 65 73 74 72 75 63 74 6f 72 2d 3e 70 55 73 65  Destructor->pUse
7ed0: 72 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71  rData);.      sq
7ee0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7ef0: 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  pDestructor);.  
7f00: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
7f10: 20 44 69 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20   Disconnect all 
7f20: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 6f 62 6a  sqlite3_vtab obj
7f30: 65 63 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  ects that belong
7f40: 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 6e   to database con
7f50: 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54  nection.** db. T
7f60: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68  his is called wh
7f70: 65 6e 20 64 62 20 69 73 20 62 65 69 6e 67 20 63  en db is being c
7f80: 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  losed..*/.static
7f90: 20 76 6f 69 64 20 64 69 73 63 6f 6e 6e 65 63 74   void disconnect
7fa0: 41 6c 6c 56 74 61 62 28 73 71 6c 69 74 65 33 20  AllVtab(sqlite3 
7fb0: 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  *db){.#ifndef SQ
7fc0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
7fd0: 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20 69 3b 0a  LTABLE.  int i;.
7fe0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20    HashElem *p;. 
7ff0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
8000: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72  erAll(db);.  for
8010: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
8020: 20 69 2b 2b 29 7b 0a 20 20 20 20 53 63 68 65 6d   i++){.    Schem
8030: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  a *pSchema = db-
8040: 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b  >aDb[i].pSchema;
8050: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62  .    if( db->aDb
8060: 5b 69 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20  [i].pSchema ){. 
8070: 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74       for(p=sqlit
8080: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
8090: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70  ema->tblHash); p
80a0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
80b0: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 20 20  xt(p)){.        
80c0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54  Table *pTab = (T
80d0: 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73  able *)sqliteHas
80e0: 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20  hData(p);.      
80f0: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
8100: 70 54 61 62 29 20 29 20 73 71 6c 69 74 65 33 56  pTab) ) sqlite3V
8110: 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62  tabDisconnect(db
8120: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d  , pTab);.      }
8130: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
8140: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
8150: 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  st(&db->aModule)
8160: 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73  ; p; p=sqliteHas
8170: 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 4d  hNext(p)){.    M
8180: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d  odule *pMod = (M
8190: 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61  odule *)sqliteHa
81a0: 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 69  shData(p);.    i
81b0: 66 28 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62  f( pMod->pEpoTab
81c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
81d0: 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28  3VtabDisconnect(
81e0: 64 62 2c 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  db, pMod->pEpoTa
81f0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
8200: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
8210: 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c  kList(db);.  sql
8220: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
8230: 6c 28 64 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55  l(db);.#else.  U
8240: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
8250: 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  db);.#endif.}../
8260: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
8270: 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   if database con
8280: 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 73 20 75  nection db has u
8290: 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61  nfinalized prepa
82a0: 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  red.** statement
82b0: 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20  s or unfinished 
82c0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f  sqlite3_backup o
82d0: 62 6a 65 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61  bjects.  .*/.sta
82e0: 74 69 63 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69  tic int connecti
82f0: 6f 6e 49 73 42 75 73 79 28 73 71 6c 69 74 65 33  onIsBusy(sqlite3
8300: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a   *db){.  int j;.
8310: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8320: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
8330: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
8340: 20 64 62 2d 3e 70 56 64 62 65 20 29 20 72 65 74   db->pVdbe ) ret
8350: 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30  urn 1;.  for(j=0
8360: 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b  ; j<db->nDb; j++
8370: 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  ){.    Btree *pB
8380: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70  t = db->aDb[j].p
8390: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20  Bt;.    if( pBt 
83a0: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  && sqlite3BtreeI
83b0: 73 49 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29  sInBackup(pBt) )
83c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
83d0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
83e0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69  .** Close an exi
83f0: 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74  sting SQLite dat
8400: 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20  abase.*/.static 
8410: 69 6e 74 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  int sqlite3Close
8420: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
8430: 74 20 66 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a  t forceZombie){.
8440: 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
8450: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
8460: 20 52 2d 36 33 32 35 37 2d 31 31 37 34 30 20 43   R-63257-11740 C
8470: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 63  alling sqlite3_c
8480: 6c 6f 73 65 28 29 20 6f 72 0a 20 20 20 20 2a 2a  lose() or.    **
8490: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
84a0: 32 28 29 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  2() with a NULL 
84b0: 70 6f 69 6e 74 65 72 20 61 72 67 75 6d 65 6e 74  pointer argument
84c0: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
84d0: 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 20 20 72 65 74  o-op. */.    ret
84e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
84f0: 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
8500: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
8510: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
8520: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
8530: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
8540: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
8550: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
8560: 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69  ..  /* Force xDi
8570: 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f  sconnect calls o
8580: 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61  n all virtual ta
8590: 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e  bles */.  discon
85a0: 6e 65 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b  nectAllVtab(db);
85b0: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e  ..  /* If a tran
85c0: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c  saction is open,
85d0: 20 74 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41   the disconnectA
85e0: 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62  llVtab() call ab
85f0: 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f  ove.  ** will no
8600: 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68  t have called th
8610: 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20  e xDisconnect() 
8620: 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69  method on any vi
8630: 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65  rtual.  ** table
8640: 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54  s in the db->aVT
8650: 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68  rans[] array. Th
8660: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
8670: 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28  te3VtabRollback(
8680: 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c  ).  ** call will
8690: 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20   do so. We need 
86a0: 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72  to do this befor
86b0: 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20  e the check for 
86c0: 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20  active.  ** SQL 
86d0: 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77  statements below
86e0: 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65  , as the v-table
86f0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
8700: 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20  may be storing. 
8710: 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65   ** some prepare
8720: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74  d statements int
8730: 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ernally..  */.  
8740: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
8750: 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c  ack(db);..  /* L
8760: 65 67 61 63 79 20 62 65 68 61 76 69 6f 72 20 28  egacy behavior (
8770: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20  sqlite3_close() 
8780: 62 65 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20  behavior) is to 
8790: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49  return.  ** SQLI
87a0: 54 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 63  TE_BUSY if the c
87b0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f  onnection can no
87c0: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
87d0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
87e0: 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65  if( !forceZombie
87f0: 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73   && connectionIs
8800: 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20  Busy(db) ){.    
8810: 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
8820: 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  Msg(db, SQLITE_B
8830: 55 53 59 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  USY, "unable to 
8840: 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66  close due to unf
8850: 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20 20 20 20  inalized ".     
8860: 20 20 22 73 74 61 74 65 6d 65 6e 74 73 20 6f 72    "statements or
8870: 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61 63 6b   unfinished back
8880: 75 70 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ups");.    sqlit
8890: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
88a0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72  b->mutex);.    r
88b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
88c0: 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  Y;.  }..#ifdef S
88d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
88e0: 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LOG.  if( sqlite
88f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
8900: 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20  qllog ){.    /* 
8910: 43 6c 6f 73 69 6e 67 20 74 68 65 20 68 61 6e 64  Closing the hand
8920: 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d  le. Fourth param
8930: 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74  eter is passed t
8940: 68 65 20 76 61 6c 75 65 20 32 2e 20 2a 2f 0a 20  he value 2. */. 
8950: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
8960: 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 73  Config.xSqllog(s
8970: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
8980: 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 64  ig.pSqllogArg, d
8990: 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d 0a 23 65  b, 0, 2);.  }.#e
89a0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  ndif..  /* Conve
89b0: 72 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  rt the connectio
89c0: 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20  n into a zombie 
89d0: 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69  and then close i
89e0: 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61  t..  */.  db->ma
89f0: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
8a00: 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c  IC_ZOMBIE;.  sql
8a10: 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e  ite3LeaveMutexAn
8a20: 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29  dCloseZombie(db)
8a30: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
8a40: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
8a50: 77 6f 20 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e  wo variations on
8a60: 20 74 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65   the public inte
8a70: 72 66 61 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e  rface for closin
8a80: 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
8a90: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20  connection. The 
8aa0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20  sqlite3_close() 
8ab0: 76 65 72 73 69 6f 6e 20 72 65 74 75 72 6e 73 20  version returns 
8ac0: 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a  SQLITE_BUSY and.
8ad0: 2a 2a 20 6c 65 61 76 65 73 20 74 68 65 20 63 6f  ** leaves the co
8ae0: 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20  nnection option 
8af0: 69 66 20 74 68 65 72 65 20 61 72 65 20 75 6e 66  if there are unf
8b00: 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65  inalized prepare
8b10: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  d.** statements 
8b20: 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71  or unfinished sq
8b30: 6c 69 74 65 33 5f 62 61 63 6b 75 70 73 2e 20 20  lite3_backups.  
8b40: 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  The sqlite3_clos
8b50: 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f  e_v2().** versio
8b60: 6e 20 66 6f 72 63 65 73 20 74 68 65 20 63 6f 6e  n forces the con
8b70: 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d  nection to becom
8b80: 65 20 61 20 7a 6f 6d 62 69 65 20 69 66 20 74 68  e a zombie if th
8b90: 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f  ere are.** unclo
8ba0: 73 65 64 20 72 65 73 6f 75 72 63 65 73 2c 20 61  sed resources, a
8bb0: 6e 64 20 61 72 72 61 6e 67 65 73 20 66 6f 72 20  nd arranges for 
8bc0: 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65  deallocation whe
8bd0: 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72  n the last.** pr
8be0: 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74 20  epare statement 
8bf0: 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  or sqlite3_backu
8c00: 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74  p closes..*/.int
8c10: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73   sqlite3_close(s
8c20: 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74  qlite3 *db){ ret
8c30: 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  urn sqlite3Close
8c40: 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71  (db,0); }.int sq
8c50: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73  lite3_close_v2(s
8c60: 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74  qlite3 *db){ ret
8c70: 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  urn sqlite3Close
8c80: 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a  (db,1); }.../*.*
8c90: 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d 75 74 65  * Close the mute
8ca0: 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 63 6f  x on database co
8cb0: 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a  nnection db..**.
8cc0: 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  ** Furthermore, 
8cd0: 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  if database conn
8ce0: 65 63 74 69 6f 6e 20 64 62 20 69 73 20 61 20 7a  ection db is a z
8cf0: 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e 67 20 74  ombie (meaning t
8d00: 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 68 61 73  hat there.** has
8d10: 20 62 65 65 6e 20 61 20 70 72 69 6f 72 20 63 61   been a prior ca
8d20: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c  ll to sqlite3_cl
8d30: 6f 73 65 28 64 62 29 20 6f 72 20 73 71 6c 69 74  ose(db) or sqlit
8d40: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29 29  e3_close_v2(db))
8d50: 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79 20 73 71   and.** every sq
8d60: 6c 69 74 65 33 5f 73 74 6d 74 20 68 61 73 20 6e  lite3_stmt has n
8d70: 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  ow been finalize
8d80: 64 20 61 6e 64 20 65 76 65 72 79 20 73 71 6c 69  d and every sqli
8d90: 74 65 33 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a  te3_backup has.*
8da0: 2a 20 66 69 6e 69 73 68 65 64 2c 20 74 68 65 6e  * finished, then
8db0: 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72   free all resour
8dc0: 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
8dd0: 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e  ite3LeaveMutexAn
8de0: 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c  dCloseZombie(sql
8df0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73  ite3 *db){.  Has
8e00: 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20 20  hElem *i;       
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e20: 48 61 73 68 20 74 61 62 6c 65 20 69 74 65 72 61  Hash table itera
8e30: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a  tor */.  int j;.
8e40: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
8e50: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 73  re outstanding s
8e60: 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 72 20 73  qlite3_stmt or s
8e70: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62  qlite3_backup ob
8e80: 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66  jects.  ** or if
8e90: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
8ea0: 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
8eb0: 20 63 6c 6f 73 65 64 20 62 79 20 73 71 6c 69 74   closed by sqlit
8ec0: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20  e3_close_v2(),. 
8ed0: 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20 6c 65   ** then just le
8ee0: 61 76 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e  ave the mutex an
8ef0: 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
8f00: 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d   if( db->magic!=
8f10: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d  SQLITE_MAGIC_ZOM
8f20: 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f  BIE || connectio
8f30: 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20  nIsBusy(db) ){. 
8f40: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
8f50: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
8f60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
8f70: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
8f80: 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
8f90: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
8fa0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
8fb0: 65 63 74 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20  ection has.  ** 
8fc0: 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71 6c 69 74  closed all sqlit
8fd0: 65 33 5f 73 74 6d 74 20 61 6e 64 20 73 71 6c 69  e3_stmt and sqli
8fe0: 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63  te3_backup objec
8ff0: 74 73 20 61 6e 64 20 68 61 73 20 62 65 65 6e 0a  ts and has been.
9000: 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 73    ** passed to s
9010: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65  qlite3_close (me
9020: 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20 69 73  aning that it is
9030: 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65   a zombie).  The
9040: 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20  refore,.  ** go 
9050: 61 68 65 61 64 20 61 6e 64 20 66 72 65 65 20 61  ahead and free a
9060: 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20  ll resources..  
9070: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72  */..  /* If a tr
9080: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
9090: 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  n, roll it back.
90a0: 20 54 68 69 73 20 61 6c 73 6f 20 65 6e 73 75 72   This also ensur
90b0: 65 73 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20  es that if.  ** 
90c0: 61 6e 79 20 64 61 74 61 62 61 73 65 20 73 63 68  any database sch
90d0: 65 6d 61 73 20 68 61 76 65 20 62 65 65 6e 20 6d  emas have been m
90e0: 6f 64 69 66 69 65 64 20 62 79 20 61 6e 20 75 6e  odified by an un
90f0: 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61  committed transa
9100: 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68 65 79 20  ction.  ** they 
9110: 61 72 65 20 72 65 73 65 74 2e 20 41 6e 64 20 74  are reset. And t
9120: 68 61 74 20 74 68 65 20 72 65 71 75 69 72 65 64  hat the required
9130: 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
9140: 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65 0a 20 20   held to make.  
9150: 2a 2a 20 74 68 65 20 70 61 67 65 72 20 72 6f 6c  ** the pager rol
9160: 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61  lback and schema
9170: 20 72 65 73 65 74 20 61 6e 20 61 74 6f 6d 69 63   reset an atomic
9180: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20   operation. */. 
9190: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
91a0: 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
91b0: 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61  K);..  /* Free a
91c0: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53  ny outstanding S
91d0: 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75  avepoint structu
91e0: 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  res. */.  sqlite
91f0: 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
9200: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  (db);..  /* Clos
9210: 65 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63  e all database c
9220: 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
9230: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e  for(j=0; j<db->n
9240: 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; j++){.    st
9250: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
9260: 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20  db->aDb[j];.    
9270: 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a  if( pDb->pBt ){.
9280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
9290: 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74  eeClose(pDb->pBt
92a0: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42  );.      pDb->pB
92b0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
92c0: 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20   j!=1 ){.       
92d0: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20   pDb->pSchema = 
92e0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
92f0: 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20  .  }.  /* Clear 
9300: 74 68 65 20 54 45 4d 50 20 73 63 68 65 6d 61 20  the TEMP schema 
9310: 73 65 70 61 72 61 74 65 6c 79 20 61 6e 64 20 6c  separately and l
9320: 61 73 74 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ast */.  if( db-
9330: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
9340: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63  ){.    sqlite3Sc
9350: 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44  hemaClear(db->aD
9360: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20  b[1].pSchema);. 
9370: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
9380: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
9390: 0a 20 20 2f 2a 20 46 72 65 65 20 75 70 20 74 68  .  /* Free up th
93a0: 65 20 61 72 72 61 79 20 6f 66 20 61 75 78 69 6c  e array of auxil
93b0: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 2a  iary databases *
93c0: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61  /.  sqlite3Colla
93d0: 70 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79  pseDatabaseArray
93e0: 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20  (db);.  assert( 
93f0: 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20  db->nDb<=2 );.  
9400: 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d  assert( db->aDb=
9410: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
9420: 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65  ;..  /* Tell the
9430: 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e   code in notify.
9440: 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65  c that the conne
9450: 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  ction no longer 
9460: 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c  holds any.  ** l
9470: 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f  ocks and does no
9480: 74 20 72 65 71 75 69 72 65 20 61 6e 79 20 66 75  t require any fu
9490: 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  rther unlock-not
94a0: 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
94b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e   */.  sqlite3Con
94c0: 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62  nectionClosed(db
94d0: 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  );..  for(j=0; j
94e0: 3c 41 72 72 61 79 53 69 7a 65 28 64 62 2d 3e 61  <ArraySize(db->a
94f0: 46 75 6e 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20  Func.a); j++){. 
9500: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 78     FuncDef *pNex
9510: 74 2c 20 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20  t, *pHash, *p;. 
9520: 20 20 20 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75     for(p=db->aFu
9530: 6e 63 2e 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48  nc.a[j]; p; p=pH
9540: 61 73 68 29 7b 0a 20 20 20 20 20 20 70 48 61 73  ash){.      pHas
9550: 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20  h = p->pHash;.  
9560: 20 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a      while( p ){.
9570: 20 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e          function
9580: 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a  Destroy(db, p);.
9590: 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20          pNext = 
95a0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  p->pNext;.      
95b0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
95c0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
95d0: 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20  p = pNext;.     
95e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   }.    }.  }.  f
95f0: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
9600: 69 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  irst(&db->aCollS
9610: 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65  eq); i; i=sqlite
9620: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
9630: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
9640: 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71   = (CollSeq *)sq
9650: 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
9660: 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61  .    /* Invoke a
9670: 6e 79 20 64 65 73 74 72 75 63 74 6f 72 73 20 72  ny destructors r
9680: 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 63 6f  egistered for co
9690: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
96a0: 20 75 73 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20   user data. */. 
96b0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b     for(j=0; j<3;
96c0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
96d0: 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29   pColl[j].xDel )
96e0: 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b  {.        pColl[
96f0: 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d  j].xDel(pColl[j]
9700: 2e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 7d  .pUser);.      }
9710: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9720: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
9730: 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ll);.  }.  sqlit
9740: 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d  e3HashClear(&db-
9750: 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e  >aCollSeq);.#ifn
9760: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9770: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 66  VIRTUALTABLE.  f
9780: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
9790: 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  irst(&db->aModul
97a0: 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  e); i; i=sqliteH
97b0: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
97c0: 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20   Module *pMod = 
97d0: 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65  (Module *)sqlite
97e0: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
97f0: 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74   if( pMod->xDest
9800: 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f  roy ){.      pMo
9810: 64 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d 6f 64  d->xDestroy(pMod
9820: 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20  ->pAux);.    }. 
9830: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 45 70     sqlite3VtabEp
9840: 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 43 6c 65 61  onymousTableClea
9850: 72 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 20  r(db, pMod);.   
9860: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9870: 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20  b, pMod);.  }.  
9880: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
9890: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a  (&db->aModule);.
98a0: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
98b0: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
98c0: 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f  E_OK); /* Deallo
98d0: 63 61 74 65 73 20 61 6e 79 20 63 61 63 68 65 64  cates any cached
98e0: 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20   error strings. 
98f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  */.  sqlite3Valu
9900: 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29 3b  eFree(db->pErr);
9910: 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 45  .  sqlite3CloseE
9920: 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 23  xtensions(db);.#
9930: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
9940: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20  UTHENTICATION.  
9950: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
9960: 3e 61 75 74 68 2e 7a 41 75 74 68 55 73 65 72 29  >auth.zAuthUser)
9970: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
9980: 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 50  (db->auth.zAuthP
9990: 57 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62  W);.#endif..  db
99a0: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
99b0: 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20  _MAGIC_ERROR;.. 
99c0: 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74   /* The temp-dat
99d0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20  abase schema is 
99e0: 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72  allocated differ
99f0: 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f  ently from the o
9a00: 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a  ther schema.  **
9a10: 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20   objects (using 
9a20: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64  sqliteMalloc() d
9a30: 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64  irectly, instead
9a40: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
9a50: 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20  Schema())..  ** 
9a60: 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  So it needs to b
9a70: 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f  e freed here. To
9a80: 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c  do: Why not roll
9a90: 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61   the temp schema
9aa0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73   into.  ** the s
9ab0: 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ame sqliteMalloc
9ac0: 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68  () as the one th
9ad0: 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  at allocates the
9ae0: 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20   database .  ** 
9af0: 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a  structure?.  */.
9b00: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9b10: 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  db, db->aDb[1].p
9b20: 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
9b30: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
9b40: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
9b50: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
9b60: 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20  MAGIC_CLOSED;.  
9b70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
9b80: 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ee(db->mutex);. 
9b90: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f   assert( db->loo
9ba0: 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29  kaside.nOut==0 )
9bb0: 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61  ;  /* Fails on a
9bc0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
9bd0: 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20  y leak */.  if( 
9be0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
9bf0: 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73  alloced ){.    s
9c00: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e  qlite3_free(db->
9c10: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
9c20: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
9c30: 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a  _free(db);.}../*
9c40: 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
9c50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
9c60: 20 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73    If tripCode is
9c70: 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20   not SQLITE_OK, 
9c80: 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 77 72 69 74  then.** any writ
9c90: 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  e cursors are in
9ca0: 76 61 6c 69 64 61 74 65 64 20 28 22 74 72 69 70  validated ("trip
9cb0: 70 65 64 22 20 2d 20 61 73 20 69 6e 20 22 74 72  ped" - as in "tr
9cc0: 69 70 70 69 6e 67 20 61 20 63 69 72 63 75 69 74  ipping a circuit
9cd0: 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29 20 61 6e  .** breaker") an
9ce0: 64 20 6d 61 64 65 20 74 6f 20 72 65 74 75 72 6e  d made to return
9cf0: 20 74 72 69 70 43 6f 64 65 20 69 66 20 74 68 65   tripCode if the
9d00: 72 65 20 61 72 65 20 61 6e 79 20 66 75 72 74 68  re are any furth
9d10: 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  er.** attempts t
9d20: 6f 20 75 73 65 20 74 68 61 74 20 63 75 72 73 6f  o use that curso
9d30: 72 2e 20 20 52 65 61 64 20 63 75 72 73 6f 72 73  r.  Read cursors
9d40: 20 72 65 6d 61 69 6e 20 6f 70 65 6e 20 61 6e 64   remain open and
9d50: 20 76 61 6c 69 64 0a 2a 2a 20 62 75 74 20 61 72   valid.** but ar
9d60: 65 20 22 73 61 76 65 64 22 20 69 6e 20 63 61 73  e "saved" in cas
9d70: 65 20 74 68 65 20 74 61 62 6c 65 20 70 61 67 65  e the table page
9d80: 73 20 61 72 65 20 6d 6f 76 65 64 20 61 72 6f 75  s are moved arou
9d90: 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nd..*/.void sqli
9da0: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73  te3RollbackAll(s
9db0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
9dc0: 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74  tripCode){.  int
9dd0: 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e   i;.  int inTran
9de0: 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 63 68  s = 0;.  int sch
9df0: 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 61 73 73  emaChange;.  ass
9e00: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9e10: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
9e20: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
9e30: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
9e40: 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e  ();..  /* Obtain
9e50: 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d 75 74 65   all b-tree mute
9e60: 78 65 73 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e  xes before makin
9e70: 67 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f 20 42  g any calls to B
9e80: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 2e 20  treeRollback(). 
9e90: 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 69 6d  .  ** This is im
9ea0: 70 6f 72 74 61 6e 74 20 69 6e 20 63 61 73 65 20  portant in case 
9eb0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
9ec0: 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
9ed0: 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f 64 69 66  k has.  ** modif
9ee0: 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ied the database
9ef0: 20 73 63 68 65 6d 61 2e 20 49 66 20 74 68 65 20   schema. If the 
9f00: 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20 61  b-tree mutexes a
9f10: 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a 20 20 2a  re not taken.  *
9f20: 2a 20 68 65 72 65 2c 20 74 68 65 6e 20 61 6e 6f  * here, then ano
9f30: 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
9f40: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 69 67  e connection mig
9f50: 68 74 20 73 6e 65 61 6b 20 69 6e 20 62 65 74 77  ht sneak in betw
9f60: 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 64 61 74  een.  ** the dat
9f70: 61 62 61 73 65 20 72 6f 6c 6c 62 61 63 6b 20 61  abase rollback a
9f80: 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65 74 2c  nd schema reset,
9f90: 20 77 68 69 63 68 20 63 61 6e 20 63 61 75 73 65   which can cause
9fa0: 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63 6f 72 72   false.  ** corr
9fb0: 75 70 74 69 6f 6e 20 72 65 70 6f 72 74 73 20 69  uption reports i
9fc0: 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e 20 20 2a  n some cases.  *
9fd0: 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
9fe0: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
9ff0: 73 63 68 65 6d 61 43 68 61 6e 67 65 20 3d 20 28  schemaChange = (
a000: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
a010: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
a020: 29 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74  )!=0 && db->init
a030: 2e 62 75 73 79 3d 3d 30 3b 0a 0a 20 20 66 6f 72  .busy==0;..  for
a040: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
a050: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
a060: 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d   *p = db->aDb[i]
a070: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20  .pBt;.    if( p 
a080: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
a090: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
a0a0: 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20  ns(p) ){.       
a0b0: 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20   inTrans = 1;.  
a0c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
a0d0: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
a0e0: 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 21 73  (p, tripCode, !s
a0f0: 63 68 65 6d 61 43 68 61 6e 67 65 29 3b 0a 20 20  chemaChange);.  
a100: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
a110: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62  3VtabRollback(db
a120: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42  );.  sqlite3EndB
a130: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
a140: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
a150: 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  &SQLITE_InternCh
a160: 61 6e 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d  anges)!=0 && db-
a170: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
a180: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
a190: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
a1a0: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71  ents(db);.    sq
a1b0: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
a1c0: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
a1d0: 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  (db);.  }.  sqli
a1e0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
a1f0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20  (db);..  /* Any 
a200: 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
a210: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68  int violations h
a220: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73  ave now been res
a230: 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e  olved. */.  db->
a240: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
a250: 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  0;.  db->nDeferr
a260: 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
a270: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
a280: 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a  QLITE_DeferFKs;.
a290: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73  .  /* If one has
a2a0: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
a2b0: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c  , invoke the rol
a2c0: 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62  lback-hook callb
a2d0: 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ack */.  if( db-
a2e0: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
a2f0: 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c  ck && (inTrans |
a300: 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  | !db->autoCommi
a310: 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52  t) ){.    db->xR
a320: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28  ollbackCallback(
a330: 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
a340: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
a350: 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20  Return a static 
a360: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
a370: 67 20 74 68 65 20 6e 61 6d 65 20 63 6f 72 72 65  g the name corre
a380: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
a390: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70  error code.** sp
a3a0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 61  ecified in the a
a3b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20  rgument..*/.#if 
a3c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
a3d0: 45 45 44 5f 45 52 52 5f 4e 41 4d 45 29 0a 63 6f  EED_ERR_NAME).co
a3e0: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
a3f0: 33 45 72 72 4e 61 6d 65 28 69 6e 74 20 72 63 29  3ErrName(int rc)
a400: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
a410: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zName = 0;.  int
a420: 20 69 2c 20 6f 72 69 67 52 63 20 3d 20 72 63 3b   i, origRc = rc;
a430: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 20  .  for(i=0; i<2 
a440: 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b  && zName==0; i++
a450: 2c 20 72 63 20 26 3d 20 30 78 66 66 29 7b 0a 20  , rc &= 0xff){. 
a460: 20 20 20 73 77 69 74 63 68 28 20 72 63 20 29 7b     switch( rc ){
a470: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a480: 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20 20  TE_OK:          
a490: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a4a0: 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20  SQLITE_OK";     
a4b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
a4c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a4d0: 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20  ITE_ERROR:      
a4e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a4f0: 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20  "SQLITE_ERROR"; 
a500: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a510: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a520: 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20  LITE_INTERNAL:  
a530: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
a540: 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41   "SQLITE_INTERNA
a550: 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  L";          bre
a560: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a570: 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20  QLITE_PERM:     
a580: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a590: 3d 20 22 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b  = "SQLITE_PERM";
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
a5b0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a5c0: 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20 20  SQLITE_ABORT:   
a5d0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a5e0: 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54   = "SQLITE_ABORT
a5f0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
a600: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a610: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
a620: 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a 4e 61 6d  LLBACK:     zNam
a630: 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52  e = "SQLITE_ABOR
a640: 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 20 20 20  T_ROLLBACK";    
a650: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a660: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 20  e SQLITE_BUSY:  
a670: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
a680: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53  me = "SQLITE_BUS
a690: 59 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Y";             
a6a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a6b0: 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  se SQLITE_BUSY_R
a6c0: 45 43 4f 56 45 52 59 3a 20 20 20 20 20 20 7a 4e  ECOVERY:      zN
a6d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55  ame = "SQLITE_BU
a6e0: 53 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 20 20  SY_RECOVERY";   
a6f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a700: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  ase SQLITE_BUSY_
a710: 53 4e 41 50 53 48 4f 54 3a 20 20 20 20 20 20 7a  SNAPSHOT:      z
a720: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42  Name = "SQLITE_B
a730: 55 53 59 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20  USY_SNAPSHOT";  
a740: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a750: 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  case SQLITE_LOCK
a760: 45 44 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ED:             
a770: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a780: 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20 20 20  LOCKED";        
a790: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a7a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43   case SQLITE_LOC
a7b0: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3a  KED_SHAREDCACHE:
a7c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a7d0: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
a7e0: 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  CHE";break;.    
a7f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
a800: 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20  MEM:            
a810: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a820: 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20  E_NOMEM";       
a830: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a840: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
a850: 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20  EADONLY:        
a860: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a870: 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20  TE_READONLY";   
a880: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a890: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a8a0: 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52  READONLY_RECOVER
a8b0: 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  Y:  zName = "SQL
a8c0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43  ITE_READONLY_REC
a8d0: 4f 56 45 52 59 22 3b 20 62 72 65 61 6b 3b 0a 20  OVERY"; break;. 
a8e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a8f0: 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f  _READONLY_CANTLO
a900: 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  CK:  zName = "SQ
a910: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41  LITE_READONLY_CA
a920: 4e 54 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  NTLOCK"; break;.
a930: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a940: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42  E_READONLY_ROLLB
a950: 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ACK:  zName = "S
a960: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
a970: 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b  OLLBACK"; break;
a980: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a990: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
a9a0: 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  VED:   zName = "
a9b0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
a9c0: 44 42 4d 4f 56 45 44 22 3b 20 20 62 72 65 61 6b  DBMOVED";  break
a9d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a9e0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20  ITE_INTERRUPT:  
a9f0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
aa00: 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  "SQLITE_INTERRUP
aa10: 54 22 3b 20 20 20 20 20 20 20 20 20 62 72 65 61  T";         brea
aa20: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
aa30: 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20  LITE_IOERR:     
aa40: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
aa50: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b   "SQLITE_IOERR";
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
aa70: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
aa80: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
aa90: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
aaa0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
aab0: 52 45 41 44 22 3b 20 20 20 20 20 20 20 20 62 72  READ";        br
aac0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
aad0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
aae0: 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e 61 6d 65  RT_READ:   zName
aaf0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
ab00: 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b 20 20 62  _SHORT_READ";  b
ab10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ab20: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
ab30: 49 54 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ITE:        zNam
ab40: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
ab50: 52 5f 57 52 49 54 45 22 3b 20 20 20 20 20 20 20  R_WRITE";       
ab60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ab70: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  e SQLITE_IOERR_F
ab80: 53 59 4e 43 3a 20 20 20 20 20 20 20 20 7a 4e 61  SYNC:        zNa
ab90: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
aba0: 52 52 5f 46 53 59 4e 43 22 3b 20 20 20 20 20 20  RR_FSYNC";      
abb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
abc0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
abd0: 44 49 52 5f 46 53 59 4e 43 3a 20 20 20 20 7a 4e  DIR_FSYNC:    zN
abe0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
abf0: 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b 20  ERR_DIR_FSYNC"; 
ac00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ac10: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
ac20: 5f 54 52 55 4e 43 41 54 45 3a 20 20 20 20 20 7a  _TRUNCATE:     z
ac30: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
ac40: 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 22 3b 20  OERR_TRUNCATE"; 
ac50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ac60: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
ac70: 52 5f 46 53 54 41 54 3a 20 20 20 20 20 20 20 20  R_FSTAT:        
ac80: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ac90: 49 4f 45 52 52 5f 46 53 54 41 54 22 3b 20 20 20  IOERR_FSTAT";   
aca0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
acb0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
acc0: 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20  RR_UNLOCK:      
acd0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ace0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20  _IOERR_UNLOCK"; 
acf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ad00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
ad10: 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20  ERR_RDLOCK:     
ad20: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ad30: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22 3b  E_IOERR_RDLOCK";
ad40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ad50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
ad60: 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20 20 20 20  OERR_DELETE:    
ad70: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ad80: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 22  TE_IOERR_DELETE"
ad90: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
ada0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
adb0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20  IOERR_NOMEM:    
adc0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
add0: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22  ITE_IOERR_NOMEM"
ade0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
adf0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ae00: 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3a 20 20  _IOERR_ACCESS:  
ae10: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ae20: 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
ae30: 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S";      break;.
ae40: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ae50: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
ae60: 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20 20 20 20  ERVEDLOCK:.     
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae80: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
ae90: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
aea0: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
aeb0: 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CK"; break;.    
aec0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
aed0: 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20  ERR_LOCK:       
aee0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
aef0: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20 20  E_IOERR_LOCK";  
af00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
af10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
af20: 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20 20 20 20  OERR_CLOSE:     
af30: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
af40: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 22 3b  TE_IOERR_CLOSE";
af50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
af60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
af70: 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3a  IOERR_DIR_CLOSE:
af80: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
af90: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c  ITE_IOERR_DIR_CL
afa0: 4f 53 45 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  OSE";   break;. 
afb0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
afc0: 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3a 20  _IOERR_SHMOPEN: 
afd0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
afe0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50  LITE_IOERR_SHMOP
aff0: 45 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  EN";     break;.
b000: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b010: 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3a  E_IOERR_SHMSIZE:
b020: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b030: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
b040: 49 5a 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  IZE";     break;
b050: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b060: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b  TE_IOERR_SHMLOCK
b070: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
b080: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b090: 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72 65 61 6b  LOCK";     break
b0a0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b0b0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
b0c0: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
b0d0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
b0e0: 4d 4d 41 50 22 3b 20 20 20 20 20 20 62 72 65 61  MMAP";      brea
b0f0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b100: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 3a  LITE_IOERR_SEEK:
b110: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b120: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
b130: 45 45 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65  EEK";        bre
b140: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b150: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
b160: 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20  TE_NOENT: zName 
b170: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b180: 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b 62 72  DELETE_NOENT";br
b190: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b1a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
b1b0: 50 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  P:         zName
b1c0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b1d0: 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20 20 20 62  _MMAP";        b
b1e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b1f0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45   SQLITE_IOERR_GE
b200: 54 54 45 4d 50 50 41 54 48 3a 20 20 7a 4e 61 6d  TTEMPPATH:  zNam
b210: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b220: 52 5f 47 45 54 54 45 4d 50 50 41 54 48 22 3b 20  R_GETTEMPPATH"; 
b230: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b240: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e SQLITE_IOERR_C
b250: 4f 4e 56 50 41 54 48 3a 20 20 20 20 20 7a 4e 61  ONVPATH:     zNa
b260: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b270: 52 52 5f 43 4f 4e 56 50 41 54 48 22 3b 20 20 20  RR_CONVPATH";   
b280: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b290: 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  se SQLITE_CORRUP
b2a0: 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  T:            zN
b2b0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b2c0: 52 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20  RRUPT";         
b2d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b2e0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ase SQLITE_CORRU
b2f0: 50 54 5f 56 54 41 42 3a 20 20 20 20 20 20 20 7a  PT_VTAB:       z
b300: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b310: 4f 52 52 55 50 54 5f 56 54 41 42 22 3b 20 20 20  ORRUPT_VTAB";   
b320: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b330: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46  case SQLITE_NOTF
b340: 4f 55 4e 44 3a 20 20 20 20 20 20 20 20 20 20 20  OUND:           
b350: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b360: 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20 20 20  NOTFOUND";      
b370: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b380: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c   case SQLITE_FUL
b390: 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L:              
b3a0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b3b0: 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 20  _FULL";         
b3c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b3d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
b3e0: 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20  NTOPEN:         
b3f0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b400: 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20  E_CANTOPEN";    
b410: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b420: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b430: 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49  ANTOPEN_NOTEMPDI
b440: 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  R: zName = "SQLI
b450: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45  TE_CANTOPEN_NOTE
b460: 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b 0a 20 20  MPDIR";break;.  
b470: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b480: 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3a 20  CANTOPEN_ISDIR: 
b490: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b4a0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44  ITE_CANTOPEN_ISD
b4b0: 49 52 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  IR";    break;. 
b4c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b4d0: 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
b4e0: 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  TH:  zName = "SQ
b4f0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
b500: 4c 4c 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a  LLPATH"; break;.
b510: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b520: 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50  E_CANTOPEN_CONVP
b530: 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ATH:  zName = "S
b540: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43  QLITE_CANTOPEN_C
b550: 4f 4e 56 50 41 54 48 22 3b 20 62 72 65 61 6b 3b  ONVPATH"; break;
b560: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b570: 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 20  TE_PROTOCOL:    
b580: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b590: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22  SQLITE_PROTOCOL"
b5a0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
b5b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b5c0: 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20  ITE_EMPTY:      
b5d0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b5e0: 22 53 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20  "SQLITE_EMPTY"; 
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b600: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b610: 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20 20 20  LITE_SCHEMA:    
b620: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b630: 20 22 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 22   "SQLITE_SCHEMA"
b640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
b650: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b660: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20  QLITE_TOOBIG:   
b670: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b680: 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47  = "SQLITE_TOOBIG
b690: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
b6a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b6b0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b6c0: 54 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  T:         zName
b6d0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
b6e0: 52 41 49 4e 54 22 3b 20 20 20 20 20 20 20 20 62  RAINT";        b
b6f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b700: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
b710: 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61 6d  NT_UNIQUE:  zNam
b720: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
b730: 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b 20  TRAINT_UNIQUE"; 
b740: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b750: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
b760: 49 4e 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e 61  INT_TRIGGER: zNa
b770: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
b780: 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 22  STRAINT_TRIGGER"
b790: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
b7a0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
b7b0: 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3a  AINT_FOREIGNKEY:
b7c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7e0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b7f0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
b800: 49 47 4e 4b 45 59 22 3b 20 20 20 62 72 65 61 6b  IGNKEY";   break
b810: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b820: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
b830: 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d 20  HECK:   zName = 
b840: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
b850: 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62 72 65 61  NT_CHECK";  brea
b860: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b870: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b880: 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20 20  PRIMARYKEY:.    
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b8b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
b8c0: 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
b8d0: 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  Y";   break;.   
b8e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b8f0: 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c  ONSTRAINT_NOTNUL
b900: 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  L: zName = "SQLI
b910: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f  TE_CONSTRAINT_NO
b920: 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20 20  TNULL";break;.  
b930: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b940: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49  CONSTRAINT_COMMI
b950: 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20 20  THOOK:.         
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b980: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b990: 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20  T_COMMITHOOK";  
b9a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b9b0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
b9c0: 41 49 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a 4e  AINT_VTAB:    zN
b9d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b9e0: 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 22 3b 20  NSTRAINT_VTAB"; 
b9f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ba00: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
ba10: 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a  RAINT_FUNCTION:.
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba40: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ba50: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54  CONSTRAINT_FUNCT
ba60: 49 4f 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ION";     break;
ba70: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ba80: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f  TE_CONSTRAINT_RO
ba90: 57 49 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  WID:   zName = "
baa0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
bab0: 54 5f 52 4f 57 49 44 22 3b 20 20 62 72 65 61 6b  T_ROWID";  break
bac0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bad0: 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20  ITE_MISMATCH:   
bae0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
baf0: 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48  "SQLITE_MISMATCH
bb00: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
bb10: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bb20: 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20  LITE_MISUSE:    
bb30: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bb40: 20 22 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22   "SQLITE_MISUSE"
bb50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
bb60: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bb70: 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20  QLITE_NOLFS:    
bb80: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bb90: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22  = "SQLITE_NOLFS"
bba0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
bbb0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bbc0: 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20  SQLITE_AUTH:    
bbd0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bbe0: 20 3d 20 22 53 51 4c 49 54 45 5f 41 55 54 48 22   = "SQLITE_AUTH"
bbf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
bc00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bc10: 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20   SQLITE_FORMAT: 
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
bc30: 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d  e = "SQLITE_FORM
bc40: 41 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  AT";            
bc50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bc60: 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20  e SQLITE_RANGE: 
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
bc80: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e  me = "SQLITE_RAN
bc90: 47 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  GE";            
bca0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bcb0: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  se SQLITE_NOTADB
bcc0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
bcd0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
bce0: 54 41 44 42 22 3b 20 20 20 20 20 20 20 20 20 20  TADB";          
bcf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bd00: 61 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20  ase SQLITE_ROW: 
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
bd20: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
bd30: 4f 57 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  OW";            
bd40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bd50: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49  case SQLITE_NOTI
bd60: 43 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  CE:             
bd70: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bd80: 4e 4f 54 49 43 45 22 3b 20 20 20 20 20 20 20 20  NOTICE";        
bd90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bda0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
bdb0: 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 3a  ICE_RECOVER_WAL:
bdc0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bdd0: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
bde0: 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  WAL";break;.    
bdf0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
be00: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c  TICE_RECOVER_ROL
be10: 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20 20 20 20  LBACK:.         
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
be40: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
be50: 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b  COVER_ROLLBACK";
be60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
be70: 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  se SQLITE_WARNIN
be80: 47 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  G:            zN
be90: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41  ame = "SQLITE_WA
bea0: 52 4e 49 4e 47 22 3b 20 20 20 20 20 20 20 20 20  RNING";         
beb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bec0: 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49  ase SQLITE_WARNI
bed0: 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a 20 20 7a  NG_AUTOINDEX:  z
bee0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57  Name = "SQLITE_W
bef0: 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58  ARNING_AUTOINDEX
bf00: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
bf10: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45  case SQLITE_DONE
bf20: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
bf30: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bf40: 44 4f 4e 45 22 3b 20 20 20 20 20 20 20 20 20 20  DONE";          
bf50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bf60: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65  .  }.  if( zName
bf70: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ==0 ){.    stati
bf80: 63 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b  c char zBuf[50];
bf90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
bfa0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
bfb0: 66 29 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49 54  f), zBuf, "SQLIT
bfc0: 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c 20  E_UNKNOWN(%d)", 
bfd0: 6f 72 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e 61  origRc);.    zNa
bfe0: 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20  me = zBuf;.  }. 
bff0: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
c000: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
c010: 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73  eturn a static s
c020: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
c030: 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66  ibes the kind of
c040: 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64   error specified
c050: 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d   in the.** argum
c060: 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ent..*/.const ch
c070: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74  ar *sqlite3ErrSt
c080: 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61  r(int rc){.  sta
c090: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20  tic const char* 
c0a0: 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b  const aMsg[] = {
c0b0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  .    /* SQLITE_O
c0c0: 4b 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e  K          */ "n
c0d0: 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20  ot an error",.  
c0e0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f    /* SQLITE_ERRO
c0f0: 52 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20  R       */ "SQL 
c100: 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d  logic error or m
c110: 69 73 73 69 6e 67 20 64 61 74 61 62 61 73 65 22  issing database"
c120: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c130: 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30  INTERNAL    */ 0
c140: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c150: 50 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20 22  PERM        */ "
c160: 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
c170: 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f  n denied",.    /
c180: 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 20  * SQLITE_ABORT  
c190: 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61 63       */ "callbac
c1a0: 6b 20 72 65 71 75 65 73 74 65 64 20 71 75 65 72  k requested quer
c1b0: 79 20 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f 2a  y abort",.    /*
c1c0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20 20   SQLITE_BUSY    
c1d0: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
c1e0: 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20   is locked",.   
c1f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   /* SQLITE_LOCKE
c200: 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  D      */ "datab
c210: 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63  ase table is loc
c220: 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ked",.    /* SQL
c230: 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20  ITE_NOMEM       
c240: 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  */ "out of memor
c250: 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  y",.    /* SQLIT
c260: 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f  E_READONLY    */
c270: 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69   "attempt to wri
c280: 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61  te a readonly da
c290: 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20  tabase",.    /* 
c2a0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
c2b0: 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70 74     */ "interrupt
c2c0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c2d0: 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20 2a  TE_IOERR       *
c2e0: 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f  / "disk I/O erro
c2f0: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
c300: 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a 2f  E_CORRUPT     */
c310: 20 22 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   "database disk 
c320: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
c330: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c340: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a  TE_NOTFOUND    *
c350: 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61  / "unknown opera
c360: 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51  tion",.    /* SQ
c370: 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20  LITE_FULL       
c380: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f 72   */ "database or
c390: 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a   disk is full",.
c3a0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41      /* SQLITE_CA
c3b0: 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e  NTOPEN    */ "un
c3c0: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
c3d0: 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20 20  abase file",.   
c3e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f   /* SQLITE_PROTO
c3f0: 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69  COL    */ "locki
c400: 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20  ng protocol",.  
c410: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54    /* SQLITE_EMPT
c420: 59 20 20 20 20 20 20 20 2a 2f 20 22 74 61 62 6c  Y       */ "tabl
c430: 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61  e contains no da
c440: 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ta",.    /* SQLI
c450: 54 45 5f 53 43 48 45 4d 41 20 20 20 20 20 20 2a  TE_SCHEMA      *
c460: 2f 20 22 64 61 74 61 62 61 73 65 20 73 63 68 65  / "database sche
c470: 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64 22 2c  ma has changed",
c480: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54  .    /* SQLITE_T
c490: 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f 20 22 73  OOBIG      */ "s
c4a0: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f  tring or blob to
c4b0: 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53  o big",.    /* S
c4c0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c4d0: 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74    */ "constraint
c4e0: 20 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a   failed",.    /*
c4f0: 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48   SQLITE_MISMATCH
c500: 20 20 20 20 2a 2f 20 22 64 61 74 61 74 79 70 65      */ "datatype
c510: 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20 20 20   mismatch",.    
c520: 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  /* SQLITE_MISUSE
c530: 20 20 20 20 20 20 2a 2f 20 22 6c 69 62 72 61 72        */ "librar
c540: 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64  y routine called
c550: 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65   out of sequence
c560: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c570: 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20  _NOLFS       */ 
c580: 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70  "large file supp
c590: 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65 64 22  ort is disabled"
c5a0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c5b0: 41 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20 22  AUTH        */ "
c5c0: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65  authorization de
c5d0: 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  nied",.    /* SQ
c5e0: 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20  LITE_FORMAT     
c5f0: 20 2a 2f 20 22 61 75 78 69 6c 69 61 72 79 20 64   */ "auxiliary d
c600: 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20 65  atabase format e
c610: 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rror",.    /* SQ
c620: 4c 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20 20  LITE_RANGE      
c630: 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c   */ "bind or col
c640: 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66  umn index out of
c650: 20 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20   range",.    /* 
c660: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20 20  SQLITE_NOTADB   
c670: 20 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20 65     */ "file is e
c680: 6e 63 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e  ncrypted or is n
c690: 6f 74 20 61 20 64 61 74 61 62 61 73 65 22 2c 0a  ot a database",.
c6a0: 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61    };.  const cha
c6b0: 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f  r *zErr = "unkno
c6c0: 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73 77 69  wn error";.  swi
c6d0: 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63  tch( rc ){.    c
c6e0: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
c6f0: 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20 20  _ROLLBACK: {.   
c700: 20 20 20 7a 45 72 72 20 3d 20 22 61 62 6f 72 74     zErr = "abort
c710: 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43 4b   due to ROLLBACK
c720: 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";.      break;.
c730: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
c740: 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 26 3d  t: {.      rc &=
c750: 20 30 78 66 66 3b 0a 20 20 20 20 20 20 69 66 28   0xff;.      if(
c760: 20 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20 26   ALWAYS(rc>=0) &
c770: 26 20 72 63 3c 41 72 72 61 79 53 69 7a 65 28 61  & rc<ArraySize(a
c780: 4d 73 67 29 20 26 26 20 61 4d 73 67 5b 72 63 5d  Msg) && aMsg[rc]
c790: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  !=0 ){.        z
c7a0: 45 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a  Err = aMsg[rc];.
c7b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
c7c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
c7d0: 20 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a   return zErr;.}.
c7e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
c7f0: 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  ine implements a
c800: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74   busy callback t
c810: 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20 74  hat sleeps and t
c820: 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e  ries.** again un
c830: 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76 61  til a timeout va
c840: 6c 75 65 20 69 73 20 72 65 61 63 68 65 64 2e 20  lue is reached. 
c850: 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61 6c   The timeout val
c860: 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65  ue is.** an inte
c870: 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  ger number of mi
c880: 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73 65  lliseconds passe
c890: 64 20 69 6e 20 61 73 20 74 68 65 20 66 69 72 73  d in as the firs
c8a0: 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  t.** argument..*
c8b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
c8c0: 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61  iteDefaultBusyCa
c8d0: 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70  llback(. void *p
c8e0: 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
c8f0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
c900: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74  nnection */. int
c910: 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20 20   count          
c920: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c930: 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68  of times table h
c940: 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a  as been busy */.
c950: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
c960: 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f 55 53 4c  _WIN || HAVE_USL
c970: 45 45 50 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  EEP.  static con
c980: 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d  st u8 delays[] =
c990: 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c  .     { 1, 2, 5,
c9a0: 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c   10, 15, 20, 25,
c9b0: 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20   25,  25,  50,  
c9c0: 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61  50, 100 };.  sta
c9d0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74  tic const u8 tot
c9e0: 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30  als[] =.     { 0
c9f0: 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20  , 1, 3,  8, 18, 
ca00: 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c  33, 53, 78, 103,
ca10: 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d   128, 178, 228 }
ca20: 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41  ;.# define NDELA
ca30: 59 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c 61  Y ArraySize(dela
ca40: 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ys).  sqlite3 *d
ca50: 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70  b = (sqlite3 *)p
ca60: 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75  tr;.  int timeou
ca70: 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d 65  t = db->busyTime
ca80: 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79  out;.  int delay
ca90: 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73 65  , prior;..  asse
caa0: 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a  rt( count>=0 );.
cab0: 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44    if( count < ND
cac0: 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c 61  ELAY ){.    dela
cad0: 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74  y = delays[count
cae0: 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74  ];.    prior = t
caf0: 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20  otals[count];.  
cb00: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61 79  }else{.    delay
cb10: 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59   = delays[NDELAY
cb20: 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  -1];.    prior =
cb30: 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31   totals[NDELAY-1
cb40: 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74  ] + delay*(count
cb50: 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20  -(NDELAY-1));.  
cb60: 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b 20  }.  if( prior + 
cb70: 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74 20  delay > timeout 
cb80: 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 74  ){.    delay = t
cb90: 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a  imeout - prior;.
cba0: 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d 30      if( delay<=0
cbb0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
cbc0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
cbd0: 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61  p(db->pVfs, dela
cbe0: 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  y*1000);.  retur
cbf0: 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  n 1;.#else.  sql
cc00: 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69  ite3 *db = (sqli
cc10: 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74  te3 *)ptr;.  int
cc20: 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73 71 6c   timeout = ((sql
cc30: 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75 73  ite3 *)ptr)->bus
cc40: 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20  yTimeout;.  if( 
cc50: 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e  (count+1)*1000 >
cc60: 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20   timeout ){.    
cc70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
cc80: 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64  sqlite3OsSleep(d
cc90: 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30 30  b->pVfs, 1000000
cca0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  );.  return 1;.#
ccb0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  endif.}../*.** I
ccc0: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
ccd0: 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a  busy handler..**
cce0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ccf0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
cd00: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69  an operation fai
cd10: 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63 6b 2e  led with a lock.
cd20: 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74  .** If this rout
cd30: 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ine returns non-
cd40: 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
cd50: 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20 69  s retried.  If i
cd60: 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c 20  t.** returns 0, 
cd70: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 62  the operation ab
cd80: 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51 4c  orts with an SQL
cd90: 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a  ITE_BUSY error..
cda0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
cdb0: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
cdc0: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 29 7b  BusyHandler *p){
cdd0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
cde0: 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c 7c 20   NEVER(p==0) || 
cdf0: 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20 70  p->xFunc==0 || p
ce00: 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75  ->nBusy<0 ) retu
ce10: 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d 3e  rn 0;.  rc = p->
ce20: 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70  xFunc(p->pArg, p
ce30: 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66 28 20  ->nBusy);.  if( 
ce40: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  rc==0 ){.    p->
ce50: 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65  nBusy = -1;.  }e
ce60: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73  lse{.    p->nBus
ce70: 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  y++;.  }.  retur
ce80: 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n rc; .}../*.** 
ce90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
cea0: 73 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  s the busy callb
ceb0: 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74  ack for an Sqlit
cec0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
ced0: 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62  e.** given callb
cee0: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ack function wit
cef0: 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75  h the given argu
cf00: 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
cf10: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
cf20: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
cf30: 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29  ,.  int (*xBusy)
cf40: 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76  (void*,int),.  v
cf50: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66  oid *pArg.){.#if
cf60: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
cf70: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
cf80: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
cf90: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
cfa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
cfb0: 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
cfc0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
cfd0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
cfe0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
cff0: 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73  ler.xFunc = xBus
d000: 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  y;.  db->busyHan
d010: 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67  dler.pArg = pArg
d020: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
d030: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
d040: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
d050: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
d060: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
d070: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
d080: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
d090: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d0a0: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
d0b0: 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BACK./*.** This 
d0c0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
d0d0: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
d0e0: 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65  ck for an Sqlite
d0f0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65   database to the
d100: 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  .** given callba
d110: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ck function with
d120: 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d   the given argum
d130: 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73  ent. The progres
d140: 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a  s callback will.
d150: 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76  ** be invoked ev
d160: 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73  ery nOps opcodes
d170: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d180: 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  3_progress_handl
d190: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  er(.  sqlite3 *d
d1a0: 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a  b, .  int nOps,.
d1b0: 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73    int (*xProgres
d1c0: 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f  s)(void*), .  vo
d1d0: 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64  id *pArg.){.#ifd
d1e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d1f0: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
d200: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
d210: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
d220: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
d230: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
d240: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
d250: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
d260: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
d270: 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e  ex);.  if( nOps>
d280: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72  0 ){.    db->xPr
d290: 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72 65  ogress = xProgre
d2a0: 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f  ss;.    db->nPro
d2b0: 67 72 65 73 73 4f 70 73 20 3d 20 28 75 6e 73 69  gressOps = (unsi
d2c0: 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20 20 20 64  gned)nOps;.    d
d2d0: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20  b->pProgressArg 
d2e0: 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b  = pArg;.  }else{
d2f0: 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65  .    db->xProgre
d300: 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  ss = 0;.    db->
d310: 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30  nProgressOps = 0
d320: 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72  ;.    db->pProgr
d330: 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a  essArg = 0;.  }.
d340: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d350: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
d360: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
d370: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d380: 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75  installs a defau
d390: 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  lt busy handler 
d3a0: 74 68 61 74 20 77 61 69 74 73 20 66 6f 72 20 74  that waits for t
d3b0: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  he.** specified 
d3c0: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
d3d0: 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65  econds before re
d3e0: 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e  turning 0..*/.in
d3f0: 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74  t sqlite3_busy_t
d400: 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a  imeout(sqlite3 *
d410: 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 23 69 66  db, int ms){.#if
d420: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d430: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
d440: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
d450: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
d460: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
d470: 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
d480: 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20    if( ms>0 ){.  
d490: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
d4a0: 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74  andler(db, sqlit
d4b0: 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c  eDefaultBusyCall
d4c0: 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29  back, (void*)db)
d4d0: 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69  ;.    db->busyTi
d4e0: 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 7d 65  meout = ms;.  }e
d4f0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
d500: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62  _busy_handler(db
d510: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
d520: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20  .}../*.** Cause 
d540: 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72  any pending oper
d550: 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74  ation to stop at
d560: 20 69 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70   its earliest op
d570: 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f  portunity..*/.vo
d580: 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  id sqlite3_inter
d590: 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62  rupt(sqlite3 *db
d5a0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
d5b0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
d5c0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
d5d0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
d5e0: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
d5f0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
d600: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
d610: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e   }.#endif.  db->
d620: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
d630: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
d640: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
d650: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
d660: 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65  e as sqlite3_cre
d670: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  ate_function(), 
d680: 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69  except.** that i
d690: 74 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  t is designed to
d6a0: 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e   be called by in
d6b0: 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65  ternal code. The
d6c0: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a   difference is.*
d6d0: 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c  * that if a mall
d6e0: 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71  oc() fails in sq
d6f0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
d700: 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f  ction(), an erro
d710: 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74  r code.** is ret
d720: 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61  urned and the ma
d730: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
d740: 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74  cleared. .*/.int
d750: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
d760: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nc(.  sqlite3 *d
d770: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
d780: 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a  *zFunctionName,.
d790: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
d7a0: 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70  t enc,.  void *p
d7b0: 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64  UserData,.  void
d7c0: 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74   (*xSFunc)(sqlit
d7d0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
d7e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
d7f0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
d800: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
d810: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
d820: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
d830: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
d840: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20  te3_context*),. 
d850: 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20   FuncDestructor 
d860: 2a 70 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a  *pDestructor.){.
d870: 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20    FuncDef *p;.  
d880: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74  int nName;.  int
d890: 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20   extraFlags;..  
d8a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d8b0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
d8c0: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a  utex) );.  if( z
d8d0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20  FunctionName==0 
d8e0: 7c 7c 0a 20 20 20 20 20 20 28 78 53 46 75 6e 63  ||.      (xSFunc
d8f0: 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78   && (xFinal || x
d900: 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20  Step)) || .     
d910: 20 28 21 78 53 46 75 6e 63 20 26 26 20 28 78 46   (!xSFunc && (xF
d920: 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29 29  inal && !xStep))
d930: 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 53 46 75   ||.      (!xSFu
d940: 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26  nc && (!xFinal &
d950: 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20  & xStep)) ||.   
d960: 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e     (nArg<-1 || n
d970: 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46  Arg>SQLITE_MAX_F
d980: 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a  UNCTION_ARG) ||.
d990: 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d        (255<(nNam
d9a0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
d9b0: 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  n30( zFunctionNa
d9c0: 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74  me))) ){.    ret
d9d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
d9e0: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 61  E_BKPT;.  }..  a
d9f0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
da00: 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c  NC_CONSTANT==SQL
da10: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
da20: 43 20 29 3b 0a 20 20 65 78 74 72 61 46 6c 61 67  C );.  extraFlag
da30: 73 20 3d 20 65 6e 63 20 26 20 20 53 51 4c 49 54  s = enc &  SQLIT
da40: 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 3b  E_DETERMINISTIC;
da50: 0a 20 20 65 6e 63 20 26 3d 20 28 53 51 4c 49 54  .  enc &= (SQLIT
da60: 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53  E_FUNC_ENCMASK|S
da70: 51 4c 49 54 45 5f 41 4e 59 29 3b 0a 20 20 0a 23  QLITE_ANY);.  .#
da80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
da90: 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66  IT_UTF16.  /* If
daa0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
dab0: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
dac0: 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
dad0: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
dae0: 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
daf0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
db00: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
db10: 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
db20: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
db30: 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
db40: 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
db50: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
db60: 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54  **.  ** If SQLIT
db70: 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66 69  E_ANY is specifi
db80: 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76 65  ed, add three ve
db90: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75  rsions of the fu
dba0: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74  nction.  ** to t
dbb0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20  he hash table.. 
dbc0: 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53   */.  if( enc==S
dbd0: 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20  QLITE_UTF16 ){. 
dbe0: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
dbf0: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
dc00: 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51  else if( enc==SQ
dc10: 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20  LITE_ANY ){.    
dc20: 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  int rc;.    rc =
dc30: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
dc40: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
dc50: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
dc60: 54 45 5f 55 54 46 38 7c 65 78 74 72 61 46 6c 61  TE_UTF8|extraFla
dc70: 67 73 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73  gs,.         pUs
dc80: 65 72 44 61 74 61 2c 20 78 53 46 75 6e 63 2c 20  erData, xSFunc, 
dc90: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70  xStep, xFinal, p
dca0: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
dcb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
dcc0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
dcd0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
dce0: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
dcf0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
dd00: 54 45 5f 55 54 46 31 36 4c 45 7c 65 78 74 72 61  TE_UTF16LE|extra
dd10: 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
dd20: 20 70 55 73 65 72 44 61 74 61 2c 20 78 53 46 75   pUserData, xSFu
dd30: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
dd40: 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b  l, pDestructor);
dd50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
dd60: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
dd70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
dd80: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d  .    }.    enc =
dd90: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b   SQLITE_UTF16BE;
dda0: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63  .  }.#else.  enc
ddb0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
ddc0: 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43  #endif.  .  /* C
ddd0: 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74  heck if an exist
dde0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ing function is 
ddf0: 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e  being overridden
de00: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20   or deleted. If 
de10: 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  so,.  ** and the
de20: 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d  re are active VM
de30: 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53  s, then return S
de40: 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61  QLITE_BUSY. If a
de50: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
de60: 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64  s being overridd
de70: 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74  en/deleted but t
de80: 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69  here are no acti
de90: 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68  ve VMs, allow th
dea0: 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  e.  ** operation
deb0: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74   to continue but
dec0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
ded0: 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  precompiled stat
dee0: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70  ements..  */.  p
def0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
df00: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63  nction(db, zFunc
df10: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  tionName, nName,
df20: 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20   nArg, (u8)enc, 
df30: 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 28  0);.  if( p && (
df40: 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  p->funcFlags & S
df50: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41  QLITE_FUNC_ENCMA
df60: 53 4b 29 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e  SK)==enc && p->n
df70: 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20  Arg==nArg ){.   
df80: 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63   if( db->nVdbeAc
df90: 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71  tive ){.      sq
dfa0: 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
dfb0: 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  g(db, SQLITE_BUS
dfc0: 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61  Y, .        "una
dfd0: 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f  ble to delete/mo
dfe0: 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74 69  dify user-functi
dff0: 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76 65  on due to active
e000: 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20   statements");. 
e010: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
e020: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e030: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
e040: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
e050: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
e060: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
e070: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
e080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
e090: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
e0a0: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63  nction(db, zFunc
e0b0: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  tionName, nName,
e0c0: 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20   nArg, (u8)enc, 
e0d0: 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c  1);.  assert(p |
e0e0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
e0f0: 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  ed);.  if( !p ){
e100: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e110: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
e120: 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72 20   /* If an older 
e130: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 66  version of the f
e140: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20 63  unction with a c
e150: 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74 72 75  onfigured destru
e160: 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65 69  ctor is.  ** bei
e170: 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76 6f  ng replaced invo
e180: 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
e190: 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e  r function here.
e1a0: 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44 65   */.  functionDe
e1b0: 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a 20  stroy(db, p);.. 
e1c0: 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72   if( pDestructor
e1d0: 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63   ){.    pDestruc
e1e0: 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  tor->nRef++;.  }
e1f0: 0a 20 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f  .  p->pDestructo
e200: 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72 3b  r = pDestructor;
e210: 0a 20 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  .  p->funcFlags 
e220: 3d 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  = (p->funcFlags 
e230: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e  & SQLITE_FUNC_EN
e240: 43 4d 41 53 4b 29 20 7c 20 65 78 74 72 61 46 6c  CMASK) | extraFl
e250: 61 67 73 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ags;.  testcase(
e260: 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20   p->funcFlags & 
e270: 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
e280: 53 54 49 43 20 29 3b 0a 20 20 70 2d 3e 78 53 46  STIC );.  p->xSF
e290: 75 6e 63 20 3d 20 78 53 46 75 6e 63 20 3f 20 78  unc = xSFunc ? x
e2a0: 53 46 75 6e 63 20 3a 20 78 53 74 65 70 3b 0a 20  SFunc : xStep;. 
e2b0: 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20   p->xFinalize = 
e2c0: 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73  xFinal;.  p->pUs
e2d0: 65 72 44 61 74 61 20 3d 20 70 55 73 65 72 44 61  erData = pUserDa
e2e0: 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20  ta;.  p->nArg = 
e2f0: 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72 65 74  (u16)nArg;.  ret
e300: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e310: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e  ../*.** Create n
e320: 65 77 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  ew user function
e330: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
e340: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
e350: 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n(.  sqlite3 *db
e360: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e370: 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72  zFunc,.  int nAr
e380: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
e390: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
e3a0: 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65  (*xSFunc)(sqlite
e3b0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
e3c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
e3d0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
e3e0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e3f0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
e400: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
e410: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
e420: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a  e3_context*).){.
e430: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
e440: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
e450: 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e  _v2(db, zFunc, n
e460: 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 53 46  Arg, enc, p, xSF
e470: 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20  unc, xStep,.    
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69  xFinal, 0);.}..i
e4b0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
e4c0: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20  e_function_v2(. 
e4d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
e4e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
e4f0: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
e500: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
e510: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53   *p,.  void (*xS
e520: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
e530: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
e540: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
e550: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
e560: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
e570: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
e580: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
e590: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
e5a0: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64  ontext*),.  void
e5b0: 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69   (*xDestroy)(voi
e5c0: 64 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d *).){.  int rc
e5d0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
e5e0: 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f  .  FuncDestructo
e5f0: 72 20 2a 70 41 72 67 20 3d 20 30 3b 0a 0a 23 69  r *pArg = 0;..#i
e600: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
e610: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
e620: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
e630: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
e640: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e650: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
e660: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
e670: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
e680: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
e690: 28 20 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  ( xDestroy ){.  
e6a0: 20 20 70 41 72 67 20 3d 20 28 46 75 6e 63 44 65    pArg = (FuncDe
e6b0: 73 74 72 75 63 74 6f 72 20 2a 29 73 71 6c 69 74  structor *)sqlit
e6c0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
e6d0: 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63 44 65  b, sizeof(FuncDe
e6e0: 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20  structor));.    
e6f0: 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20  if( !pArg ){.   
e700: 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a     xDestroy(p);.
e710: 20 20 20 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a        goto out;.
e720: 20 20 20 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e      }.    pArg->
e730: 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74  xDestroy = xDest
e740: 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70  roy;.    pArg->p
e750: 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20  UserData = p;.  
e760: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
e770: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
e780: 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Func, nArg, enc,
e790: 20 70 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65   p, xSFunc, xSte
e7a0: 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41 72 67 29  p, xFinal, pArg)
e7b0: 3b 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20  ;.  if( pArg && 
e7c0: 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  pArg->nRef==0 ){
e7d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
e7e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
e7f0: 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20    xDestroy(p);. 
e800: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
e810: 28 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a  (db, pArg);.  }.
e820: 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73 71  . out:.  rc = sq
e830: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
e840: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
e850: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
e860: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
e870: 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
e880: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
e890: 36 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  6.int sqlite3_cr
e8a0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28  eate_function16(
e8b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
e8c0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46    const void *zF
e8d0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69  unctionName,.  i
e8e0: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
e8f0: 54 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64 20  TextRep,.  void 
e900: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46  *p,.  void (*xSF
e910: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
e920: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
e930: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
e940: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
e950: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
e960: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
e970: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
e980: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
e990: 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  ext*).){.  int r
e9a0: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63  c;.  char *zFunc
e9b0: 38 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  8;..#ifdef SQLIT
e9c0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
e9d0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
e9e0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
e9f0: 62 29 20 7c 7c 20 7a 46 75 6e 63 74 69 6f 6e 4e  b) || zFunctionN
ea00: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ame==0 ) return 
ea10: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
ea20: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
ea30: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
ea40: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
ea50: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
ea60: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46  ocFailed );.  zF
ea70: 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55 74  unc8 = sqlite3Ut
ea80: 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63  f16to8(db, zFunc
ea90: 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  tionName, -1, SQ
eaa0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
eab0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
eac0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
ead0: 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65 54  zFunc8, nArg, eT
eae0: 65 78 74 52 65 70 2c 20 70 2c 20 78 53 46 75 6e  extRep, p, xSFun
eaf0: 63 2c 78 53 74 65 70 2c 78 46 69 6e 61 6c 2c 30  c,xStep,xFinal,0
eb00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
eb10: 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a  ee(db, zFunc8);.
eb20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
eb30: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
eb40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
eb50: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
eb60: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
eb70: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
eb80: 65 63 6c 61 72 65 20 74 68 61 74 20 61 20 66 75  eclare that a fu
eb90: 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  nction has been 
eba0: 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20  overloaded by a 
ebb0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
ebc0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63  *.** If the func
ebd0: 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69  tion already exi
ebe0: 73 74 73 20 61 73 20 61 20 72 65 67 75 6c 61 72  sts as a regular
ebf0: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
ec00: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
ec10: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
ec20: 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63 74  p.  If the funct
ec30: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ion does not exi
ec40: 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a  st, then create.
ec50: 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61  ** a new one tha
ec60: 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20  t always throws 
ec70: 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72  a run-time error
ec80: 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76  .  .**.** When v
ec90: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e  irtual tables in
eca0: 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20  tend to provide 
ecb0: 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75  an overloaded fu
ecc0: 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20  nction, they.** 
ecd0: 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73  should call this
ece0: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65   routine to make
ecf0: 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c   sure the global
ed00: 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73   function exists
ed10: 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75  ..** A global fu
ed20: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73  nction must exis
ed30: 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e  t in order for n
ed40: 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74  ame resolution t
ed50: 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72  o work.** proper
ed60: 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
ed70: 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63  e3_overload_func
ed80: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  tion(.  sqlite3 
ed90: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
eda0: 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  r *zName,.  int 
edb0: 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20 6e 4e  nArg.){.  int nN
edc0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
edd0: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
ede0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
edf0: 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  OK;..#ifdef SQLI
ee00: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
ee10: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
ee20: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
ee30: 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20  db) || zName==0 
ee40: 7c 7c 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20  || nArg<-2 ){.  
ee50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ee60: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
ee70: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
ee80: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
ee90: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
eea0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
eeb0: 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  ion(db, zName, n
eec0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
eed0: 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29  TE_UTF8, 0)==0 )
eee0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
eef0: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
ef00: 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51   zName, nArg, SQ
ef10: 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20  LITE_UTF8,.     
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef30: 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33        0, sqlite3
ef40: 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c  InvalidFunction,
ef50: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 0, 0);.  }. 
ef60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
ef70: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
ef80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ef90: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
efa0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
efb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
efc0: 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  MIT_TRACE./*.** 
efd0: 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65  Register a trace
efe0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
eff0: 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
f000: 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
f010: 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20  red trace.** is 
f020: 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a  returned.  .**.*
f030: 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66  * A NULL trace f
f040: 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  unction means th
f050: 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73  at no tracing is
f060: 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
f070: 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20  n-NULL.** trace 
f080: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
f090: 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
f0a0: 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  is invoked at th
f0b0: 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a  e start of each.
f0c0: 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
f0d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
f0e0: 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33  e3_trace(sqlite3
f0f0: 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72   *db, void (*xTr
f100: 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  ace)(void*,const
f110: 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70   char*), void *p
f120: 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  Arg){.  void *pO
f130: 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ld;..#ifdef SQLI
f140: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
f150: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
f160: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
f170: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
f180: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
f190: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
f1a0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
f1b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
f1c0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
f1d0: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72    pOld = db->pTr
f1e0: 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54  aceArg;.  db->xT
f1f0: 72 61 63 65 20 3d 20 78 54 72 61 63 65 3b 0a 20  race = xTrace;. 
f200: 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d   db->pTraceArg =
f210: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
f220: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
f230: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
f240: 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  n pOld;.}./*.** 
f250: 52 65 67 69 73 74 65 72 20 61 20 70 72 6f 66 69  Register a profi
f260: 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  le function.  Th
f270: 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20  e pArg from the 
f280: 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
f290: 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c  tered .** profil
f2a0: 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  e function is re
f2b0: 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
f2c0: 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66  A NULL profile f
f2d0: 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  unction means th
f2e0: 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20  at no profiling 
f2f0: 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20  is executes.  A 
f300: 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66  non-NULL.** prof
f310: 69 6c 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ile is a pointer
f320: 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
f330: 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  hat is invoked a
f340: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
f350: 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20   of.** each SQL 
f360: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69  statement that i
f370: 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  s run..*/.void *
f380: 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28  sqlite3_profile(
f390: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
f3a0: 20 20 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c    void (*xProfil
f3b0: 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
f3c0: 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74  har*,sqlite_uint
f3d0: 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  64),.  void *pAr
f3e0: 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  g.){.  void *pOl
f3f0: 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d;..#ifdef SQLIT
f400: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
f410: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
f420: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
f430: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
f440: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
f450: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
f460: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
f470: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
f480: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
f490: 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f   pOld = db->pPro
f4a0: 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  fileArg;.  db->x
f4b0: 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69  Profile = xProfi
f4c0: 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69  le;.  db->pProfi
f4d0: 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  leArg = pArg;.  
f4e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f4f0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
f500: 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d    return pOld;.}
f510: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
f520: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a  E_OMIT_TRACE */.
f530: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
f540: 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  a function to be
f550: 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20   invoked when a 
f560: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
f570: 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  its..** If the i
f580: 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20  nvoked function 
f590: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
f5a0: 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69  , then the commi
f5b0: 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72  t becomes a.** r
f5c0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64  ollback..*/.void
f5d0: 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74   *sqlite3_commit
f5e0: 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
f5f0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
f600: 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
f610: 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
f620: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
f630: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
f640: 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f  d*),  /* Functio
f650: 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65  n to invoke on e
f660: 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  ach commit */.  
f670: 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
f680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
f690: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
f6a0: 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ction */.){.  vo
f6b0: 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65  id *pOld;..#ifde
f6c0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
f6d0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
f6e0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
f6f0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
f700: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
f710: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
f720: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
f730: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
f740: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
f750: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
f760: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20  b->pCommitArg;. 
f770: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
f780: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
f790: 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ;.  db->pCommitA
f7a0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
f7b0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f7c0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
f7d0: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f  eturn pOld;.}../
f7e0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
f7f0: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
f800: 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
f810: 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65   a row is update
f820: 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f  d,.** inserted o
f830: 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  r deleted using 
f840: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
f850: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
f860: 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74  d *sqlite3_updat
f870: 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  e_hook(.  sqlite
f880: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
f890: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
f8a0: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
f8b0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
f8c0: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
f8d0: 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f  oid*,int,char co
f8e0: 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74  nst *,char const
f8f0: 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29   *,sqlite_int64)
f900: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f920: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
f930: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
f940: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23    void *pRet;..#
f950: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f960: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
f970: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
f980: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
f990: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
f9a0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
f9b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f9c0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
f9d0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
f9e0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
f9f0: 20 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72   = db->pUpdateAr
fa00: 67 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65  g;.  db->xUpdate
fa10: 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
fa20: 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64  back;.  db->pUpd
fa30: 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ateArg = pArg;. 
fa40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
fa50: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
fa60: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
fa70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
fa80: 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
fa90: 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
faa0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
fab0: 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20  on is rolled.** 
fac0: 62 61 63 6b 20 62 79 20 74 68 69 73 20 64 61 74  back by this dat
fad0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
fae0: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
faf0: 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b  e3_rollback_hook
fb00: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
fb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fb20: 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
fb30: 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
fb40: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  e */.  void (*xC
fb50: 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c  allback)(void*),
fb60: 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e   /* Callback fun
fb70: 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
fb80: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
fb90: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
fba0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
fbb0: 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
fbc0: 52 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  Ret;..#ifdef SQL
fbd0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
fbe0: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
fbf0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
fc00: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
fc10: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
fc20: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
fc30: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
fc40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
fc50: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
fc60: 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52  .  pRet = db->pR
fc70: 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62  ollbackArg;.  db
fc80: 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62  ->xRollbackCallb
fc90: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
fca0: 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  .  db->pRollback
fcb0: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
fcc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
fcd0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
fce0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
fcf0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
fd00: 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
fd10: 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  OOK./*.** Regist
fd20: 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
fd30: 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
fd40: 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75   time a row is u
fd50: 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72  pdated,.** inser
fd60: 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75  ted or deleted u
fd70: 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61  sing this databa
fd80: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
fd90: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
fda0: 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a  preupdate_hook(.
fdb0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
fdd0: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
fde0: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
fdf0: 2a 2f 0a 20 20 76 6f 69 64 28 2a 78 43 61 6c 6c  */.  void(*xCall
fe00: 62 61 63 6b 29 28 20 20 20 20 20 20 20 20 20 2f  back)(         /
fe10: 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  * Callback funct
fe20: 69 6f 6e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 2a  ion */.    void*
fe30: 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 2c 63 68  ,sqlite3*,int,ch
fe40: 61 72 20 63 6f 6e 73 74 2a 2c 63 68 61 72 20 63  ar const*,char c
fe50: 6f 6e 73 74 2a 2c 73 71 6c 69 74 65 33 5f 69 6e  onst*,sqlite3_in
fe60: 74 36 34 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36  t64,sqlite3_int6
fe70: 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  4),.  void *pArg
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe90: 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c 62 61 63  /* First callbac
fea0: 6b 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  k argument */.){
feb0: 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20  .  void *pRet;. 
fec0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
fed0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
fee0: 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 50  .  pRet = db->pP
fef0: 72 65 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64  reUpdateArg;.  d
ff00: 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c  b->xPreUpdateCal
ff10: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
ff20: 6b 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64  k;.  db->pPreUpd
ff30: 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ateArg = pArg;. 
ff40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
ff50: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
ff60: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
ff70: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ff80: 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
ff90: 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66  ATE_HOOK */..#if
ffa0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ffb0: 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  _WAL./*.** The s
ffc0: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
ffd0: 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73  ) callback regis
ffe0: 74 65 72 65 64 20 62 79 20 73 71 6c 69 74 65 33  tered by sqlite3
fff0: 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
10000 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65  int()..** Invoke
10010 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
10020 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e  ckpoint if the n
10030 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20  umber of frames 
10040 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a  in the log file.
10050 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
10060 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41  an sqlite3.pWalA
10070 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e  rg cast to an in
10080 74 65 67 65 72 20 28 74 68 65 20 76 61 6c 75 65  teger (the value
10090 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a   configured by.*
100a0 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  * wal_autocheckp
100b0 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74  oint())..*/ .int
100c0 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75   sqlite3WalDefau
100d0 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a  ltHook(.  void *
100e0 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20  pClientData,    
100f0 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a   /* Argument */.
10100 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
10110 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e           /* Conn
10120 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ection */.  cons
10130 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
10140 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a     /* Database *
10150 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20  /.  int nFrame  
10160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
10170 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a  ze of WAL */.){.
10180 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51    if( nFrame>=SQ
10190 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
101a0 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a  pClientData) ){.
101b0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
101c0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
101d0 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
101e0 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a  checkpoint(db, z
101f0 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
10200 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
10210 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
10220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
10230 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
10240 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
10250 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71   Configure an sq
10260 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
10270 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74   callback to aut
10280 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b  omatically check
10290 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62  point.** a datab
102a0 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74  ase after commit
102b0 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
102c0 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  on if there are 
102d0 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72  nFrame or.** mor
102e0 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20  e frames in the 
102f0 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e  log file. Passin
10300 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61  g zero or a nega
10310 74 69 76 65 20 76 61 6c 75 65 20 61 73 20 74 68  tive value as th
10320 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61  e.** nFrame para
10330 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73 20 61  meter disables a
10340 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f  utomatic checkpo
10350 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a  ints entirely..*
10360 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63  *.** The callbac
10370 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20  k registered by 
10380 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
10390 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73 74  places any exist
103a0 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  ing callback.** 
103b0 72 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67  registered using
103c0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
103d0 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72  k(). Likewise, r
103e0 65 67 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c  egistering a cal
103f0 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73  lback.** using s
10400 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
10410 29 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61  ) disables the a
10420 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f  utomatic checkpo
10430 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a  int mechanism.**
10440 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74   configured by t
10450 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
10460 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c  .int sqlite3_wal
10470 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
10480 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
10490 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66   nFrame){.#ifdef
104a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
104b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
104c0 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45  TER(db);.  UNUSE
104d0 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61  D_PARAMETER(nFra
104e0 6d 65 29 3b 0a 23 65 6c 73 65 0a 23 69 66 64 65  me);.#else.#ifde
104f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10500 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
10510 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
10520 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
10530 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
10540 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
10550 69 66 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a  if( nFrame>0 ){.
10560 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
10570 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65 33  hook(db, sqlite3
10580 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20  WalDefaultHook, 
10590 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
105a0 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65  R(nFrame));.  }e
105b0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
105c0 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c  _wal_hook(db, 0,
105d0 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
105e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
105f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  OK;.}../*.** Reg
10600 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
10610 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
10620 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73  ach time a trans
10630 61 63 74 69 6f 6e 20 69 73 20 77 72 69 74 74 65  action is writte
10640 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77 72  n.** into the wr
10650 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79  ite-ahead-log by
10660 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
10670 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
10680 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f  id *sqlite3_wal_
10690 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
106a0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
106b0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
106c0 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
106d0 69 73 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a  is db handle */.
106e0 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b    int(*xCallback
106f0 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65  )(void *, sqlite
10700 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c  3*, const char*,
10710 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70   int),.  void *p
10720 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
10730 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
10740 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
10750 64 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29  d to xCallback()
10760 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
10770 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
10780 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 23 69 66   void *pRet;.#if
10790 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
107a0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
107b0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
107c0 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
107d0 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
107e0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
107f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
10800 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
10810 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
10820 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
10830 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20   db->pWalArg;.  
10840 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b  db->xWalCallback
10850 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
10860 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70 41  db->pWalArg = pA
10870 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
10880 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
10890 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
108a0 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  Ret;.#else.  ret
108b0 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
108c0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e  ./*.** Checkpoin
108d0 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 0a  t database zDb..
108e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
108f0 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
10900 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
10910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10920 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
10930 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
10940 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
10950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10960 61 6d 65 20 6f 66 20 61 74 74 61 63 68 65 64 20  ame of attached 
10970 64 61 74 61 62 61 73 65 20 28 6f 72 20 4e 55 4c  database (or NUL
10980 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64  L) */.  int eMod
10990 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
109a0 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
109b0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76  E_CHECKPOINT_* v
109c0 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
109d0 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20 20 20 20  nLog,           
109e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
109f0 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f  : Size of WAL lo
10a00 67 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20  g in frames */. 
10a10 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20 20   int *pnCkpt    
10a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a30 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e   /* OUT: Total n
10a40 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20  umber of frames 
10a50 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a  checkpointed */.
10a60 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
10a70 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74 75  _OMIT_WAL.  retu
10a80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
10a90 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  lse.  int rc;   
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ab0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
10ac0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  code */.  int iD
10ad0 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  b = SQLITE_MAX_A
10ae0 54 54 41 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c  TTACHED;  /* sql
10af0 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78  ite3.aDb[] index
10b00 20 6f 66 20 64 62 20 74 6f 20 63 68 65 63 6b 70   of db to checkp
10b10 6f 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20  oint */..#ifdef 
10b20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
10b30 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
10b40 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
10b50 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
10b60 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
10b70 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  KPT;.#endif..  /
10b80 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
10b90 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
10ba0 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20  s to -1 in case 
10bb0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
10bc0 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20   */.  if( pnLog 
10bd0 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20  ) *pnLog = -1;. 
10be0 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70   if( pnCkpt ) *p
10bf0 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61  nCkpt = -1;..  a
10c00 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
10c10 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
10c20 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
10c30 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
10c40 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20  NT_FULL==1 );.  
10c50 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
10c60 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
10c70 54 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74  T==2 );.  assert
10c80 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
10c90 49 4e 54 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20  INT_TRUNCATE==3 
10ca0 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53  );.  if( eMode<S
10cb0 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
10cc0 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64  _PASSIVE || eMod
10cd0 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  e>SQLITE_CHECKPO
10ce0 49 4e 54 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a  INT_TRUNCATE ){.
10cf0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
10d00 4f 46 3a 20 52 2d 30 33 39 39 36 2d 31 32 30 38  OF: R-03996-1208
10d10 38 20 54 68 65 20 4d 20 70 61 72 61 6d 65 74 65  8 The M paramete
10d20 72 20 6d 75 73 74 20 62 65 20 61 20 76 61 6c 69  r must be a vali
10d30 64 20 63 68 65 63 6b 70 6f 69 6e 74 0a 20 20 20  d checkpoint.   
10d40 20 2a 2a 20 6d 6f 64 65 3a 20 2a 2f 0a 20 20 20   ** mode: */.   
10d50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
10d60 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71  ISUSE;.  }..  sq
10d70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
10d80 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
10d90 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62 5b 30  if( zDb && zDb[0
10da0 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 73  ] ){.    iDb = s
10db0 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
10dc0 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20  (db, zDb);.  }. 
10dd0 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20   if( iDb<0 ){.  
10de0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
10df0 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
10e00 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
10e10 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22   SQLITE_ERROR, "
10e20 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
10e30 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d  : %s", zDb);.  }
10e40 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 62 75  else{.    db->bu
10e50 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20  syHandler.nBusy 
10e60 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
10e70 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
10e80 64 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20  db, iDb, eMode, 
10e90 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a  pnLog, pnCkpt);.
10ea0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10eb0 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  (db, rc);.  }.  
10ec0 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
10ed0 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
10ee0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
10ef0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
10f00 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
10f10 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  if.}.../*.** Che
10f20 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65  ckpoint database
10f30 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20   zDb. If zDb is 
10f40 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20  NULL, or if the 
10f50 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74  buffer zDb point
10f60 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73  s.** to contains
10f70 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73   a zero-length s
10f80 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63  tring, all attac
10f90 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72  hed databases ar
10fa0 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74  e .** checkpoint
10fb0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
10fc0 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
10fd0 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  t(sqlite3 *db, c
10fe0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
10ff0 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
11000 46 3a 20 52 2d 34 31 36 31 33 2d 32 30 35 35 33  F: R-41613-20553
11010 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c   The sqlite3_wal
11020 5f 63 68 65 63 6b 70 6f 69 6e 74 28 44 2c 58 29  _checkpoint(D,X)
11030 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
11040 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 77  o.  ** sqlite3_w
11050 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
11060 28 44 2c 58 2c 53 51 4c 49 54 45 5f 43 48 45 43  (D,X,SQLITE_CHEC
11070 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30  KPOINT_PASSIVE,0
11080 2c 30 29 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ,0). */.  return
11090 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
110a0 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 7a 44  ckpoint_v2(db,zD
110b0 62 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  b,SQLITE_CHECKPO
110c0 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30 29  INT_PASSIVE,0,0)
110d0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
110e0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
110f0 2a 2a 20 52 75 6e 20 61 20 63 68 65 63 6b 70 6f  ** Run a checkpo
11100 69 6e 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20  int on database 
11110 69 44 62 2e 20 54 68 69 73 20 69 73 20 61 20 6e  iDb. This is a n
11120 6f 2d 6f 70 20 69 66 20 64 61 74 61 62 61 73 65  o-op if database
11130 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63   iDb is.** not c
11140 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e  urrently open in
11150 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a   WAL mode..**.**
11160 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
11170 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  n is open on the
11180 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
11190 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68  checkpointed, th
111a0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
111b0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c  returns SQLITE_L
111c0 4f 43 4b 45 44 20 61 6e 64 20 61 20 63 68 65 63  OCKED and a chec
111d0 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 74  kpoint is not at
111e0 74 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20  tempted. If .** 
111f0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
11200 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68  while running th
11210 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e  e checkpoint, an
11220 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
11230 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  de is .** return
11240 65 64 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f  ed (i.e. SQLITE_
11250 49 4f 45 52 52 29 2e 20 4f 74 68 65 72 77 69 73  IOERR). Otherwis
11260 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  e, SQLITE_OK..**
11270 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 6e  .** The mutex on
11280 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
11290 20 64 62 20 73 68 6f 75 6c 64 20 62 65 20 68 65   db should be he
112a0 6c 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ld by the caller
112b0 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61  . The mutex.** a
112c0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
112d0 68 65 20 73 70 65 63 69 66 69 63 20 62 2d 74 72  he specific b-tr
112e0 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f  ee being checkpo
112f0 69 6e 74 65 64 20 69 73 20 74 61 6b 65 6e 20 62  inted is taken b
11300 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  y.** this functi
11310 6f 6e 20 77 68 69 6c 65 20 74 68 65 20 63 68 65  on while the che
11320 63 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69  ckpoint is runni
11330 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  ng..**.** If iDb
11340 20 69 73 20 70 61 73 73 65 64 20 53 51 4c 49 54   is passed SQLIT
11350 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 20  E_MAX_ATTACHED, 
11360 74 68 65 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  then all attache
11370 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65 0a  d databases are.
11380 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e  ** checkpointed.
11390 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
113a0 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69  encountered it i
113b0 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64  s returned immed
113c0 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61  iately -.** no a
113d0 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
113e0 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79  o checkpoint any
113f0 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 62   remaining datab
11400 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  ases..**.** Para
11410 6d 65 74 65 72 20 65 4d 6f 64 65 20 69 73 20 6f  meter eMode is o
11420 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45  ne of SQLITE_CHE
11430 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c  CKPOINT_PASSIVE,
11440 20 46 55 4c 4c 20 6f 72 20 52 45 53 54 41 52 54   FULL or RESTART
11450 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11460 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  Checkpoint(sqlit
11470 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
11480 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20   int eMode, int 
11490 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43  *pnLog, int *pnC
114a0 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  kpt){.  int rc =
114b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
114c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
114d0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
114e0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
114f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
11500 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
11510 68 72 6f 75 67 68 20 61 74 74 61 63 68 65 64 20  hrough attached 
11520 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75  dbs */.  int bBu
11530 73 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sy = 0;         
11540 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
11550 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   if SQLITE_BUSY 
11560 68 61 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  has been encount
11570 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ered */..  asser
11580 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11590 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
115a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
115b0 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d  nLog || *pnLog==
115c0 2d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  -1 );.  assert( 
115d0 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b  !pnCkpt || *pnCk
115e0 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72  pt==-1 );..  for
115f0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20  (i=0; i<db->nDb 
11600 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
11610 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
11620 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53  i==iDb || iDb==S
11630 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
11640 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ED ){.      rc =
11650 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 68 65   sqlite3BtreeChe
11660 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b  ckpoint(db->aDb[
11670 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70  i].pBt, eMode, p
11680 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20  nLog, pnCkpt);. 
11690 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a       pnLog = 0;.
116a0 20 20 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30        pnCkpt = 0
116b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
116c0 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
116d0 20 20 20 20 20 20 20 62 42 75 73 79 20 3d 20 31         bBusy = 1
116e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
116f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
11700 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
11710 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
11720 45 5f 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f  E_OK && bBusy) ?
11730 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72   SQLITE_BUSY : r
11740 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
11750 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
11760 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
11770 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
11780 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f  rue if main-memo
11790 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  ry should be use
117a0 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
117b0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
117c0 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70   for transient p
117d0 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73  ager files and s
117e0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
117f0 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  s..** The value 
11800 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73  returned depends
11810 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
11820 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
11830 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61  (runtime.** para
11840 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65 20 63  meter) and the c
11850 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75  ompile time valu
11860 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  e of SQLITE_TEMP
11870 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66  _STORE. The.** f
11880 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64  ollowing table d
11890 65 73 63 72 69 62 65 73 20 74 68 65 20 72 65 6c  escribes the rel
118a0 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65  ationship betwee
118b0 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75  n these two valu
118c0 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66  es.** and this f
118d0 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
118e0 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  value..**.**   S
118f0 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
11900 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74       db->temp_st
11910 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e  ore     Location
11920 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61   of temporary da
11930 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d  tabase.**   ----
11940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
11950 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
11960 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
11970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11980 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
119a0 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
119b0 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
119c0 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20  urn 0).**   1   
119d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119e0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
119f0 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
11a00 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31  return 0).**   1
11a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
11a30 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
11a40 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
11a50 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
11a60 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
11a70 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
11a80 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
11a90 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
11aa0 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
11ac0 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
11ad0 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  0).**   2       
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b00 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
11b10 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 1).**   2    
11b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b30 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
11b40 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
11b50 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20  eturn 1).**   3 
11b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b70 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
11b80 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
11b90 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69   (return 1).*/.i
11ba0 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  nt sqlite3TempIn
11bb0 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c  Memory(const sql
11bc0 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53  ite3 *db){.#if S
11bd0 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
11be0 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64  ==1.  return ( d
11bf0 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32  b->temp_store==2
11c00 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   );.#endif.#if S
11c10 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
11c20 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64  ==2.  return ( d
11c30 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31  b->temp_store!=1
11c40 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   );.#endif.#if S
11c50 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
11c60 3d 3d 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ==3.  UNUSED_PAR
11c70 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65  AMETER(db);.  re
11c80 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23  turn 1;.#endif.#
11c90 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
11ca0 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45  TORE<1 || SQLITE
11cb0 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20  _TEMP_STORE>3.  
11cc0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
11cd0 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  (db);.  return 0
11ce0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
11cf0 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65  * Return UTF-8 e
11d00 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c  ncoded English l
11d10 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74  anguage explanat
11d20 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
11d30 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e  recent.** error.
11d40 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
11d50 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73  sqlite3_errmsg(s
11d60 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63  qlite3 *db){.  c
11d70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
11d80 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72  if( !db ){.    r
11d90 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
11da0 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  Str(SQLITE_NOMEM
11db0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  );.  }.  if( !sq
11dc0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
11dd0 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
11de0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
11df0 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
11e00 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20  MISUSE_BKPT);.  
11e10 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
11e20 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
11e30 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  x);.  if( db->ma
11e40 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
11e50 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72    z = sqlite3Err
11e60 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  Str(SQLITE_NOMEM
11e70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11e80 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 70 45  testcase( db->pE
11e90 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7a 20 3d  rr==0 );.    z =
11ea0 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
11eb0 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70  value_text(db->p
11ec0 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Err);.    assert
11ed0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
11ee0 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  led );.    if( z
11ef0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  ==0 ){.      z =
11f00 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64   sqlite3ErrStr(d
11f10 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20  b->errCode);.   
11f20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
11f30 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
11f40 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
11f50 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n z;.}..#ifndef 
11f60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
11f70 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55  6./*.** Return U
11f80 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e  TF-16 encoded En
11f90 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
11fa0 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
11fb0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
11fc0 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   error..*/.const
11fd0 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65   void *sqlite3_e
11fe0 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20  rrmsg16(sqlite3 
11ff0 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63  *db){.  static c
12000 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65  onst u16 outOfMe
12010 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c  m[] = {.    'o',
12020 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20   'u', 't', ' ', 
12030 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27  'o', 'f', ' ', '
12040 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f  m', 'e', 'm', 'o
12050 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20  ', 'r', 'y', 0. 
12060 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
12070 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20  st u16 misuse[] 
12080 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69 27  = {.    'l', 'i'
12090 2c 20 27 62 27 2c 20 27 72 27 2c 20 27 61 27 2c  , 'b', 'r', 'a',
120a0 20 27 72 27 2c 20 27 79 27 2c 20 27 20 27 2c 20   'r', 'y', ' ', 
120b0 0a 20 20 20 20 27 72 27 2c 20 27 6f 27 2c 20 27  .    'r', 'o', '
120c0 75 27 2c 20 27 74 27 2c 20 27 69 27 2c 20 27 6e  u', 't', 'i', 'n
120d0 27 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'e', ' ', .  
120e0 20 20 27 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c    'c', 'a', 'l',
120f0 20 27 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c 20   'l', 'e', 'd', 
12100 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27  ' ', .    'o', '
12110 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a 20  u', 't', ' ', . 
12120 20 20 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27     'o', 'f', ' '
12130 2c 20 0a 20 20 20 20 27 73 27 2c 20 27 65 27 2c  , .    's', 'e',
12140 20 27 71 27 2c 20 27 75 27 2c 20 27 65 27 2c 20   'q', 'u', 'e', 
12150 27 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c 20 30  'n', 'c', 'e', 0
12160 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76  .  };..  const v
12170 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64  oid *z;.  if( !d
12180 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
12190 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d  (void *)outOfMem
121a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
121b0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
121c0 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
121d0 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20     return (void 
121e0 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20  *)misuse;.  }.  
121f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
12200 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
12210 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
12220 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20  Failed ){.    z 
12230 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d  = (void *)outOfM
12240 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  em;.  }else{.   
12250 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
12260 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45  ue_text16(db->pE
12270 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  rr);.    if( z==
12280 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
12290 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
122a0 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20  b, db->errCode, 
122b0 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62  sqlite3ErrStr(db
122c0 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20 20 20  ->errCode));.   
122d0 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
122e0 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e  alue_text16(db->
122f0 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pErr);.    }.   
12300 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d   /* A malloc() m
12310 61 79 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  ay have failed w
12320 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74  ithin the call t
12330 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  o sqlite3_value_
12340 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20  text16().    ** 
12350 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69  above. If this i
12360 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
12370 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
12380 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73  ailed flag needs
12390 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c   to.    ** be cl
123a0 65 61 72 65 64 20 62 65 66 6f 72 65 20 72 65 74  eared before ret
123b0 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20  urning. Do this 
123c0 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61  directly, instea
123d0 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20  d of via.    ** 
123e0 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 29  sqlite3ApiExit()
123f0 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69  , to avoid setti
12400 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
12410 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73  handle error mes
12420 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sage..    */.   
12430 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
12440 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  d = 0;.  }.  sql
12450 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
12460 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
12470 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69  eturn z;.}.#endi
12480 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
12490 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
124a0 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   Return the most
124b0 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f   recent error co
124c0 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  de generated by 
124d0 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e  an SQLite routin
124e0 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a  e. If NULL is.**
124f0 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
12500 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73  function, we ass
12510 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66  ume a malloc() f
12520 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c  ailed during sql
12530 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a  ite3_open()..*/.
12540 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63  int sqlite3_errc
12550 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ode(sqlite3 *db)
12560 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73  {.  if( db && !s
12570 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
12580 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
12590 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
125a0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
125b0 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c    }.  if( !db ||
125c0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
125d0 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
125e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
125f0 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65  }.  return db->e
12600 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72 72  rrCode & db->err
12610 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  Mask;.}.int sqli
12620 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
12630 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  code(sqlite3 *db
12640 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21  ){.  if( db && !
12650 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
12660 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
12670 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
12680 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
12690 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c  .  }.  if( !db |
126a0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
126b0 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
126c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
126d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
126e0 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  errCode;.}../*.*
126f0 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e  * Return a strin
12700 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
12710 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72   the kind of err
12720 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
12730 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  the.** argument.
12740 20 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20    For now, this 
12750 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74 68 65  simply calls the
12760 20 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69 74 65   internal sqlite
12770 33 45 72 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e  3ErrStr().** fun
12780 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ction..*/.const 
12790 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72  char *sqlite3_er
127a0 72 73 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20  rstr(int rc){.  
127b0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
127c0 72 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  rStr(rc);.}../*.
127d0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
127e0 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
127f0 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  on for database 
12800 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65 20  "db".  The name 
12810 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20  is zName.** and 
12820 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20  the encoding is 
12830 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  enc..*/.static i
12840 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  nt createCollati
12850 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  on(.  sqlite3* d
12860 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
12870 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e  *zName, .  u8 en
12880 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  c,.  void* pCtx,
12890 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
128a0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
128b0 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
128c0 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  t void*),.  void
128d0 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29  (*xDel)(void*).)
128e0 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
128f0 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a  ll;.  int enc2;.
12900 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c    .  assert( sql
12910 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12920 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
12930 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54   /* If SQLITE_UT
12940 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64  F16 is specified
12950 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
12960 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d   type, transform
12970 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e   this.  ** to on
12980 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31  e of SQLITE_UTF1
12990 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54  6LE or SQLITE_UT
129a0 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a  F16BE using the.
129b0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31    ** SQLITE_UTF1
129c0 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53  6NATIVE macro. S
129d0 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e  QLITE_UTF16 is n
129e0 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  ot used internal
129f0 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20  ly..  */.  enc2 
12a00 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73  = enc;.  testcas
12a10 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  e( enc2==SQLITE_
12a20 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63  UTF16 );.  testc
12a30 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54  ase( enc2==SQLIT
12a40 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
12a50 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53  );.  if( enc2==S
12a60 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65  QLITE_UTF16 || e
12a70 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
12a80 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20  6_ALIGNED ){.   
12a90 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55   enc2 = SQLITE_U
12aa0 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a  TF16NATIVE;.  }.
12ab0 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54    if( enc2<SQLIT
12ac0 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53  E_UTF8 || enc2>S
12ad0 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b  QLITE_UTF16BE ){
12ae0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12af0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
12b00 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
12b10 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  if this call is 
12b20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c  removing or repl
12b30 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e  acing an existin
12b40 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a  g collation .  *
12b50 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73  * sequence. If s
12b60 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  o, and there are
12b70 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74   active VMs, ret
12b80 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65  urn busy. If the
12b90 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61  re.  ** are no a
12ba0 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c  ctive VMs, inval
12bb0 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f  idate any pre-co
12bc0 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
12bd0 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20  s..  */.  pColl 
12be0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
12bf0 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63  lSeq(db, (u8)enc
12c00 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  2, zName, 0);.  
12c10 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f  if( pColl && pCo
12c20 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20  ll->xCmp ){.    
12c30 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  if( db->nVdbeAct
12c40 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ive ){.      sql
12c50 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
12c60 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  (db, SQLITE_BUSY
12c70 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62  , .        "unab
12c80 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64  le to delete/mod
12c90 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ify collation se
12ca0 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20 61 63  quence due to ac
12cb0 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22  tive statements"
12cc0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12cd0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
12ce0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
12cf0 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
12d00 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20  ements(db);..   
12d10 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e   /* If collation
12d20 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20   sequence pColl 
12d30 77 61 73 20 63 72 65 61 74 65 64 20 64 69 72 65  was created dire
12d40 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c 20 74  ctly by a call t
12d50 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
12d60 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
12d70 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72  n, and not gener
12d80 61 74 65 64 20 62 79 20 73 79 6e 74 68 43 6f 6c  ated by synthCol
12d90 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74  lSeq(),.    ** t
12da0 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73 20 6d  hen any copies m
12db0 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c  ade by synthColl
12dc0 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20 62 65  Seq() need to be
12dd0 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20 20   invalidated..  
12de0 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61    ** Also, colla
12df0 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f 72 20  tion destructor 
12e00 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29  - CollSeq.xDel()
12e10 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20   - function may 
12e20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62  need.    ** to b
12e30 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f  e called..    */
12e40 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c 6c   .    if( (pColl
12e50 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f  ->enc & ~SQLITE_
12e60 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d  UTF16_ALIGNED)==
12e70 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20 43 6f  enc2 ){.      Co
12e80 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73  llSeq *aColl = s
12e90 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
12ea0 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e  db->aCollSeq, zN
12eb0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  ame);.      int 
12ec0 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
12ed0 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
12ee0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20       CollSeq *p 
12ef0 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  = &aColl[j];.   
12f00 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d       if( p->enc=
12f10 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20  =pColl->enc ){. 
12f20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
12f30 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  xDel ){.        
12f40 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70      p->xDel(p->p
12f50 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  User);.         
12f60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
12f70 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  xCmp = 0;.      
12f80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12f90 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d  }.  }..  pColl =
12fa0 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
12fb0 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32  Seq(db, (u8)enc2
12fc0 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69  , zName, 1);.  i
12fd0 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65  f( pColl==0 ) re
12fe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12ff0 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  M;.  pColl->xCmp
13000 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70   = xCompare;.  p
13010 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43  Coll->pUser = pC
13020 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65  tx;.  pColl->xDe
13030 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c  l = xDel;.  pCol
13040 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e  l->enc = (u8)(en
13050 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49  c2 | (enc & SQLI
13060 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
13070 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72  ));.  sqlite3Err
13080 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
13090 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
130a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
130b0 20 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69   This array defi
130c0 6e 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62  nes hard upper b
130d0 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76  ounds on limit v
130e0 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69  alues.  The.** i
130f0 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20  nitializer must 
13100 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20  be kept in sync 
13110 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
13120 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69  LIMIT_*.** #defi
13130 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68  nes in sqlite3.h
13140 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
13150 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74  t int aHardLimit
13160 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f  [] = {.  SQLITE_
13170 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  MAX_LENGTH,.  SQ
13180 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
13190 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
131a0 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49  X_COLUMN,.  SQLI
131b0 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
131c0 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
131d0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c  COMPOUND_SELECT,
131e0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  .  SQLITE_MAX_VD
131f0 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f  BE_OP,.  SQLITE_
13200 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
13210 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  ,.  SQLITE_MAX_A
13220 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54  TTACHED,.  SQLIT
13230 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
13240 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  RN_LENGTH,.  SQL
13250 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
13260 5f 4e 55 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a  _NUMBER,      /*
13270 20 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33 32   IMP: R-38091-32
13280 33 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f  352 */.  SQLITE_
13290 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
132a0 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
132b0 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a  WORKER_THREADS,.
132c0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  };../*.** Make s
132d0 75 72 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d  ure the hard lim
132e0 69 74 73 20 61 72 65 20 73 65 74 20 74 6f 20 72  its are set to r
132f0 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73  easonable values
13300 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .*/.#if SQLITE_M
13310 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20  AX_LENGTH<100.# 
13320 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
13330 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
13340 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e  at least 100.#en
13350 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
13360 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30  AX_SQL_LENGTH<10
13370 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
13380 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
13390 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
133a0 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20   100.#endif.#if 
133b0 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
133c0 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58  ENGTH>SQLITE_MAX
133d0 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20  _LENGTH.# error 
133e0 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
133f0 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62  ENGTH must not b
13400 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53  e greater than S
13410 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
13420 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
13430 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
13440 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72  SELECT<2.# error
13450 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
13460 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74  OUND_SELECT must
13470 20 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23   be at least 2.#
13480 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
13490 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a  _MAX_VDBE_OP<40.
134a0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
134b0 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20  AX_VDBE_OP must 
134c0 62 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23  be at least 40.#
134d0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
134e0 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
134f0 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  G<0 || SQLITE_MA
13500 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31  X_FUNCTION_ARG>1
13510 30 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  000.# error SQLI
13520 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
13530 41 52 47 20 6d 75 73 74 20 62 65 20 62 65 74 77  ARG must be betw
13540 65 65 6e 20 30 20 61 6e 64 20 31 30 30 30 0a 23  een 0 and 1000.#
13550 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
13560 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3c 30 20  _MAX_ATTACHED<0 
13570 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  || SQLITE_MAX_AT
13580 54 41 43 48 45 44 3e 31 32 35 0a 23 20 65 72 72  TACHED>125.# err
13590 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  or SQLITE_MAX_AT
135a0 54 41 43 48 45 44 20 6d 75 73 74 20 62 65 20 62  TACHED must be b
135b0 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 32 35  etween 0 and 125
135c0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
135d0 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
135e0 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65  ERN_LENGTH<1.# e
135f0 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
13600 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
13610 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
13620 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69  east 1.#endif.#i
13630 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
13640 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f  UMN>32767.# erro
13650 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  r SQLITE_MAX_COL
13660 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63  UMN must not exc
13670 65 65 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66  eed 32767.#endif
13680 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
13690 54 52 49 47 47 45 52 5f 44 45 50 54 48 3c 31 0a  TRIGGER_DEPTH<1.
136a0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
136b0 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
136c0 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
136d0 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 1.#endif.#if S
136e0 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
136f0 5f 54 48 52 45 41 44 53 3c 30 20 7c 7c 20 53 51  _THREADS<0 || SQ
13700 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
13710 54 48 52 45 41 44 53 3e 35 30 0a 23 20 65 72 72  THREADS>50.# err
13720 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  or SQLITE_MAX_WO
13730 52 4b 45 52 5f 54 48 52 45 41 44 53 20 6d 75 73  RKER_THREADS mus
13740 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  t be between 0 a
13750 6e 64 20 35 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f  nd 50.#endif.../
13760 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
13770 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74  value of a limit
13780 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c  .  Report the ol
13790 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61  d value..** If a
137a0 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20  n invalid limit 
137b0 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69 65  index is supplie
137c0 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a  d, report -1..**
137d0 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
137e0 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72   but still repor
137f0 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20  t the old value 
13800 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69  if the.** new li
13810 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e  mit is negative.
13820 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77  .**.** A new low
13830 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f  er limit does no
13840 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e  t shrink existin
13850 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a  g constructs..**
13860 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65   It merely preve
13870 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63  nts new construc
13880 74 73 20 74 68 61 74 20 65 78 63 65 65 64 20 74  ts that exceed t
13890 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d  he limit.** from
138a0 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   forming..*/.int
138b0 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73   sqlite3_limit(s
138c0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
138d0 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77  limitId, int new
138e0 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c  Limit){.  int ol
138f0 64 4c 69 6d 69 74 3b 0a 0a 23 69 66 64 65 66 20  dLimit;..#ifdef 
13900 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
13910 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
13920 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
13930 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
13940 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
13950 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
13960 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64  urn -1;.  }.#end
13970 69 66 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  if..  /* EVIDENC
13980 45 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34  E-OF: R-30189-54
13990 30 39 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d  097 For each lim
139a0 69 74 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49  it category SQLI
139b0 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20  TE_LIMIT_NAME.  
139c0 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 61  ** there is a ha
139d0 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73  rd upper bound s
139e0 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  et at compile-ti
139f0 6d 65 20 62 79 20 61 20 43 20 70 72 65 70 72 6f  me by a C prepro
13a00 63 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72  cessor.  ** macr
13a10 6f 20 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f  o called SQLITE_
13a20 4d 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22  MAX_NAME. (The "
13a30 5f 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20  _LIMIT_" in the 
13a40 6e 61 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20  name is changed 
13a50 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e  to.  ** "_MAX_".
13a60 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ).  */.  assert(
13a70 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
13a80 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
13a90 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  ==SQLITE_MAX_LEN
13aa0 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  GTH );.  assert(
13ab0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
13ac0 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e  TE_LIMIT_SQL_LEN
13ad0 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  GTH]==SQLITE_MAX
13ae0 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  _SQL_LENGTH );. 
13af0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
13b00 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
13b10 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45  _COLUMN]==SQLITE
13b20 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _MAX_COLUMN );. 
13b30 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
13b40 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
13b50 5f 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51  _EXPR_DEPTH]==SQ
13b60 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
13b70 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
13b80 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
13b90 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
13ba0 44 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54  D_SELECT]==SQLIT
13bb0 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
13bc0 45 4c 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74  ELECT);.  assert
13bd0 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
13be0 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f  ITE_LIMIT_VDBE_O
13bf0 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56  P]==SQLITE_MAX_V
13c00 44 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65  DBE_OP );.  asse
13c10 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
13c20 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43  QLITE_LIMIT_FUNC
13c30 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54  TION_ARG]==SQLIT
13c40 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
13c50 52 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  RG );.  assert( 
13c60 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
13c70 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44  E_LIMIT_ATTACHED
13c80 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  ]==SQLITE_MAX_AT
13c90 54 41 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65  TACHED );.  asse
13ca0 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
13cb0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
13cc0 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d  _PATTERN_LENGTH]
13cd0 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ==.             
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d00 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b    SQLITE_MAX_LIK
13d10 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
13d20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
13d30 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
13d40 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
13d50 55 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d  UMBER]==SQLITE_M
13d60 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  AX_VARIABLE_NUMB
13d70 45 52 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ER);.  assert( a
13d80 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
13d90 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44  _LIMIT_TRIGGER_D
13da0 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  EPTH]==SQLITE_MA
13db0 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
13dc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
13dd0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
13de0 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
13df0 41 44 53 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  ADS]==SQLITE_MAX
13e00 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20  _WORKER_THREADS 
13e10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
13e20 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
13e30 5f 54 48 52 45 41 44 53 3d 3d 28 53 51 4c 49 54  _THREADS==(SQLIT
13e40 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a  E_N_LIMIT-1) );.
13e50 0a 0a 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c  ..  if( limitId<
13e60 30 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51  0 || limitId>=SQ
13e70 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a  LITE_N_LIMIT ){.
13e80 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
13e90 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20   }.  oldLimit = 
13ea0 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74  db->aLimit[limit
13eb0 49 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69  Id];.  if( newLi
13ec0 6d 69 74 3e 3d 30 20 29 7b 20 20 20 20 20 20 20  mit>=0 ){       
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13ee0 4d 50 3a 20 52 2d 35 32 34 37 36 2d 32 38 37 33  MP: R-52476-2873
13ef0 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77  2 */.    if( new
13f00 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74  Limit>aHardLimit
13f10 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20  [limitId] ){.   
13f20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48     newLimit = aH
13f30 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ardLimit[limitId
13f40 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31  ];  /* IMP: R-51
13f50 34 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20  463-25634 */.   
13f60 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69   }.    db->aLimi
13f70 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77  t[limitId] = new
13f80 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74  Limit;.  }.  ret
13f90 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20  urn oldLimit;   
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fb0 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34    /* IMP: R-5334
13fc0 31 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a  1-35419 */.}../*
13fd0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
13fe0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 72  n is used to par
13ff0 73 65 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64  se both URIs and
14000 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d   non-URI filenam
14010 65 73 20 70 61 73 73 65 64 20 62 79 20 74 68 65  es passed by the
14020 0a 2a 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20  .** user to API 
14030 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65  functions sqlite
14040 33 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69  3_open() or sqli
14050 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61  te3_open_v2(), a
14060 6e 64 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a  nd for database.
14070 2a 2a 20 55 52 49 73 20 73 70 65 63 69 66 69 65  ** URIs specifie
14080 64 20 61 73 20 70 61 72 74 20 6f 66 20 41 54 54  d as part of ATT
14090 41 43 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ACH statements..
140a0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
140b0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
140c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65   function is the
140d0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53   name of the VFS
140e0 20 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61   to use (or.** a
140f0 20 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79   NULL to signify
14100 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
14110 29 20 69 66 20 74 68 65 20 55 52 49 20 64 6f 65  ) if the URI doe
14120 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  s not contain a 
14130 22 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65  "vfs=xxx".** que
14140 72 79 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68  ry parameter. Th
14150 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
14160 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55  t contains the U
14170 52 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66  RI (or non-URI f
14180 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65  ilename).** itse
14190 6c 66 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75  lf. When this fu
141a0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
141b0 20 74 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72   the *pFlags var
141c0 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e  iable should con
141d0 74 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61  tain.** the defa
141e0 75 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65  ult flags to ope
141f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
14200 61 6e 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20  andle with. The 
14210 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
14220 2a 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62  ** *pFlags may b
14230 65 20 75 70 64 61 74 65 64 20 62 65 66 6f 72 65  e updated before
14240 20 72 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68   returning if th
14250 65 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63  e URI filename c
14260 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63  ontains .** "cac
14270 68 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65  he=xxx" or "mode
14280 3d 78 78 78 22 20 71 75 65 72 79 20 70 61 72 61  =xxx" query para
14290 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  meters..**.** If
142a0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
142b0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
142c0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
142d0 20 2a 70 70 56 66 73 20 69 73 20 73 65 74 20 74   *ppVfs is set t
142e0 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
142f0 65 20 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c  e VFS that shoul
14300 64 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65  d be used to ope
14310 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
14320 69 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20  ile. *pzFile is 
14330 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20  set to.** point 
14340 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
14350 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20  aining the name 
14360 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f  of the file to o
14370 70 65 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a  pen. It is the .
14380 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
14390 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
143a0 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  to eventually ca
143b0 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ll sqlite3_free(
143c0 29 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20  ) to release.** 
143d0 74 68 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  this buffer..**.
143e0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
143f0 63 63 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53  ccurs, then an S
14400 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
14410 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
14420 20 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61   *pzErrMsg.** ma
14430 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e  y be set to poin
14440 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
14450 6e 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c  ntaining an Engl
14460 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72  ish language err
14470 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20  or .** message. 
14480 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
14490 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
144a0 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
144b0 61 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20  ally release.** 
144c0 74 68 69 73 20 62 75 66 66 65 72 20 62 79 20 63  this buffer by c
144d0 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66  alling sqlite3_f
144e0 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ree()..*/.int sq
144f0 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 0a 20  lite3ParseUri(. 
14500 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
14510 66 61 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20  faultVfs,       
14520 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69   /* VFS to use i
14530 66 20 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71  f no "vfs=xxx" q
14540 75 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  uery option */. 
14550 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72   const char *zUr
14560 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i,              
14570 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74   /* Nul-terminat
14580 65 64 20 55 52 49 20 74 6f 20 70 61 72 73 65 20  ed URI to parse 
14590 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  */.  unsigned in
145a0 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20  t *pFlags,      
145b0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
145c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20  SQLITE_OPEN_XXX 
145d0 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  flags */.  sqlit
145e0 65 33 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20  e3_vfs **ppVfs, 
145f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
14600 54 3a 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f  T: VFS to use */
14610 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c   .  char **pzFil
14620 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
14630 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65      /* OUT: File
14640 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f  name component o
14650 66 20 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20  f URI */.  char 
14660 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20  **pzErrMsg      
14670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
14680 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  T: Error message
14690 20 28 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f   (if rc!=SQLITE_
146a0 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  OK) */.){.  int 
146b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
146c0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66    unsigned int f
146d0 6c 61 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a  lags = *pFlags;.
146e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
146f0 66 73 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73  fs = zDefaultVfs
14700 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  ;.  char *zFile;
14710 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74  .  char c;.  int
14720 20 6e 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53   nUri = sqlite3S
14730 74 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a  trlen30(zUri);..
14740 20 20 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72    assert( *pzErr
14750 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  Msg==0 );..  if(
14760 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54   ((flags & SQLIT
14770 45 5f 4f 50 45 4e 5f 55 52 49 29 20 20 20 20 20  E_OPEN_URI)     
14780 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
14790 52 2d 34 38 37 32 35 2d 33 32 32 30 36 20 2a 2f  R-48725-32206 */
147a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
147b0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
147c0 66 69 67 2e 62 4f 70 65 6e 55 72 69 29 20 2f 2a  fig.bOpenUri) /*
147d0 20 49 4d 50 3a 20 52 2d 35 31 36 38 39 2d 34 36   IMP: R-51689-46
147e0 35 34 38 20 2a 2f 0a 20 20 20 26 26 20 6e 55 72  548 */.   && nUr
147f0 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a  i>=5 && memcmp(z
14800 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29  Uri, "file:", 5)
14810 3d 3d 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 37  ==0 /* IMP: R-57
14820 38 38 34 2d 33 37 34 39 36 20 2a 2f 0a 20 20 29  884-37496 */.  )
14830 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74  {.    char *zOpt
14840 3b 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65  ;.    int eState
14850 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14860 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 73 74      /* Parser st
14870 61 74 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67  ate when parsing
14880 20 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20   URI */.    int 
14890 69 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  iIn;            
148a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
148b0 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64  ut character ind
148c0 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f  ex */.    int iO
148d0 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
148e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
148f0 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65  t character inde
14900 78 20 2a 2f 0a 20 20 20 20 75 36 34 20 6e 42 79  x */.    u64 nBy
14910 74 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20  te = nUri+2;    
14920 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
14930 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  of space to allo
14940 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  cate */..    /* 
14950 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 53 51  Make sure the SQ
14960 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c  LITE_OPEN_URI fl
14970 61 67 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64  ag is set to ind
14980 69 63 61 74 65 20 74 6f 20 74 68 65 20 56 46 53  icate to the VFS
14990 20 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d   xOpen .    ** m
149a0 65 74 68 6f 64 20 74 68 61 74 20 74 68 65 72 65  ethod that there
149b0 20 6d 61 79 20 62 65 20 65 78 74 72 61 20 70 61   may be extra pa
149c0 72 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69  rameters followi
149d0 6e 67 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65  ng the file-name
149e0 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20  .  */.    flags 
149f0 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  |= SQLITE_OPEN_U
14a00 52 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e  RI;..    for(iIn
14a10 3d 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49  =0; iIn<nUri; iI
14a20 6e 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a  n++) nByte += (z
14a30 55 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a  Uri[iIn]=='&');.
14a40 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69      zFile = sqli
14a50 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79  te3_malloc64(nBy
14a60 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46  te);.    if( !zF
14a70 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ile ) return SQL
14a80 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20 20  ITE_NOMEM;..    
14a90 69 49 6e 20 3d 20 35 3b 0a 23 69 66 64 65 66 20  iIn = 5;.#ifdef 
14aa0 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52 49  SQLITE_ALLOW_URI
14ab0 5f 41 55 54 48 4f 52 49 54 59 0a 20 20 20 20 69  _AUTHORITY.    i
14ac0 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b  f( strncmp(zUri+
14ad0 35 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20  5, "///", 3)==0 
14ae0 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37  ){.      iIn = 7
14af0 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  ;.      /* The f
14b00 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69  ollowing conditi
14b10 6f 6e 20 63 61 75 73 65 73 20 55 52 49 73 20 77  on causes URIs w
14b20 69 74 68 20 66 69 76 65 20 6c 65 61 64 69 6e 67  ith five leading
14b30 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20 20   / characters.  
14b40 20 20 20 20 2a 2a 20 6c 69 6b 65 20 66 69 6c 65      ** like file
14b50 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 20  ://///host/path 
14b60 74 6f 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  to be converted 
14b70 69 6e 74 6f 20 55 4e 43 73 20 6c 69 6b 65 20 2f  into UNCs like /
14b80 2f 68 6f 73 74 2f 70 61 74 68 2e 0a 20 20 20 20  /host/path..    
14b90 20 20 2a 2a 20 54 68 65 20 63 6f 72 72 65 63 74    ** The correct
14ba0 20 55 52 49 20 66 6f 72 20 74 68 61 74 20 55 4e   URI for that UN
14bb0 43 20 68 61 73 20 6f 6e 6c 79 20 74 77 6f 20 6f  C has only two o
14bc0 72 20 66 6f 75 72 20 6c 65 61 64 69 6e 67 20 2f  r four leading /
14bd0 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20 20   characters.    
14be0 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f 73 74    ** file://host
14bf0 2f 70 61 74 68 20 6f 72 20 66 69 6c 65 3a 2f 2f  /path or file://
14c00 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 20 20 42 75  //host/path.  Bu
14c10 74 20 35 20 6c 65 61 64 69 6e 67 20 73 6c 61 73  t 5 leading slas
14c20 68 65 73 20 69 73 20 61 20 0a 20 20 20 20 20 20  hes is a .      
14c30 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f 72 2c  ** common error,
14c40 20 77 65 20 61 72 65 20 74 6f 6c 64 2c 20 73 6f   we are told, so
14c50 20 77 65 20 68 61 6e 64 6c 65 20 69 74 20 61 73   we handle it as
14c60 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2e   a special case.
14c70 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74   */.      if( st
14c80 72 6e 63 6d 70 28 7a 55 72 69 2b 37 2c 20 22 2f  rncmp(zUri+7, "/
14c90 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 20 69 49  //", 3)==0 ){ iI
14ca0 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65  n++; }.    }else
14cb0 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72   if( strncmp(zUr
14cc0 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68 6f 73  i+5, "//localhos
14cd0 74 2f 22 2c 20 31 32 29 3d 3d 30 20 29 7b 0a 20  t/", 12)==0 ){. 
14ce0 20 20 20 20 20 69 49 6e 20 3d 20 31 36 3b 0a 20       iIn = 16;. 
14cf0 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f     }.#else.    /
14d00 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 73 63  * Discard the sc
14d10 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72 69  heme and authori
14d20 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 74  ty segments of t
14d30 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69  he URI. */.    i
14d40 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20  f( zUri[5]=='/' 
14d50 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20  && zUri[6]=='/' 
14d60 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37  ){.      iIn = 7
14d70 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  ;.      while( z
14d80 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69  Uri[iIn] && zUri
14d90 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e  [iIn]!='/' ) iIn
14da0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 49  ++;.      if( iI
14db0 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31 36  n!=7 && (iIn!=16
14dc0 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61   || memcmp("loca
14dd0 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d  lhost", &zUri[7]
14de0 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 9)) ){.       
14df0 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
14e00 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e  ite3_mprintf("in
14e10 76 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f 72  valid uri author
14e20 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20  ity: %.*s", .   
14e30 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c 20           iIn-7, 
14e40 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20  &zUri[7]);.     
14e50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
14e60 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f  RROR;.        go
14e70 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
14e80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14e90 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43  #endif..    /* C
14ea0 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  opy the filename
14eb0 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70   and any query p
14ec0 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74  arameters into t
14ed0 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e  he zFile buffer.
14ee0 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20   .    ** Decode 
14ef0 25 48 48 20 65 73 63 61 70 65 20 63 6f 64 65 73  %HH escape codes
14f00 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20   along the way. 
14f10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
14f20 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c  ithin this loop,
14f30 20 76 61 72 69 61 62 6c 65 20 65 53 74 61 74 65   variable eState
14f40 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 30   may be set to 0
14f50 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64  , 1 or 2, depend
14f60 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ing.    ** on th
14f70 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
14f80 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  t. As follows:. 
14f90 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30     **.    **   0
14fa0 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e  : Parsing file-n
14fb0 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a  ame..    **   1:
14fc0 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65   Parsing name se
14fd0 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d  ction of a name=
14fe0 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61  value query para
14ff0 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20  meter..    **   
15000 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65  2: Parsing value
15010 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61   section of a na
15020 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70  me=value query p
15030 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f  arameter..    */
15040 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b  .    eState = 0;
15050 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d  .    while( (c =
15060 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26   zUri[iIn])!=0 &
15070 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20  & c!='#' ){.    
15080 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69    iIn++;.      i
15090 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20  f( c=='%' .     
150a0 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64    && sqlite3Isxd
150b0 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20  igit(zUri[iIn]) 
150c0 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
150d0 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b  e3Isxdigit(zUri[
150e0 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29  iIn+1]) .      )
150f0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63  {.        int oc
15100 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65  tet = (sqlite3He
15110 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b  xToInt(zUri[iIn+
15120 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20  +]) << 4);.     
15130 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69     octet += sqli
15140 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69  te3HexToInt(zUri
15150 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20  [iIn++]);..     
15160 20 20 20 61 73 73 65 72 74 28 20 6f 63 74 65 74     assert( octet
15170 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36  >=0 && octet<256
15180 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
15190 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  octet==0 ){.    
151a0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
151b0 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
151c0 65 6e 20 22 25 30 30 22 20 61 70 70 65 61 72 73  en "%00" appears
151d0 20 77 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e   within the URI.
151e0 20 49 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20   In this.       
151f0 20 20 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67     ** case we ig
15200 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e  nore all text in
15210 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
15220 66 20 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65  f the path, name
15230 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   or.          **
15240 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79   value currently
15250 20 62 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53   being parsed. S
15260 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72  o ignore the cur
15270 72 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20  rent character. 
15280 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
15290 73 6b 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74  skip to the next
152a0 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22   "?", "=" or "&"
152b0 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  , as appropriate
152c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77  . */.          w
152d0 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b  hile( (c = zUri[
152e0 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  iIn])!=0 && c!='
152f0 23 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  #' .            
15300 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 30 20    && (eState!=0 
15310 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20  || c!='?').     
15320 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74           && (eSt
15330 61 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d  ate!=1 || (c!='=
15340 27 20 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20  ' && c!='&')).  
15350 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
15360 65 53 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d  eState!=2 || c!=
15370 27 26 27 29 0a 20 20 20 20 20 20 20 20 20 20 29  '&').          )
15380 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49  {.            iI
15390 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n++;.          }
153a0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
153b0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
153c0 20 20 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74         c = octet
153d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
153e0 28 20 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28  ( eState==1 && (
153f0 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27  c=='&' || c=='='
15400 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
15410 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d   zFile[iOut-1]==
15420 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
15430 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f  * An empty optio
15440 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74  n name. Ignore t
15450 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67  his option altog
15460 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ether. */.      
15470 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b      while( zUri[
15480 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e  iIn] && zUri[iIn
15490 5d 21 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69  ]!='#' && zUri[i
154a0 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e  In-1]!='&' ) iIn
154b0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  ++;.          co
154c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
154d0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  }.        if( c=
154e0 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='&' ){.        
154f0 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
15500 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
15510 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
15520 20 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20   eState = 2;.   
15530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
15540 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
15550 65 20 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30  e if( (eState==0
15560 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28   && c=='?') || (
15570 65 53 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d  eState==2 && c==
15580 27 26 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '&') ){.        
15590 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65  c = 0;.        e
155a0 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  State = 1;.     
155b0 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69   }.      zFile[i
155c0 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  Out++] = c;.    
155d0 7d 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65  }.    if( eState
155e0 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74  ==1 ) zFile[iOut
155f0 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
15600 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
15610 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
15620 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  iOut++] = '\0';.
15630 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
15640 20 74 68 65 72 65 20 77 65 72 65 20 61 6e 79 20   there were any 
15650 6f 70 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65  options specifie
15660 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  d that should be
15670 20 69 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20   interpreted .  
15680 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f    ** here. Optio
15690 6e 73 20 74 68 61 74 20 61 72 65 20 69 6e 74 65  ns that are inte
156a0 72 70 72 65 74 65 64 20 68 65 72 65 20 69 6e 63  rpreted here inc
156b0 6c 75 64 65 20 22 76 66 73 22 20 61 6e 64 20 74  lude "vfs" and t
156c0 68 6f 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  hose that.    **
156d0 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66   correspond to f
156e0 6c 61 67 73 20 74 68 61 74 20 6d 61 79 20 62 65  lags that may be
156f0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73   passed to the s
15700 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
15710 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20  .    ** method. 
15720 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a  */.    zOpt = &z
15730 46 69 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  File[sqlite3Strl
15740 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a  en30(zFile)+1];.
15750 20 20 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b      while( zOpt[
15760 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  0] ){.      int 
15770 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74  nOpt = sqlite3St
15780 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20  rlen30(zOpt);.  
15790 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d      char *zVal =
157a0 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a   &zOpt[nOpt+1];.
157b0 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d        int nVal =
157c0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
157d0 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69  (zVal);..      i
157e0 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65  f( nOpt==3 && me
157f0 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74  mcmp("vfs", zOpt
15800 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 3)==0 ){.     
15810 20 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a     zVfs = zVal;.
15820 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15830 20 20 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e       struct Open
15840 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20  Mode {.         
15850 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
15860 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f            int mo
15870 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61  de;.        } *a
15880 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mode = 0;.      
15890 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70    char *zModeTyp
158a0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  e = 0;.        i
158b0 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  nt mask = 0;.   
158c0 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d       int limit =
158d0 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   0;..        if(
158e0 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63   nOpt==5 && memc
158f0 6d 70 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74  mp("cache", zOpt
15900 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 5)==0 ){.     
15910 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75       static stru
15920 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63  ct OpenMode aCac
15930 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20  heMode[] = {.   
15940 20 20 20 20 20 20 20 20 20 7b 20 22 73 68 61 72           { "shar
15950 65 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45  ed",  SQLITE_OPE
15960 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c  N_SHAREDCACHE },
15970 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
15980 70 72 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45  private", SQLITE
15990 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
159a0 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  HE },.          
159b0 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20    { 0, 0 }.     
159c0 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20       };..       
159d0 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45     mask = SQLITE
159e0 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
159f0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  E|SQLITE_OPEN_PR
15a00 49 56 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20  IVATECACHE;.    
15a10 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43        aMode = aC
15a20 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20  acheMode;.      
15a30 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b      limit = mask
15a40 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64  ;.          zMod
15a50 65 54 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b  eType = "cache";
15a60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15a70 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26     if( nOpt==4 &
15a80 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c  & memcmp("mode",
15a90 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a   zOpt, 4)==0 ){.
15aa0 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
15ab0 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
15ac0 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b   aOpenMode[] = {
15ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
15ae0 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45  ro",  SQLITE_OPE
15af0 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20  N_READONLY },.  
15b00 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 22            { "rw"
15b10 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ,  SQLITE_OPEN_R
15b20 45 41 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20  EADWRITE }, .   
15b30 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 63 22           { "rwc"
15b40 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  , SQLITE_OPEN_RE
15b50 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
15b60 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a  _OPEN_CREATE },.
15b70 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d              { "m
15b80 65 6d 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f  emory", SQLITE_O
15b90 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20  PEN_MEMORY },.  
15ba0 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30            { 0, 0
15bb0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a   }.          };.
15bc0 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20  .          mask 
15bd0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
15be0 41 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f  ADONLY | SQLITE_
15bf0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20  OPEN_READWRITE. 
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c10 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    | SQLITE_OPEN_
15c20 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
15c30 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20  OPEN_MEMORY;.   
15c40 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61         aMode = a
15c50 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20  OpenMode;.      
15c60 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b      limit = mask
15c70 20 26 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20   & flags;.      
15c80 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20      zModeType = 
15c90 22 61 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20  "access";.      
15ca0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
15cb0 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20   aMode ){.      
15cc0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
15cd0 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20       int mode = 
15ce0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  0;.          for
15cf0 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a  (i=0; aMode[i].z
15d00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
15d10 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15d20 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a  z = aMode[i].z;.
15d30 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
15d40 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72  nVal==sqlite3Str
15d50 6c 65 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d  len30(z) && 0==m
15d60 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e  emcmp(zVal, z, n
15d70 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Val) ){.        
15d80 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f        mode = aMo
15d90 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20  de[i].mode;.    
15da0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
15db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
15dc0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15dd0 20 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30       if( mode==0
15de0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15df0 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
15e00 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20  te3_mprintf("no 
15e10 73 75 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73  such %s mode: %s
15e20 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56  ", zModeType, zV
15e30 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  al);.           
15e40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
15e50 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OR;.            
15e60 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
15e70 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ut;.          }.
15e80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6d            if( (m
15e90 6f 64 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50  ode & ~SQLITE_OP
15ea0 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74  EN_MEMORY)>limit
15eb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15ec0 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
15ed0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20  te3_mprintf("%s 
15ee0 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  mode not allowed
15ef0 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  : %s",.         
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
15f20 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b  ModeType, zVal);
15f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
15f40 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  = SQLITE_PERM;. 
15f50 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
15f60 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20  parse_uri_out;. 
15f70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15f80 20 20 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c       flags = (fl
15f90 61 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d  ags & ~mask) | m
15fa0 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ode;.        }. 
15fb0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f       }..      zO
15fc0 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b  pt = &zVal[nVal+
15fd0 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  1];.    }..  }el
15fe0 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20  se{.    zFile = 
15ff0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
16000 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66  (nUri+2);.    if
16010 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72  ( !zFile ) retur
16020 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
16030 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65      memcpy(zFile
16040 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20  , zUri, nUri);. 
16050 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d     zFile[nUri] =
16060 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65   '\0';.    zFile
16070 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b  [nUri+1] = '\0';
16080 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53  .    flags &= ~S
16090 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a  QLITE_OPEN_URI;.
160a0 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20    }..  *ppVfs = 
160b0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
160c0 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 2a 70  (zVfs);.  if( *p
160d0 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  pVfs==0 ){.    *
160e0 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
160f0 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73  e3_mprintf("no s
16100 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a 56  uch vfs: %s", zV
16110 66 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  fs);.    rc = SQ
16120 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
16130 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a   parse_uri_out:.
16140 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16150 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
16160 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a  e3_free(zFile);.
16170 20 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20      zFile = 0;. 
16180 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 66   }.  *pFlags = f
16190 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20  lags;.  *pzFile 
161a0 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75 72  = zFile;.  retur
161b0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
161c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
161d0 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70  s the work of op
161e0 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ening a database
161f0 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a   on behalf of.**
16200 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20   sqlite3_open() 
16210 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  and sqlite3_open
16220 31 36 28 29 2e 20 54 68 65 20 64 61 74 61 62 61  16(). The databa
16230 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69  se filename "zFi
16240 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20  lename"  .** is 
16250 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a  UTF-8 encoded..*
16260 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
16270 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f 6e  nDatabase(.  con
16280 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
16290 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65 20  me, /* Database 
162a0 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20 65  filename UTF-8 e
162b0 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69  ncoded */.  sqli
162c0 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20  te3 **ppDb,     
162d0 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
162e0 6e 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ned database han
162f0 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  dle */.  unsigne
16300 64 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20  d int flags,    
16310 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66  /* Operational f
16320 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
16330 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20  char *zVfs      
16340 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
16350 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b  VFS to use */.){
16360 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
16370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16380 20 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f     /* Store allo
16390 63 61 74 65 64 20 68 61 6e 64 6c 65 20 68 65 72  cated handle her
163a0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
163b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163c0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
163d0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
163e0 73 54 68 72 65 61 64 73 61 66 65 3b 20 20 20 20  sThreadsafe;    
163f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
16400 75 65 20 66 6f 72 20 74 68 72 65 61 64 73 61 66  ue for threadsaf
16410 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  e connections */
16420 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d  .  char *zOpen =
16430 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
16440 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61     /* Filename a
16450 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
16460 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20 2a  to BtreeOpen() *
16470 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  /.  char *zErrMs
16480 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
16490 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73      /* Error mes
164a0 73 61 67 65 20 66 72 6f 6d 20 73 71 6c 69 74 65  sage from sqlite
164b0 33 50 61 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a  3ParseUri() */..
164c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
164d0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
164e0 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72   if( ppDb==0 ) r
164f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
16500 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
16510 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69  .  *ppDb = 0;.#i
16520 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16530 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20  T_AUTOINIT.  rc 
16540 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
16550 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
16560 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
16570 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20  ndif..  /* Only 
16580 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63  allow sensible c
16590 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62  ombinations of b
165a0 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73  its in the flags
165b0 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a   argument.  .  *
165c0 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  * Throw an error
165d0 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73   if any non-sens
165e0 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73  e combination is
165f0 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20   used.  If we.  
16600 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20  ** do not block 
16610 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74  illegal combinat
16620 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f  ions here, it co
16630 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  uld trigger.  **
16640 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
16650 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c  ents in deeper l
16660 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65  ayers.  Sensible
16670 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20   combinations.  
16680 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a  ** are:.  **.  *
16690 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50  *  1:  SQLITE_OP
166a0 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  EN_READONLY.  **
166b0 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    2:  SQLITE_OPE
166c0 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a  N_READWRITE.  **
166d0 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    6:  SQLITE_OPE
166e0 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
166f0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
16700 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
16710 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16720 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b  ONLY  == 0x01 );
16730 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
16740 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
16750 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73   == 0x02 );.  as
16760 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
16770 4e 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30  N_CREATE    == 0
16780 78 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73  x04 );.  testcas
16790 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
167a0 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45  )==0x02 ); /* RE
167b0 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74  ADONLY */.  test
167c0 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73  case( (1<<(flags
167d0 26 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a  &7))==0x04 ); /*
167e0 20 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20   READWRITE */.  
167f0 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
16800 6c 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29  lags&7))==0x40 )
16810 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c  ; /* READWRITE |
16820 20 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28   CREATE */.  if(
16830 20 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29   ((1<<(flags&7))
16840 20 26 20 30 78 34 36 29 3d 3d 30 20 29 7b 0a 20   & 0x46)==0 ){. 
16850 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16860 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 20 20 2f  _MISUSE_BKPT;  /
16870 2a 20 49 4d 50 3a 20 52 2d 36 35 34 39 37 2d 34  * IMP: R-65497-4
16880 34 35 39 34 20 2a 2f 0a 20 20 7d 0a 0a 20 20 69  4594 */.  }..  i
16890 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
168a0 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
168b0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54 68  x==0 ){.    isTh
168c0 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20  readsafe = 0;.  
168d0 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
168e0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f  & SQLITE_OPEN_NO
168f0 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54  MUTEX ){.    isT
16900 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20  hreadsafe = 0;. 
16910 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
16920 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46   & SQLITE_OPEN_F
16930 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20 20  ULLMUTEX ){.    
16940 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 31  isThreadsafe = 1
16950 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16960 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 73 71  sThreadsafe = sq
16970 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
16980 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20  g.bFullMutex;.  
16990 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  }.  if( flags & 
169a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
169b0 41 54 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20  ATECACHE ){.    
169c0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
169d0 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
169e0 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  E;.  }else if( s
169f0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16a00 69 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e  ig.sharedCacheEn
16a10 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61  abled ){.    fla
16a20 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
16a30 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  N_SHAREDCACHE;. 
16a40 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
16a50 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f  harmful bits fro
16a60 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  m the flags para
16a70 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  meter.  **.  ** 
16a80 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  The SQLITE_OPEN_
16a90 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49  NOMUTEX and SQLI
16aa0 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
16ab0 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a  X flags were.  *
16ac0 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20  * dealt with in 
16ad0 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
16ae0 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65  e block.  Beside
16af0 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c  s these, the onl
16b00 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70  y.  ** valid inp
16b10 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c  ut flags for sql
16b20 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61  ite3_open_v2() a
16b30 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  re SQLITE_OPEN_R
16b40 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51  EADONLY,.  ** SQ
16b50 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
16b60 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ITE, SQLITE_OPEN
16b70 5f 43 52 45 41 54 45 2c 20 53 51 4c 49 54 45 5f  _CREATE, SQLITE_
16b80 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
16b90 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50  ,.  ** SQLITE_OP
16ba0 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 2c  EN_PRIVATECACHE,
16bb0 20 61 6e 64 20 73 6f 6d 65 20 72 65 73 65 72 76   and some reserv
16bc0 65 64 20 62 69 74 73 2e 20 20 53 69 6c 65 6e 74  ed bits.  Silent
16bd0 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66  ly mask.  ** off
16be0 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73   all other flags
16bf0 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26  ..  */.  flags &
16c00 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45  =  ~( SQLITE_OPE
16c10 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
16c20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
16c30 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
16c40 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
16c50 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
16c60 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20  PEN_MAIN_DB |.  
16c70 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
16c80 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
16c90 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
16ca0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
16cb0 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20  RANSIENT_DB | . 
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
16cd0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
16ce0 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
16cf0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
16d00 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
16d10 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  L | .           
16d20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
16d30 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  SUBJOURNAL | .  
16d40 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
16d50 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
16d60 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20  JOURNAL |.      
16d70 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
16d80 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20  OPEN_NOMUTEX |. 
16d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
16da0 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
16db0 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEX |.          
16dc0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16dd0 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  _WAL.           
16de0 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    );..  /* Alloc
16df0 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 20 64  ate the sqlite d
16e00 61 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ata structure */
16e10 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d  .  db = sqlite3M
16e20 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
16e30 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20  f(sqlite3) );.  
16e40 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f  if( db==0 ) goto
16e50 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69   opendb_out;.  i
16e60 66 28 20 69 73 54 68 72 65 61 64 73 61 66 65 20  f( isThreadsafe 
16e70 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65 78  ){.    db->mutex
16e80 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
16e90 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
16ea0 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
16eb0 20 20 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d    if( db->mutex=
16ec0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
16ed0 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20  te3_free(db);.  
16ee0 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20      db = 0;.    
16ef0 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
16f00 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  t;.    }.  }.  s
16f10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
16f20 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
16f30 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30   db->errMask = 0
16f40 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  xff;.  db->nDb =
16f50 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20   2;.  db->magic 
16f60 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  = SQLITE_MAGIC_B
16f70 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d  USY;.  db->aDb =
16f80 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a   db->aDbStatic;.
16f90 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
16fa0 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73  f(db->aLimit)==s
16fb0 69 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d 69 74  izeof(aHardLimit
16fc0 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62  ) );.  memcpy(db
16fd0 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c  ->aLimit, aHardL
16fe0 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d  imit, sizeof(db-
16ff0 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d  >aLimit));.  db-
17000 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
17010 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
17020 41 44 53 5d 20 3d 20 53 51 4c 49 54 45 5f 44 45  ADS] = SQLITE_DE
17030 46 41 55 4c 54 5f 57 4f 52 4b 45 52 5f 54 48 52  FAULT_WORKER_THR
17040 45 41 44 53 3b 0a 20 20 64 62 2d 3e 61 75 74 6f  EADS;.  db->auto
17050 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62  Commit = 1;.  db
17060 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20  ->nextAutovac = 
17070 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d 6d 61 70  -1;.  db->szMmap
17080 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
17090 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20  Config.szMmap;. 
170a0 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
170b0 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61  e = 0;.  db->nMa
170c0 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20 30 78  xSorterMmap = 0x
170d0 37 46 46 46 46 46 46 46 3b 0a 20 20 64 62 2d 3e  7FFFFFFF;.  db->
170e0 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
170f0 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20  ShortColNames | 
17100 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69  SQLITE_EnableTri
17110 67 67 65 72 20 7c 20 53 51 4c 49 54 45 5f 43 61  gger | SQLITE_Ca
17120 63 68 65 53 70 69 6c 6c 0a 23 69 66 20 21 64 65  cheSpill.#if !de
17130 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46  fined(SQLITE_DEF
17140 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  AULT_AUTOMATIC_I
17150 4e 44 45 58 29 20 7c 7c 20 53 51 4c 49 54 45 5f  NDEX) || SQLITE_
17160 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49  DEFAULT_AUTOMATI
17170 43 5f 49 4e 44 45 58 0a 20 20 20 20 20 20 20 20  C_INDEX.        
17180 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
17190 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65 6e 64  E_AutoIndex.#end
171a0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  if.#if SQLITE_DE
171b0 46 41 55 4c 54 5f 43 4b 50 54 46 55 4c 4c 46 53  FAULT_CKPTFULLFS
171c0 59 4e 43 0a 20 20 20 20 20 20 20 20 20 20 20 20  YNC.            
171d0 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 6b       | SQLITE_Ck
171e0 70 74 46 75 6c 6c 46 53 79 6e 63 0a 23 65 6e 64  ptFullFSync.#end
171f0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  if.#if SQLITE_DE
17200 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41  FAULT_FILE_FORMA
17210 54 3c 34 0a 20 20 20 20 20 20 20 20 20 20 20 20  T<4.            
17220 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65       | SQLITE_Le
17230 67 61 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64  gacyFileFmt.#end
17240 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
17250 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54  _ENABLE_LOAD_EXT
17260 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20  ENSION.         
17270 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
17280 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23  _LoadExtension.#
17290 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
172a0 5f 44 45 46 41 55 4c 54 5f 52 45 43 55 52 53 49  _DEFAULT_RECURSI
172b0 56 45 5f 54 52 49 47 47 45 52 53 0a 20 20 20 20  VE_TRIGGERS.    
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
172d0 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65 72  QLITE_RecTrigger
172e0 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  s.#endif.#if def
172f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41  ined(SQLITE_DEFA
17300 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53  ULT_FOREIGN_KEYS
17310 29 20 26 26 20 53 51 4c 49 54 45 5f 44 45 46 41  ) && SQLITE_DEFA
17320 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53  ULT_FOREIGN_KEYS
17330 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17340 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72 65 69    | SQLITE_Forei
17350 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a 23 69  gnKeys.#endif.#i
17360 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
17370 5f 52 45 56 45 52 53 45 5f 55 4e 4f 52 44 45 52  _REVERSE_UNORDER
17380 45 44 5f 53 45 4c 45 43 54 53 29 0a 20 20 20 20  ED_SELECTS).    
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
173a0 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64  QLITE_ReverseOrd
173b0 65 72 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  er.#endif.#if de
173c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
173d0 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
173e0 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 20 20 20  L_CHECK).       
173f0 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
17400 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 0a 23 65  TE_CellSizeCk.#e
17410 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73  ndif.      ;.  s
17420 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
17430 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23  db->aCollSeq);.#
17440 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17450 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
17460 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
17470 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
17480 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64  .#endif..  /* Ad
17490 64 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  d the default co
174a0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
174b0 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20   BINARY. BINARY 
174c0 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55  works for both U
174d0 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54  TF-8.  ** and UT
174e0 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76  F-16, so add a v
174f0 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  ersion for each 
17500 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e  to avoid any unn
17510 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f  ecessary.  ** co
17520 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f  nversions. The o
17530 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20 63  nly error that c
17540 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69 73  an occur here is
17550 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
17560 75 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ure..  **.  ** E
17570 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32  VIDENCE-OF: R-52
17580 37 38 36 2d 34 34 38 37 38 20 53 51 4c 69 74 65  786-44878 SQLite
17590 20 64 65 66 69 6e 65 73 20 74 68 72 65 65 20 62   defines three b
175a0 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e  uilt-in collatin
175b0 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  g.  ** functions
175c0 3a 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43  :.  */.  createC
175d0 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c  ollation(db, sql
175e0 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20 53  ite3StrBINARY, S
175f0 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 62  QLITE_UTF8, 0, b
17600 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
17610 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
17620 6e 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72  n(db, sqlite3Str
17630 42 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55  BINARY, SQLITE_U
17640 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f  TF16BE, 0, binCo
17650 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
17660 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
17670 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  , sqlite3StrBINA
17680 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  RY, SQLITE_UTF16
17690 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75  LE, 0, binCollFu
176a0 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
176b0 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e  Collation(db, "N
176c0 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55  OCASE", SQLITE_U
176d0 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f  TF8, 0, nocaseCo
176e0 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b  llatingFunc, 0);
176f0 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
17700 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20  on(db, "RTRIM", 
17710 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f  SQLITE_UTF8, (vo
17720 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75  id*)1, binCollFu
17730 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  nc, 0);.  if( db
17740 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
17750 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  {.    goto opend
17760 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20  b_out;.  }.  /* 
17770 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
17780 38 33 30 38 2d 31 37 32 32 34 20 54 68 65 20 64  8308-17224 The d
17790 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
177a0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6c   function for al
177b0 6c 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 69  l.  ** strings i
177c0 73 20 42 49 4e 41 52 59 2e 20 0a 20 20 2a 2f 0a  s BINARY. .  */.
177d0 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20    db->pDfltColl 
177e0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
177f0 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f  lSeq(db, SQLITE_
17800 55 54 46 38 2c 20 73 71 6c 69 74 65 33 53 74 72  UTF8, sqlite3Str
17810 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 61 73  BINARY, 0);.  as
17820 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43  sert( db->pDfltC
17830 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  oll!=0 );..  /* 
17840 50 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61  Parse the filena
17850 6d 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 2e  me/URI argument.
17860 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c   */.  db->openFl
17870 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72  ags = flags;.  r
17880 63 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  c = sqlite3Parse
17890 55 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e  Uri(zVfs, zFilen
178a0 61 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62  ame, &flags, &db
178b0 2d 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20  ->pVfs, &zOpen, 
178c0 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
178d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
178e0 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
178f0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d  LITE_NOMEM ) db-
17900 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
17910 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  1;.    sqlite3Er
17920 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72  rorWithMsg(db, r
17930 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73  c, zErrMsg ? "%s
17940 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b  " : 0, zErrMsg);
17950 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
17960 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
17970 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
17980 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
17990 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61  the backend data
179a0 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20  base driver */. 
179b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
179c0 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c  eeOpen(db->pVfs,
179d0 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d   zOpen, db, &db-
179e0 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a  >aDb[0].pBt, 0,.
179f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a00 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20          flags | 
17a10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
17a20 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  _DB);.  if( rc!=
17a30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17a40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17a50 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  IOERR_NOMEM ){. 
17a60 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17a70 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
17a80 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
17a90 62 2c 20 72 63 29 3b 0a 20 20 20 20 67 6f 74 6f  b, rc);.    goto
17aa0 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
17ab0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17ac0 6e 74 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  nter(db->aDb[0].
17ad0 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  pBt);.  db->aDb[
17ae0 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c  0].pSchema = sql
17af0 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62  ite3SchemaGet(db
17b00 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  , db->aDb[0].pBt
17b10 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  );.  if( !db->ma
17b20 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 45 4e 43  llocFailed ) ENC
17b30 28 64 62 29 20 3d 20 53 43 48 45 4d 41 5f 45 4e  (db) = SCHEMA_EN
17b40 43 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  C(db);.  sqlite3
17b50 42 74 72 65 65 4c 65 61 76 65 28 64 62 2d 3e 61  BtreeLeave(db->a
17b60 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62  Db[0].pBt);.  db
17b70 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
17b80 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
17b90 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f  Get(db, 0);..  /
17ba0 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 61  * The default sa
17bb0 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74  fety_level for t
17bc0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
17bd0 20 69 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20   is 'full'; for 
17be0 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61  the temp.  ** da
17bf0 74 61 62 61 73 65 20 69 74 20 69 73 20 27 4e 4f  tabase it is 'NO
17c00 4e 45 27 2e 20 54 68 69 73 20 6d 61 74 63 68 65  NE'. This matche
17c10 73 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  s the pager laye
17c20 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20  r defaults.  .  
17c30 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  */.  db->aDb[0].
17c40 7a 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a  zName = "main";.
17c50 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66    db->aDb[0].saf
17c60 65 74 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20  ety_level = 3;. 
17c70 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d   db->aDb[1].zNam
17c80 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62  e = "temp";.  db
17c90 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f  ->aDb[1].safety_
17ca0 6c 65 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62  level = 1;..  db
17cb0 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
17cc0 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69  _MAGIC_OPEN;.  i
17cd0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
17ce0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
17cf0 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
17d00 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61  .  /* Register a
17d10 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63  ll built-in func
17d20 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f  tions, but do no
17d30 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61  t attempt to rea
17d40 64 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  d the.  ** datab
17d50 61 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20  ase schema yet. 
17d60 54 68 69 73 20 69 73 20 64 65 6c 61 79 65 64 20  This is delayed 
17d70 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
17d80 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73  time the databas
17d90 65 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73  e.  ** is access
17da0 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ed..  */.  sqlit
17db0 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
17dc0 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65  TE_OK);.  sqlite
17dd0 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e  3RegisterBuiltin
17de0 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a  Functions(db);..
17df0 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61    /* Load automa
17e00 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d  tic extensions -
17e10 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74   extensions that
17e20 20 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73   have been regis
17e30 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67  tered.  ** using
17e40 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74   the sqlite3_aut
17e50 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e  omatic_extension
17e60 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 72  () API..  */.  r
17e70 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
17e80 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72  ode(db);.  if( r
17e90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17ea0 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c      sqlite3AutoL
17eb0 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62  oadExtensions(db
17ec0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
17ed0 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
17ee0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
17ef0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17f00 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
17f10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
17f20 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17f30 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d  _FTS1.  if( !db-
17f40 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
17f50 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
17f60 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28  sqlite3Fts1Init(
17f70 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72  sqlite3*);.    r
17f80 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49  c = sqlite3Fts1I
17f90 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
17fa0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
17fb0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20  TE_ENABLE_FTS2. 
17fc0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
17fd0 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
17fe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65  LITE_OK ){.    e
17ff0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
18000 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65  3Fts2Init(sqlite
18010 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  3*);.    rc = sq
18020 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 64 62  lite3Fts2Init(db
18030 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
18040 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
18050 42 4c 45 5f 46 54 53 33 20 2f 2a 20 61 75 74 6f  BLE_FTS3 /* auto
18060 6d 61 74 69 63 61 6c 6c 79 20 64 65 66 69 6e 65  matically define
18070 64 20 62 79 20 53 51 4c 49 54 45 5f 45 4e 41 42  d by SQLITE_ENAB
18080 4c 45 5f 46 54 53 34 20 2a 2f 0a 20 20 69 66 28  LE_FTS4 */.  if(
18090 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
180a0 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
180b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
180c0 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28  sqlite3Fts3Init(
180d0 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
180e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
180f0 4e 41 42 4c 45 5f 46 54 53 35 0a 20 20 69 66 28  NABLE_FTS5.  if(
18100 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
18110 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
18120 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
18130 73 71 6c 69 74 65 33 46 74 73 35 49 6e 69 74 28  sqlite3Fts5Init(
18140 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
18150 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18160 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20  NABLE_ICU.  if( 
18170 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
18180 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
18190 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
181a0 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64 62  qlite3IcuInit(db
181b0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
181c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
181d0 42 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20  BLE_RTREE.  if( 
181e0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
181f0 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
18200 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  OK){.    rc = sq
18210 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74 28 64  lite3RtreeInit(d
18220 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
18230 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
18240 41 42 4c 45 5f 44 42 53 54 41 54 5f 56 54 41 42  ABLE_DBSTAT_VTAB
18250 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
18260 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
18270 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20  SQLITE_OK){.    
18280 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 73 74  rc = sqlite3Dbst
18290 61 74 52 65 67 69 73 74 65 72 28 64 62 29 3b 0a  atRegister(db);.
182a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
182b0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
182c0 5f 4a 53 4f 4e 31 0a 20 20 69 66 28 20 21 64 62  _JSON1.  if( !db
182d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
182e0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc==SQLITE_OK)
182f0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
18300 65 33 4a 73 6f 6e 31 49 6e 69 74 28 64 62 29 3b  e3Json1Init(db);
18310 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
18320 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55  * -DSQLITE_DEFAU
18330 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
18340 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56  1 makes EXCLUSIV
18350 45 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  E the default lo
18360 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e  cking.  ** mode.
18370 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55    -DSQLITE_DEFAU
18380 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
18390 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68  0 make NORMAL th
183a0 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
183b0 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f  g.  ** mode.  Do
183c0 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61  ing nothing at a
183d0 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f  ll also makes NO
183e0 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74  RMAL the default
183f0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
18400 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
18410 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e  KING_MODE.  db->
18420 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53  dfltLockMode = S
18430 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
18440 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71  CKING_MODE;.  sq
18450 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e  lite3PagerLockin
18460 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72  gMode(sqlite3Btr
18470 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b  eePager(db->aDb[
18480 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20  0].pBt),.       
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184a0 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c     SQLITE_DEFAUL
184b0 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b  T_LOCKING_MODE);
184c0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72  .#endif..  if( r
184d0 63 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72  c ) sqlite3Error
184e0 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20  (db, rc);..  /* 
184f0 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61  Enable the looka
18500 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73  side-malloc subs
18510 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70  ystem */.  setup
18520 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c  Lookaside(db, 0,
18530 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
18540 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65  nfig.szLookaside
18550 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18560 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
18570 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c  3GlobalConfig.nL
18580 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73 71  ookaside);..  sq
18590 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
185a0 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c  eckpoint(db, SQL
185b0 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
185c0 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b  AUTOCHECKPOINT);
185d0 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20  ..opendb_out:.  
185e0 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73  if( db ){.    as
185f0 73 65 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21  sert( db->mutex!
18600 3d 30 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61  =0 || isThreadsa
18610 66 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  fe==0.          
18620 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   || sqlite3Globa
18630 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  lConfig.bFullMut
18640 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ex==0 );.    sql
18650 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
18660 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d  (db->mutex);.  }
18670 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
18680 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 61  errcode(db);.  a
18690 73 73 65 72 74 28 20 64 62 21 3d 30 20 7c 7c 20  ssert( db!=0 || 
186a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
186b0 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
186c0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
186d0 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
186e0 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b  db);.    db = 0;
186f0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21  .  }else if( rc!
18700 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18710 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
18720 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b  LITE_MAGIC_SICK;
18730 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64  .  }.  *ppDb = d
18740 62 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  b;.#ifdef SQLITE
18750 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20  _ENABLE_SQLLOG. 
18760 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
18770 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
18780 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69   ){.    /* Openi
18790 6e 67 20 61 20 64 62 20 68 61 6e 64 6c 65 2e 20  ng a db handle. 
187a0 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65 72  Fourth parameter
187b0 20 69 73 20 70 61 73 73 65 64 20 30 2e 20 2a 2f   is passed 0. */
187c0 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20  .    void *pArg 
187d0 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
187e0 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
187f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
18800 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
18810 67 28 70 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c  g(pArg, db, zFil
18820 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23  ename, 0);.  }.#
18830 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
18840 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  d(SQLITE_HAS_COD
18850 45 43 29 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  EC).  if( rc==SQ
18860 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63  LITE_OK ){.    c
18870 6f 6e 73 74 20 63 68 61 72 20 2a 7a 48 65 78 4b  onst char *zHexK
18880 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  ey = sqlite3_uri
18890 5f 70 61 72 61 6d 65 74 65 72 28 7a 4f 70 65 6e  _parameter(zOpen
188a0 2c 20 22 68 65 78 6b 65 79 22 29 3b 0a 20 20 20  , "hexkey");.   
188b0 20 69 66 28 20 7a 48 65 78 4b 65 79 20 26 26 20   if( zHexKey && 
188c0 7a 48 65 78 4b 65 79 5b 30 5d 20 29 7b 0a 20 20  zHexKey[0] ){.  
188d0 20 20 20 20 75 38 20 69 42 79 74 65 3b 0a 20 20      u8 iByte;.  
188e0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
188f0 20 63 68 61 72 20 7a 4b 65 79 5b 34 30 5d 3b 0a   char zKey[40];.
18900 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 69        for(i=0, i
18910 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  Byte=0; i<sizeof
18920 28 7a 4b 65 79 29 2a 32 20 26 26 20 73 71 6c 69  (zKey)*2 && sqli
18930 74 65 33 49 73 78 64 69 67 69 74 28 7a 48 65 78  te3Isxdigit(zHex
18940 4b 65 79 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Key[i]); i++){. 
18950 20 20 20 20 20 20 20 69 42 79 74 65 20 3d 20 28         iByte = (
18960 69 42 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69  iByte<<4) + sqli
18970 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 48 65 78  te3HexToInt(zHex
18980 4b 65 79 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Key[i]);.       
18990 20 69 66 28 20 28 69 26 31 29 21 3d 30 20 29 20   if( (i&1)!=0 ) 
189a0 7a 4b 65 79 5b 69 2f 32 5d 20 3d 20 69 42 79 74  zKey[i/2] = iByt
189b0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
189c0 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28   sqlite3_key_v2(
189d0 64 62 2c 20 30 2c 20 7a 4b 65 79 2c 20 69 2f 32  db, 0, zKey, i/2
189e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
189f0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  dif.  sqlite3_fr
18a00 65 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 72 65 74  ee(zOpen);.  ret
18a10 75 72 6e 20 72 63 20 26 20 30 78 66 66 3b 0a 7d  urn rc & 0xff;.}
18a20 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
18a30 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ew database hand
18a40 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
18a50 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74  e3_open(.  const
18a60 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
18a70 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  , .  sqlite3 **p
18a80 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e  pDb .){.  return
18a90 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46   openDatabase(zF
18aa0 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20  ilename, ppDb,. 
18ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ac0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
18ad0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
18ae0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
18af0 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
18b00 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f  e3_open_v2(.  co
18b10 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61  nst char *filena
18b20 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73  me,   /* Databas
18b30 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d  e filename (UTF-
18b40 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  8) */.  sqlite3 
18b50 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 20  **ppDb,         
18b60 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64  /* OUT: SQLite d
18b70 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  b handle */.  in
18b80 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
18b90 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a        /* Flags *
18ba0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
18bb0 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e  zVfs        /* N
18bc0 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c  ame of VFS modul
18bd0 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20  e to use */.){. 
18be0 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61   return openData
18bf0 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70  base(filename, p
18c00 70 44 62 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  pDb, (unsigned i
18c10 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b  nt)flags, zVfs);
18c20 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
18c30 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
18c40 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64  .** Open a new d
18c50 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
18c60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
18c70 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76  pen16(.  const v
18c80 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  oid *zFilename, 
18c90 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
18ca0 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  b.){.  char cons
18cb0 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20  t *zFilename8;  
18cc0 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e   /* zFilename en
18cd0 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69  coded in UTF-8 i
18ce0 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36  nstead of UTF-16
18cf0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
18d00 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
18d10 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c   rc;..#ifdef SQL
18d20 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
18d30 52 4d 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d  RMOR.  if( ppDb=
18d40 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
18d50 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
18d60 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d  #endif.  *ppDb =
18d70 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
18d80 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
18d90 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
18da0 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
18db0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
18dc0 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  rc;.#endif.  if(
18dd0 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20   zFilename==0 ) 
18de0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22 5c 30 30  zFilename = "\00
18df0 30 5c 30 30 30 22 3b 0a 20 20 70 56 61 6c 20 3d  0\000";.  pVal =
18e00 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
18e10 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  (0);.  sqlite3Va
18e20 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
18e30 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53  -1, zFilename, S
18e40 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
18e50 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  E, SQLITE_STATIC
18e60 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20  );.  zFilename8 
18e70 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
18e80 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f  xt(pVal, SQLITE_
18e90 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46 69  UTF8);.  if( zFi
18ea0 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72  lename8 ){.    r
18eb0 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73 65  c = openDatabase
18ec0 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44  (zFilename8, ppD
18ed0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
18ee0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
18ef0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
18f00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
18f10 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  ATE, 0);.    ass
18f20 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20 72 63  ert( *ppDb || rc
18f30 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
18f40 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
18f50 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62 48 61  LITE_OK && !DbHa
18f60 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44 62 2c  sProperty(*ppDb,
18f70 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61   0, DB_SchemaLoa
18f80 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20 53 43  ded) ){.      SC
18f90 48 45 4d 41 5f 45 4e 43 28 2a 70 70 44 62 29 20  HEMA_ENC(*ppDb) 
18fa0 3d 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53  = ENC(*ppDb) = S
18fb0 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
18fc0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  E;.    }.  }else
18fd0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
18fe0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73  E_NOMEM;.  }.  s
18ff0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
19000 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pVal);..  return
19010 20 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 23 65   rc & 0xff;.}.#e
19020 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
19030 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
19040 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
19050 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
19060 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
19070 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
19080 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
19090 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
190a0 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  on(.  sqlite3* d
190b0 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
190c0 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
190d0 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
190e0 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
190f0 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
19100 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
19110 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  onst void*).){. 
19120 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
19130 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
19140 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65  _v2(db, zName, e
19150 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  nc, pCtx, xCompa
19160 72 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  re, 0);.}../*.**
19170 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
19180 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
19190 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
191a0 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
191b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
191c0 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
191d0 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  v2(.  sqlite3* d
191e0 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
191f0 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
19200 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
19210 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
19220 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
19230 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
19240 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76  onst void*),.  v
19250 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  oid(*xDel)(void*
19260 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ).){.  int rc;..
19270 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
19280 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
19290 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
192a0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c  etyCheckOk(db) |
192b0 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  | zName==0 ) ret
192c0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
192d0 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
192e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
192f0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
19300 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
19310 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
19320 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c    rc = createCol
19330 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  lation(db, zName
19340 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c  , (u8)enc, pCtx,
19350 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29   xCompare, xDel)
19360 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
19370 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
19380 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
19390 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
193a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
193b0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
193c0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
193d0 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65  ** Register a ne
193e0 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  w collation sequ
193f0 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61  ence with the da
19400 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
19410 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19420 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
19430 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  n16(.  sqlite3* 
19440 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69  db, .  const voi
19450 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  d *zName,.  int 
19460 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
19470 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
19480 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
19490 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
194a0 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  onst void*).){. 
194b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
194c0 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  _OK;.  char *zNa
194d0 6d 65 38 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  me8;..#ifdef SQL
194e0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
194f0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
19500 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
19510 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30  (db) || zName==0
19520 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
19530 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
19540 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
19550 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
19560 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
19570 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
19580 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d  ed );.  zName8 =
19590 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38   sqlite3Utf16to8
195a0 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  (db, zName, -1, 
195b0 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
195c0 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  VE);.  if( zName
195d0 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72  8 ){.    rc = cr
195e0 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
195f0 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e  , zName8, (u8)en
19600 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  c, pCtx, xCompar
19610 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
19620 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
19630 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  me8);.  }.  rc =
19640 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
19650 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
19660 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
19670 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
19680 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
19690 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
196a0 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
196b0 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61  Register a colla
196c0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
196d0 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77  ctory callback w
196e0 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
196f0 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52   handle.** db. R
19700 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69  eplace any previ
19710 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20  ously installed 
19720 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
19730 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69  ce factory..*/.i
19740 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61  nt sqlite3_colla
19750 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73  tion_needed(.  s
19760 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76  qlite3 *db, .  v
19770 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64  oid *pCollNeeded
19780 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43  Arg, .  void(*xC
19790 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a  ollNeeded)(void*
197a0 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54  ,sqlite3*,int eT
197b0 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61  extRep,const cha
197c0 72 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51  r*).){.#ifdef SQ
197d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
197e0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
197f0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
19800 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
19810 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
19820 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
19830 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
19840 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
19850 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20  ->xCollNeeded = 
19860 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64  xCollNeeded;.  d
19870 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  b->xCollNeeded16
19880 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c   = 0;.  db->pCol
19890 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f  lNeededArg = pCo
198a0 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73  llNeededArg;.  s
198b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
198c0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
198d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
198e0 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
198f0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
19900 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
19910 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
19920 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c  nce factory call
19930 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61  back with the da
19940 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
19950 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79   db. Replace any
19960 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74   previously inst
19970 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  alled collation 
19980 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
19990 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
199a0 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
199b0 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  d16(.  sqlite3 *
199c0 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f  db, .  void *pCo
199d0 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20  llNeededArg, .  
199e0 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65  void(*xCollNeede
199f0 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74  d16)(void*,sqlit
19a00 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70  e3*,int eTextRep
19a10 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
19a20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
19a30 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
19a40 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
19a50 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
19a60 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
19a70 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
19a80 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
19a90 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
19aa0 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  tex);.  db->xCol
19ab0 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64  lNeeded = 0;.  d
19ac0 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  b->xCollNeeded16
19ad0 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36   = xCollNeeded16
19ae0 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65  ;.  db->pCollNee
19af0 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65  dedArg = pCollNe
19b00 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74  ededArg;.  sqlit
19b10 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
19b20 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
19b30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19b40 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
19b50 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
19b60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19b70 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
19b80 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
19b90 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e  ion is now an an
19ba0 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73  achronism. It us
19bb0 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f  ed to be used to
19bc0 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a   recover from a.
19bd0 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  ** malloc() fail
19be0 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20  ure, but SQLite 
19bf0 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20 61 75  now does this au
19c00 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a  tomatically..*/.
19c10 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62  int sqlite3_glob
19c20 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29  al_recover(void)
19c30 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  {.  return SQLIT
19c40 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
19c50 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65  /*.** Test to se
19c60 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
19c70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
19c80 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61  nnection is in a
19c90 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64  utocommit.** mod
19ca0 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  e.  Return TRUE 
19cb0 69 66 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c  if it is and FAL
19cc0 53 45 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f  SE if not.  Auto
19cd0 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f  commit mode is o
19ce0 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e  n.** by default.
19cf0 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20    Autocommit is 
19d00 64 69 73 61 62 6c 65 64 20 62 79 20 61 20 42 45  disabled by a BE
19d10 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  GIN statement an
19d20 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62  d reenabled.** b
19d30 79 20 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49  y the next COMMI
19d40 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a  T or ROLLBACK..*
19d50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65  /.int sqlite3_ge
19d60 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c  t_autocommit(sql
19d70 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65  ite3 *db){.#ifde
19d80 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
19d90 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
19da0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
19db0 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
19dc0 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
19dd0 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
19de0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
19df0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  dif.  return db-
19e00 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a  >autoCommit;.}..
19e10 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
19e20 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ing routines are
19e30 20 73 75 62 73 74 69 74 75 74 65 73 20 66 6f 72   substitutes for
19e40 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54   constants SQLIT
19e50 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51  E_CORRUPT,.** SQ
19e60 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c  LITE_MISUSE, SQL
19e70 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51  ITE_CANTOPEN, SQ
19e80 4c 49 54 45 5f 49 4f 45 52 52 20 61 6e 64 20 70  LITE_IOERR and p
19e90 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72  ossibly other er
19ea0 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  ror.** constants
19eb0 2e 20 20 54 68 65 79 20 73 65 72 76 65 20 74 77  .  They serve tw
19ec0 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a  o purposes:.**.*
19ed0 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20 61 73  *   1.  Serve as
19ee0 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c   a convenient pl
19ef0 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65  ace to set a bre
19f00 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62  akpoint in a deb
19f10 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74  ugger.**       t
19f20 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20 76 65  o detect when ve
19f30 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64  rsion error cond
19f40 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a  itions occurs..*
19f50 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b  *.**   2.  Invok
19f60 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  e sqlite3_log() 
19f70 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 73  to provide the s
19f80 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74  ource code locat
19f90 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20  ion where.**    
19fa0 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65     a low-level e
19fb0 72 72 6f 72 20 69 73 20 66 69 72 73 74 20 64 65  rror is first de
19fc0 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  tected..*/.int s
19fd0 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45 72 72  qlite3CorruptErr
19fe0 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
19ff0 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1a000 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1a010 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c  xLog!=0 );.  sql
1a020 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
1a030 43 4f 52 52 55 50 54 2c 0a 20 20 20 20 20 20 20  CORRUPT,.       
1a040 20 20 20 20 20 20 20 22 64 61 74 61 62 61 73 65         "database
1a050 20 63 6f 72 72 75 70 74 69 6f 6e 20 61 74 20 6c   corruption at l
1a060 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73  ine %d of [%.10s
1a070 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]",.            
1a080 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c    lineno, 20+sql
1a090 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
1a0a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1a0b0 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e 74  E_CORRUPT;.}.int
1a0c0 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45 72   sqlite3MisuseEr
1a0d0 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
1a0e0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
1a0f0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1a100 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71  .xLog!=0 );.  sq
1a110 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
1a120 5f 4d 49 53 55 53 45 2c 20 0a 20 20 20 20 20 20  _MISUSE, .      
1a130 20 20 20 20 20 20 20 20 22 6d 69 73 75 73 65 20          "misuse 
1a140 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25  at line %d of [%
1a150 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20  .10s]",.        
1a160 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30        lineno, 20
1a170 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69  +sqlite3_sourcei
1a180 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  d());.  return S
1a190 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a  QLITE_MISUSE;.}.
1a1a0 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f  int sqlite3Canto
1a1b0 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  penError(int lin
1a1c0 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
1a1d0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1a1e0 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
1a1f0 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53  .  sqlite3_log(S
1a200 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20  QLITE_CANTOPEN, 
1a210 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1a220 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
1a230 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b   at line %d of [
1a240 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20  %.10s]",.       
1a250 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32         lineno, 2
1a260 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  0+sqlite3_source
1a270 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  id());.  return 
1a280 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
1a290 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
1a2a0 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
1a2b0 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  TED./*.** This i
1a2c0 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20  s a convenience 
1a2d0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6b  routine that mak
1a2e0 65 73 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c  es sure that all
1a2f0 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63   thread-specific
1a300 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 69  .** data for thi
1a310 73 20 74 68 72 65 61 64 20 68 61 73 20 62 65 65  s thread has bee
1a320 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a  n deallocated..*
1a330 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c  *.** SQLite no l
1a340 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72 65 61  onger uses threa
1a350 64 2d 73 70 65 63 69 66 69 63 20 64 61 74 61 20  d-specific data 
1a360 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  so this routine 
1a370 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f  is now a.** no-o
1a380 70 2e 20 20 49 74 20 69 73 20 72 65 74 61 69 6e  p.  It is retain
1a390 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61  ed for historica
1a3a0 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e  l compatibility.
1a3b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1a3c0 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28  _thread_cleanup(
1a3d0 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a  void){.}.#endif.
1a3e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65  ./*.** Return me
1a3f0 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ta information a
1a400 62 6f 75 74 20 61 20 73 70 65 63 69 66 69 63 20  bout a specific 
1a410 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74 61  column of a data
1a420 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53  base table..** S
1a430 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71  ee comment in sq
1a440 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74 65 2e  lite3.h (sqlite.
1a450 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61 69 6c  h.in) for detail
1a460 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1a470 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
1a480 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74  etadata(.  sqlit
1a490 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
1a4a0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
1a4b0 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  tion handle */. 
1a4c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1a4d0 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
1a4e0 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72  Database name or
1a4f0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
1a500 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d   char *zTableNam
1a510 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  e,     /* Table 
1a520 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  name */.  const 
1a530 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d  char *zColumnNam
1a540 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  e,    /* Column 
1a550 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  name */.  char c
1a560 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70  onst **pzDataTyp
1a570 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  e,    /* OUTPUT:
1a580 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20 74   Declared data t
1a590 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ype */.  char co
1a5a0 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c  nst **pzCollSeq,
1a5b0 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
1a5c0 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
1a5d0 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  ce name */.  int
1a5e0 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20   *pNotNull,     
1a5f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
1a600 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20  UT: True if NOT 
1a610 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20  NULL constraint 
1a620 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20  exists */.  int 
1a630 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20  *pPrimaryKey,   
1a640 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
1a650 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
1a660 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a  n part of PK */.
1a670 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20    int *pAutoinc 
1a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a690 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
1a6a0 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d   column is auto-
1a6b0 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  increment */.){.
1a6c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
1a6d0 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
1a6e0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
1a6f0 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
1a700 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
1a710 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
1a720 73 74 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20  st *zDataType = 
1a730 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
1a740 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20  *zCollSeq = 0;. 
1a750 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30   int notnull = 0
1a760 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b  ;.  int primaryk
1a770 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75  ey = 0;.  int au
1a780 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 0a 23 69 66  toinc = 0;...#if
1a790 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1a7a0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1a7b0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1a7c0 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a  CheckOk(db) || z
1a7d0 54 61 62 6c 65 4e 61 6d 65 3d 3d 30 20 29 7b 0a  TableName==0 ){.
1a7e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a7f0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
1a800 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1a810 45 6e 73 75 72 65 20 74 68 65 20 64 61 74 61 62  Ensure the datab
1a820 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 62  ase schema has b
1a830 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20  een loaded */.  
1a840 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1a850 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1a860 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1a870 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63  terAll(db);.  rc
1a880 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64   = sqlite3Init(d
1a890 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  b, &zErrMsg);.  
1a8a0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
1a8b0 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72  c ){.    goto er
1a8c0 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ror_out;.  }..  
1a8d0 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  /* Locate the ta
1a8e0 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20  ble in question 
1a8f0 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  */.  pTab = sqli
1a900 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
1a910 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62   zTableName, zDb
1a920 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54  Name);.  if( !pT
1a930 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  ab || pTab->pSel
1a940 65 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20  ect ){.    pTab 
1a950 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72  = 0;.    goto er
1a960 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ror_out;.  }..  
1a970 2f 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75  /* Find the colu
1a980 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66  mn for which inf
1a990 6f 20 69 73 20 72 65 71 75 65 73 74 65 64 20 2a  o is requested *
1a9a0 2f 0a 20 20 69 66 28 20 7a 43 6f 6c 75 6d 6e 4e  /.  if( zColumnN
1a9b0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ame==0 ){.    /*
1a9c0 20 51 75 65 72 79 20 66 6f 72 20 65 78 69 73 74   Query for exist
1a9d0 61 6e 63 65 20 6f 66 20 74 61 62 6c 65 20 6f 6e  ance of table on
1a9e0 6c 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ly */.  }else{. 
1a9f0 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
1aa00 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
1aa10 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70  iCol++){.      p
1aa20 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
1aa30 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69  l[iCol];.      i
1aa40 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
1aa50 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
1aa60 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29  , zColumnName) )
1aa70 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
1aa80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1aa90 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61     if( iCol==pTa
1aaa0 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
1aab0 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
1aac0 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 49 73  ab) && sqlite3Is
1aad0 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d  Rowid(zColumnNam
1aae0 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43  e) ){.        iC
1aaf0 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
1ab00 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d  ;.        pCol =
1ab10 20 69 43 6f 6c 3e 3d 30 20 3f 20 26 70 54 61 62   iCol>=0 ? &pTab
1ab20 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 20 3a 20 30  ->aCol[iCol] : 0
1ab30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ab40 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b         pTab = 0;
1ab50 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 72  .        goto er
1ab60 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ror_out;.      }
1ab70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1ab80 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
1ab90 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20  lock stores the 
1aba0 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
1abb0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
1abc0 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74  turned.  ** to t
1abd0 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63  he caller in loc
1abe0 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61  al variables zDa
1abf0 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71  taType, zCollSeq
1ac00 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61  , notnull, prima
1ac10 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61  rykey.  ** and a
1ac20 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20  utoinc. At this 
1ac30 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65 20  point there are 
1ac40 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65  two possibilitie
1ac50 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20  s:.  ** .  **   
1ac60 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66 69    1. The specifi
1ac70 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77  ed column name w
1ac80 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22  as rowid", "oid"
1ac90 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20   or "_rowid_" . 
1aca0 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74   **        and t
1acb0 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69  here is no expli
1acc0 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49  citly declared I
1acd0 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a  PK column. .  **
1ace0 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65  .  **     2. The
1acf0 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20   table is not a 
1ad00 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c  view and the col
1ad10 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66  umn name identif
1ad20 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20  ied an .  **    
1ad30 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64      explicitly d
1ad40 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20  eclared column. 
1ad50 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d  Copy meta inform
1ad60 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c  ation from *pCol
1ad70 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43  ..  */ .  if( pC
1ad80 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54  ol ){.    zDataT
1ad90 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70  ype = pCol->zTyp
1ada0 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20  e;.    zCollSeq 
1adb0 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20  = pCol->zColl;. 
1adc0 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f     notnull = pCo
1add0 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20  l->notNull!=0;. 
1ade0 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d     primarykey  =
1adf0 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73   (pCol->colFlags
1ae00 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b   & COLFLAG_PRIMK
1ae10 45 59 29 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f  EY)!=0;.    auto
1ae20 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  inc = pTab->iPKe
1ae30 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62  y==iCol && (pTab
1ae40 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
1ae50 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d  Autoincrement)!=
1ae60 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1ae70 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54  zDataType = "INT
1ae80 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61  EGER";.    prima
1ae90 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20  rykey = 1;.  }. 
1aea0 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29   if( !zCollSeq )
1aeb0 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d  {.    zCollSeq =
1aec0 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
1aed0 59 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75  Y;.  }..error_ou
1aee0 74 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t:.  sqlite3Btre
1aef0 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a  eLeaveAll(db);..
1af00 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65    /* Whether the
1af10 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73   function call s
1af20 75 63 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c  ucceeded or fail
1af30 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70  ed, set the outp
1af40 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20  ut parameters.  
1af50 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20 74  ** to whatever t
1af60 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74  heir local count
1af70 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e  erparts contain.
1af80 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64   If an error did
1af90 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69   occur,.  ** thi
1afa0 73 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  s has the effect
1afb0 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20   of zeroing all 
1afc0 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
1afd0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a  s..  */.  if( pz
1afe0 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61  DataType ) *pzDa
1aff0 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79  taType = zDataTy
1b000 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c  pe;.  if( pzColl
1b010 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71  Seq ) *pzCollSeq
1b020 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69   = zCollSeq;.  i
1b030 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70  f( pNotNull ) *p
1b040 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c  NotNull = notnul
1b050 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72  l;.  if( pPrimar
1b060 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79  yKey ) *pPrimary
1b070 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79  Key = primarykey
1b080 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63  ;.  if( pAutoinc
1b090 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61   ) *pAutoinc = a
1b0a0 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53  utoinc;..  if( S
1b0b0 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20  QLITE_OK==rc && 
1b0c0 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  !pTab ){.    sql
1b0d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1b0e0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72  ErrMsg);.    zEr
1b0f0 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  rMsg = sqlite3MP
1b100 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75  rintf(db, "no su
1b110 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a  ch table column:
1b120 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e   %s.%s", zTableN
1b130 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f  ame,.        zCo
1b140 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72  lumnName);.    r
1b150 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1b160 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
1b170 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
1b180 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73  rc, (zErrMsg?"%s
1b190 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  ":0), zErrMsg);.
1b1a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1b1b0 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
1b1c0 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
1b1d0 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
1b1e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1b1f0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1b200 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b210 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
1b220 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
1b230 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
1b240 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
1b250 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1b260 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20  sleep(int ms){. 
1b270 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1b280 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fs;.  int rc;.  
1b290 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
1b2a0 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66  fs_find(0);.  if
1b2b0 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75  ( pVfs==0 ) retu
1b2c0 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  rn 0;..  /* This
1b2d0 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
1b2e0 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  in milliseconds,
1b2f0 20 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79   but the underly
1b300 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20  ing OsSleep() . 
1b310 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63   ** API uses mic
1b320 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65  roseconds. Hence
1b330 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a   the 1000's..  *
1b340 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65  /.  rc = (sqlite
1b350 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31  3OsSleep(pVfs, 1
1b360 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20  000*ms)/1000);. 
1b370 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b380 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64  *.** Enable or d
1b390 69 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e  isable the exten
1b3a0 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73  ded result codes
1b3b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b3c0 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
1b3d0 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a  _codes(sqlite3 *
1b3e0 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a  db, int onoff){.
1b3f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1b400 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1b410 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1b420 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
1b430 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1b440 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
1b450 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
1b460 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1b470 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61  ex);.  db->errMa
1b480 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66  sk = onoff ? 0xf
1b490 66 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a  fffffff : 0xff;.
1b4a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1b4b0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1b4c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1b4d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
1b4e0 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43  nvoke the xFileC
1b4f0 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e  ontrol method on
1b500 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
1b510 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
1b520 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
1b530 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  rol(sqlite3 *db,
1b540 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1b550 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f  Name, int op, vo
1b560 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74  id *pArg){.  int
1b570 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1b580 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  OR;.  Btree *pBt
1b590 72 65 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ree;..#ifdef SQL
1b5a0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1b5b0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
1b5c0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
1b5d0 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
1b5e0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
1b5f0 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
1b600 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1b610 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74  b->mutex);.  pBt
1b620 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  ree = sqlite3DbN
1b630 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
1b640 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  DbName);.  if( p
1b650 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67  Btree ){.    Pag
1b660 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
1b670 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1b680 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1b690 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
1b6a0 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71  .    pPager = sq
1b6b0 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
1b6c0 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73  pBtree);.    ass
1b6d0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
1b6e0 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74  ;.    fd = sqlit
1b6f0 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67  e3PagerFile(pPag
1b700 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
1b710 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66   fd!=0 );.    if
1b720 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e  ( op==SQLITE_FCN
1b730 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20  TL_FILE_POINTER 
1b740 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74  ){.      *(sqlit
1b750 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d  e3_file**)pArg =
1b760 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   fd;.      rc = 
1b770 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1b780 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c  else if( op==SQL
1b790 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 5f 50 4f  ITE_FCNTL_VFS_PO
1b7a0 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a  INTER ){.      *
1b7b0 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2a 29 70  (sqlite3_vfs**)p
1b7c0 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Arg = sqlite3Pag
1b7d0 65 72 56 66 73 28 70 50 61 67 65 72 29 3b 0a 20  erVfs(pPager);. 
1b7e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b7f0 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
1b800 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  f( op==SQLITE_FC
1b810 4e 54 4c 5f 4a 4f 55 52 4e 41 4c 5f 50 4f 49 4e  NTL_JOURNAL_POIN
1b820 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73  TER ){.      *(s
1b830 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41  qlite3_file**)pA
1b840 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rg = sqlite3Page
1b850 72 4a 72 6e 6c 46 69 6c 65 28 70 50 61 67 65 72  rJrnlFile(pPager
1b860 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
1b870 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1b880 73 65 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68  se if( fd->pMeth
1b890 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ods ){.      rc 
1b8a0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
1b8b0 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70  ontrol(fd, op, p
1b8c0 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Arg);.    }else{
1b8d0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1b8e0 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20  TE_NOTFOUND;.   
1b8f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
1b900 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
1b910 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1b920 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1b930 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1b940 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e   rc;.}../*.** In
1b950 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 74  terface to the t
1b960 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f  esting logic..*/
1b970 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73  .int sqlite3_tes
1b980 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70  t_control(int op
1b990 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63  , ...){.  int rc
1b9a0 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
1b9b0 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
1b9c0 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50  _TEST.  UNUSED_P
1b9d0 41 52 41 4d 45 54 45 52 28 6f 70 29 3b 0a 23 65  ARAMETER(op);.#e
1b9e0 6c 73 65 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  lse.  va_list ap
1b9f0 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
1ba00 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20   op);.  switch( 
1ba10 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20  op ){..    /*.  
1ba20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75    ** Save the cu
1ba30 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74  rrent state of t
1ba40 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a  he PRNG..    */.
1ba50 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ba60 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41  TESTCTRL_PRNG_SA
1ba70 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  VE: {.      sqli
1ba80 74 65 33 50 72 6e 67 53 61 76 65 53 74 61 74 65  te3PrngSaveState
1ba90 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
1baa0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1bab0 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20 74 68     ** Restore th
1bac0 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  e state of the P
1bad0 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73 74 20  RNG to the last 
1bae0 73 74 61 74 65 20 73 61 76 65 64 20 75 73 69 6e  state saved usin
1baf0 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41  g.    ** PRNG_SA
1bb00 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53 41 56  VE.  If PRNG_SAV
1bb10 45 20 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f  E has never befo
1bb20 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  re been called, 
1bb30 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73  then.    ** this
1bb40 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b 65 20   verb acts like 
1bb50 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20 20  PRNG_RESET..    
1bb60 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1bb70 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
1bb80 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20  _RESTORE: {.    
1bb90 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73    sqlite3PrngRes
1bba0 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20 20 20  toreState();.   
1bbb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1bbc0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52  .    /*.    ** R
1bbd0 65 73 65 74 20 74 68 65 20 50 52 4e 47 20 62 61  eset the PRNG ba
1bbe0 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e 69 74  ck to its uninit
1bbf0 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e 20 20  ialized state.  
1bc00 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20  The next call.  
1bc10 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
1bc20 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c  randomness() wil
1bc30 6c 20 72 65 73 65 65 64 20 74 68 65 20 50 52 4e  l reseed the PRN
1bc40 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65  G using a single
1bc50 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
1bc60 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20  the xRandomness 
1bc70 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 64 65  method of the de
1bc80 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a  fault VFS..    *
1bc90 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1bca0 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
1bcb0 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20 73  RESET: {.      s
1bcc0 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
1bcd0 73 28 30 2c 30 29 3b 0a 20 20 20 20 20 20 62 72  s(0,0);.      br
1bce0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1bcf0 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1bd00 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1bd10 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73 69 7a  BITVEC_TEST, siz
1bd20 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20 20 20  e, program).    
1bd30 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61 20  **.    ** Run a 
1bd40 74 65 73 74 20 61 67 61 69 6e 73 74 20 61 20 42  test against a B
1bd50 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f 66 20  itvec object of 
1bd60 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f 67 72  size.  The progr
1bd70 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20  am argument.    
1bd80 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f  ** is an array o
1bd90 66 20 69 6e 74 65 67 65 72 73 20 74 68 61 74 20  f integers that 
1bda0 64 65 66 69 6e 65 73 20 74 68 65 20 74 65 73 74  defines the test
1bdb0 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20  .  Return -1 on 
1bdc0 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  a.    ** memory 
1bdd0 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
1bde0 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  , 0 on success, 
1bdf0 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20  or non-zero for 
1be00 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a  an error..    **
1be10 20 53 65 65 20 74 68 65 20 73 71 6c 69 74 65 33   See the sqlite3
1be20 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73  BitvecBuiltinTes
1be30 74 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  t() for addition
1be40 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
1be50 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1be60 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1be70 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20  BITVEC_TEST: {. 
1be80 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61       int sz = va
1be90 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
1bea0 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f 67 20       int *aProg 
1beb0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
1bec0 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  *);.      rc = s
1bed0 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c  qlite3BitvecBuil
1bee0 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50 72 6f  tinTest(sz, aPro
1bef0 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
1bf00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1bf10 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
1bf20 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 46 41 55 4c  est_control(FAUL
1bf30 54 5f 49 4e 53 54 41 4c 4c 2c 20 78 43 61 6c 6c  T_INSTALL, xCall
1bf40 62 61 63 6b 29 0a 20 20 20 20 2a 2a 0a 20 20 20  back).    **.   
1bf50 20 2a 2a 20 41 72 72 61 6e 67 65 20 74 6f 20 69   ** Arrange to i
1bf60 6e 76 6f 6b 65 20 78 43 61 6c 6c 62 61 63 6b 28  nvoke xCallback(
1bf70 29 20 77 68 65 6e 65 76 65 72 20 73 71 6c 69 74  ) whenever sqlit
1bf80 65 33 46 61 75 6c 74 53 69 6d 28 29 20 69 73 20  e3FaultSim() is 
1bf90 63 61 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a 20 69  called,.    ** i
1bfa0 66 20 78 43 61 6c 6c 62 61 63 6b 20 69 73 20 6e  f xCallback is n
1bfb0 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 0a  ot NULL..    **.
1bfc0 20 20 20 20 2a 2a 20 41 73 20 61 20 74 65 73 74      ** As a test
1bfd0 20 6f 66 20 74 68 65 20 66 61 75 6c 74 20 73 69   of the fault si
1bfe0 6d 75 6c 61 74 6f 72 20 6d 65 63 68 61 6e 69 73  mulator mechanis
1bff0 6d 20 69 74 73 65 6c 66 2c 20 73 71 6c 69 74 65  m itself, sqlite
1c000 33 46 61 75 6c 74 53 69 6d 28 30 29 0a 20 20 20  3FaultSim(0).   
1c010 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 69 6d   ** is called im
1c020 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
1c030 69 6e 73 74 61 6c 6c 69 6e 67 20 74 68 65 20 6e  installing the n
1c040 65 77 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20  ew callback and 
1c050 74 68 65 20 72 65 74 75 72 6e 0a 20 20 20 20 2a  the return.    *
1c060 2a 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 71 6c  * value from sql
1c070 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 20  ite3FaultSim(0) 
1c080 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65 74 75  becomes the retu
1c090 72 6e 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73  rn from.    ** s
1c0a0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1c0b0 72 6f 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  rol()..    */.  
1c0c0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1c0d0 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53  STCTRL_FAULT_INS
1c0e0 54 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  TALL: {.      /*
1c0f0 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20 61   MSVC is picky a
1c100 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e  bout pulling fun
1c110 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c  c ptrs from va l
1c120 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68  ists..      ** h
1c130 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69  ttp://support.mi
1c140 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34  crosoft.com/kb/4
1c150 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71  7961.      ** sq
1c160 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1c170 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20  g.xTestCallback 
1c180 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
1c190 28 2a 29 28 69 6e 74 29 29 3b 0a 20 20 20 20 20  (*)(int));.     
1c1a0 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65   */.      typede
1c1b0 66 20 69 6e 74 28 2a 54 45 53 54 43 41 4c 4c 42  f int(*TESTCALLB
1c1c0 41 43 4b 46 55 4e 43 5f 74 29 28 69 6e 74 29 3b  ACKFUNC_t)(int);
1c1d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1c1e0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74  obalConfig.xTest
1c1f0 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72  Callback = va_ar
1c200 67 28 61 70 2c 20 54 45 53 54 43 41 4c 4c 42 41  g(ap, TESTCALLBA
1c210 43 4b 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20  CKFUNC_t);.     
1c220 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 61 75   rc = sqlite3Fau
1c230 6c 74 53 69 6d 28 30 29 3b 0a 20 20 20 20 20 20  ltSim(0);.      
1c240 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1c250 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1c260 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1c270 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f  l(BENIGN_MALLOC_
1c280 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78  HOOKS, xBegin, x
1c290 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  End).    **.    
1c2a0 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f 6b  ** Register hook
1c2b0 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64  s to call to ind
1c2c0 69 63 61 74 65 20 77 68 69 63 68 20 6d 61 6c 6c  icate which mall
1c2d0 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20 0a 20  oc() failures . 
1c2e0 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e     ** are benign
1c2f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1c300 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1c310 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f  L_BENIGN_MALLOC_
1c320 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74  HOOKS: {.      t
1c330 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 76 6f  ypedef void (*vo
1c340 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69  id_function)(voi
1c350 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66  d);.      void_f
1c360 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42  unction xBenignB
1c370 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64  egin;.      void
1c380 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67  _function xBenig
1c390 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42 65 6e  nEnd;.      xBen
1c3a0 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61 72  ignBegin = va_ar
1c3b0 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74  g(ap, void_funct
1c3c0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42 65 6e  ion);.      xBen
1c3d0 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67 28  ignEnd = va_arg(
1c3e0 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f  ap, void_functio
1c3f0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
1c400 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f  3BenignMallocHoo
1c410 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c  ks(xBenignBegin,
1c420 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20   xBenignEnd);.  
1c430 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c440 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1c450 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1c460 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1c470 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59  TCTRL_PENDING_BY
1c480 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  TE, unsigned int
1c490 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   X).    **.    *
1c4a0 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44 49 4e  * Set the PENDIN
1c4b0 47 20 62 79 74 65 20 74 6f 20 74 68 65 20 76 61  G byte to the va
1c4c0 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67 75 6d  lue in the argum
1c4d0 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20  ent, if X>0..   
1c4e0 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e   ** Make no chan
1c4f0 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20 52 65  ges if X==0.  Re
1c500 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
1c510 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20 62 79  f the pending by
1c520 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69 74 20  te.    ** as it 
1c530 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72 65 20  existing before 
1c540 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
1c550 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a   called..    **.
1c560 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54      ** IMPORTANT
1c570 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20  :  Changing the 
1c580 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66 72 6f  PENDING byte fro
1c590 6d 20 30 78 34 30 30 30 30 30 30 30 20 72 65 73  m 0x40000000 res
1c5a0 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61  ults in.    ** a
1c5b0 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64  n incompatible d
1c5c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
1c5d0 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67 20 74  mat.  Changing t
1c5e0 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 0a  he PENDING byte.
1c5f0 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79      ** while any
1c600 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1c610 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65 73  tion is open res
1c620 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69 6e 65  ults in undefine
1c630 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c  d and.    ** del
1c640 65 74 65 72 69 6f 75 73 20 62 65 68 61 76 69 6f  eterious behavio
1c650 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
1c660 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1c670 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a  RL_PENDING_BYTE:
1c680 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 50 45   {.      rc = PE
1c690 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66 6e  NDING_BYTE;.#ifn
1c6a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c6b0 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  WSD.      {.    
1c6c0 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
1c6d0 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61 72 67   newVal = va_arg
1c6e0 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  (ap, unsigned in
1c6f0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
1c700 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74 65 33  newVal ) sqlite3
1c710 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e 65  PendingByte = ne
1c720 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65  wVal;.      }.#e
1c730 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b  ndif.      break
1c740 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1c750 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1c760 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1c770 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
1c780 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20 20 20  ERT, int X).    
1c790 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61  **.    ** This a
1c7a0 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61  ction provides a
1c7b0 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74   run-time test t
1c7c0 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72  o see whether or
1c7d0 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73 65   not.    ** asse
1c7e0 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c 65 64  rt() was enabled
1c7f0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1c800 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20  .  If X is true 
1c810 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20 20 20  and assert().   
1c820 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c 20   ** is enabled, 
1c830 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
1c840 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e 20 20  value is true.  
1c850 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e 64  If X is true and
1c860 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29  .    ** assert()
1c870 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68   is disabled, th
1c880 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
1c890 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20 49 66  lue is zero.  If
1c8a0 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66 61 6c   X is.    ** fal
1c8b0 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20  se and assert() 
1c8c0 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
1c8d0 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e 20 66   the assertion f
1c8e0 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20 20 20  ires and the.   
1c8f0 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62 6f 72   ** process abor
1c900 74 73 2e 20 20 49 66 20 58 20 69 73 20 66 61 6c  ts.  If X is fal
1c910 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20  se and assert() 
1c920 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65  is disabled, the
1c930 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 74  n the.    ** ret
1c940 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72  urn value is zer
1c950 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  o..    */.    ca
1c960 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1c970 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20 20  RL_ASSERT: {.   
1c980 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20     volatile int 
1c990 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  x = 0;.      ass
1c9a0 65 72 74 28 20 28 78 20 3d 20 76 61 5f 61 72 67  ert( (x = va_arg
1c9b0 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a  (ap,int))!=0 );.
1c9c0 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a 20 20        rc = x;.  
1c9d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c9e0 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ...    /*.    **
1c9f0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1ca00 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1ca10 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69  STCTRL_ALWAYS, i
1ca20 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
1ca30 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20   ** This action 
1ca40 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74  provides a run-t
1ca50 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20  ime test to see 
1ca60 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53 20 61  how the ALWAYS a
1ca70 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52 20  nd.    ** NEVER 
1ca80 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65 66 69  macros were defi
1ca90 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ned at compile-t
1caa0 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ime..    **.    
1cab0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
1cac0 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28 58 29  lue is ALWAYS(X)
1cad0 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  .  .    **.    *
1cae0 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65  * The recommende
1caf0 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32 2e 20  d test is X==2. 
1cb00 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
1cb10 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61 74 20  alue is 2, that 
1cb20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c 57  means.    ** ALW
1cb30 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28  AYS() and NEVER(
1cb40 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f 70  ) are both no-op
1cb50 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61   pass-through ma
1cb60 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20 74  cros, which is t
1cb70 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  he.    ** defaul
1cb80 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66 20 74  t setting.  If t
1cb90 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1cba0 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57 41 59  is 1, then ALWAY
1cbb0 53 28 29 20 69 73 20 65 69 74 68 65 72 0a 20 20  S() is either.  
1cbc0 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64 20    ** hard-coded 
1cbd0 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73 65 20  to true or else 
1cbe0 69 74 20 61 73 73 65 72 74 73 20 69 66 20 69 74  it asserts if it
1cbf0 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61  s argument is fa
1cc00 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  lse..    ** The 
1cc10 66 69 72 73 74 20 62 65 68 61 76 69 6f 72 20 28  first behavior (
1cc20 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72  hard-coded to tr
1cc30 75 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20  ue) is the case 
1cc40 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  if.    ** SQLITE
1cc50 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
1cc60 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65   shows that asse
1cc70 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  rt() is disabled
1cc80 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 0a   and the second.
1cc90 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 20      ** behavior 
1cca0 28 61 73 73 65 72 74 20 69 66 20 74 68 65 20 61  (assert if the a
1ccb0 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41 59  rgument to ALWAY
1ccc0 53 28 29 20 69 73 20 66 61 6c 73 65 29 20 69 73  S() is false) is
1ccd0 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20 20   the case if.   
1cce0 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43   ** SQLITE_TESTC
1ccf0 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73  TRL_ASSERT shows
1cd00 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20 69   that assert() i
1cd10 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 2a  s enabled..    *
1cd20 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75 6e  *.    ** The run
1cd30 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f 63 65  -time test proce
1cd40 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b 20  dure might look 
1cd50 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 74  something like t
1cd60 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  his:.    **.    
1cd70 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  **    if( sqlite
1cd80 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1cd90 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1cda0 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b 0a  LWAYS, 2)==2 ){.
1cdb0 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
1cdc0 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45  LWAYS() and NEVE
1cdd0 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70 61  R() are no-op pa
1cde0 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f  ss-through macro
1cdf0 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73  s.    **    }els
1ce00 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65  e if( sqlite3_te
1ce10 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1ce20 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
1ce30 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a 20  T, 1) ){.    ** 
1ce40 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78       // ALWAYS(x
1ce50 29 20 61 73 73 65 72 74 73 20 74 68 61 74 20 78  ) asserts that x
1ce60 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45 52 28   is true. NEVER(
1ce70 78 29 20 61 73 73 65 72 74 73 20 78 20 69 73 20  x) asserts x is 
1ce80 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20 20  false..    **   
1ce90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20   }else{.    **  
1cea0 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29      // ALWAYS(x)
1ceb0 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 31   is a constant 1
1cec0 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73 20 61  .  NEVER(x) is a
1ced0 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20 20   constant 0..   
1cee0 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f 0a   **    }.    */.
1cef0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1cf00 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a  TESTCTRL_ALWAYS:
1cf10 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d   {.      int x =
1cf20 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b   va_arg(ap,int);
1cf30 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c 57 41  .      rc = ALWA
1cf40 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62 72 65  YS(x);.      bre
1cf50 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1cf60 2a 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c 69 74  *.    **   sqlit
1cf70 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1cf80 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1cf90 42 59 54 45 4f 52 44 45 52 29 3b 0a 20 20 20 20  BYTEORDER);.    
1cfa0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 69 6e  **.    ** The in
1cfb0 74 65 67 65 72 20 72 65 74 75 72 6e 65 64 20 72  teger returned r
1cfc0 65 76 65 61 6c 73 20 74 68 65 20 62 79 74 65 2d  eveals the byte-
1cfd0 6f 72 64 65 72 20 6f 66 20 74 68 65 20 63 6f 6d  order of the com
1cfe0 70 75 74 65 72 20 6f 6e 20 77 68 69 63 68 0a 20  puter on which. 
1cff0 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 69 73 20     ** SQLite is 
1d000 72 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a  running:.    **.
1d010 20 20 20 20 2a 2a 20 20 20 20 20 20 20 31 20 20      **       1  
1d020 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20     big-endian,  
1d030 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20    determined at 
1d040 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20  run-time.    ** 
1d050 20 20 20 20 20 31 30 20 20 20 20 20 6c 69 74 74       10     litt
1d060 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72  le-endian, deter
1d070 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d  mined at run-tim
1d080 65 0a 20 20 20 20 2a 2a 20 20 34 33 32 31 30 31  e.    **  432101
1d090 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c       big-endian,
1d0a0 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61      determined a
1d0b0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20  t compile-time. 
1d0c0 20 20 20 2a 2a 20 20 31 32 33 34 31 30 20 20 20     **  123410   
1d0d0 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c    little-endian,
1d0e0 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63   determined at c
1d0f0 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20  ompile-time.    
1d100 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 53 51 4c  */ .    case SQL
1d110 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54  ITE_TESTCTRL_BYT
1d120 45 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20 20 20  EORDER: {.      
1d130 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 59 54 45  rc = SQLITE_BYTE
1d140 4f 52 44 45 52 2a 31 30 30 20 2b 20 53 51 4c 49  ORDER*100 + SQLI
1d150 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e 2a  TE_LITTLEENDIAN*
1d160 31 30 20 2b 20 53 51 4c 49 54 45 5f 42 49 47 45  10 + SQLITE_BIGE
1d170 4e 44 49 41 4e 3b 0a 20 20 20 20 20 20 62 72 65  NDIAN;.      bre
1d180 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1d190 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1d1a0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1d1b0 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45  TESTCTRL_RESERVE
1d1c0 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  , sqlite3 *db, i
1d1d0 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt N).    **.   
1d1e0 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65 73   ** Set the nRes
1d1f0 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20 66  erve size to N f
1d200 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  or the main data
1d210 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74 61  base on the data
1d220 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e  base.    ** conn
1d230 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a  ection db..    *
1d240 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1d250 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
1d260 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  VE: {.      sqli
1d270 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67  te3 *db = va_arg
1d280 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a  (ap, sqlite3*);.
1d290 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61        int x = va
1d2a0 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20  _arg(ap,int);.  
1d2b0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1d2c0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1d2d0 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x);.      sqlite
1d2e0 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
1d2f0 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
1d300 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20  , 0, x, 0);.    
1d310 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1d320 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1d330 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d340 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71     }..    /*  sq
1d350 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1d360 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1d370 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
1d380 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  , sqlite3 *db, i
1d390 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt N).    **.   
1d3a0 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69   ** Enable or di
1d3b0 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f 70  sable various op
1d3c0 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20  timizations for 
1d3d0 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
1d3e0 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20 61  .  The .    ** a
1d3f0 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20 62  rgument N is a b
1d400 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69  itmask of optimi
1d410 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64 69  zations to be di
1d420 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72  sabled.  For nor
1d430 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  mal.    ** opera
1d440 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65  tion N should be
1d450 20 30 2e 20 20 54 68 65 20 69 64 65 61 20 69 73   0.  The idea is
1d460 20 74 68 61 74 20 61 20 74 65 73 74 20 70 72 6f   that a test pro
1d470 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20  gram (like the. 
1d480 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20     ** SQL Logic 
1d490 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73 74  Test or SLT test
1d4a0 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75 6e   module) can run
1d4b0 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d 75   the same SQL mu
1d4c0 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20 20  ltiple times.   
1d4d0 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75 73   ** with various
1d4e0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64   optimizations d
1d4f0 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69 66  isabled to verif
1d500 79 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  y that the same 
1d510 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69 73  answer.    ** is
1d520 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76 65   obtained in eve
1d530 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  ry case..    */.
1d540 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1d550 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
1d560 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20  ATIONS: {.      
1d570 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61  sqlite3 *db = va
1d580 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
1d590 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 64 62  *);.      db->db
1d5a0 4f 70 74 46 6c 61 67 73 20 3d 20 28 75 31 36 29  OptFlags = (u16)
1d5b0 28 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29  (va_arg(ap, int)
1d5c0 20 26 20 30 78 66 66 66 66 29 3b 0a 20 20 20 20   & 0xffff);.    
1d5d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1d5e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f  #ifdef SQLITE_N_
1d5f0 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73  KEYWORD.    /* s
1d600 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1d610 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1d620 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63  TRL_ISKEYWORD, c
1d630 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64  onst char *zWord
1d640 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1d650 49 66 20 7a 57 6f 72 64 20 69 73 20 61 20 6b 65  If zWord is a ke
1d660 79 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a 65 64  yword recognized
1d670 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2c 20   by the parser, 
1d680 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a  then return the.
1d690 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
1d6a0 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 69   keywords.  Or i
1d6b0 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74 20 61  f zWord is not a
1d6c0 20 6b 65 79 77 6f 72 64 2c 20 72 65 74 75 72 6e   keyword, return
1d6d0 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20   0..    ** .    
1d6e0 2a 2a 20 54 68 69 73 20 74 65 73 74 20 66 65 61  ** This test fea
1d6f0 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 61 76 61  ture is only ava
1d700 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 61 6d  ilable in the am
1d710 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65  algamation since
1d720 0a 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 49  .    ** the SQLI
1d730 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63  TE_N_KEYWORD mac
1d740 72 6f 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  ro is not define
1d750 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69  d in this file i
1d760 66 20 53 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20  f SQLite.    ** 
1d770 69 73 20 62 75 69 6c 74 20 75 73 69 6e 67 20 73  is built using s
1d780 65 70 61 72 61 74 65 20 73 6f 75 72 63 65 20 66  eparate source f
1d790 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  iles..    */.   
1d7a0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1d7b0 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a  TCTRL_ISKEYWORD:
1d7c0 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63   {.      const c
1d7d0 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f  har *zWord = va_
1d7e0 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68  arg(ap, const ch
1d7f0 61 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  ar*);.      int 
1d800 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
1d810 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20  n30(zWord);.    
1d820 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4b    rc = (sqlite3K
1d830 65 79 77 6f 72 64 43 6f 64 65 28 28 75 38 2a 29  eywordCode((u8*)
1d840 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44  zWord, n)!=TK_ID
1d850 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59  ) ? SQLITE_N_KEY
1d860 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20 20 20  WORD : 0;.      
1d870 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
1d880 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20 73 71 6c  dif ..    /* sql
1d890 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1d8a0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1d8b0 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 2c  L_SCRATCHMALLOC,
1d8c0 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70 46 72 65   sz, &pNew, pFre
1d8d0 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  e);.    **.    *
1d8e0 2a 20 50 61 73 73 20 70 46 72 65 65 20 69 6e 74  * Pass pFree int
1d8f0 6f 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68  o sqlite3Scratch
1d900 46 72 65 65 28 29 2e 20 0a 20 20 20 20 2a 2a 20  Free(). .    ** 
1d910 49 66 20 73 7a 3e 30 20 74 68 65 6e 20 61 6c 6c  If sz>0 then all
1d920 6f 63 61 74 65 20 61 20 73 63 72 61 74 63 68 20  ocate a scratch 
1d930 62 75 66 66 65 72 20 69 6e 74 6f 20 70 4e 65 77  buffer into pNew
1d940 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  .  .    */.    c
1d950 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1d960 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f  TRL_SCRATCHMALLO
1d970 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  C: {.      void 
1d980 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e 65 77 3b  *pFree, **ppNew;
1d990 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20  .      int sz;. 
1d9a0 20 20 20 20 20 73 7a 20 3d 20 76 61 5f 61 72 67       sz = va_arg
1d9b0 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
1d9c0 20 70 70 4e 65 77 20 3d 20 76 61 5f 61 72 67 28   ppNew = va_arg(
1d9d0 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20 20 20  ap, void**);.   
1d9e0 20 20 20 70 46 72 65 65 20 3d 20 76 61 5f 61 72     pFree = va_ar
1d9f0 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
1da00 20 20 20 20 69 66 28 20 73 7a 20 29 20 2a 70 70      if( sz ) *pp
1da10 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 63 72  New = sqlite3Scr
1da20 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a  atchMalloc(sz);.
1da30 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 72        sqlite3Scr
1da40 61 74 63 68 46 72 65 65 28 70 46 72 65 65 29 3b  atchFree(pFree);
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 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55  RL_LOCALTIME_FAU
1daa0 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a  LT, int onoff);.
1dab0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
1dac0 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66   parameter onoff
1dad0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f   is non-zero, co
1dae0 6e 66 69 67 75 72 65 20 74 68 65 20 77 72 61 70  nfigure the wrap
1daf0 70 65 72 73 20 73 6f 20 74 68 61 74 20 61 6c 6c  pers so that all
1db00 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65  .    ** subseque
1db10 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61  nt calls to loca
1db20 6c 74 69 6d 65 28 29 20 61 6e 64 20 76 61 72 69  ltime() and vari
1db30 61 6e 74 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e  ants fail. If on
1db40 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a 20 20 20  off is zero,.   
1db50 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73 20 73 65   ** undo this se
1db60 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  tting..    */.  
1db70 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1db80 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45  STCTRL_LOCALTIME
1db90 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20  _FAULT: {.      
1dba0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1dbb0 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61  fig.bLocaltimeFa
1dbc0 75 6c 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ult = va_arg(ap,
1dbd0 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
1dbe0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1dbf0 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1dc00 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1dc10 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43  TESTCTRL_NEVER_C
1dc20 4f 52 52 55 50 54 2c 20 69 6e 74 29 3b 0a 20 20  ORRUPT, int);.  
1dc30 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20    **.    ** Set 
1dc40 6f 72 20 63 6c 65 61 72 20 61 20 66 6c 61 67 20  or clear a flag 
1dc50 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 74  that indicates t
1dc60 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
1dc70 20 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73 20   file is always 
1dc80 77 65 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f 72  well-.    ** for
1dc90 6d 65 64 20 61 6e 64 20 6e 65 76 65 72 20 63 6f  med and never co
1dca0 72 72 75 70 74 2e 20 20 54 68 69 73 20 66 6c 61  rrupt.  This fla
1dcb0 67 20 69 73 20 63 6c 65 61 72 20 62 79 20 64 65  g is clear by de
1dcc0 66 61 75 6c 74 2c 20 69 6e 64 69 63 61 74 69 6e  fault, indicatin
1dcd0 67 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 64 61  g that.    ** da
1dce0 74 61 62 61 73 65 20 66 69 6c 65 73 20 6d 69 67  tabase files mig
1dcf0 68 74 20 68 61 76 65 20 61 72 62 69 74 72 61 72  ht have arbitrar
1dd00 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 53  y corruption.  S
1dd10 65 74 74 69 6e 67 20 74 68 65 20 66 6c 61 67 20  etting the flag 
1dd20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74 65  during.    ** te
1dd30 73 74 69 6e 67 20 63 61 75 73 65 73 20 63 65 72  sting causes cer
1dd40 74 61 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  tain assert() st
1dd50 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
1dd60 63 6f 64 65 20 74 6f 20 62 65 20 61 63 74 69 76  code to be activ
1dd70 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 68 61 74  ated.    ** that
1dd80 20 64 65 6d 6f 6e 73 74 72 61 74 20 69 6e 76 61   demonstrat inva
1dd90 72 69 61 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d 66  riants on well-f
1dda0 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
1ddb0 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  iles..    */.   
1ddc0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1ddd0 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52  TCTRL_NEVER_CORR
1dde0 55 50 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  UPT: {.      sql
1ddf0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1de00 2e 6e 65 76 65 72 43 6f 72 72 75 70 74 20 3d 20  .neverCorrupt = 
1de10 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1de20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1de30 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 20 20 73    }...    /*   s
1de40 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1de50 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1de60 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  TRL_VDBE_COVERAG
1de70 45 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70 74  E, xCallback, pt
1de80 72 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  r);.    **.    *
1de90 2a 20 53 65 74 20 74 68 65 20 56 44 42 45 20 63  * Set the VDBE c
1dea0 6f 76 65 72 61 67 65 20 63 61 6c 6c 62 61 63 6b  overage callback
1deb0 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 78 43 61   function to xCa
1dec0 6c 6c 62 61 63 6b 20 77 69 74 68 20 63 6f 6e 74  llback with cont
1ded0 65 78 74 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  ext .    ** poin
1dee0 74 65 72 20 70 74 72 2e 0a 20 20 20 20 2a 2f 0a  ter ptr..    */.
1def0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1df00 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f  TESTCTRL_VDBE_CO
1df10 56 45 52 41 47 45 3a 20 7b 0a 23 69 66 64 65 66  VERAGE: {.#ifdef
1df20 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
1df30 45 52 41 47 45 0a 20 20 20 20 20 20 74 79 70 65  ERAGE.      type
1df40 64 65 66 20 76 6f 69 64 20 28 2a 62 72 61 6e 63  def void (*branc
1df50 68 5f 63 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  h_callback)(void
1df60 2a 2c 69 6e 74 2c 75 38 2c 75 38 29 3b 0a 20 20  *,int,u8,u8);.  
1df70 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1df80 6c 43 6f 6e 66 69 67 2e 78 56 64 62 65 42 72 61  lConfig.xVdbeBra
1df90 6e 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  nch = va_arg(ap,
1dfa0 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29  branch_callback)
1dfb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
1dfc0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64 62  lobalConfig.pVdb
1dfd0 65 42 72 61 6e 63 68 41 72 67 20 3d 20 76 61 5f  eBranchArg = va_
1dfe0 61 72 67 28 61 70 2c 76 6f 69 64 2a 29 3b 0a 23  arg(ap,void*);.#
1dff0 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
1e000 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1e010 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1e020 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1e030 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d  ESTCTRL_SORTER_M
1e040 4d 41 50 2c 20 64 62 2c 20 6e 4d 61 78 29 3b 20  MAP, db, nMax); 
1e050 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1e060 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54  TE_TESTCTRL_SORT
1e070 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20 20  ER_MMAP: {.     
1e080 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
1e090 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
1e0a0 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  3*);.      db->n
1e0b0 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20  MaxSorterMmap = 
1e0c0 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1e0d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e0e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71    }..    /*   sq
1e0f0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1e100 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1e110 52 4c 5f 49 53 49 4e 49 54 29 3b 0a 20 20 20 20  RL_ISINIT);.    
1e120 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e  **.    ** Return
1e130 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 53 51   SQLITE_OK if SQ
1e140 4c 69 74 65 20 68 61 73 20 62 65 65 6e 20 69 6e  Lite has been in
1e150 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 53 51  itialized and SQ
1e160 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 0a 20 20  LITE_ERROR if.  
1e170 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f    ** not..    */
1e180 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e190 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54  _TESTCTRL_ISINIT
1e1a0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
1e1b0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1e1c0 67 2e 69 73 49 6e 69 74 3d 3d 30 20 29 20 72 63  g.isInit==0 ) rc
1e1d0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1e1e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1e1f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c    }..    /*  sql
1e200 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1e210 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1e220 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64 62 2c 20  L_IMPOSTER, db, 
1e230 64 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c 20 74  dbName, onOff, t
1e240 6e 75 6d 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  num);.    **.   
1e250 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 63 6f   ** This test co
1e260 6e 74 72 6f 6c 20 69 73 20 75 73 65 64 20 74 6f  ntrol is used to
1e270 20 63 72 65 61 74 65 20 69 6d 70 6f 73 74 65 72   create imposter
1e280 20 74 61 62 6c 65 73 2e 20 20 22 64 62 22 20 69   tables.  "db" i
1e290 73 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 20 20  s a pointer.    
1e2a0 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
1e2b0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20  se connection.  
1e2c0 64 62 4e 61 6d 65 20 69 73 20 74 68 65 20 64 61  dbName is the da
1e2d0 74 61 62 61 73 65 20 6e 61 6d 65 20 28 65 78 3a  tabase name (ex:
1e2e0 20 22 6d 61 69 6e 22 20 6f 72 0a 20 20 20 20 2a   "main" or.    *
1e2f0 2a 20 22 74 65 6d 70 22 29 20 77 68 69 63 68 20  * "temp") which 
1e300 77 69 6c 6c 20 72 65 63 65 69 76 65 20 74 68 65  will receive the
1e310 20 69 6d 70 6f 73 74 65 72 2e 20 20 22 6f 6e 4f   imposter.  "onO
1e320 66 66 22 20 74 75 72 6e 73 20 69 6d 70 6f 73 74  ff" turns impost
1e330 65 72 20 6d 6f 64 65 20 6f 6e 0a 20 20 20 20 2a  er mode on.    *
1e340 2a 20 6f 72 20 6f 66 66 2e 20 20 22 74 6e 75 6d  * or off.  "tnum
1e350 22 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  " is the root pa
1e360 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
1e370 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69 6d   to which the im
1e380 70 6f 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61  poster.    ** ta
1e390 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 6e 65  ble should conne
1e3a0 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ct..    **.    *
1e3b0 2a 20 45 6e 61 62 6c 65 20 69 6d 70 6f 73 74 65  * Enable imposte
1e3c0 72 20 6d 6f 64 65 20 6f 6e 6c 79 20 77 68 65 6e  r mode only when
1e3d0 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
1e3e0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 61 72  already been par
1e3f0 73 65 64 2e 20 20 54 68 65 6e 0a 20 20 20 20 2a  sed.  Then.    *
1e400 2a 20 72 75 6e 20 61 20 73 69 6e 67 6c 65 20 43  * run a single C
1e410 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
1e420 65 6d 65 6e 74 20 74 6f 20 63 6f 6e 73 74 72 75  ement to constru
1e430 63 74 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20  ct the imposter 
1e440 74 61 62 6c 65 20 69 6e 0a 20 20 20 20 2a 2a 20  table in.    ** 
1e450 74 68 65 20 70 61 72 73 65 64 20 73 63 68 65 6d  the parsed schem
1e460 61 2e 20 20 54 68 65 6e 20 74 75 72 6e 20 69 6d  a.  Then turn im
1e470 70 6f 73 74 65 72 20 6d 6f 64 65 20 62 61 63 6b  poster mode back
1e480 20 6f 66 66 20 61 67 61 69 6e 2e 0a 20 20 20 20   off again..    
1e490 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 4f  **.    ** If onO
1e4a0 66 66 3d 3d 30 20 61 6e 64 20 74 6e 75 6d 3e 30  ff==0 and tnum>0
1e4b0 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20   then reset the 
1e4c0 73 63 68 65 6d 61 20 66 6f 72 20 61 6c 6c 20 64  schema for all d
1e4d0 61 74 61 62 61 73 65 73 2c 20 63 61 75 73 69 6e  atabases, causin
1e4e0 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68  g.    ** the sch
1e4f0 65 6d 61 20 74 6f 20 62 65 20 72 65 70 61 72 73  ema to be repars
1e500 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ed the next time
1e510 20 69 74 20 69 73 20 6e 65 65 64 65 64 2e 20 20   it is needed.  
1e520 54 68 69 73 20 68 61 73 20 74 68 65 0a 20 20 20  This has the.   
1e530 20 2a 2a 20 65 66 66 65 63 74 20 6f 66 20 65 72   ** effect of er
1e540 61 73 69 6e 67 20 61 6c 6c 20 69 6d 70 6f 73 74  asing all impost
1e550 65 72 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 2a  er tables..    *
1e560 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1e570 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
1e580 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
1e590 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
1e5a0 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
1e5b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
1e5c0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1e5d0 75 74 65 78 29 3b 0a 20 20 20 20 20 20 64 62 2d  utex);.      db-
1e5e0 3e 69 6e 69 74 2e 69 44 62 20 3d 20 73 71 6c 69  >init.iDb = sqli
1e5f0 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
1e600 2c 20 76 61 5f 61 72 67 28 61 70 2c 63 6f 6e 73  , va_arg(ap,cons
1e610 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20  t char*));.     
1e620 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d   db->init.busy =
1e630 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74   db->init.impost
1e640 65 72 54 61 62 6c 65 20 3d 20 76 61 5f 61 72 67  erTable = va_arg
1e650 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20  (ap,int);.      
1e660 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
1e670 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
1e680 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d  );.      if( db-
1e690 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 26 26  >init.busy==0 &&
1e6a0 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
1e6b0 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  m>0 ){.        s
1e6c0 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63  qlite3ResetAllSc
1e6d0 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f  hemasOfConnectio
1e6e0 6e 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n(db);.      }. 
1e6f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
1e700 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1e710 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
1e720 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
1e730 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69 66  _end(ap);.#endif
1e740 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1e750 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f 0a  BUILTIN_TEST */.
1e760 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1e770 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
1e780 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 2c  utility routine,
1e790 20 75 73 65 66 75 6c 20 74 6f 20 56 46 53 20 69   useful to VFS i
1e7a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20  mplementations, 
1e7b0 74 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  that checks.** t
1e7c0 6f 20 73 65 65 20 69 66 20 61 20 64 61 74 61 62  o see if a datab
1e7d0 61 73 65 20 66 69 6c 65 20 77 61 73 20 61 20 55  ase file was a U
1e7e0 52 49 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 65  RI that containe
1e7f0 64 20 61 20 73 70 65 63 69 66 69 63 20 71 75 65  d a specific que
1e800 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ry .** parameter
1e810 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f 62 74 61  , and if so obta
1e820 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ins the value of
1e830 20 74 68 65 20 71 75 65 72 79 20 70 61 72 61 6d   the query param
1e840 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eter..**.** The 
1e850 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65  zFilename argume
1e860 6e 74 20 69 73 20 74 68 65 20 66 69 6c 65 6e 61  nt is the filena
1e870 6d 65 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65  me pointer passe
1e880 64 20 69 6e 74 6f 20 74 68 65 20 78 4f 70 65 6e  d into the xOpen
1e890 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20  ().** method of 
1e8a0 61 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61  a VFS implementa
1e8b0 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72 61  tion.  The zPara
1e8c0 6d 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  m argument is th
1e8d0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
1e8e0 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
1e8f0 20 77 65 20 73 65 65 6b 2e 20 20 54 68 69 73 20   we seek.  This 
1e900 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1e910 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1e920 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61 6d   zParam.** param
1e930 65 74 65 72 20 69 66 20 69 74 20 65 78 69 73 74  eter if it exist
1e940 73 2e 20 20 49 66 20 74 68 65 20 70 61 72 61 6d  s.  If the param
1e950 65 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 65 78  eter does not ex
1e960 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ist, this routin
1e970 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 4e  e.** returns a N
1e980 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ULL pointer..*/.
1e990 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
1e9a0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
1e9b0 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  r(const char *zF
1e9c0 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63  ilename, const c
1e9d0 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20 20  har *zParam){.  
1e9e0 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
1e9f0 20 7c 7c 20 7a 50 61 72 61 6d 3d 3d 30 20 29 20   || zParam==0 ) 
1ea00 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c  return 0;.  zFil
1ea10 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33  ename += sqlite3
1ea20 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
1ea30 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  me) + 1;.  while
1ea40 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  ( zFilename[0] )
1ea50 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 73 74  {.    int x = st
1ea60 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  rcmp(zFilename, 
1ea70 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69  zParam);.    zFi
1ea80 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65  lename += sqlite
1ea90 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
1eaa0 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 69 66  ame) + 1;.    if
1eab0 28 20 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( x==0 ) return 
1eac0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a  zFilename;.    z
1ead0 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
1eae0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
1eaf0 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a  ename) + 1;.  }.
1eb00 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1eb10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6f  *.** Return a bo
1eb20 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f 72 20  olean value for 
1eb30 61 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  a query paramete
1eb40 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
1eb50 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f  3_uri_boolean(co
1eb60 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1eb70 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
1eb80 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62 44 66  *zParam, int bDf
1eb90 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  lt){.  const cha
1eba0 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75  r *z = sqlite3_u
1ebb0 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69  ri_parameter(zFi
1ebc0 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b  lename, zParam);
1ebd0 0a 20 20 62 44 66 6c 74 20 3d 20 62 44 66 6c 74  .  bDflt = bDflt
1ebe0 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20  !=0;.  return z 
1ebf0 3f 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c  ? sqlite3GetBool
1ec00 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20 3a 20  ean(z, bDflt) : 
1ec10 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  bDflt;.}../*.** 
1ec20 52 65 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20  Return a 64-bit 
1ec30 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f  integer value fo
1ec40 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65  r a query parame
1ec50 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  ter..*/.sqlite3_
1ec60 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 75 72  int64 sqlite3_ur
1ec70 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74  i_int64(.  const
1ec80 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1ec90 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65  ,    /* Filename
1eca0 20 61 73 20 70 61 73 73 65 64 20 74 6f 20 78 4f   as passed to xO
1ecb0 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  pen */.  const c
1ecc0 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20  har *zParam,    
1ecd0 20 20 20 2f 2a 20 55 52 49 20 70 61 72 61 6d 65     /* URI parame
1ece0 74 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a 20 20  ter sought */.  
1ecf0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 62 44  sqlite3_int64 bD
1ed00 66 6c 74 20 20 20 20 20 20 20 2f 2a 20 72 65 74  flt       /* ret
1ed10 75 72 6e 20 69 66 20 70 61 72 61 6d 65 74 65 72  urn if parameter
1ed20 20 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 29   is missing */.)
1ed30 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1ed40 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  z = sqlite3_uri_
1ed50 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e  parameter(zFilen
1ed60 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20  ame, zParam);.  
1ed70 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b  sqlite3_int64 v;
1ed80 0a 20 20 69 66 28 20 7a 20 26 26 20 73 71 6c 69  .  if( z && sqli
1ed90 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34  te3DecOrHexToI64
1eda0 28 7a 2c 20 26 76 29 3d 3d 53 51 4c 49 54 45 5f  (z, &v)==SQLITE_
1edb0 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66 6c 74 20  OK ){.    bDflt 
1edc0 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = v;.  }.  retur
1edd0 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n bDflt;.}../*.*
1ede0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 42 74 72  * Return the Btr
1edf0 65 65 20 70 6f 69 6e 74 65 72 20 69 64 65 6e 74  ee pointer ident
1ee00 69 66 69 65 64 20 62 79 20 7a 44 62 4e 61 6d 65  ified by zDbName
1ee10 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
1ee20 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
1ee30 42 74 72 65 65 20 2a 73 71 6c 69 74 65 33 44 62  Btree *sqlite3Db
1ee40 4e 61 6d 65 54 6f 42 74 72 65 65 28 73 71 6c 69  NameToBtree(sqli
1ee50 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
1ee60 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20  har *zDbName){. 
1ee70 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1ee80 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
1ee90 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  +){.    if( db->
1eea0 61 44 62 5b 69 5d 2e 70 42 74 0a 20 20 20 20 20  aDb[i].pBt.     
1eeb0 26 26 20 28 7a 44 62 4e 61 6d 65 3d 3d 30 20 7c  && (zDbName==0 |
1eec0 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  | sqlite3StrICmp
1eed0 28 7a 44 62 4e 61 6d 65 2c 20 64 62 2d 3e 61 44  (zDbName, db->aD
1eee0 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 29 0a  b[i].zName)==0).
1eef0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1ef00 75 72 6e 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  urn db->aDb[i].p
1ef10 42 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  Bt;.    }.  }.  
1ef20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1ef30 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69  ** Return the fi
1ef40 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  lename of the da
1ef50 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
1ef60 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
1ef70 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
1ef80 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
1ef90 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
1efa0 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ame(sqlite3 *db,
1efb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1efc0 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a  Name){.  Btree *
1efd0 70 42 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  pBt;.#ifdef SQLI
1efe0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1eff0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1f000 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1f010 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
1f020 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
1f030 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
1f040 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
1f050 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  pBt = sqlite3DbN
1f060 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
1f070 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  DbName);.  retur
1f080 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42  n pBt ? sqlite3B
1f090 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
1f0a0 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a  pBt) : 0;.}../*.
1f0b0 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 64  ** Return 1 if d
1f0c0 61 74 61 62 61 73 65 20 69 73 20 72 65 61 64 2d  atabase is read-
1f0d0 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20 72 65 61  only or 0 if rea
1f0e0 64 2f 77 72 69 74 65 2e 20 20 52 65 74 75 72 6e  d/write.  Return
1f0f0 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63   -1 if.** no suc
1f100 68 20 64 61 74 61 62 61 73 65 20 65 78 69 73 74  h database exist
1f110 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1f120 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 73 71  3_db_readonly(sq
1f130 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1f140 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b   char *zDbName){
1f150 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23  .  Btree *pBt;.#
1f160 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1f170 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1f180 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1f190 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
1f1a0 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
1f1b0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
1f1c0 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
1f1d0 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d  }.#endif.  pBt =
1f1e0 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f   sqlite3DbNameTo
1f1f0 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d  Btree(db, zDbNam
1f200 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  e);.  return pBt
1f210 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   ? sqlite3BtreeI
1f220 73 52 65 61 64 6f 6e 6c 79 28 70 42 74 29 20 3a  sReadonly(pBt) :
1f230 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   -1;.}..#ifdef S
1f240 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41  QLITE_ENABLE_SNA
1f250 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 4f 62 74 61  PSHOT./*.** Obta
1f260 69 6e 20 61 20 73 6e 61 70 73 68 6f 74 20 68 61  in a snapshot ha
1f270 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 73 6e 61  ndle for the sna
1f280 70 73 68 6f 74 20 6f 66 20 64 61 74 61 62 61 73  pshot of databas
1f290 65 20 7a 44 62 20 63 75 72 72 65 6e 74 6c 79 20  e zDb currently 
1f2a0 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64 20 62  .** being read b
1f2b0 79 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  y handle db..*/.
1f2c0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  int sqlite3_snap
1f2d0 73 68 6f 74 5f 67 65 74 28 0a 20 20 73 71 6c 69  shot_get(.  sqli
1f2e0 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73  te3 *db, .  cons
1f2f0 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 73  t char *zDb,.  s
1f300 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20  qlite3_snapshot 
1f310 2a 2a 70 70 53 6e 61 70 73 68 6f 74 0a 29 7b 0a  **ppSnapshot.){.
1f320 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1f330 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66  E_ERROR;.#ifndef
1f340 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1f350 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 23 69 66  .  int iDb;..#if
1f360 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1f370 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1f380 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1f390 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
1f3a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f3b0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
1f3c0 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
1f3d0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1f3e0 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 69 44  b->mutex);..  iD
1f3f0 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
1f400 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a  bName(db, zDb);.
1f410 20 20 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20    if( iDb==0 || 
1f420 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 42 74 72  iDb>1 ){.    Btr
1f430 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
1f440 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
1f450 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74  if( 0==sqlite3Bt
1f460 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
1f470 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
1f480 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
1f490 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 29 3b 0a  nTrans(pBt, 0);.
1f4a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1f4b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f4c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f4d0 61 67 65 72 53 6e 61 70 73 68 6f 74 47 65 74 28  agerSnapshotGet(
1f4e0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
1f4f0 72 28 70 42 74 29 2c 20 70 70 53 6e 61 70 73 68  r(pBt), ppSnapsh
1f500 6f 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ot);.      }.   
1f510 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65   }.  }..  sqlite
1f520 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1f530 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66  ->mutex);.#endif
1f540 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49     /* SQLITE_OMI
1f550 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72  T_WAL */.  retur
1f560 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
1f570 70 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73  pen a read-trans
1f580 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 6e  action on the sn
1f590 61 70 73 68 6f 74 20 69 64 65 6e 64 69 66 69 65  apshot idendifie
1f5a0 64 20 62 79 20 70 53 6e 61 70 73 68 6f 74 2e 0a  d by pSnapshot..
1f5b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
1f5c0 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a 20 20  napshot_open(.  
1f5d0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
1f5e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
1f5f0 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70   .  sqlite3_snap
1f600 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 0a  shot *pSnapshot.
1f610 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1f620 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e  LITE_ERROR;.#ifn
1f630 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f640 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  WAL..#ifdef SQLI
1f650 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1f660 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1f670 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1f680 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
1f690 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1f6a0 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
1f6b0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1f6c0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1f6d0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74  );.  if( db->aut
1f6e0 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  oCommit==0 ){.  
1f6f0 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 69    int iDb;.    i
1f700 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
1f710 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b  DbName(db, zDb);
1f720 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 30 20  .    if( iDb==0 
1f730 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20  || iDb>1 ){.    
1f740 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
1f750 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
1f760 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71  .      if( 0==sq
1f770 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 52 65  lite3BtreeIsInRe
1f780 61 64 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  adTrans(pBt) ){.
1f790 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1f7a0 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f  ite3PagerSnapsho
1f7b0 74 4f 70 65 6e 28 73 71 6c 69 74 65 33 42 74 72  tOpen(sqlite3Btr
1f7c0 65 65 50 61 67 65 72 28 70 42 74 29 2c 20 70 53  eePager(pBt), pS
1f7d0 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20  napshot);.      
1f7e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f7f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1f800 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1f810 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74  eeBeginTrans(pBt
1f820 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1f830 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70  sqlite3PagerSnap
1f840 73 68 6f 74 4f 70 65 6e 28 73 71 6c 69 74 65 33  shotOpen(sqlite3
1f850 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 2c  BtreePager(pBt),
1f860 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
1f870 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1f880 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
1f890 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1f8a0 78 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20  x);.#endif   /* 
1f8b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
1f8c0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
1f8d0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  }../*.** Free a 
1f8e0 73 6e 61 70 73 68 6f 74 20 68 61 6e 64 6c 65 20  snapshot handle 
1f8f0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
1f900 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67  lite3_snapshot_g
1f910 65 74 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  et()..*/.void sq
1f920 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66  lite3_snapshot_f
1f930 72 65 65 28 73 71 6c 69 74 65 33 5f 73 6e 61 70  ree(sqlite3_snap
1f940 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 29  shot *pSnapshot)
1f950 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  {.  sqlite3_free
1f960 28 70 53 6e 61 70 73 68 6f 74 29 3b 0a 7d 0a 23  (pSnapshot);.}.#
1f970 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1f980 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20  ENABLE_SNAPSHOT 
1f990 2a 2f 0a                                         */.