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

Artifact 694ac90557abdaa62151a6090670e107b0f2c2ab:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64  u.h".#endif.#ifd
0320: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0330: 5f 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74  _JSON1.int sqlit
0340: 65 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69  e3Json1Init(sqli
0350: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69  te3*);.#endif.#i
0360: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
0370: 4c 45 5f 46 54 53 35 0a 69 6e 74 20 73 71 6c 69  LE_FTS5.int sqli
0380: 74 65 33 46 74 73 35 49 6e 69 74 28 73 71 6c 69  te3Fts5Init(sqli
0390: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  te3*);.#endif..#
03a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d  ifndef SQLITE_AM
03b0: 41 4c 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d  ALGAMATION./* IM
03c0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
03d0: 20 52 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54   R-46656-45156 T
03e0: 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69  he sqlite3_versi
03f0: 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73  on[] string cons
0400: 74 61 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  tant.** contains
0410: 20 74 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c   the text of SQL
0420: 49 54 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72  ITE_VERSION macr
0430: 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  o. .*/.const cha
0440: 72 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  r sqlite3_versio
0450: 6e 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52  n[] = SQLITE_VER
0460: 53 49 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  SION;.#endif../*
0470: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0480: 4f 46 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37  OF: R-53536-4257
0490: 35 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  5 The sqlite3_li
04a0: 62 76 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74  bversion() funct
04b0: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61  ion returns.** a
04c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
04d0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  to the sqlite3_v
04e0: 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20  ersion[] string 
04f0: 63 6f 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f  constant. .*/.co
0500: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0510: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69  3_libversion(voi
0520: 64 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  d){ return sqlit
0530: 65 33 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f  e3_version; }../
0540: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
0550: 2d 4f 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33  -OF: R-63124-393
0560: 30 30 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73  00 The sqlite3_s
0570: 6f 75 72 63 65 69 64 28 29 20 66 75 6e 63 74 69  ourceid() functi
0580: 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20  on returns a.** 
0590: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
05a0: 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f  ing constant who
05b0: 73 65 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  se value is the 
05c0: 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53  same as the.** S
05d0: 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20  QLITE_SOURCE_ID 
05e0: 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d  C preprocessor m
05f0: 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20  acro. .*/.const 
0600: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f  char *sqlite3_so
0610: 75 72 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65  urceid(void){ re
0620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52  turn SQLITE_SOUR
0630: 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  CE_ID; }../* IMP
0640: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0650: 52 2d 33 35 32 31 30 2d 36 33 35 30 38 20 54 68  R-35210-63508 Th
0660: 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  e sqlite3_libver
0670: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75  sion_number() fu
0680: 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  nction.** return
0690: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75  s an integer equ
06a0: 61 6c 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52  al to SQLITE_VER
06b0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a  SION_NUMBER..*/.
06c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  int sqlite3_libv
06d0: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f  ersion_number(vo
06e0: 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  id){ return SQLI
06f0: 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
0700: 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  R; }../* IMPLEME
0710: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30  NTATION-OF: R-20
0720: 37 39 30 2d 31 34 30 32 35 20 54 68 65 20 73 71  790-14025 The sq
0730: 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65  lite3_threadsafe
0740: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
0750: 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61  rns.** zero if a
0760: 6e 64 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74  nd only if SQLit
0770: 65 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77  e was compiled w
0780: 69 74 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64  ith mutexing cod
0790: 65 20 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f  e omitted due to
07a0: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54  .** the SQLITE_T
07b0: 48 52 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c  HREADSAFE compil
07c0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65  e-time option be
07d0: 69 6e 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f  ing set to 0..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72  .int sqlite3_thr
07f0: 65 61 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72  eadsafe(void){ r
0800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52  eturn SQLITE_THR
0810: 45 41 44 53 41 46 45 3b 20 7d 0a 0a 2f 2a 0a 2a  EADSAFE; }../*.*
0820: 2a 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * When compiling
0830: 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72   the test fixtur
0840: 65 20 6f 72 20 77 69 74 68 20 64 65 62 75 67 67  e or with debugg
0850: 69 6e 67 20 65 6e 61 62 6c 65 64 20 28 6f 6e 20  ing enabled (on 
0860: 57 69 6e 33 32 29 2c 0a 2a 2a 20 74 68 69 73 20  Win32),.** this 
0870: 76 61 72 69 61 62 6c 65 20 62 65 69 6e 67 20 73  variable being s
0880: 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 77  et to non-zero w
0890: 69 6c 6c 20 63 61 75 73 65 20 4f 53 54 52 41 43  ill cause OSTRAC
08a0: 45 20 6d 61 63 72 6f 73 20 74 6f 20 65 6d 69 74  E macros to emit
08b0: 0a 2a 2a 20 65 78 74 72 61 20 64 69 61 67 6e 6f  .** extra diagno
08c0: 73 74 69 63 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  stic information
08d0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
08e0: 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
08f0: 0a 23 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  .# ifndef SQLITE
0900: 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 0a  _DEBUG_OS_TRACE.
0910: 23 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  #   define SQLIT
0920: 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45  E_DEBUG_OS_TRACE
0930: 20 30 0a 23 20 65 6e 64 69 66 0a 20 20 69 6e 74   0.# endif.  int
0940: 20 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 20   sqlite3OSTrace 
0950: 3d 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f  = SQLITE_DEBUG_O
0960: 53 5f 54 52 41 43 45 3b 0a 23 65 6e 64 69 66 0a  S_TRACE;.#endif.
0970: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0980: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
0990: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
09a0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
09b0: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E)./*.** If the 
09c0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
09d0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  on pointer is no
09e0: 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a 2a 2a  t NULL and if.**
09f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
0a00: 4f 54 52 41 43 45 20 69 73 20 65 6e 61 62 6c 65  OTRACE is enable
0a10: 64 2c 20 74 68 65 6e 20 6d 65 73 73 61 67 65 73  d, then messages
0a20: 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20 49   describing.** I
0a30: 2f 4f 20 61 63 74 69 76 65 20 61 72 65 20 77 72  /O active are wr
0a40: 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68 69 73  itten using this
0a50: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 73   function.  Thes
0a60: 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20 61 72  e messages.** ar
0a70: 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 64  e intended for d
0a80: 65 62 75 67 67 69 6e 67 20 61 63 74 69 76 69 74  ebugging activit
0a90: 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53 51 4c 49 54  y only..*/.SQLIT
0aa0: 45 5f 41 50 49 20 76 6f 69 64 20 28 53 51 4c 49  E_API void (SQLI
0ab0: 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74 65  TE_CDECL *sqlite
0ac0: 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20  3IoTrace)(const 
0ad0: 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b  char*, ...) = 0;
0ae0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
0af0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0b00: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
0b10: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
0b20: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  ng which is the.
0b30: 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  ** name of a dir
0b40: 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61  ectory, then tha
0b50: 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  t directory will
0b60: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
0b70: 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66  e.** temporary f
0b80: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  iles..**.** See 
0b90: 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41  also the "PRAGMA
0ba0: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
0bb0: 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61  ctory" SQL comma
0bc0: 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nd..*/.char *sql
0bd0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
0be0: 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ory = 0;../*.** 
0bf0: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0c00: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0c10: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0c20: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0c30: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0c40: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0c50: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0c60: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0c70: 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62 61  re.** all databa
0c80: 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66 69  se files specifi
0c90: 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ed with a relati
0ca0: 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a 0a  ve pathname..**.
0cb0: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  ** See also the 
0cc0: 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f  "PRAGMA data_sto
0cd0: 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53 51  re_directory" SQ
0ce0: 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68  L command..*/.ch
0cf0: 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74 61  ar *sqlite3_data
0d00: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  _directory = 0;.
0d10: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0d20: 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a 2a  e SQLite.  .**.*
0d30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0d40: 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ust be called to
0d50: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
0d60: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
0d70: 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20 6d  n,.** VFS, and m
0d80: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73 20  utex subsystems 
0d90: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61  prior to doing a
0da0: 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b 20  ny serious work 
0db0: 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e 20  with.** SQLite. 
0dc0: 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73 20   But as long as 
0dd0: 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70 69  you do not compi
0de0: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f  le with SQLITE_O
0df0: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a 20  MIT_AUTOINIT.** 
0e00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
0e10: 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74 6f  l be called auto
0e20: 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65 79  matically by key
0e30: 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20 61   routines such a
0e40: 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  s.** sqlite3_ope
0e50: 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  n().  .**.** Thi
0e60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
0e70: 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20 69  o-op except on i
0e80: 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63 61  ts very first ca
0e90: 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63 65  ll for the proce
0ea0: 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74 68  ss,.** or for th
0eb0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66 74  e first call aft
0ec0: 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
0ed0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a 2a  ite3_shutdown..*
0ee0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
0ef0: 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74 68  hread to call th
0f00: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
0f10: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
0f20: 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65 74  on to.** complet
0f30: 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71 75  ion.  If subsequ
0f40: 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c 6c  ent threads call
0f50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
0f60: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  fore the first.*
0f70: 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69 6e  * thread has fin
0f80: 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69 61  ished the initia
0f90: 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73  lization process
0fa0: 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73 65  , then the subse
0fb0: 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64 73  quent.** threads
0fc0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fd0: 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  l the first thre
0fe0: 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74 68  ad finishes with
0ff0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1000: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
1010: 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67 68  irst thread migh
1020: 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  t call this rout
1030: 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79 2e  ine recursively.
1040: 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20 63    Recursive.** c
1050: 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75  alls to this rou
1060: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tine should not 
1070: 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73 65  block, of course
1080: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
1090: 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  .** initializati
10a0: 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c 64  on process would
10b0: 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65 2e   never complete.
10c0: 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65 20  .**.** Let X be 
10d0: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  the first thread
10e0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 72   to enter this r
10f0: 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20 62  outine.  Let Y b
1100: 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  e some other.** 
1110: 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77 68  thread.  Then wh
1120: 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ile the initial 
1130: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  invocation of th
1140: 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58 20  is routine by X 
1150: 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74 65  is.** incomplete
1160: 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65 64  , it is required
1170: 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   that:.**.**    
1180: 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69 73  *  Calls to this
1190: 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59 20   routine from Y 
11a0: 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69 6c  must block until
11b0: 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74 0a   the outer-most.
11c0: 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62 79  **       call by
11d0: 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a 2a   X completes..**
11e0: 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72 73  .**    *  Recurs
11f0: 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68 69  ive calls to thi
1200: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
1210: 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20 69  hread X return i
1220: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
1230: 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f 63      without bloc
1240: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
1250: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1260: 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f 4c  void){.  MUTEX_L
1270: 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
1280: 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20  tex *pMaster; ) 
1290: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
12a0: 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a  n static mutex *
12b0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1300: 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69 6e  _EXTRA_INIT.  in
1310: 74 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20  t bRunExtraInit 
1320: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
1340: 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  tra initializati
1350: 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6e  on needed */.#en
1360: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1370: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63  TE_OMIT_WSD.  rc
1380: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
1390: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
13a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13b0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
13c0: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
13d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 6f 6c  .  /* If the fol
13e0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20  lowing assert() 
13f0: 66 61 69 6c 73 20 6f 6e 20 73 6f 6d 65 20 6f 62  fails on some ob
1400: 73 63 75 72 65 20 70 72 6f 63 65 73 73 6f 72 2f  scure processor/
1410: 63 6f 6d 70 69 6c 65 72 0a 20 20 2a 2a 20 63 6f  compiler.  ** co
1420: 6d 62 69 6e 61 74 69 6f 6e 2c 20 74 68 65 20 77  mbination, the w
1430: 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 74 6f  ork-around is to
1440: 20 73 65 74 20 74 68 65 20 63 6f 72 72 65 63 74   set the correct
1450: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 73 69   pointer.  ** si
1460: 7a 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ze at compile-ti
1470: 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  me using -DSQLIT
1480: 45 5f 50 54 52 53 49 5a 45 3d 6e 20 63 6f 6d 70  E_PTRSIZE=n comp
1490: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
14a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  */.  assert( SQL
14b0: 49 54 45 5f 50 54 52 53 49 5a 45 3d 3d 73 69 7a  ITE_PTRSIZE==siz
14c0: 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 0a 20  eof(char*) );.. 
14d0: 20 2f 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73   /* If SQLite is
14e0: 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c 65 74   already complet
14f0: 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  ely initialized,
1500: 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 0a   then this call.
1510: 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
1520: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 73 68 6f  initialize() sho
1530: 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20  uld be a no-op. 
1540: 20 42 75 74 20 74 68 65 20 69 6e 69 74 69 61 6c   But the initial
1550: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d 75 73  ization.  ** mus
1560: 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e 20 20  t be complete.  
1570: 53 6f 20 69 73 49 6e 69 74 20 6d 75 73 74 20 6e  So isInit must n
1580: 6f 74 20 62 65 20 73 65 74 20 75 6e 74 69 6c 20  ot be set until 
1590: 74 68 65 20 76 65 72 79 20 65 6e 64 0a 20 20 2a  the very end.  *
15a0: 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * of this routin
15b0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  e..  */.  if( sq
15c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15d0: 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72  g.isInit ) retur
15e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
15f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
1600: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
1610: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   is initialized.
1620: 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 0a    If unable to .
1630: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
1640: 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  the mutex subsys
1650: 74 65 6d 2c 20 72 65 74 75 72 6e 20 65 61 72 6c  tem, return earl
1660: 79 20 77 69 74 68 20 74 68 65 20 65 72 72 6f 72  y with the error
1670: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 79  ..  ** If the sy
1680: 73 74 65 6d 20 69 73 20 73 6f 20 73 69 63 6b 20  stem is so sick 
1690: 74 68 61 74 20 77 65 20 61 72 65 20 75 6e 61 62  that we are unab
16a0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  le to allocate a
16b0: 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20 74 68 65   mutex,.  ** the
16c0: 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 53  re is not much S
16d0: 51 4c 69 74 65 20 69 73 20 67 6f 69 6e 67 20 74  QLite is going t
16e0: 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 2e  o be able to do.
16f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d  .  **.  ** The m
1700: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 20 6d  utex subsystem m
1710: 75 73 74 20 74 61 6b 65 20 63 61 72 65 20 6f 66  ust take care of
1720: 20 73 65 72 69 61 6c 69 7a 69 6e 67 20 69 74 73   serializing its
1730: 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69 74 69 61   own.  ** initia
1740: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  lization..  */. 
1750: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 75 74   rc = sqlite3Mut
1760: 65 78 49 6e 69 74 28 29 3b 0a 20 20 69 66 28 20  exInit();.  if( 
1770: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1780: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1790: 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20 73 79   the malloc() sy
17a0: 73 74 65 6d 20 61 6e 64 20 74 68 65 20 72 65 63  stem and the rec
17b0: 75 72 73 69 76 65 20 70 49 6e 69 74 4d 75 74 65  ursive pInitMute
17c0: 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a 20 54 68  x mutex..  ** Th
17d0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  is operation is 
17e0: 70 72 6f 74 65 63 74 65 64 20 62 79 20 74 68 65  protected by the
17f0: 20 53 54 41 54 49 43 5f 4d 41 53 54 45 52 20 6d   STATIC_MASTER m
1800: 75 74 65 78 2e 20 20 4e 6f 74 65 20 74 68 61 74  utex.  Note that
1810: 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c 6c 6f 63  .  ** MutexAlloc
1820: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  () is called for
1830: 20 61 20 73 74 61 74 69 63 20 6d 75 74 65 78 20   a static mutex 
1840: 70 72 69 6f 72 20 74 6f 20 69 6e 69 74 69 61 6c  prior to initial
1850: 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6d  izing the.  ** m
1860: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20  alloc subsystem 
1870: 2d 20 74 68 69 73 20 69 6d 70 6c 69 65 73 20 74  - this implies t
1880: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
1890: 6f 6e 20 6f 66 20 61 20 73 74 61 74 69 63 0a 20  on of a static. 
18a0: 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74 20 6e   ** mutex must n
18b0: 6f 74 20 72 65 71 75 69 72 65 20 73 75 70 70 6f  ot require suppo
18c0: 72 74 20 66 72 6f 6d 20 74 68 65 20 6d 61 6c 6c  rt from the mall
18d0: 6f 63 20 73 75 62 73 79 73 74 65 6d 2e 0a 20 20  oc subsystem..  
18e0: 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  */.  MUTEX_LOGIC
18f0: 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69  ( pMaster = sqli
1900: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
1910: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1920: 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73  C_MASTER); ).  s
1930: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1940: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
1950: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1960: 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d  ig.isMutexInit =
1970: 20 31 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   1;.  if( !sqlit
1980: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1990: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
19a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
19b0: 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a 20 20 7d  allocInit();.  }
19c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
19e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
19f0: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 31  isMallocInit = 1
1a00: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
1a10: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1a20: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1a30: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1a40: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
1a50: 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 73  x =.           s
1a60: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1a70: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
1a80: 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20 20  CURSIVE);.      
1a90: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1aa0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
1ab0: 65 78 20 26 26 20 21 73 71 6c 69 74 65 33 47 6c  ex && !sqlite3Gl
1ac0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1ad0: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
1ae0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1af0: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
1b00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1b10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  {.    sqlite3Glo
1b30: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
1b40: 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20  itMutex++;.  }. 
1b50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1b60: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a  eave(pMaster);..
1b70: 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f    /* If rc is no
1b80: 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74  t SQLITE_OK at t
1b90: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
1ba0: 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f  either the mallo
1bb0: 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d  c.  ** subsystem
1bc0: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e   could not be in
1bd0: 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65  itialized or the
1be0: 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74   system failed t
1bf0: 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20  o allocate.  ** 
1c00: 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d  the pInitMutex m
1c10: 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20  utex. Return an 
1c20: 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20  error in either 
1c30: 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  case.  */.  if( 
1c40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c50: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1c60: 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65    }..  /* Do the
1c70: 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69   rest of the ini
1c80: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65  tialization unde
1c90: 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  r the recursive 
1ca0: 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68  mutex so.  ** th
1cb0: 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62  at we will be ab
1cc0: 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63  le to handle rec
1cd0: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74  ursive calls int
1ce0: 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69  o.  ** sqlite3_i
1cf0: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68  nitialize().  Th
1d00: 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1d10: 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20  s normally come 
1d20: 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c  through.  ** sql
1d30: 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77  ite3_os_init() w
1d40: 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73  hen it invokes s
1d50: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1d60: 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72  ter(), but other
1d70: 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20  .  ** recursive 
1d80: 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f  calls might also
1d90: 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20   be possible..  
1da0: 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
1db0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31  TATION-OF: R-001
1dc0: 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20  40-37445 SQLite 
1dd0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
1de0: 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20  rializes calls. 
1df0: 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74   ** to the xInit
1e00: 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20   method, so the 
1e10: 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65  xInit method nee
1e20: 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73  d not be threads
1e30: 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  afe..  **.  ** T
1e40: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74  he following mut
1e50: 65 78 20 69 73 20 77 68 61 74 20 73 65 72 69 61  ex is what seria
1e60: 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20  lizes access to 
1e70: 74 68 65 20 61 70 70 64 65 66 20 70 63 61 63 68  the appdef pcach
1e80: 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74  e xInit.  ** met
1e90: 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74  hods.  The sqlit
1ea0: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
1eb0: 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73  s.xInit() all is
1ec0: 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65   embedded in the
1ed0: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
1ee0: 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69  lite3PcacheIniti
1ef0: 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  alize()..  */.  
1f00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1f10: 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ter(sqlite3Globa
1f20: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
1f30: 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ex);.  if( sqlit
1f40: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1f50: 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69  sInit==0 && sqli
1f60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f70: 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b  inProgress==0 ){
1f80: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
1f90: 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72  alConfig.inProgr
1fa0: 65 73 73 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  ess = 1;.#ifdef 
1fb0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
1fc0: 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20 20 20 20 20  LLOG.    {.     
1fd0: 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c   extern void sql
1fe0: 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c 6f 67  ite3_init_sqllog
1ff0: 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 73 71  (void);.      sq
2000: 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c 6f  lite3_init_sqllo
2010: 67 28 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  g();.    }.#endi
2020: 66 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71  f.    memset(&sq
2030: 6c 69 74 65 33 42 75 69 6c 74 69 6e 46 75 6e 63  lite3BuiltinFunc
2040: 74 69 6f 6e 73 2c 20 30 2c 20 73 69 7a 65 6f 66  tions, 0, sizeof
2050: 28 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e 46  (sqlite3BuiltinF
2060: 75 6e 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20  unctions));.    
2070: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 42  sqlite3RegisterB
2080: 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28  uiltinFunctions(
2090: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
20a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
20b0: 73 50 43 61 63 68 65 49 6e 69 74 3d 3d 30 20 29  sPCacheInit==0 )
20c0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20d0: 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61  ite3PcacheInitia
20e0: 6c 69 7a 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20  lize();.    }.  
20f0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2100: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
2110: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2120: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2130: 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  1;.      rc = sq
2140: 6c 69 74 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20  lite3OsInit();. 
2150: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2160: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2170: 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63 68      sqlite3PCach
2180: 65 42 75 66 66 65 72 53 65 74 75 70 28 20 73 71  eBufferSetup( sq
2190: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
21a0: 67 2e 70 50 61 67 65 2c 20 0a 20 20 20 20 20 20  g.pPage, .      
21b0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
21c0: 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20  lConfig.szPage, 
21d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
21e0: 66 69 67 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20  fig.nPage);.    
21f0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2200: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 31  onfig.isInit = 1
2210: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2220: 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 20 20 20  EXTRA_INIT.     
2230: 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20 3d   bRunExtraInit =
2240: 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d   1;.#endif.    }
2250: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2260: 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72  alConfig.inProgr
2270: 65 73 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  ess = 0;.  }.  s
2280: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
2290: 76 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ve(sqlite3Global
22a0: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
22b0: 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63  x);..  /* Go bac
22c0: 6b 20 75 6e 64 65 72 20 74 68 65 20 73 74 61 74  k under the stat
22d0: 69 63 20 6d 75 74 65 78 20 61 6e 64 20 63 6c 65  ic mutex and cle
22e0: 61 6e 20 75 70 20 74 68 65 20 72 65 63 75 72 73  an up the recurs
22f0: 69 76 65 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74  ive.  ** mutex t
2300: 6f 20 70 72 65 76 65 6e 74 20 61 20 72 65 73 6f  o prevent a reso
2310: 75 72 63 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a  urce leak..  */.
2320: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2330: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
2340: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2350: 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75  onfig.nRefInitMu
2360: 74 65 78 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c  tex--;.  if( sql
2370: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2380: 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d  .nRefInitMutex<=
2390: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
23a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
23b0: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
23c0: 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ex==0 );.    sql
23d0: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
23e0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
23f0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b  fig.pInitMutex);
2400: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2410: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
2420: 74 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  tex = 0;.  }.  s
2430: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
2440: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20  ve(pMaster);..  
2450: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2460: 20 69 73 20 6a 75 73 74 20 61 20 73 61 6e 69 74   is just a sanit
2470: 79 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  y check to make 
2480: 73 75 72 65 20 53 51 4c 69 74 65 20 68 61 73 0a  sure SQLite has.
2490: 20 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c    ** been compil
24a0: 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49  ed correctly.  I
24b0: 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
24c0: 6f 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 2c  o run this code,
24d0: 20 62 75 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e   but.  ** we don
24e0: 27 74 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 69  't want to run i
24f0: 74 20 74 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20  t too often and 
2500: 73 6f 61 6b 20 75 70 20 43 50 55 20 63 79 63 6c  soak up CPU cycl
2510: 65 73 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72  es for no.  ** r
2520: 65 61 73 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75  eason.  So we ru
2530: 6e 20 69 74 20 6f 6e 63 65 20 64 75 72 69 6e 67  n it once during
2540: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e   initialization.
2550: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  .  */.#ifndef ND
2560: 45 42 55 47 0a 23 69 66 6e 64 65 66 20 53 51 4c  EBUG.#ifndef SQL
2570: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
2580: 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69  G_POINT.  /* Thi
2590: 73 20 73 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64  s section of cod
25a0: 65 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74  e's only "output
25b0: 22 20 69 73 20 76 69 61 20 61 73 73 65 72 74 28  " is via assert(
25c0: 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f  ) statements. */
25d0: 0a 20 20 69 66 20 28 20 72 63 3d 3d 53 51 4c 49  .  if ( rc==SQLI
25e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34  TE_OK ){.    u64
25f0: 20 78 20 3d 20 28 28 28 75 36 34 29 31 29 3c 3c   x = (((u64)1)<<
2600: 36 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c  63)-1;.    doubl
2610: 65 20 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e y;.    assert(
2620: 73 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20  sizeof(x)==8);. 
2630: 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66     assert(sizeof
2640: 28 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b  (x)==sizeof(y));
2650: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 79 2c 20  .    memcpy(&y, 
2660: 26 78 2c 20 38 29 3b 0a 20 20 20 20 61 73 73 65  &x, 8);.    asse
2670: 72 74 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  rt( sqlite3IsNaN
2680: 28 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  (y) );.  }.#endi
2690: 66 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  f.#endif..  /* D
26a0: 6f 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69  o extra initiali
26b0: 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 72 65 71  zation steps req
26c0: 75 65 73 74 65 64 20 62 79 20 74 68 65 20 53 51  uested by the SQ
26d0: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
26e0: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d    ** compile-tim
26f0: 65 20 6f 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  e option..  */.#
2700: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54  ifdef SQLITE_EXT
2710: 52 41 5f 49 4e 49 54 0a 20 20 69 66 28 20 62 52  RA_INIT.  if( bR
2720: 75 6e 45 78 74 72 61 49 6e 69 74 20 29 7b 0a 20  unExtraInit ){. 
2730: 20 20 20 69 6e 74 20 53 51 4c 49 54 45 5f 45 58     int SQLITE_EX
2740: 54 52 41 5f 49 4e 49 54 28 63 6f 6e 73 74 20 63  TRA_INIT(const c
2750: 68 61 72 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  har*);.    rc = 
2760: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2770: 54 28 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  T(0);.  }.#endif
2780: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2790: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65  ../*.** Undo the
27a0: 20 65 66 66 65 63 74 73 20 6f 66 20 73 71 6c 69   effects of sqli
27b0: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
27c0: 2e 20 20 4d 75 73 74 20 6e 6f 74 20 62 65 20 63  .  Must not be c
27d0: 61 6c 6c 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74  alled while.** t
27e0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
27f0: 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f  ding database co
2800: 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d  nnections or mem
2810: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ory allocations 
2820: 6f 72 0a 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20  or.** while any 
2830: 70 61 72 74 20 6f 66 20 53 51 4c 69 74 65 20 69  part of SQLite i
2840: 73 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75  s otherwise in u
2850: 73 65 20 69 6e 20 61 6e 79 20 74 68 72 65 61 64  se in any thread
2860: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
2870: 6e 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  ne is not thread
2880: 73 61 66 65 2e 20 20 42 75 74 20 69 74 20 69 73  safe.  But it is
2890: 20 73 61 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20   safe to invoke 
28a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
28b0: 6f 6e 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69  on when SQLite i
28c0: 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20 64  s already shut d
28d0: 6f 77 6e 2e 20 20 49 66 20 53 51 4c 69 74 65 20  own.  If SQLite 
28e0: 69 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20  is already shut 
28f0: 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69  down.** when thi
2900: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
2910: 6f 6b 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  oked, then this 
2920: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72  routine is a har
2930: 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  mless no-op..*/.
2940: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74  int sqlite3_shut
2950: 64 6f 77 6e 28 76 6f 69 64 29 7b 0a 23 69 66 64  down(void){.#ifd
2960: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2970: 53 44 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  SD.  int rc = sq
2980: 6c 69 74 65 33 5f 77 73 64 5f 69 6e 69 74 28 34  lite3_wsd_init(4
2990: 30 39 36 2c 20 32 34 29 3b 0a 20 20 69 66 28 20  096, 24);.  if( 
29a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
29c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
29d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
29e0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a  onfig.isInit ){.
29f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58  #ifdef SQLITE_EX
2a00: 54 52 41 5f 53 48 55 54 44 4f 57 4e 0a 20 20 20  TRA_SHUTDOWN.   
2a10: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 45 58 54   void SQLITE_EXT
2a20: 52 41 5f 53 48 55 54 44 4f 57 4e 28 76 6f 69 64  RA_SHUTDOWN(void
2a30: 29 3b 0a 20 20 20 20 53 51 4c 49 54 45 5f 45 58  );.    SQLITE_EX
2a40: 54 52 41 5f 53 48 55 54 44 4f 57 4e 28 29 3b 0a  TRA_SHUTDOWN();.
2a50: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
2a60: 65 33 5f 6f 73 5f 65 6e 64 28 29 3b 0a 20 20 20  e3_os_end();.   
2a70: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 5f 61   sqlite3_reset_a
2a80: 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28 29 3b  uto_extension();
2a90: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2aa0: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
2ab0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
2ac0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2ad0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20  ig.isPCacheInit 
2ae0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
2af0: 61 63 68 65 53 68 75 74 64 6f 77 6e 28 29 3b 0a  acheShutdown();.
2b00: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2b10: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
2b20: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
2b30: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2b40: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
2b50: 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Init ){.    sqli
2b60: 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a  te3MallocEnd();.
2b70: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2b80: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
2b90: 49 6e 69 74 20 3d 20 30 3b 0a 0a 23 69 66 6e 64  Init = 0;..#ifnd
2ba0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2bb0: 48 55 54 44 4f 57 4e 5f 44 49 52 45 43 54 4f 52  HUTDOWN_DIRECTOR
2bc0: 49 45 53 0a 20 20 20 20 2f 2a 20 54 68 65 20 68  IES.    /* The h
2bd0: 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 68 61  eap subsystem ha
2be0: 73 20 6e 6f 77 20 62 65 65 6e 20 73 68 75 74 64  s now been shutd
2bf0: 6f 77 6e 20 61 6e 64 20 74 68 65 73 65 20 76 61  own and these va
2c00: 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65  lues are suppose
2c10: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 4e  d.    ** to be N
2c20: 55 4c 4c 20 6f 72 20 70 6f 69 6e 74 20 74 6f 20  ULL or point to 
2c30: 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20  memory that was 
2c40: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2c50: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 0a  lite3_malloc(),.
2c60: 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f 75      ** which wou
2c70: 6c 64 20 72 65 6c 79 20 6f 6e 20 74 68 61 74 20  ld rely on that 
2c80: 68 65 61 70 20 73 75 62 73 79 73 74 65 6d 3b 20  heap subsystem; 
2c90: 74 68 65 72 65 66 6f 72 65 2c 20 6d 61 6b 65 20  therefore, make 
2ca0: 73 75 72 65 20 74 68 65 73 65 0a 20 20 20 20 2a  sure these.    *
2cb0: 2a 20 76 61 6c 75 65 73 20 63 61 6e 6e 6f 74 20  * values cannot 
2cc0: 72 65 66 65 72 20 74 6f 20 68 65 61 70 20 6d 65  refer to heap me
2cd0: 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20 6a 75  mory that was ju
2ce0: 73 74 20 69 6e 76 61 6c 69 64 61 74 65 64 20 77  st invalidated w
2cf0: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 68  hen the.    ** h
2d00: 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 77 61  eap subsystem wa
2d10: 73 20 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69  s shutdown.  Thi
2d20: 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 69  s is only done i
2d30: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61  f the current ca
2d40: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 69  ll to.    ** thi
2d50: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 75 6c  s function resul
2d60: 74 65 64 20 69 6e 20 74 68 65 20 68 65 61 70 20  ted in the heap 
2d70: 73 75 62 73 79 73 74 65 6d 20 61 63 74 75 61 6c  subsystem actual
2d80: 6c 79 20 62 65 69 6e 67 20 73 68 75 74 64 6f 77  ly being shutdow
2d90: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  n..    */.    sq
2da0: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
2db0: 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20 73 71  tory = 0;.    sq
2dc0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
2dd0: 74 6f 72 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66  tory = 0;.#endif
2de0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2df0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2e00: 73 4d 75 74 65 78 49 6e 69 74 20 29 7b 0a 20 20  sMutexInit ){.  
2e10: 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 45 6e    sqlite3MutexEn
2e20: 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d();.    sqlite3
2e30: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
2e40: 75 74 65 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20  utexInit = 0;.  
2e50: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
2e60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2e70: 54 68 69 73 20 41 50 49 20 61 6c 6c 6f 77 73 20  This API allows 
2e80: 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20  applications to 
2e90: 6d 6f 64 69 66 79 20 74 68 65 20 67 6c 6f 62 61  modify the globa
2ea0: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  l configuration 
2eb0: 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  of.** the SQLite
2ec0: 20 6c 69 62 72 61 72 79 20 61 74 20 72 75 6e 2d   library at run-
2ed0: 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  time..**.** This
2ee0: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
2ef0: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
2f00: 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
2f10: 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20   outstanding.** 
2f20: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2f30: 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61  ions or memory a
2f40: 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 69  llocations.  Thi
2f50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
2f60: 0a 2a 2a 20 74 68 72 65 61 64 73 61 66 65 2e 20  .** threadsafe. 
2f70: 20 46 61 69 6c 75 72 65 20 74 6f 20 68 65 65 64   Failure to heed
2f80: 20 74 68 65 73 65 20 77 61 72 6e 69 6e 67 73 20   these warnings 
2f90: 63 61 6e 20 6c 65 61 64 20 74 6f 20 75 6e 70 72  can lead to unpr
2fa0: 65 64 69 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68  edictable.** beh
2fb0: 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  avior..*/.int sq
2fc0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74  lite3_config(int
2fd0: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
2fe0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
2ff0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
3000: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e    /* sqlite3_con
3010: 66 69 67 28 29 20 73 68 61 6c 6c 20 72 65 74 75  fig() shall retu
3020: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
3030: 20 69 66 20 69 74 20 69 73 20 69 6e 76 6f 6b 65   if it is invoke
3040: 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65  d while.  ** the
3050: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
3060: 69 73 20 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20  is in use. */.  
3070: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
3080: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29  lConfig.isInit )
3090: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
30a0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76  ISUSE_BKPT;..  v
30b0: 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
30c0: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
30d0: 0a 0a 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 63  ..    /* Mutex c
30e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
30f0: 69 6f 6e 73 20 61 72 65 20 6f 6e 6c 79 20 61 76  ions are only av
3100: 61 69 6c 61 62 6c 65 20 69 6e 20 61 20 74 68 72  ailable in a thr
3110: 65 61 64 73 61 66 65 0a 20 20 20 20 2a 2a 20 63  eadsafe.    ** c
3120: 6f 6d 70 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 23  ompile..    */.#
3130: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3140: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
3150: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
3160: 46 45 3e 30 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  FE>0  /* IMP: R-
3170: 35 34 34 36 36 2d 34 36 37 35 36 20 2a 2f 0a 20  54466-46756 */. 
3180: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3190: 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45  ONFIG_SINGLETHRE
31a0: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  AD: {.      /* E
31b0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 32  VIDENCE-OF: R-02
31c0: 37 34 38 2d 31 39 30 39 36 20 54 68 69 73 20 6f  748-19096 This o
31d0: 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 74  ption sets the t
31e0: 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f  hreading mode to
31f0: 0a 20 20 20 20 20 20 2a 2a 20 53 69 6e 67 6c 65  .      ** Single
3200: 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20  -thread. */.    
3210: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3220: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
3230: 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c   = 0;  /* Disabl
3240: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65 20  e mutex on core 
3250: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3260: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
3270: 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a  llMutex = 0;  /*
3280: 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20 6f   Disable mutex o
3290: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  n connections */
32a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
32b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
32c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48  efined(SQLITE_TH
32d0: 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c  READSAFE) && SQL
32e0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
32f0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 30 35 32 30   /* IMP: R-20520
3300: 2d 35 34 30 38 36 20 2a 2f 0a 20 20 20 20 63 61  -54086 */.    ca
3310: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3320: 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a  _MULTITHREAD: {.
3330: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3340: 45 2d 4f 46 3a 20 52 2d 31 34 33 37 34 2d 34 32  E-OF: R-14374-42
3350: 34 36 38 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  468 This option 
3360: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
3370: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3380: 20 2a 2a 20 4d 75 6c 74 69 2d 74 68 72 65 61 64   ** Multi-thread
3390: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
33a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
33b0: 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20  CoreMutex = 1;  
33c0: 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20  /* Enable mutex 
33d0: 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20  on core */.     
33e0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
33f0: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
3400: 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65  = 0;  /* Disable
3410: 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63   mutex on connec
3420: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62  tions */.      b
3430: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
3440: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
3450: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
3460: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
3470: 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a  ADSAFE>0 /* IMP:
3480: 20 52 2d 35 39 35 39 33 2d 32 31 38 31 30 20 2a   R-59593-21810 *
3490: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
34a0: 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49  E_CONFIG_SERIALI
34b0: 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ZED: {.      /* 
34c0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
34d0: 31 32 32 30 2d 35 31 38 30 30 20 54 68 69 73 20  1220-51800 This 
34e0: 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  option sets the 
34f0: 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20 74  threading mode t
3500: 6f 0a 20 20 20 20 20 20 2a 2a 20 53 65 72 69 61  o.      ** Seria
3510: 6c 69 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  lized. */.      
3520: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3530: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d  fig.bCoreMutex =
3540: 20 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d   1;  /* Enable m
3550: 75 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a  utex on core */.
3560: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3570: 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
3580: 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e  utex = 1;  /* En
3590: 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f  able mutex on co
35a0: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  nnections */.   
35b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
35c0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
35d0: 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ed(SQLITE_THREAD
35e0: 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f  SAFE) && SQLITE_
35f0: 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a 20  THREADSAFE>0 /* 
3600: 49 4d 50 3a 20 52 2d 36 33 36 36 36 2d 34 38 37  IMP: R-63666-487
3610: 35 35 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  55 */.    case S
3620: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54  QLITE_CONFIG_MUT
3630: 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53  EX: {.      /* S
3640: 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e  pecify an altern
3650: 61 74 69 76 65 20 6d 75 74 65 78 20 69 6d 70 6c  ative mutex impl
3660: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
3670: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3680: 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20  lConfig.mutex = 
3690: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
36a0: 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64  te3_mutex_method
36b0: 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  s*);.      break
36c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
36d0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
36e0: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
36f0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
3700: 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 31  FE>0 /* IMP: R-1
3710: 34 34 35 30 2d 33 37 35 39 37 20 2a 2f 0a 20 20  4450-37597 */.  
3720: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3730: 4e 46 49 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b  NFIG_GETMUTEX: {
3740: 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65  .      /* Retrie
3750: 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  ve the current m
3760: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
3770: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61  ion */.      *va
3780: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3790: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29  _mutex_methods*)
37a0: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
37b0: 43 6f 6e 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20  Config.mutex;.  
37c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
37d0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
37e0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
37f0: 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20  MALLOC: {.      
3800: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
3810: 52 2d 35 35 35 39 34 2d 32 31 30 33 30 20 54 68  R-55594-21030 Th
3820: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3830: 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61  MALLOC option ta
3840: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
3850: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
3860: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
3870: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
3880: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
3890: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
38a0: 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20  hods structure. 
38b0: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 73 70 65  The argument spe
38c0: 63 69 66 69 65 73 20 61 6c 74 65 72 6e 61 74 69  cifies alternati
38d0: 76 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 2d  ve.      ** low-
38e0: 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c  level memory all
38f0: 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73  ocation routines
3900: 20 74 6f 20 62 65 20 75 73 65 64 20 69 6e 20 70   to be used in p
3910: 6c 61 63 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f  lace of the memo
3920: 72 79 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  ry.      ** allo
3930: 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  cation routines 
3940: 62 75 69 6c 74 20 69 6e 74 6f 20 53 51 4c 69 74  built into SQLit
3950: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e. */.      sqli
3960: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3970: 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  m = *va_arg(ap, 
3980: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3990: 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ods*);.      bre
39a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
39b0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
39c0: 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  _GETMALLOC: {.  
39d0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
39e0: 4f 46 3a 20 52 2d 35 31 32 31 33 2d 34 36 34 31  OF: R-51213-4641
39f0: 34 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  4 The SQLITE_CON
3a00: 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 20 6f 70  FIG_GETMALLOC op
3a10: 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20  tion takes a.   
3a20: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67     ** single arg
3a30: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61  ument which is a
3a40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
3a50: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 0a 20  nstance of the. 
3a60: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
3a70: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75  mem_methods stru
3a80: 63 74 75 72 65 2e 20 54 68 65 20 73 71 6c 69 74  cture. The sqlit
3a90: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73  e3_mem_methods s
3aa0: 74 72 75 63 74 75 72 65 20 69 73 0a 20 20 20 20  tructure is.    
3ab0: 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
3ac0: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
3ad0: 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 61 6c  efined memory al
3ae0: 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65  location routine
3af0: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  s. */.      if( 
3b00: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3b10: 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30  fig.m.xMalloc==0
3b20: 20 29 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74   ) sqlite3MemSet
3b30: 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20  Default();.     
3b40: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
3b50: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
3b60: 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  *) = sqlite3Glob
3b70: 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20  alConfig.m;.    
3b80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3b90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3ba0: 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a  ONFIG_MEMSTATUS:
3bb0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3bc0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 32 37 35  ENCE-OF: R-61275
3bd0: 2d 33 35 31 35 37 20 54 68 65 20 53 51 4c 49 54  -35157 The SQLIT
3be0: 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54  E_CONFIG_MEMSTAT
3bf0: 55 53 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a  US option takes.
3c00: 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
3c10: 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 79 70 65  argument of type
3c20: 20 69 6e 74 2c 20 69 6e 74 65 72 70 72 65 74 65   int, interprete
3c30: 64 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 2c 20  d as a boolean, 
3c40: 77 68 69 63 68 20 65 6e 61 62 6c 65 73 0a 20 20  which enables.  
3c50: 20 20 20 20 2a 2a 20 6f 72 20 64 69 73 61 62 6c      ** or disabl
3c60: 65 73 20 74 68 65 20 63 6f 6c 6c 65 63 74 69 6f  es the collectio
3c70: 6e 20 6f 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  n of memory allo
3c80: 63 61 74 69 6f 6e 20 73 74 61 74 69 73 74 69 63  cation statistic
3c90: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  s. */.      sqli
3ca0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3cb0: 62 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72  bMemstat = va_ar
3cc0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3cd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3ce0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3cf0: 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b  ONFIG_SCRATCH: {
3d00: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
3d10: 43 45 2d 4f 46 3a 20 52 2d 30 38 34 30 34 2d 36  CE-OF: R-08404-6
3d20: 30 38 38 37 20 54 68 65 72 65 20 61 72 65 20 74  0887 There are t
3d30: 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74  hree arguments t
3d40: 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  o.      ** SQLIT
3d50: 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43 48  E_CONFIG_SCRATCH
3d60: 3a 20 41 20 70 6f 69 6e 74 65 72 20 61 6e 20 38  : A pointer an 8
3d70: 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d 65  -byte aligned me
3d80: 6d 6f 72 79 20 62 75 66 66 65 72 20 66 72 6f 6d  mory buffer from
3d90: 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20  .      ** which 
3da0: 74 68 65 20 73 63 72 61 74 63 68 20 61 6c 6c 6f  the scratch allo
3db0: 63 61 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20  cations will be 
3dc0: 64 72 61 77 6e 2c 20 74 68 65 20 73 69 7a 65 20  drawn, the size 
3dd0: 6f 66 20 65 61 63 68 20 73 63 72 61 74 63 68 0a  of each scratch.
3de0: 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
3df0: 69 6f 6e 20 28 73 7a 29 2c 20 61 6e 64 20 74 68  ion (sz), and th
3e00: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
3e10: 20 6f 66 20 73 63 72 61 74 63 68 20 61 6c 6c 6f   of scratch allo
3e20: 63 61 74 69 6f 6e 73 20 28 4e 29 2e 20 2a 2f 0a  cations (N). */.
3e30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3e40: 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74  balConfig.pScrat
3e50: 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ch = va_arg(ap, 
3e60: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
3e70: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3e80: 67 2e 73 7a 53 63 72 61 74 63 68 20 3d 20 76 61  g.szScratch = va
3e90: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
3ea0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3eb0: 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63  alConfig.nScratc
3ec0: 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  h = va_arg(ap, i
3ed0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3ee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3ef0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
3f00: 41 47 45 43 41 43 48 45 3a 20 7b 0a 20 20 20 20  AGECACHE: {.    
3f10: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3f20: 3a 20 52 2d 31 38 37 36 31 2d 33 36 36 30 31 20  : R-18761-36601 
3f30: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
3f40: 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
3f50: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     ** SQLITE_CON
3f60: 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 41  FIG_PAGECACHE: A
3f70: 20 70 6f 69 6e 74 65 72 20 74 6f 20 38 2d 62 79   pointer to 8-by
3f80: 74 65 20 61 6c 69 67 6e 65 64 20 6d 65 6d 6f 72  te aligned memor
3f90: 79 20 28 70 4d 65 6d 29 2c 0a 20 20 20 20 20 20  y (pMem),.      
3fa0: 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 65  ** the size of e
3fb0: 61 63 68 20 70 61 67 65 20 63 61 63 68 65 20 6c  ach page cache l
3fc0: 69 6e 65 20 28 73 7a 29 2c 20 61 6e 64 20 74 68  ine (sz), and th
3fd0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  e number of cach
3fe0: 65 20 6c 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a  e lines.      **
3ff0: 20 28 4e 29 2e 20 2a 2f 0a 20 20 20 20 20 20 73   (N). */.      s
4000: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4010: 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f 61 72  ig.pPage = va_ar
4020: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
4030: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4040: 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d  lConfig.szPage =
4050: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4060: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4070: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67  lobalConfig.nPag
4080: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
4090: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
40a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
40b0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
40c0: 43 41 43 48 45 5f 48 44 52 53 5a 3a 20 7b 0a 20  CACHE_HDRSZ: {. 
40d0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
40e0: 2d 4f 46 3a 20 52 2d 33 39 31 30 30 2d 32 37 33  -OF: R-39100-273
40f0: 31 37 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  17 The SQLITE_CO
4100: 4e 46 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53  NFIG_PCACHE_HDRS
4110: 5a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a 20  Z option takes. 
4120: 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65       ** a single
4130: 20 70 61 72 61 6d 65 74 65 72 20 77 68 69 63 68   parameter which
4140: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4150: 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20   an integer and 
4160: 77 72 69 74 65 73 20 69 6e 74 6f 0a 20 20 20 20  writes into.    
4170: 20 20 2a 2a 20 74 68 61 74 20 69 6e 74 65 67 65    ** that intege
4180: 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  r the number of 
4190: 65 78 74 72 61 20 62 79 74 65 73 20 70 65 72 20  extra bytes per 
41a0: 70 61 67 65 20 72 65 71 75 69 72 65 64 20 66 6f  page required fo
41b0: 72 20 65 61 63 68 20 70 61 67 65 0a 20 20 20 20  r each page.    
41c0: 20 20 2a 2a 20 69 6e 20 53 51 4c 49 54 45 5f 43    ** in SQLITE_C
41d0: 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 2e  ONFIG_PAGECACHE.
41e0: 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72   */.      *va_ar
41f0: 67 28 61 70 2c 20 69 6e 74 2a 29 20 3d 20 0a 20  g(ap, int*) = . 
4200: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4210: 48 65 61 64 65 72 53 69 7a 65 42 74 72 65 65 28  HeaderSizeBtree(
4220: 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ) +.          sq
4230: 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 50  lite3HeaderSizeP
4240: 63 61 63 68 65 28 29 20 2b 0a 20 20 20 20 20 20  cache() +.      
4250: 20 20 20 20 73 71 6c 69 74 65 33 48 65 61 64 65      sqlite3Heade
4260: 72 53 69 7a 65 50 63 61 63 68 65 31 28 29 3b 0a  rSizePcache1();.
4270: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4280: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
4290: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48  ITE_CONFIG_PCACH
42a0: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  E: {.      /* no
42b0: 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  -op */.      bre
42c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
42d0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
42e0: 5f 47 45 54 50 43 41 43 48 45 3a 20 7b 0a 20 20  _GETPCACHE: {.  
42f0: 20 20 20 20 2f 2a 20 6e 6f 77 20 61 6e 20 65 72      /* now an er
4300: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ror */.      rc 
4310: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
4320: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4330: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
4340: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48  ITE_CONFIG_PCACH
4350: 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  E2: {.      /* E
4360: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33  VIDENCE-OF: R-63
4370: 33 32 35 2d 34 38 33 37 38 20 54 68 65 20 53 51  325-48378 The SQ
4380: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43  LITE_CONFIG_PCAC
4390: 48 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73  HE2 option takes
43a0: 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
43b0: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
43c0: 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  h is a pointer t
43d0: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 70 63 61  o an sqlite3_pca
43e0: 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20  che_methods2.   
43f0: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 54 68     ** object. Th
4400: 69 73 20 6f 62 6a 65 63 74 20 73 70 65 63 69 66  is object specif
4410: 69 65 73 20 74 68 65 20 69 6e 74 65 72 66 61 63  ies the interfac
4420: 65 20 74 6f 20 61 20 63 75 73 74 6f 6d 20 70 61  e to a custom pa
4430: 67 65 20 63 61 63 68 65 0a 20 20 20 20 20 20 2a  ge cache.      *
4440: 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
4450: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
4460: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
4470: 63 61 63 68 65 32 20 3d 20 2a 76 61 5f 61 72 67  cache2 = *va_arg
4480: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61  (ap, sqlite3_pca
4490: 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29 3b 0a  che_methods2*);.
44a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
44b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
44c0: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41  TE_CONFIG_GETPCA
44d0: 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CHE2: {.      /*
44e0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
44f0: 32 32 30 33 35 2d 34 36 31 38 32 20 54 68 65 20  22035-46182 The 
4500: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
4510: 54 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20  TPCACHE2 option 
4520: 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a  takes a.      **
4530: 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
4540: 20 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e   which is a poin
4550: 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
4560: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
4570: 32 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63  2.      ** objec
4580: 74 2e 20 53 51 4c 69 74 65 20 63 6f 70 69 65 73  t. SQLite copies
4590: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
45a0: 70 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c 65  page cache imple
45b0: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 6f 0a 20  mentation into. 
45c0: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 62 6a       ** that obj
45d0: 65 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ect. */.      if
45e0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
45f0: 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 2e 78 49  onfig.pcache2.xI
4600: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nit==0 ){.      
4610: 20 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 53    sqlite3PCacheS
4620: 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20  etDefault();.   
4630: 20 20 20 7d 0a 20 20 20 20 20 20 2a 76 61 5f 61     }.      *va_a
4640: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70  rg(ap, sqlite3_p
4650: 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29  cache_methods2*)
4660: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
4670: 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 3b 0a  Config.pcache2;.
4680: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4690: 20 7d 0a 0a 2f 2a 20 45 56 49 44 45 4e 43 45 2d   }../* EVIDENCE-
46a0: 4f 46 3a 20 52 2d 30 36 36 32 36 2d 31 32 39 31  OF: R-06626-1291
46b0: 31 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  1 The SQLITE_CON
46c0: 46 49 47 5f 48 45 41 50 20 6f 70 74 69 6f 6e 20  FIG_HEAP option 
46d0: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  is only.** avail
46e0: 61 62 6c 65 20 69 66 20 53 51 4c 69 74 65 20 69  able if SQLite i
46f0: 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  s compiled with 
4700: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 45 4e  either SQLITE_EN
4710: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20 6f 72 0a  ABLE_MEMSYS3 or.
4720: 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ** SQLITE_ENABLE
4730: 5f 4d 45 4d 53 59 53 35 20 61 6e 64 20 72 65 74  _MEMSYS5 and ret
4740: 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 52 52 4f  urns SQLITE_ERRO
4750: 52 20 69 66 20 69 6e 76 6f 6b 65 64 20 6f 74 68  R if invoked oth
4760: 65 72 77 69 73 65 2e 20 2a 2f 0a 23 69 66 20 64  erwise. */.#if d
4770: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
4780: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c  ABLE_MEMSYS3) ||
4790: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
47a0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a  ENABLE_MEMSYS5).
47b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
47c0: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20  CONFIG_HEAP: {. 
47d0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
47e0: 2d 4f 46 3a 20 52 2d 31 39 38 35 34 2d 34 32 31  -OF: R-19854-421
47f0: 32 36 20 54 68 65 72 65 20 61 72 65 20 74 68 72  26 There are thr
4800: 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  ee arguments to.
4810: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
4820: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 41 6e 20  CONFIG_HEAP: An 
4830: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 70  8-byte aligned p
4840: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6d 65  ointer to the me
4850: 6d 6f 72 79 2c 20 74 68 65 0a 20 20 20 20 20 20  mory, the.      
4860: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  ** number of byt
4870: 65 73 20 69 6e 20 74 68 65 20 6d 65 6d 6f 72 79  es in the memory
4880: 20 62 75 66 66 65 72 2c 20 61 6e 64 20 74 68 65   buffer, and the
4890: 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 63 61 74   minimum allocat
48a0: 69 6f 6e 20 73 69 7a 65 2e 0a 20 20 20 20 20 20  ion size..      
48b0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
48c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
48d0: 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
48e0: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
48f0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4900: 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67  g.nHeap = va_arg
4910: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4920: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4930: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f  nfig.mnReq = va_
4940: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20  arg(ap, int);.. 
4950: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
4960: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52  GlobalConfig.mnR
4970: 65 71 3c 31 20 29 7b 0a 20 20 20 20 20 20 20 20  eq<1 ){.        
4980: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4990: 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20  fig.mnReq = 1;. 
49a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
49b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
49c0: 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29  ig.mnReq>(1<<12)
49d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63   ){.        /* c
49e0: 61 70 20 6d 69 6e 20 72 65 71 75 65 73 74 20 73  ap min request s
49f0: 69 7a 65 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20  ize at 2^12 */. 
4a00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
4a10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71  obalConfig.mnReq
4a20: 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20   = (1<<12);.    
4a30: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73    }..      if( s
4a40: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4a50: 69 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20  ig.pHeap==0 ){. 
4a60: 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
4a70: 43 45 2d 4f 46 3a 20 52 2d 34 39 39 32 30 2d 36  CE-OF: R-49920-6
4a80: 30 31 38 39 20 49 66 20 74 68 65 20 66 69 72 73  0189 If the firs
4a90: 74 20 70 6f 69 6e 74 65 72 20 28 74 68 65 20 6d  t pointer (the m
4aa0: 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 29 0a 20  emory pointer). 
4ab0: 20 20 20 20 20 20 20 2a 2a 20 69 73 20 4e 55 4c         ** is NUL
4ac0: 4c 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 72  L, then SQLite r
4ad0: 65 76 65 72 74 73 20 74 6f 20 75 73 69 6e 67 20  everts to using 
4ae0: 69 74 73 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f  its default memo
4af0: 72 79 20 61 6c 6c 6f 63 61 74 6f 72 0a 20 20 20  ry allocator.   
4b00: 20 20 20 20 20 2a 2a 20 28 74 68 65 20 73 79 73       ** (the sys
4b10: 74 65 6d 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70  tem malloc() imp
4b20: 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 2c 20 75 6e  lementation), un
4b30: 64 6f 69 6e 67 20 61 6e 79 20 70 72 69 6f 72 20  doing any prior 
4b40: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 0a 20 20  invocation of.  
4b50: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
4b60: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2e 0a 20  CONFIG_MALLOC.. 
4b70: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
4b80: 20 20 2a 2a 20 53 65 74 74 69 6e 67 20 73 71 6c    ** Setting sql
4b90: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4ba0: 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 20  .m to all zeros 
4bb0: 77 69 6c 6c 20 63 61 75 73 65 20 6d 61 6c 6c 6f  will cause mallo
4bc0: 63 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  c to.        ** 
4bd0: 72 65 76 65 72 74 20 74 6f 20 69 74 73 20 64 65  revert to its de
4be0: 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61  fault implementa
4bf0: 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65  tion when sqlite
4c00: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69  3_initialize() i
4c10: 73 20 72 75 6e 0a 20 20 20 20 20 20 20 20 2a 2f  s run.        */
4c20: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
4c30: 26 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  &sqlite3GlobalCo
4c40: 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f  nfig.m, 0, sizeo
4c50: 66 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  f(sqlite3GlobalC
4c60: 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20  onfig.m));.     
4c70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4c80: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4c90: 52 2d 36 31 30 30 36 2d 30 38 39 31 38 20 49 66  R-61006-08918 If
4ca0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e   the memory poin
4cb0: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ter is not NULL 
4cc0: 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  then the.       
4cd0: 20 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20   ** alternative 
4ce0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  memory allocator
4cf0: 20 69 73 20 65 6e 67 61 67 65 64 20 74 6f 20 68   is engaged to h
4d00: 61 6e 64 6c 65 20 61 6c 6c 20 6f 66 20 53 51 4c  andle all of SQL
4d10: 69 74 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ites.        ** 
4d20: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
4d30: 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a 23 69 66 64  n needs. */.#ifd
4d40: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4d50: 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20 20  _MEMSYS3.       
4d60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4d70: 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65  nfig.m = *sqlite
4d80: 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28 29  3MemGetMemsys3()
4d90: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
4da0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
4db0: 4d 53 59 53 35 0a 20 20 20 20 20 20 20 20 73 71  MSYS5.        sq
4dc0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4dd0: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
4de0: 6d 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23  mGetMemsys5();.#
4df0: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
4e00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4e10: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
4e20: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4e30: 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20  LOOKASIDE: {.   
4e40: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4e50: 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69  Config.szLookasi
4e60: 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  de = va_arg(ap, 
4e70: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4e80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4e90: 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f  nLookaside = va_
4ea0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
4eb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4ec0: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 52 65 63  .    .    /* Rec
4ed0: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
4ee0: 20 74 68 65 20 6c 6f 67 67 65 72 20 66 75 6e 63   the logger func
4ef0: 74 69 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72  tion and its fir
4f00: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  st argument..   
4f10: 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   ** The default 
4f20: 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e  is NULL.  Loggin
4f30: 67 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 66  g is disabled if
4f40: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f   the function po
4f50: 69 6e 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20  inter is.    ** 
4f60: 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
4f70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4f80: 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20  FIG_LOG: {.     
4f90: 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b   /* MSVC is pick
4fa0: 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20  y about pulling 
4fb0: 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76  func ptrs from v
4fc0: 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a  a lists..      *
4fd0: 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74  * http://support
4fe0: 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b  .microsoft.com/k
4ff0: 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a  b/47961.      **
5000: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5010: 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61  nfig.xLog = va_a
5020: 72 67 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76  rg(ap, void(*)(v
5030: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63  oid*,int,const c
5040: 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f  har*));.      */
5050: 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76  .      typedef v
5060: 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28  oid(*LOGFUNC_t)(
5070: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
5080: 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71  char*);.      sq
5090: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
50a0: 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28  g.xLog = va_arg(
50b0: 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a  ap, LOGFUNC_t);.
50c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
50d0: 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72  balConfig.pLogAr
50e0: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  g = va_arg(ap, v
50f0: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  oid*);.      bre
5100: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
5110: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5120: 2d 35 35 35 34 38 2d 33 33 38 31 37 20 54 68 65  -55548-33817 The
5130: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 73 65   compile-time se
5140: 74 74 69 6e 67 20 66 6f 72 20 55 52 49 20 66 69  tting for URI fi
5150: 6c 65 6e 61 6d 65 73 0a 20 20 20 20 2a 2a 20 63  lenames.    ** c
5160: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 74  an be changed at
5170: 20 73 74 61 72 74 2d 74 69 6d 65 20 75 73 69 6e   start-time usin
5180: 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c  g the.    ** sql
5190: 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
51a0: 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 31 29  TE_CONFIG_URI,1)
51b0: 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   or.    ** sqlit
51c0: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
51d0: 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 30 29 20 63  _CONFIG_URI,0) c
51e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 61 6c  onfiguration cal
51f0: 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ls..    */.    c
5200: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
5210: 47 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 2f  G_URI: {.      /
5220: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5230: 2d 32 35 34 35 31 2d 36 31 31 32 35 20 54 68 65  -25451-61125 The
5240: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55   SQLITE_CONFIG_U
5250: 52 49 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  RI option takes 
5260: 61 20 73 69 6e 67 6c 65 0a 20 20 20 20 20 20 2a  a single.      *
5270: 2a 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 79  * argument of ty
5280: 70 65 20 69 6e 74 2e 20 49 66 20 6e 6f 6e 2d 7a  pe int. If non-z
5290: 65 72 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61  ero, then URI ha
52a0: 6e 64 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c  ndling is global
52b0: 6c 79 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62  ly.      ** enab
52c0: 6c 65 64 2e 20 49 66 20 74 68 65 20 70 61 72 61  led. If the para
52d0: 6d 65 74 65 72 20 69 73 20 7a 65 72 6f 2c 20 74  meter is zero, t
52e0: 68 65 6e 20 55 52 49 20 68 61 6e 64 6c 69 6e 67  hen URI handling
52f0: 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a 20 20 20   is globally.   
5300: 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 64 2e 20     ** disabled. 
5310: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
5320: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70  GlobalConfig.bOp
5330: 65 6e 55 72 69 20 3d 20 76 61 5f 61 72 67 28 61  enUri = va_arg(a
5340: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
5350: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
5360: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
5370: 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44  FIG_COVERING_IND
5380: 45 58 5f 53 43 41 4e 3a 20 7b 0a 20 20 20 20 20  EX_SCAN: {.     
5390: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
53a0: 20 52 2d 33 36 35 39 32 2d 30 32 37 37 32 20 54   R-36592-02772 T
53b0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
53c0: 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f  _COVERING_INDEX_
53d0: 53 43 41 4e 0a 20 20 20 20 20 20 2a 2a 20 6f 70  SCAN.      ** op
53e0: 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e  tion takes a sin
53f0: 67 6c 65 20 69 6e 74 65 67 65 72 20 61 72 67 75  gle integer argu
5400: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 69 6e  ment which is in
5410: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 0a 20  terpreted as a. 
5420: 20 20 20 20 20 2a 2a 20 62 6f 6f 6c 65 61 6e 20       ** boolean 
5430: 69 6e 20 6f 72 64 65 72 20 74 6f 20 65 6e 61 62  in order to enab
5440: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
5450: 65 20 75 73 65 20 6f 66 20 63 6f 76 65 72 69 6e  e use of coverin
5460: 67 20 69 6e 64 69 63 65 73 20 66 6f 72 0a 20 20  g indices for.  
5470: 20 20 20 20 2a 2a 20 66 75 6c 6c 20 74 61 62 6c      ** full tabl
5480: 65 20 73 63 61 6e 73 20 69 6e 20 74 68 65 20 71  e scans in the q
5490: 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 2e 20  uery optimizer. 
54a0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
54b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
54c0: 65 43 69 73 20 3d 20 76 61 5f 61 72 67 28 61 70  eCis = va_arg(ap
54d0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
54e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  eak;.    }..#ifd
54f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5500: 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65  _SQLLOG.    case
5510: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
5520: 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74  QLLOG: {.      t
5530: 79 70 65 64 65 66 20 76 6f 69 64 28 2a 53 51 4c  ypedef void(*SQL
5540: 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a  LOGFUNC_t)(void*
5550: 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73  , sqlite3*, cons
5560: 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20  t char*, int);. 
5570: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
5580: 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
5590: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 53 51   = va_arg(ap, SQ
55a0: 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20  LLOGFUNC_t);.   
55b0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
55c0: 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
55d0: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  g = va_arg(ap, v
55e0: 6f 69 64 20 2a 29 3b 0a 20 20 20 20 20 20 62 72  oid *);.      br
55f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5600: 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  f..    case SQLI
5610: 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53  TE_CONFIG_MMAP_S
5620: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  IZE: {.      /* 
5630: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
5640: 38 30 36 33 2d 33 38 32 35 38 20 53 51 4c 49 54  8063-38258 SQLIT
5650: 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49  E_CONFIG_MMAP_SI
5660: 5a 45 20 74 61 6b 65 73 20 74 77 6f 20 36 34 2d  ZE takes two 64-
5670: 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74  bit.      ** int
5680: 65 67 65 72 20 28 73 71 6c 69 74 65 33 5f 69 6e  eger (sqlite3_in
5690: 74 36 34 29 20 76 61 6c 75 65 73 20 74 68 61 74  t64) values that
56a0: 20 61 72 65 20 74 68 65 20 64 65 66 61 75 6c 74   are the default
56b0: 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d 69 74   mmap size limit
56c0: 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20 64  .      ** (the d
56d0: 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 20 66  efault setting f
56e0: 6f 72 20 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73  or PRAGMA mmap_s
56f0: 69 7a 65 29 20 61 6e 64 20 74 68 65 20 6d 61 78  ize) and the max
5700: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 0a 20 20 20  imum allowed.   
5710: 20 20 20 2a 2a 20 6d 6d 61 70 20 73 69 7a 65 20     ** mmap size 
5720: 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20  limit. */.      
5730: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
5740: 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Mmap = va_arg(ap
5750: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  , sqlite3_int64)
5760: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5770: 69 6e 74 36 34 20 6d 78 4d 6d 61 70 20 3d 20 76  int64 mxMmap = v
5780: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
5790: 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20 20 20  3_int64);.      
57a0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
57b0: 52 2d 35 33 33 36 37 2d 34 33 31 39 30 20 49 66  R-53367-43190 If
57c0: 20 65 69 74 68 65 72 20 61 72 67 75 6d 65 6e 74   either argument
57d0: 20 74 6f 20 74 68 69 73 20 6f 70 74 69 6f 6e 20   to this option 
57e0: 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e 65 67 61  is.      ** nega
57f0: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 61 74 20  tive, then that 
5800: 61 72 67 75 6d 65 6e 74 20 69 73 20 63 68 61 6e  argument is chan
5810: 67 65 64 20 74 6f 20 69 74 73 20 63 6f 6d 70 69  ged to its compi
5820: 6c 65 2d 74 69 6d 65 20 64 65 66 61 75 6c 74 2e  le-time default.
5830: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
5840: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
5850: 52 2d 33 34 39 39 33 2d 34 35 30 33 31 20 54 68  R-34993-45031 Th
5860: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
5870: 64 20 6d 6d 61 70 20 73 69 7a 65 20 77 69 6c 6c  d mmap size will
5880: 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 73 69 6c   be.      ** sil
5890: 65 6e 74 6c 79 20 74 72 75 6e 63 61 74 65 64 20  ently truncated 
58a0: 69 66 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20  if necessary so 
58b0: 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
58c0: 20 65 78 63 65 65 64 20 74 68 65 0a 20 20 20 20   exceed the.    
58d0: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d    ** compile-tim
58e0: 65 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  e maximum mmap s
58f0: 69 7a 65 20 73 65 74 20 62 79 20 74 68 65 20 53  ize set by the S
5900: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
5910: 49 5a 45 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  IZE.      ** com
5920: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
5930: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
5940: 20 69 66 28 20 6d 78 4d 6d 61 70 3c 30 20 7c 7c   if( mxMmap<0 ||
5950: 20 6d 78 4d 6d 61 70 3e 53 51 4c 49 54 45 5f 4d   mxMmap>SQLITE_M
5960: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 20 29 7b 0a  AX_MMAP_SIZE ){.
5970: 20 20 20 20 20 20 20 20 6d 78 4d 6d 61 70 20 3d          mxMmap =
5980: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
5990: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _SIZE;.      }. 
59a0: 20 20 20 20 20 69 66 28 20 73 7a 4d 6d 61 70 3c       if( szMmap<
59b0: 30 20 29 20 73 7a 4d 6d 61 70 20 3d 20 53 51 4c  0 ) szMmap = SQL
59c0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50  ITE_DEFAULT_MMAP
59d0: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 66 28  _SIZE;.      if(
59e0: 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d 61 70 29 20   szMmap>mxMmap) 
59f0: 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b  szMmap = mxMmap;
5a00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
5a10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
5a20: 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  p = mxMmap;.    
5a30: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5a40: 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 20 3d 20 73  onfig.szMmap = s
5a50: 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 62 72 65  zMmap;.      bre
5a60: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 53  ak;.    }..#if S
5a70: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 26 26 20  QLITE_OS_WIN && 
5a80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
5a90: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29 20 2f 2a 20  IN32_MALLOC) /* 
5aa0: 49 4d 50 3a 20 52 2d 30 34 37 38 30 2d 35 35 38  IMP: R-04780-558
5ab0: 31 35 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  15 */.    case S
5ac0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e  QLITE_CONFIG_WIN
5ad0: 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b 0a 20  32_HEAPSIZE: {. 
5ae0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5af0: 2d 4f 46 3a 20 52 2d 33 34 39 32 36 2d 30 33 33  -OF: R-34926-033
5b00: 36 30 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  60 SQLITE_CONFIG
5b10: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 20  _WIN32_HEAPSIZE 
5b20: 74 61 6b 65 73 20 61 20 33 32 2d 62 69 74 0a 20  takes a 32-bit. 
5b30: 20 20 20 20 20 2a 2a 20 75 6e 73 69 67 6e 65 64       ** unsigned
5b40: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 74   integer value t
5b50: 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68  hat specifies th
5b60: 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f  e maximum size o
5b70: 66 20 74 68 65 20 63 72 65 61 74 65 64 0a 20 20  f the created.  
5b80: 20 20 20 20 2a 2a 20 68 65 61 70 2e 20 2a 2f 0a      ** heap. */.
5b90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5ba0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20  balConfig.nHeap 
5bb0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5bc0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5bd0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
5be0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5bf0: 4e 46 49 47 5f 50 4d 41 53 5a 3a 20 7b 0a 20 20  NFIG_PMASZ: {.  
5c00: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
5c10: 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d 61 20 3d 20  lConfig.szPma = 
5c20: 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67  va_arg(ap, unsig
5c30: 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ned int);.      
5c40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
5c50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5c60: 4e 46 49 47 5f 53 54 4d 54 4a 52 4e 4c 5f 53 50  NFIG_STMTJRNL_SP
5c70: 49 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ILL: {.      sql
5c80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5c90: 2e 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 76 61  .nStmtSpill = va
5ca0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
5cb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5cc0: 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  }..    default: 
5cd0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
5ce0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
5cf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5d00: 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
5d10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5d20: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65  /*.** Set up the
5d30: 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65   lookaside buffe
5d40: 72 73 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  rs for a databas
5d50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
5d60: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
5d70: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a  K on success.  .
5d80: 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20  ** If lookaside 
5d90: 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
5da0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
5db0: 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  _BUSY..**.** The
5dc0: 20 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73   sz parameter is
5dd0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
5de0: 79 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f  ytes in each loo
5df0: 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20  kaside slot..** 
5e00: 54 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65  The cnt paramete
5e10: 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  r is the number 
5e20: 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53  of slots.  If pS
5e30: 74 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65  tart is NULL the
5e40: 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68  .** space for th
5e50: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  e lookaside memo
5e60: 72 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ry is obtained f
5e70: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
5e80: 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61  oc()..** If pSta
5e90: 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  rt is not NULL t
5ea0: 68 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74  hen it is sz*cnt
5eb0: 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
5ec0: 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74   to use for.** t
5ed0: 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  he lookaside mem
5ee0: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
5ef0: 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64  nt setupLookasid
5f00: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76  e(sqlite3 *db, v
5f10: 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73  oid *pBuf, int s
5f20: 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 23 69 66  z, int cnt){.#if
5f30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5f40: 5f 4c 4f 4f 4b 41 53 49 44 45 0a 20 20 76 6f 69  _LOOKASIDE.  voi
5f50: 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28  d *pStart;.  if(
5f60: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
5f70: 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Out ){.    retur
5f80: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
5f90: 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79   }.  /* Free any
5fa0: 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73   existing lookas
5fb0: 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20 74  ide buffer for t
5fc0: 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72  his handle befor
5fd0: 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e  e.  ** allocatin
5fe0: 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77  g a new one so w
5ff0: 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20  e don't have to 
6000: 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a  have space for .
6010: 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65    ** both at the
6020: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f   same time..  */
6030: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
6040: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
6050: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
6060: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
6070: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
6080: 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  /* The size of a
6090: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20   lookaside slot 
60a0: 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38  after ROUNDDOWN8
60b0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72   needs to be lar
60c0: 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20  ger.  ** than a 
60d0: 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73  pointer to be us
60e0: 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20  eful..  */.  sz 
60f0: 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29  = ROUNDDOWN8(sz)
6100: 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30  ;  /* IMP: R-330
6110: 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66  38-09382 */.  if
6120: 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  ( sz<=(int)sizeo
6130: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
6140: 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66  ) ) sz = 0;.  if
6150: 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20  ( cnt<0 ) cnt = 
6160: 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c  0;.  if( sz==0 |
6170: 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  | cnt==0 ){.    
6180: 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61  sz = 0;.    pSta
6190: 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  rt = 0;.  }else 
61a0: 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20  if( pBuf==0 ){. 
61b0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
61c0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
61d0: 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69     pStart = sqli
61e0: 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e  te3Malloc( sz*cn
61f0: 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  t );  /* IMP: R-
6200: 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20  61949-35727 */. 
6210: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
6220: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
6230: 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63 6e   if( pStart ) cn
6240: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
6250: 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a  cSize(pStart)/sz
6260: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6270: 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20  Start = pBuf;.  
6280: 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  }.  db->lookasid
6290: 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61 72  e.pStart = pStar
62a0: 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  t;.  db->lookasi
62b0: 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20  de.pFree = 0;.  
62c0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a  db->lookaside.sz
62d0: 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66   = (u16)sz;.  if
62e0: 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
62f0: 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61  int i;.    Looka
6300: 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20  sideSlot *p;.   
6310: 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69   assert( sz > (i
6320: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
6330: 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20  ideSlot*) );.   
6340: 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53   p = (LookasideS
6350: 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20  lot*)pStart;.   
6360: 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e   for(i=cnt-1; i>
6370: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; i--){.      
6380: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c  p->pNext = db->l
6390: 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a  ookaside.pFree;.
63a0: 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73        db->lookas
63b0: 69 64 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20  ide.pFree = p;. 
63c0: 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73       p = (Lookas
63d0: 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29  ideSlot*)&((u8*)
63e0: 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20  p)[sz];.    }.  
63f0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6400: 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62  pEnd = p;.    db
6410: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73  ->lookaside.bDis
6420: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
6430: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
6440: 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20  loced = pBuf==0 
6450: 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ?1:0;.  }else{. 
6460: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
6470: 2e 70 53 74 61 72 74 20 3d 20 64 62 3b 0a 20 20  .pStart = db;.  
6480: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6490: 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20 64  pEnd = db;.    d
64a0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
64b0: 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 64  sable = 1;.    d
64c0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
64d0: 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  lloced = 0;.  }.
64e0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
64f0: 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 20  _OMIT_LOOKASIDE 
6500: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  */.  return SQLI
6510: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6520: 52 65 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78  Return the mutex
6530: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6540: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
6550: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74  ection..*/.sqlit
6560: 65 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65  e3_mutex *sqlite
6570: 33 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74  3_db_mutex(sqlit
6580: 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20  e3 *db){.#ifdef 
6590: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
65a0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
65b0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
65c0: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
65d0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
65e0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
65f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
6600: 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d  f.  return db->m
6610: 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  utex;.}../*.** F
6620: 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d  ree up as much m
6630: 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20  emory as we can 
6640: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64  from the given d
6650: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
6660: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
6670: 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
6680: 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20  _memory(sqlite3 
6690: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  *db){.  int i;..
66a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
66b0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
66c0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
66d0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
66e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
66f0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
6700: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
6710: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
6720: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
6730: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
6740: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
6750: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
6760: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
6770: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
6780: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
6790: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
67a0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
67b0: 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
67c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72   sqlite3PagerShr
67d0: 69 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ink(pPager);.   
67e0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
67f0: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
6800: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
6810: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
6820: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
6830: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6840: 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 69 72 74  * Flush any dirt
6850: 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
6860: 61 67 65 72 2d 63 61 63 68 65 20 66 6f 72 20 61  ager-cache for a
6870: 6e 79 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ny attached data
6880: 62 61 73 65 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e  base.** to disk.
6890: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
68a0: 64 62 5f 63 61 63 68 65 66 6c 75 73 68 28 73 71  db_cacheflush(sq
68b0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
68c0: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
68d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
68e0: 20 62 53 65 65 6e 42 75 73 79 20 3d 20 30 3b 0a   bSeenBusy = 0;.
68f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6900: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
6910: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
6920: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
6930: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
6940: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
6950: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
6960: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
6970: 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  tex);.  sqlite3B
6980: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
6990: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
69a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
69b0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
69c0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
69d0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
69e0: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73      if( pBt && s
69f0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
6a00: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
6a10: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
6a20: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
6a30: 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
6a40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6a50: 65 72 46 6c 75 73 68 28 70 50 61 67 65 72 29 3b  erFlush(pPager);
6a60: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
6a70: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
6a80: 20 20 20 20 20 20 62 53 65 65 6e 42 75 73 79 20        bSeenBusy 
6a90: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 1;.        rc 
6aa0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
6ab0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6ac0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
6ad0: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
6ae0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6af0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
6b00: 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49  eturn ((rc==SQLI
6b10: 54 45 5f 4f 4b 20 26 26 20 62 53 65 65 6e 42 75  TE_OK && bSeenBu
6b20: 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  sy) ? SQLITE_BUS
6b30: 59 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Y : rc);.}../*.*
6b40: 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
6b50: 73 65 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20  settings for an 
6b60: 69 6e 64 69 76 69 64 75 61 6c 20 64 61 74 61 62  individual datab
6b70: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
6b80: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
6b90: 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20  _config(sqlite3 
6ba0: 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e  *db, int op, ...
6bb0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
6bc0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f  .  int rc;.  va_
6bd0: 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20  start(ap, op);. 
6be0: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
6bf0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6c00: 42 43 4f 4e 46 49 47 5f 4d 41 49 4e 44 42 4e 41  BCONFIG_MAINDBNA
6c10: 4d 45 3a 20 7b 0a 20 20 20 20 20 20 64 62 2d 3e  ME: {.      db->
6c20: 61 44 62 5b 30 5d 2e 7a 44 62 53 4e 61 6d 65 20  aDb[0].zDbSName 
6c30: 3d 20 76 61 5f 61 72 67 28 61 70 2c 63 68 61 72  = va_arg(ap,char
6c40: 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  *);.      rc = S
6c50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
6c60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6c70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
6c80: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
6c90: 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
6ca0: 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Buf = va_arg(ap,
6cb0: 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a   void*); /* IMP:
6cc0: 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a   R-26835-10964 *
6cd0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  /.      int sz =
6ce0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
6cf0: 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  ;       /* IMP: 
6d00: 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f  R-47871-25994 */
6d10: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
6d20: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
6d30: 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ;      /* IMP: R
6d40: 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a  -04460-53386 */.
6d50: 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75 70        rc = setup
6d60: 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42  Lookaside(db, pB
6d70: 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20  uf, sz, cnt);.  
6d80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6d90: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
6da0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
6db0: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
6dc0: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
6dd0: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a   /* The opcode *
6de0: 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d 61  /.        u32 ma
6df0: 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  sk;    /* Mask o
6e00: 66 20 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c  f the bit in sql
6e10: 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65  ite3.flags to se
6e20: 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20  t/clear */.     
6e30: 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b   } aFlagOp[] = {
6e40: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
6e50: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
6e60: 45 5f 46 4b 45 59 2c 20 20 20 20 20 20 20 20 20  E_FKEY,         
6e70: 20 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e    SQLITE_Foreign
6e80: 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20 20 20 20  Keys    },.     
6e90: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
6ea0: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47  NFIG_ENABLE_TRIG
6eb0: 47 45 52 2c 20 20 20 20 20 20 20 20 53 51 4c 49  GER,        SQLI
6ec0: 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72  TE_EnableTrigger
6ed0: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53    },.        { S
6ee0: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
6ef0: 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e  NABLE_FTS3_TOKEN
6f00: 49 5a 45 52 2c 20 53 51 4c 49 54 45 5f 46 74 73  IZER, SQLITE_Fts
6f10: 33 54 6f 6b 65 6e 69 7a 65 72 20 20 7d 2c 0a 20  3Tokenizer  },. 
6f20: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
6f30: 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
6f40: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 2c 20  LOAD_EXTENSION, 
6f50: 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e  SQLITE_LoadExten
6f60: 73 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20 20 20  sion  },.       
6f70: 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46   { SQLITE_DBCONF
6f80: 49 47 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c  IG_NO_CKPT_ON_CL
6f90: 4f 53 45 2c 20 20 20 20 20 20 53 51 4c 49 54 45  OSE,      SQLITE
6fa0: 5f 4e 6f 43 6b 70 74 4f 6e 43 6c 6f 73 65 20 20  _NoCkptOnClose  
6fb0: 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  },.      };.    
6fc0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
6fd0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
6fe0: 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 49 4d  ITE_ERROR; /* IM
6ff0: 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33 37 32  P: R-42790-23372
7000: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
7010: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
7020: 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20  FlagOp); i++){. 
7030: 20 20 20 20 20 20 20 69 66 28 20 61 46 6c 61 67         if( aFlag
7040: 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b 0a  Op[i].op==op ){.
7050: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6e            int on
7060: 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  off = va_arg(ap,
7070: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20   int);.         
7080: 20 69 6e 74 20 2a 70 52 65 73 20 3d 20 76 61 5f   int *pRes = va_
7090: 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20  arg(ap, int*);. 
70a0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6c 64           int old
70b0: 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67  Flags = db->flag
70c0: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  s;.          if(
70d0: 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20 20 20   onoff>0 ){.    
70e0: 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
70f0: 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69 5d 2e  s |= aFlagOp[i].
7100: 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  mask;.          
7110: 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66 66 3d  }else if( onoff=
7120: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7130: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
7140: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b  aFlagOp[i].mask;
7150: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7160: 20 20 20 20 20 20 20 69 66 28 20 6f 6c 64 46 6c         if( oldFl
7170: 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29  ags!=db->flags )
7180: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
7190: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
71a0: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
71b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
71c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65           if( pRe
71d0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
71e0: 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c   *pRes = (db->fl
71f0: 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d  ags & aFlagOp[i]
7200: 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20  .mask)!=0;.     
7210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7220: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7230: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
7240: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7250: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7260: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
7270: 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72  end(ap);.  retur
7280: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
7290: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
72a0: 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e  he buffer z[0..n
72b0: 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  -1] contains all
72c0: 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74   spaces..*/.stat
72d0: 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63 65 73  ic int allSpaces
72e0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
72f0: 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28  int n){.  while(
7300: 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d   n>0 && z[n-1]==
7310: 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  ' ' ){ n--; }.  
7320: 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a  return n==0;.}..
7330: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
7340: 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
7350: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  ing function nam
7360: 65 64 20 22 42 49 4e 41 52 59 22 20 77 68 69 63  ed "BINARY" whic
7370: 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61  h is always.** a
7380: 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
7390: 49 66 20 74 68 65 20 70 61 64 46 6c 61 67 20 61  If the padFlag a
73a0: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
73b0: 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65 20 70  ULL then space p
73c0: 61 64 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e  adding at the en
73d0: 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73 20  d.** of strings 
73e0: 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  is ignored.  Thi
73f0: 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  s implements the
7400: 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e   RTRIM collation
7410: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7420: 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76  binCollFunc(.  v
7430: 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20  oid *padFlag,.  
7440: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
7450: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
7460: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
7470: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
7480: 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e    int rc, n;.  n
7490: 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f   = nKey1<nKey2 ?
74a0: 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a   nKey1 : nKey2;.
74b0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
74c0: 3a 20 52 2d 36 35 30 33 33 2d 32 38 34 34 39 20  : R-65033-28449 
74d0: 54 68 65 20 62 75 69 6c 74 2d 69 6e 20 42 49 4e  The built-in BIN
74e0: 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 6f  ARY collation co
74f0: 6d 70 61 72 65 73 0a 20 20 2a 2a 20 73 74 72 69  mpares.  ** stri
7500: 6e 67 73 20 62 79 74 65 20 62 79 20 62 79 74 65  ngs byte by byte
7510: 20 75 73 69 6e 67 20 74 68 65 20 6d 65 6d 63 6d   using the memcm
7520: 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  p() function fro
7530: 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 43  m the standard C
7540: 0a 20 20 2a 2a 20 6c 69 62 72 61 72 79 2e 20 2a  .  ** library. *
7550: 2f 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28  /.  rc = memcmp(
7560: 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29  pKey1, pKey2, n)
7570: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
7580: 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c 61 67  .    if( padFlag
7590: 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63  .     && allSpac
75a0: 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31  es(((char*)pKey1
75b0: 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20  )+n, nKey1-n).  
75c0: 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28     && allSpaces(
75d0: 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e  ((char*)pKey2)+n
75e0: 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29  , nKey2-n).    )
75f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
7600: 4e 43 45 2d 4f 46 3a 20 52 2d 33 31 36 32 34 2d  NCE-OF: R-31624-
7610: 32 34 37 33 37 20 52 54 52 49 4d 20 69 73 20 6c  24737 RTRIM is l
7620: 69 6b 65 20 42 49 4e 41 52 59 20 65 78 63 65 70  ike BINARY excep
7630: 74 20 74 68 61 74 20 65 78 74 72 61 0a 20 20 20  t that extra.   
7640: 20 20 20 2a 2a 20 73 70 61 63 65 73 20 61 74 20     ** spaces at 
7650: 74 68 65 20 65 6e 64 20 6f 66 20 65 69 74 68 65  the end of eithe
7660: 72 20 73 74 72 69 6e 67 20 64 6f 20 6e 6f 74 20  r string do not 
7670: 63 68 61 6e 67 65 20 74 68 65 20 72 65 73 75 6c  change the resul
7680: 74 2e 20 49 6e 20 6f 74 68 65 72 0a 20 20 20 20  t. In other.    
7690: 20 20 2a 2a 20 77 6f 72 64 73 2c 20 73 74 72 69    ** words, stri
76a0: 6e 67 73 20 77 69 6c 6c 20 63 6f 6d 70 61 72 65  ngs will compare
76b0: 20 65 71 75 61 6c 20 74 6f 20 6f 6e 65 20 61 6e   equal to one an
76c0: 6f 74 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73  other as long as
76d0: 20 74 68 65 79 0a 20 20 20 20 20 20 2a 2a 20 64   they.      ** d
76e0: 69 66 66 65 72 20 6f 6e 6c 79 20 69 6e 20 74 68  iffer only in th
76f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 70 61 63  e number of spac
7700: 65 73 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 20  es at the end.. 
7710: 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73       */.    }els
7720: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b  e{.      rc = nK
7730: 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20  ey1 - nKey2;.   
7740: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7750: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f  rc;.}../*.** Ano
7760: 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f  ther built-in co
7770: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
7780: 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a  : NOCASE. .**.**
7790: 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20   This collating 
77a0: 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65  sequence is inte
77b0: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
77c0: 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65  for "case indepe
77d0: 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69  ndent.** compari
77e0: 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b  son". SQLite's k
77f0: 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65  nowledge of uppe
7800: 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65  r and lower case
7810: 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20   equivalents.** 
7820: 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20  extends only to 
7830: 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72  the 26 character
7840: 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e  s used in the En
7850: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a  glish language..
7860: 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d  **.** At the mom
7870: 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  ent there is onl
7880: 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d  y a UTF-8 implem
7890: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
78a0: 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f  tic int nocaseCo
78b0: 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76  llatingFunc(.  v
78c0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
78d0: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
78e0: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
78f0: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
7900: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
7910: 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65    int r = sqlite
7920: 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20  3StrNICmp(.     
7930: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
7940: 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  Key1, (const cha
7950: 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79  r *)pKey2, (nKey
7960: 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e  1<nKey2)?nKey1:n
7970: 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Key2);.  UNUSED_
7980: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
7990: 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29  d);.  if( 0==r )
79a0: 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d  {.    r = nKey1-
79b0: 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
79c0: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
79d0: 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44  Return the ROWID
79e0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
79f0: 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71  ent insert.*/.sq
7a00: 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74  lite_int64 sqlit
7a10: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
7a20: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
7a30: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
7a40: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
7a50: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
7a60: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
7a70: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
7a80: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
7a90: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
7aa0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
7ab0: 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77  turn db->lastRow
7ac0: 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  id;.}../*.** Ret
7ad0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
7ae0: 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65  f changes in the
7af0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c   most recent cal
7b00: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65  l to sqlite3_exe
7b10: 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  c()..*/.int sqli
7b20: 74 65 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69  te3_changes(sqli
7b30: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66  te3 *db){.#ifdef
7b40: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
7b50: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
7b60: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
7b70: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
7b80: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
7b90: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
7ba0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
7bb0: 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  if.  return db->
7bc0: 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
7bd0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
7be0: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73  ber of changes s
7bf0: 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73  ince the databas
7c00: 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65  e handle was ope
7c10: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
7c20: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
7c30: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
7c40: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7c50: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
7c60: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
7c70: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
7c80: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
7c90: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
7ca0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7cb0: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
7cc0: 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e  n db->nTotalChan
7cd0: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ge;.}../*.** Clo
7ce0: 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  se all open save
7cf0: 70 6f 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e  points. This fun
7d00: 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70  ction only manip
7d10: 75 6c 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66  ulates fields of
7d20: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
7d30: 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20   handle object, 
7d40: 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73  it does not clos
7d50: 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73  e any savepoints
7d60: 20 74 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65   that may be ope
7d70: 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72  n.** at the b-tr
7d80: 65 65 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a  ee/pager level..
7d90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
7da0: 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73  loseSavepoints(s
7db0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77  qlite3 *db){.  w
7dc0: 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70  hile( db->pSavep
7dd0: 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65  oint ){.    Save
7de0: 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62  point *pTmp = db
7df0: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20  ->pSavepoint;.  
7e00: 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74    db->pSavepoint
7e10: 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a   = pTmp->pNext;.
7e20: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7e30: 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d  e(db, pTmp);.  }
7e40: 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  .  db->nSavepoin
7e50: 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74  t = 0;.  db->nSt
7e60: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64  atement = 0;.  d
7e70: 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  b->isTransaction
7e80: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d  Savepoint = 0;.}
7e90: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
7ea0: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75  he destructor fu
7eb0: 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65  nction associate
7ec0: 64 20 77 69 74 68 20 46 75 6e 63 44 65 66 20 70  d with FuncDef p
7ed0: 2c 20 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74  , if any. Except
7ee0: 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20  ,.** if this is 
7ef0: 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70  not the last cop
7f00: 79 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  y of the functio
7f10: 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65  n, do not invoke
7f20: 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a   it. Multiple.**
7f30: 20 63 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e   copies of a sin
7f40: 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  gle function are
7f50: 20 63 72 65 61 74 65 64 20 77 68 65 6e 20 63 72   created when cr
7f60: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20  eate_function() 
7f70: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74  is called.** wit
7f80: 68 20 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20  h SQLITE_ANY as 
7f90: 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f  the encoding..*/
7fa0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e  .static void fun
7fb0: 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c  ctionDestroy(sql
7fc0: 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65  ite3 *db, FuncDe
7fd0: 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73  f *p){.  FuncDes
7fe0: 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75  tructor *pDestru
7ff0: 63 74 6f 72 20 3d 20 70 2d 3e 75 2e 70 44 65 73  ctor = p->u.pDes
8000: 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28 20 70  tructor;.  if( p
8010: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
8020: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
8030: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
8040: 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66  Destructor->nRef
8050: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44 65  ==0 ){.      pDe
8060: 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73 74 72  structor->xDestr
8070: 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72 2d 3e  oy(pDestructor->
8080: 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20  pUserData);.    
8090: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
80a0: 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  db, pDestructor)
80b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
80c0: 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20  *.** Disconnect 
80d0: 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74 61 62  all sqlite3_vtab
80e0: 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 62 65   objects that be
80f0: 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  long to database
8100: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64   connection.** d
8110: 62 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  b. This is calle
8120: 64 20 77 68 65 6e 20 64 62 20 69 73 20 62 65 69  d when db is bei
8130: 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  ng closed..*/.st
8140: 61 74 69 63 20 76 6f 69 64 20 64 69 73 63 6f 6e  atic void discon
8150: 6e 65 63 74 41 6c 6c 56 74 61 62 28 73 71 6c 69  nectAllVtab(sqli
8160: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65  te3 *db){.#ifnde
8170: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
8180: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74  RTUALTABLE.  int
8190: 20 69 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   i;.  HashElem *
81a0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  p;.  sqlite3Btre
81b0: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
81c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
81d0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 53  nDb; i++){.    S
81e0: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
81f0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68   db->aDb[i].pSch
8200: 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  ema;.    if( db-
8210: 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 20  >aDb[i].pSchema 
8220: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73  ){.      for(p=s
8230: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
8240: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
8250: 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61  ); p; p=sqliteHa
8260: 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20  shNext(p)){.    
8270: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
8280: 3d 20 28 54 61 62 6c 65 20 2a 29 73 71 6c 69 74  = (Table *)sqlit
8290: 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20  eHashData(p);.  
82a0: 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74        if( IsVirt
82b0: 75 61 6c 28 70 54 61 62 29 20 29 20 73 71 6c 69  ual(pTab) ) sqli
82c0: 74 65 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63  te3VtabDisconnec
82d0: 74 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  t(db, pTab);.   
82e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
82f0: 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73   for(p=sqliteHas
8300: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64  hFirst(&db->aMod
8310: 75 6c 65 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ule); p; p=sqlit
8320: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
8330: 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20     Module *pMod 
8340: 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69  = (Module *)sqli
8350: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
8360: 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70 45 70     if( pMod->pEp
8370: 6f 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71  oTab ){.      sq
8380: 6c 69 74 65 33 56 74 61 62 44 69 73 63 6f 6e 6e  lite3VtabDisconn
8390: 65 63 74 28 64 62 2c 20 70 4d 6f 64 2d 3e 70 45  ect(db, pMod->pE
83a0: 70 6f 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  poTab);.    }.  
83b0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  }.  sqlite3VtabU
83c0: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20  nlockList(db);. 
83d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
83e0: 76 65 41 6c 6c 28 64 62 29 3b 0a 23 65 6c 73 65  veAll(db);.#else
83f0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
8400: 54 45 52 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a  TER(db);.#endif.
8410: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8420: 54 52 55 45 20 69 66 20 64 61 74 61 62 61 73 65  TRUE if database
8430: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68   connection db h
8440: 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70  as unfinalized p
8450: 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65  repared.** state
8460: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
8470: 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  hed sqlite3_back
8480: 75 70 20 6f 62 6a 65 63 74 73 2e 20 20 0a 2a 2f  up objects.  .*/
8490: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 6e  .static int conn
84a0: 65 63 74 69 6f 6e 49 73 42 75 73 79 28 73 71 6c  ectionIsBusy(sql
84b0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
84c0: 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   j;.  assert( sq
84d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
84e0: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
84f0: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29   if( db->pVdbe )
8500: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72   return 1;.  for
8510: 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b  (j=0; j<db->nDb;
8520: 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   j++){.    Btree
8530: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
8540: 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  j].pBt;.    if( 
8550: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
8560: 72 65 65 49 73 49 6e 42 61 63 6b 75 70 28 70 42  reeIsInBackup(pB
8570: 74 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  t) ) return 1;. 
8580: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
8590: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
85a0: 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65   existing SQLite
85b0: 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61   database.*/.sta
85c0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 43  tic int sqlite3C
85d0: 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lose(sqlite3 *db
85e0: 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f 6d 62 69  , int forceZombi
85f0: 65 29 7b 0a 20 20 69 66 28 20 21 64 62 20 29 7b  e){.  if( !db ){
8600: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
8610: 2d 4f 46 3a 20 52 2d 36 33 32 35 37 2d 31 31 37  -OF: R-63257-117
8620: 34 30 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74  40 Calling sqlit
8630: 65 33 5f 63 6c 6f 73 65 28 29 20 6f 72 0a 20 20  e3_close() or.  
8640: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6c 6f    ** sqlite3_clo
8650: 73 65 5f 76 32 28 29 20 77 69 74 68 20 61 20 4e  se_v2() with a N
8660: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 72 67 75  ULL pointer argu
8670: 6d 65 6e 74 20 69 73 20 61 20 68 61 72 6d 6c 65  ment is a harmle
8680: 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 20  ss no-op. */.   
8690: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
86a0: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  K;.  }.  if( !sq
86b0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
86c0: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
86d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
86e0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
86f0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
8700: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
8710: 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ex);.  if( db->m
8720: 54 72 61 63 65 20 26 20 53 51 4c 49 54 45 5f 54  Trace & SQLITE_T
8730: 52 41 43 45 5f 43 4c 4f 53 45 20 29 7b 0a 20 20  RACE_CLOSE ){.  
8740: 20 20 64 62 2d 3e 78 54 72 61 63 65 28 53 51 4c    db->xTrace(SQL
8750: 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 2c  ITE_TRACE_CLOSE,
8760: 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 2c 20   db->pTraceArg, 
8770: 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  db, 0);.  }..  /
8780: 2a 20 46 6f 72 63 65 20 78 44 69 73 63 6f 6e 6e  * Force xDisconn
8790: 65 63 74 20 63 61 6c 6c 73 20 6f 6e 20 61 6c 6c  ect calls on all
87a0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
87b0: 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e 65 63 74 41  */.  disconnectA
87c0: 6c 6c 56 74 61 62 28 64 62 29 3b 0a 0a 20 20 2f  llVtab(db);..  /
87d0: 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
87e0: 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 20  on is open, the 
87f0: 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61  disconnectAllVta
8800: 62 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 0a 20  b() call above. 
8810: 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68 61 76   ** will not hav
8820: 65 20 63 61 6c 6c 65 64 20 74 68 65 20 78 44 69  e called the xDi
8830: 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68 6f  sconnect() metho
8840: 64 20 6f 6e 20 61 6e 79 20 76 69 72 74 75 61 6c  d on any virtual
8850: 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20  .  ** tables in 
8860: 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e 73 5b  the db->aVTrans[
8870: 5d 20 61 72 72 61 79 2e 20 54 68 65 20 66 6f 6c  ] array. The fol
8880: 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 56 74  lowing sqlite3Vt
8890: 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20 20 2a  abRollback().  *
88a0: 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f 20 73  * call will do s
88b0: 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f 20 64 6f  o. We need to do
88c0: 20 74 68 69 73 20 62 65 66 6f 72 65 20 74 68 65   this before the
88d0: 20 63 68 65 63 6b 20 66 6f 72 20 61 63 74 69 76   check for activ
88e0: 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  e.  ** SQL state
88f0: 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61 73 20  ments below, as 
8900: 74 68 65 20 76 2d 74 61 62 6c 65 20 69 6d 70 6c  the v-table impl
8910: 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20 62  ementation may b
8920: 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a 20 73  e storing.  ** s
8930: 6f 6d 65 20 70 72 65 70 61 72 65 64 20 73 74 61  ome prepared sta
8940: 74 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e 61 6c  tements internal
8950: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ly..  */.  sqlit
8960: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64  e3VtabRollback(d
8970: 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65 67 61 63 79  b);..  /* Legacy
8980: 20 62 65 68 61 76 69 6f 72 20 28 73 71 6c 69 74   behavior (sqlit
8990: 65 33 5f 63 6c 6f 73 65 28 29 20 62 65 68 61 76  e3_close() behav
89a0: 69 6f 72 29 20 69 73 20 74 6f 20 72 65 74 75 72  ior) is to retur
89b0: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55  n.  ** SQLITE_BU
89c0: 53 59 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  SY if the connec
89d0: 74 69 6f 6e 20 63 61 6e 20 6e 6f 74 20 62 65 20  tion can not be 
89e0: 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65  closed immediate
89f0: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ly..  */.  if( !
8a00: 66 6f 72 63 65 5a 6f 6d 62 69 65 20 26 26 20 63  forceZombie && c
8a10: 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28  onnectionIsBusy(
8a20: 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  db) ){.    sqlit
8a30: 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
8a40: 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
8a50: 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65  "unable to close
8a60: 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69   due to unfinali
8a70: 7a 65 64 20 22 0a 20 20 20 20 20 20 20 22 73 74  zed ".       "st
8a80: 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69  atements or unfi
8a90: 6e 69 73 68 65 64 20 62 61 63 6b 75 70 73 22 29  nished backups")
8aa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
8ab0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
8ac0: 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  tex);.    return
8ad0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
8ae0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
8af0: 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20  _ENABLE_SQLLOG. 
8b00: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
8b10: 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
8b20: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 69   ){.    /* Closi
8b30: 6e 67 20 74 68 65 20 68 61 6e 64 6c 65 2e 20 46  ng the handle. F
8b40: 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65 72 20  ourth parameter 
8b50: 69 73 20 70 61 73 73 65 64 20 74 68 65 20 76 61  is passed the va
8b60: 6c 75 65 20 32 2e 20 2a 2f 0a 20 20 20 20 73 71  lue 2. */.    sq
8b70: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
8b80: 67 2e 78 53 71 6c 6c 6f 67 28 73 71 6c 69 74 65  g.xSqllog(sqlite
8b90: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
8ba0: 71 6c 6c 6f 67 41 72 67 2c 20 64 62 2c 20 30 2c  qllogArg, db, 0,
8bb0: 20 32 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   2);.  }.#endif.
8bc0: 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68  .  /* Convert th
8bd0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 74  e connection int
8be0: 6f 20 61 20 7a 6f 6d 62 69 65 20 61 6e 64 20 74  o a zombie and t
8bf0: 68 65 6e 20 63 6c 6f 73 65 20 69 74 2e 0a 20 20  hen close it..  
8c00: 2a 2f 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  */.  db->magic =
8c10: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f   SQLITE_MAGIC_ZO
8c20: 4d 42 49 45 3b 0a 20 20 73 71 6c 69 74 65 33 4c  MBIE;.  sqlite3L
8c30: 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73  eaveMutexAndClos
8c40: 65 5a 6f 6d 62 69 65 28 64 62 29 3b 0a 20 20 72  eZombie(db);.  r
8c50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8c60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61  .}../*.** Two va
8c70: 72 69 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20  riations on the 
8c80: 70 75 62 6c 69 63 20 69 6e 74 65 72 66 61 63 65  public interface
8c90: 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 61 20 64   for closing a d
8ca0: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
8cb0: 63 74 69 6f 6e 2e 20 54 68 65 20 73 71 6c 69 74  ction. The sqlit
8cc0: 65 33 5f 63 6c 6f 73 65 28 29 20 76 65 72 73 69  e3_close() versi
8cd0: 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
8ce0: 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 6c 65  E_BUSY and.** le
8cf0: 61 76 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74  aves the connect
8d00: 69 6f 6e 20 6f 70 74 69 6f 6e 20 69 66 20 74 68  ion option if th
8d10: 65 72 65 20 61 72 65 20 75 6e 66 69 6e 61 6c 69  ere are unfinali
8d20: 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20  zed prepared.** 
8d30: 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e  statements or un
8d40: 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33  finished sqlite3
8d50: 5f 62 61 63 6b 75 70 73 2e 20 20 54 68 65 20 73  _backups.  The s
8d60: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28  qlite3_close_v2(
8d70: 29 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 66 6f 72  ).** version for
8d80: 63 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ces the connecti
8d90: 6f 6e 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 7a  on to become a z
8da0: 6f 6d 62 69 65 20 69 66 20 74 68 65 72 65 20 61  ombie if there a
8db0: 72 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65 64 20 72  re.** unclosed r
8dc0: 65 73 6f 75 72 63 65 73 2c 20 61 6e 64 20 61 72  esources, and ar
8dd0: 72 61 6e 67 65 73 20 66 6f 72 20 64 65 61 6c 6c  ranges for deall
8de0: 6f 63 61 74 69 6f 6e 20 77 68 65 6e 20 74 68 65  ocation when the
8df0: 20 6c 61 73 74 0a 2a 2a 20 70 72 65 70 61 72 65   last.** prepare
8e00: 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 71   statement or sq
8e10: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 63 6c 6f  lite3_backup clo
8e20: 73 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ses..*/.int sqli
8e30: 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65  te3_close(sqlite
8e40: 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73  3 *db){ return s
8e50: 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 30  qlite3Close(db,0
8e60: 29 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  ); }.int sqlite3
8e70: 5f 63 6c 6f 73 65 5f 76 32 28 73 71 6c 69 74 65  _close_v2(sqlite
8e80: 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73  3 *db){ return s
8e90: 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 31  qlite3Close(db,1
8ea0: 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ); }.../*.** Clo
8eb0: 73 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  se the mutex on 
8ec0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
8ed0: 69 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75  ion db..**.** Fu
8ee0: 72 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 64 61  rthermore, if da
8ef0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
8f00: 6e 20 64 62 20 69 73 20 61 20 7a 6f 6d 62 69 65  n db is a zombie
8f10: 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74   (meaning that t
8f20: 68 65 72 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e  here.** has been
8f30: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
8f40: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
8f50: 62 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c  b) or sqlite3_cl
8f60: 6f 73 65 5f 76 32 28 64 62 29 29 20 61 6e 64 0a  ose_v2(db)) and.
8f70: 2a 2a 20 65 76 65 72 79 20 73 71 6c 69 74 65 33  ** every sqlite3
8f80: 5f 73 74 6d 74 20 68 61 73 20 6e 6f 77 20 62 65  _stmt has now be
8f90: 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64  en finalized and
8fa0: 20 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f 62   every sqlite3_b
8fb0: 61 63 6b 75 70 20 68 61 73 0a 2a 2a 20 66 69 6e  ackup has.** fin
8fc0: 69 73 68 65 64 2c 20 74 68 65 6e 20 66 72 65 65  ished, then free
8fd0: 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a   all resources..
8fe0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4c  */.void sqlite3L
8ff0: 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73  eaveMutexAndClos
9000: 65 5a 6f 6d 62 69 65 28 73 71 6c 69 74 65 33 20  eZombie(sqlite3 
9010: 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  *db){.  HashElem
9020: 20 2a 69 3b 20 20 20 20 20 20 20 20 20 20 20 20   *i;            
9030: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
9040: 74 61 62 6c 65 20 69 74 65 72 61 74 6f 72 20 2a  table iterator *
9050: 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a  /.  int j;..  /*
9060: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
9070: 74 73 74 61 6e 64 69 6e 67 20 73 71 6c 69 74 65  tstanding sqlite
9080: 33 5f 73 74 6d 74 20 6f 72 20 73 71 6c 69 74 65  3_stmt or sqlite
9090: 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  3_backup objects
90a0: 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 20  .  ** or if the 
90b0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 6e  connection has n
90c0: 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6c 6f 73  ot yet been clos
90d0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6c  ed by sqlite3_cl
90e0: 6f 73 65 5f 76 32 28 29 2c 0a 20 20 2a 2a 20 74  ose_v2(),.  ** t
90f0: 68 65 6e 20 6a 75 73 74 20 6c 65 61 76 65 20 74  hen just leave t
9100: 68 65 20 6d 75 74 65 78 20 61 6e 64 20 72 65 74  he mutex and ret
9110: 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  urn..  */.  if( 
9120: 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54  db->magic!=SQLIT
9130: 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 20 7c  E_MAGIC_ZOMBIE |
9140: 7c 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75  | connectionIsBu
9150: 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71  sy(db) ){.    sq
9160: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
9170: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
9180: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
9190: 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
91a0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d  this point, it m
91b0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 64 61  eans that the da
91c0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
91d0: 6e 20 68 61 73 0a 20 20 2a 2a 20 63 6c 6f 73 65  n has.  ** close
91e0: 64 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 74  d all sqlite3_st
91f0: 6d 74 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 62  mt and sqlite3_b
9200: 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 61 6e  ackup objects an
9210: 64 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20  d has been.  ** 
9220: 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
9230: 33 5f 63 6c 6f 73 65 20 28 6d 65 61 6e 69 6e 67  3_close (meaning
9240: 20 74 68 61 74 20 69 74 20 69 73 20 61 20 7a 6f   that it is a zo
9250: 6d 62 69 65 29 2e 20 20 54 68 65 72 65 66 6f 72  mbie).  Therefor
9260: 65 2c 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61 64  e,.  ** go ahead
9270: 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 72 65   and free all re
9280: 73 6f 75 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20  sources..  */.. 
9290: 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63   /* If a transac
92a0: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 72 6f  tion is open, ro
92b0: 6c 6c 20 69 74 20 62 61 63 6b 2e 20 54 68 69 73  ll it back. This
92c0: 20 61 6c 73 6f 20 65 6e 73 75 72 65 73 20 74 68   also ensures th
92d0: 61 74 20 69 66 0a 20 20 2a 2a 20 61 6e 79 20 64  at if.  ** any d
92e0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 73 20  atabase schemas 
92f0: 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 69  have been modifi
9300: 65 64 20 62 79 20 61 6e 20 75 6e 63 6f 6d 6d 69  ed by an uncommi
9310: 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  tted transaction
9320: 0a 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20 72  .  ** they are r
9330: 65 73 65 74 2e 20 41 6e 64 20 74 68 61 74 20 74  eset. And that t
9340: 68 65 20 72 65 71 75 69 72 65 64 20 62 2d 74 72  he required b-tr
9350: 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64  ee mutex is held
9360: 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 74 68   to make.  ** th
9370: 65 20 70 61 67 65 72 20 72 6f 6c 6c 62 61 63 6b  e pager rollback
9380: 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65   and schema rese
9390: 74 20 61 6e 20 61 74 6f 6d 69 63 20 6f 70 65 72  t an atomic oper
93a0: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69  ation. */.  sqli
93b0: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
93c0: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 0a  b, SQLITE_OK);..
93d0: 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 75    /* Free any ou
93e0: 74 73 74 61 6e 64 69 6e 67 20 53 61 76 65 70 6f  tstanding Savepo
93f0: 69 6e 74 20 73 74 72 75 63 74 75 72 65 73 2e 20  int structures. 
9400: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73  */.  sqlite3Clos
9410: 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
9420: 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
9430: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
9440: 74 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 6a  tions */.  for(j
9450: 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a  =0; j<db->nDb; j
9460: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
9470: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
9480: 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[j];.    if( p
9490: 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  Db->pBt ){.     
94a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
94b0: 73 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20  se(pDb->pBt);.  
94c0: 20 20 20 20 70 44 62 2d 3e 70 42 74 20 3d 20 30      pDb->pBt = 0
94d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d 31  ;.      if( j!=1
94e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
94f0: 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20  >pSchema = 0;.  
9500: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9510: 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 54    /* Clear the T
9520: 45 4d 50 20 73 63 68 65 6d 61 20 73 65 70 61 72  EMP schema separ
9530: 61 74 65 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a  ately and last *
9540: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  /.  if( db->aDb[
9550: 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  1].pSchema ){.  
9560: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43    sqlite3SchemaC
9570: 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e  lear(db->aDb[1].
9580: 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
9590: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
95a0: 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  kList(db);..  /*
95b0: 20 46 72 65 65 20 75 70 20 74 68 65 20 61 72 72   Free up the arr
95c0: 61 79 20 6f 66 20 61 75 78 69 6c 69 61 72 79 20  ay of auxiliary 
95d0: 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 73  databases */.  s
95e0: 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61  qlite3CollapseDa
95f0: 74 61 62 61 73 65 41 72 72 61 79 28 64 62 29 3b  tabaseArray(db);
9600: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e  .  assert( db->n
9610: 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72  Db<=2 );.  asser
9620: 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e  t( db->aDb==db->
9630: 61 44 62 53 74 61 74 69 63 20 29 3b 0a 0a 20 20  aDbStatic );..  
9640: 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f 64 65  /* Tell the code
9650: 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68 61   in notify.c tha
9660: 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  t the connection
9670: 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73   no longer holds
9680: 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20   any.  ** locks 
9690: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  and does not req
96a0: 75 69 72 65 20 61 6e 79 20 66 75 72 74 68 65 72  uire any further
96b0: 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
96c0: 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20  allbacks..  */. 
96d0: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
96e0: 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20  onClosed(db);.. 
96f0: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
9700: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 46 75 6e  hFirst(&db->aFun
9710: 63 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  c); i; i=sqliteH
9720: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
9730: 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c   FuncDef *pNext,
9740: 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
9750: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
9760: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 66 75      do{.      fu
9770: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
9780: 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 4e 65 78  , p);.      pNex
9790: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
97a0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
97b0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
97c0: 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 7d  p = pNext;.    }
97d0: 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 7d 0a  while( p );.  }.
97e0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
97f0: 61 72 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b 0a  ar(&db->aFunc);.
9800: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
9810: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f  shFirst(&db->aCo
9820: 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c  llSeq); i; i=sql
9830: 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
9840: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
9850: 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a  oll = (CollSeq *
9860: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
9870: 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b  i);.    /* Invok
9880: 65 20 61 6e 79 20 64 65 73 74 72 75 63 74 6f 72  e any destructor
9890: 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
98a0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
98b0: 6e 63 65 20 75 73 65 72 20 64 61 74 61 2e 20 2a  nce user data. *
98c0: 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  /.    for(j=0; j
98d0: 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
98e0: 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65  if( pColl[j].xDe
98f0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
9900: 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c  ll[j].xDel(pColl
9910: 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20 20 20  [j].pUser);.    
9920: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
9930: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9940: 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  pColl);.  }.  sq
9950: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
9960: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23  db->aCollSeq);.#
9970: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9980: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
9990: 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
99a0: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f  shFirst(&db->aMo
99b0: 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69  dule); i; i=sqli
99c0: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
99d0: 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64      Module *pMod
99e0: 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c   = (Module *)sql
99f0: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
9a00: 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44      if( pMod->xD
9a10: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20  estroy ){.      
9a20: 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28 70  pMod->xDestroy(p
9a30: 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20  Mod->pAux);.    
9a40: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  }.    sqlite3Vta
9a50: 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 43  bEponymousTableC
9a60: 6c 65 61 72 28 64 62 2c 20 70 4d 6f 64 29 3b 0a  lear(db, pMod);.
9a70: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9a80: 65 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d  e(db, pMod);.  }
9a90: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
9aa0: 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  ear(&db->aModule
9ab0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  );.#endif..  sql
9ac0: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
9ad0: 4c 49 54 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61  LITE_OK); /* Dea
9ae0: 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63  llocates any cac
9af0: 68 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67  hed error string
9b00: 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  s. */.  sqlite3V
9b10: 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72  alueFree(db->pEr
9b20: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f  r);.  sqlite3Clo
9b30: 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29  seExtensions(db)
9b40: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ;.#if SQLITE_USE
9b50: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
9b60: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9b70: 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 55 73  db->auth.zAuthUs
9b80: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  er);.  sqlite3_f
9b90: 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75  ree(db->auth.zAu
9ba0: 74 68 50 57 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  thPW);.#endif.. 
9bb0: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
9bc0: 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b  ITE_MAGIC_ERROR;
9bd0: 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d  ..  /* The temp-
9be0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
9bf0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66  is allocated dif
9c00: 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68  ferently from th
9c10: 65 20 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20  e other schema. 
9c20: 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69   ** objects (usi
9c30: 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  ng sqliteMalloc(
9c40: 29 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74  ) directly, inst
9c50: 65 61 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74  ead of sqlite3Bt
9c60: 72 65 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20  reeSchema())..  
9c70: 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74  ** So it needs t
9c80: 6f 20 62 65 20 66 72 65 65 64 20 68 65 72 65 2e  o be freed here.
9c90: 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72   Todo: Why not r
9ca0: 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68  oll the temp sch
9cb0: 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68  ema into.  ** th
9cc0: 65 20 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c  e same sqliteMal
9cd0: 6c 6f 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65  loc() as the one
9ce0: 20 74 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20   that allocates 
9cf0: 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
9d00: 2a 2a 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20  ** structure?.  
9d10: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
9d20: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31  ee(db, db->aDb[1
9d30: 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71  ].pSchema);.  sq
9d40: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
9d50: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
9d60: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
9d70: 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b  TE_MAGIC_CLOSED;
9d80: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
9d90: 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74 65 78 29  _free(db->mutex)
9da0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
9db0: 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d  lookaside.nOut==
9dc0: 30 20 29 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f  0 );  /* Fails o
9dd0: 6e 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65  n a lookaside me
9de0: 6d 6f 72 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69  mory leak */.  i
9df0: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
9e00: 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20  .bMalloced ){.  
9e10: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
9e20: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
9e30: 61 72 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  art);.  }.  sqli
9e40: 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a  te3_free(db);.}.
9e50: 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
9e60: 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  all database fil
9e70: 65 73 2e 20 20 49 66 20 74 72 69 70 43 6f 64 65  es.  If tripCode
9e80: 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f   is not SQLITE_O
9e90: 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 77  K, then.** any w
9ea0: 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
9eb0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 22 74   invalidated ("t
9ec0: 72 69 70 70 65 64 22 20 2d 20 61 73 20 69 6e 20  ripped" - as in 
9ed0: 22 74 72 69 70 70 69 6e 67 20 61 20 63 69 72 63  "tripping a circ
9ee0: 75 69 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29  uit.** breaker")
9ef0: 20 61 6e 64 20 6d 61 64 65 20 74 6f 20 72 65 74   and made to ret
9f00: 75 72 6e 20 74 72 69 70 43 6f 64 65 20 69 66 20  urn tripCode if 
9f10: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 66 75  there are any fu
9f20: 72 74 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74  rther.** attempt
9f30: 73 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 75  s to use that cu
9f40: 72 73 6f 72 2e 20 20 52 65 61 64 20 63 75 72 73  rsor.  Read curs
9f50: 6f 72 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e 20  ors remain open 
9f60: 61 6e 64 20 76 61 6c 69 64 0a 2a 2a 20 62 75 74  and valid.** but
9f70: 20 61 72 65 20 22 73 61 76 65 64 22 20 69 6e 20   are "saved" in 
9f80: 63 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 70  case the table p
9f90: 61 67 65 73 20 61 72 65 20 6d 6f 76 65 64 20 61  ages are moved a
9fa0: 72 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  round..*/.void s
9fb0: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
9fc0: 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  l(sqlite3 *db, i
9fd0: 6e 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20  nt tripCode){.  
9fe0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54  int i;.  int inT
9ff0: 72 61 6e 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20  rans = 0;.  int 
a000: 73 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20  schemaChange;.  
a010: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
a020: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
a030: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
a040: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
a050: 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74  loc();..  /* Obt
a060: 61 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d  ain all b-tree m
a070: 75 74 65 78 65 73 20 62 65 66 6f 72 65 20 6d 61  utexes before ma
a080: 6b 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20 74  king any calls t
a090: 6f 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  o BtreeRollback(
a0a0: 29 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20 69 73  ). .  ** This is
a0b0: 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63 61   important in ca
a0c0: 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  se the transacti
a0d0: 6f 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  on being rolled 
a0e0: 62 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f  back has.  ** mo
a0f0: 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62  dified the datab
a100: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 74  ase schema. If t
a110: 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65  he b-tree mutexe
a120: 73 20 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a  s are not taken.
a130: 20 20 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e 20    ** here, then 
a140: 61 6e 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63  another shared-c
a150: 61 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ache connection 
a160: 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 20 62  might sneak in b
a170: 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20  etween.  ** the 
a180: 64 61 74 61 62 61 73 65 20 72 6f 6c 6c 62 61 63  database rollbac
a190: 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73  k and schema res
a1a0: 65 74 2c 20 77 68 69 63 68 20 63 61 6e 20 63 61  et, which can ca
a1b0: 75 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63  use false.  ** c
a1c0: 6f 72 72 75 70 74 69 6f 6e 20 72 65 70 6f 72 74  orruption report
a1d0: 73 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e  s in some cases.
a1e0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
a1f0: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
a200: 0a 20 20 73 63 68 65 6d 61 43 68 61 6e 67 65 20  .  schemaChange 
a210: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
a220: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
a230: 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d 3e 69  ges)!=0 && db->i
a240: 6e 69 74 2e 62 75 73 79 3d 3d 30 3b 0a 0a 20 20  nit.busy==0;..  
a250: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
a260: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74  Db; i++){.    Bt
a270: 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62  ree *p = db->aDb
a280: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [i].pBt;.    if(
a290: 20 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20   p ){.      if( 
a2a0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
a2b0: 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20  Trans(p) ){.    
a2c0: 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b      inTrans = 1;
a2d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
a2e0: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
a2f0: 61 63 6b 28 70 2c 20 74 72 69 70 43 6f 64 65 2c  ack(p, tripCode,
a300: 20 21 73 63 68 65 6d 61 43 68 61 6e 67 65 29 3b   !schemaChange);
a310: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
a320: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
a330: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  (db);.  sqlite3E
a340: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
a350: 3b 0a 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c  ;..  if( (db->fl
a360: 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72  ags&SQLITE_Inter
a370: 6e 43 68 61 6e 67 65 73 29 21 3d 30 20 26 26 20  nChanges)!=0 && 
a380: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
a390: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
a3a0: 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
a3b0: 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20  tements(db);.   
a3c0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
a3d0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
a3e0: 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73  ion(db);.  }.  s
a3f0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
a400: 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41  All(db);..  /* A
a410: 6e 79 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  ny deferred cons
a420: 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e  traint violation
a430: 73 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  s have now been 
a440: 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64  resolved. */.  d
a450: 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
a460: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66   = 0;.  db->nDef
a470: 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30  erredImmCons = 0
a480: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
a490: 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b   ~SQLITE_DeferFK
a4a0: 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20  s;..  /* If one 
a4b0: 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75  has been configu
a4c0: 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  red, invoke the 
a4d0: 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61  rollback-hook ca
a4e0: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  llback */.  if( 
a4f0: 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
a500: 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72 61 6e  lback && (inTran
a510: 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f  s || !db->autoCo
a520: 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64 62 2d  mmit) ){.    db-
a530: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
a540: 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  ck(db->pRollback
a550: 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Arg);.  }.}../*.
a560: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74  ** Return a stat
a570: 69 63 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69  ic string contai
a580: 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 63 6f  ning the name co
a590: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
a5a0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  he error code.**
a5b0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
a5c0: 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  e argument..*/.#
a5d0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
a5e0: 45 5f 4e 45 45 44 5f 45 52 52 5f 4e 41 4d 45 29  E_NEED_ERR_NAME)
a5f0: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
a600: 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 20  ite3ErrName(int 
a610: 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rc){.  const cha
a620: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
a630: 69 6e 74 20 69 2c 20 6f 72 69 67 52 63 20 3d 20  int i, origRc = 
a640: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
a650: 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20  <2 && zName==0; 
a660: 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66 66 29  i++, rc &= 0xff)
a670: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 72 63  {.    switch( rc
a680: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53   ){.      case S
a690: 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20  QLITE_OK:       
a6a0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a6b0: 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20  = "SQLITE_OK";  
a6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
a6d0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a6e0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20  SQLITE_ERROR:   
a6f0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a700: 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52   = "SQLITE_ERROR
a710: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
a720: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a730: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
a740: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
a750: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45  e = "SQLITE_INTE
a760: 52 4e 41 4c 22 3b 20 20 20 20 20 20 20 20 20 20  RNAL";          
a770: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a780: 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20  e SQLITE_PERM:  
a790: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
a7a0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45 52  me = "SQLITE_PER
a7b0: 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  M";             
a7c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a7d0: 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a  se SQLITE_ABORT:
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
a7f0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42  ame = "SQLITE_AB
a800: 4f 52 54 22 3b 20 20 20 20 20 20 20 20 20 20 20  ORT";           
a810: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a820: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
a830: 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a  _ROLLBACK:     z
a840: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41  Name = "SQLITE_A
a850: 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20  BORT_ROLLBACK"; 
a860: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a870: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59  case SQLITE_BUSY
a880: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
a890: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a8a0: 42 55 53 59 22 3b 20 20 20 20 20 20 20 20 20 20  BUSY";          
a8b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a8c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53   case SQLITE_BUS
a8d0: 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 20 20 20  Y_RECOVERY:     
a8e0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a8f0: 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 22 3b  _BUSY_RECOVERY";
a900: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a910: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
a920: 53 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20 20  SY_SNAPSHOT:    
a930: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a940: 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 22  E_BUSY_SNAPSHOT"
a950: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
a960: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
a970: 4f 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20 20  OCKED:          
a980: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a990: 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20  TE_LOCKED";     
a9a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a9b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a9c0: 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
a9d0: 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  HE: zName = "SQL
a9e0: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
a9f0: 44 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20  DCACHE";break;. 
aa00: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
aa10: 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 20  _NOMEM:         
aa20: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
aa30: 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20  LITE_NOMEM";    
aa40: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
aa50: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
aa60: 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20  E_READONLY:     
aa70: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
aa80: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b  QLITE_READONLY";
aa90: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
aaa0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
aab0: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f  TE_READONLY_RECO
aac0: 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  VERY:  zName = "
aad0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
aae0: 52 45 43 4f 56 45 52 59 22 3b 20 62 72 65 61 6b  RECOVERY"; break
aaf0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ab00: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e  ITE_READONLY_CAN
ab10: 54 4c 4f 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20  TLOCK:  zName = 
ab20: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
ab30: 5f 43 41 4e 54 4c 4f 43 4b 22 3b 20 62 72 65 61  _CANTLOCK"; brea
ab40: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ab50: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f  LITE_READONLY_RO
ab60: 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d  LLBACK:  zName =
ab70: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
ab80: 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65  Y_ROLLBACK"; bre
ab90: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
aba0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44  QLITE_READONLY_D
abb0: 42 4d 4f 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20  BMOVED:   zName 
abc0: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
abd0: 4c 59 5f 44 42 4d 4f 56 45 44 22 3b 20 20 62 72  LY_DBMOVED";  br
abe0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
abf0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
ac00: 3a 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  :          zName
ac10: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52   = "SQLITE_INTER
ac20: 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 62  RUPT";         b
ac30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ac40: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20   SQLITE_IOERR:  
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
ac60: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
ac70: 52 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  R";             
ac80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ac90: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  e SQLITE_IOERR_R
aca0: 45 41 44 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  EAD:         zNa
acb0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
acc0: 52 52 5f 52 45 41 44 22 3b 20 20 20 20 20 20 20  RR_READ";       
acd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ace0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
acf0: 53 48 4f 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e  SHORT_READ:   zN
ad00: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
ad10: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b  ERR_SHORT_READ";
ad20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ad30: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
ad40: 5f 57 52 49 54 45 3a 20 20 20 20 20 20 20 20 7a  _WRITE:        z
ad50: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
ad60: 4f 45 52 52 5f 57 52 49 54 45 22 3b 20 20 20 20  OERR_WRITE";    
ad70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ad80: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
ad90: 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 20 20 20  R_FSYNC:        
ada0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
adb0: 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20 20 20  IOERR_FSYNC";   
adc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
add0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
ade0: 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20 20  RR_DIR_FSYNC:   
adf0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ae00: 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
ae10: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
ae20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
ae30: 45 52 52 5f 54 52 55 4e 43 41 54 45 3a 20 20 20  ERR_TRUNCATE:   
ae40: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ae50: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
ae60: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
ae70: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
ae80: 4f 45 52 52 5f 46 53 54 41 54 3a 20 20 20 20 20  OERR_FSTAT:     
ae90: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
aea0: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 22 3b  TE_IOERR_FSTAT";
aeb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
aec0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
aed0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20  IOERR_UNLOCK:   
aee0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
aef0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
af00: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
af10: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
af20: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20  _IOERR_RDLOCK:  
af30: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
af40: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
af50: 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K";      break;.
af60: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
af70: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20  E_IOERR_DELETE: 
af80: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
af90: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
afa0: 54 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  TE";      break;
afb0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
afc0: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20  TE_IOERR_NOMEM: 
afd0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
afe0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
aff0: 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  EM";       break
b000: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b010: 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
b020: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
b030: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43  "SQLITE_IOERR_AC
b040: 43 45 53 53 22 3b 20 20 20 20 20 20 62 72 65 61  CESS";      brea
b050: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b060: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
b070: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20  RESERVEDLOCK:.  
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
b0a0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b0b0: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
b0c0: 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20  DLOCK"; break;. 
b0d0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b0e0: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20  _IOERR_LOCK:    
b0f0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b100: 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22  LITE_IOERR_LOCK"
b110: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
b120: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b130: 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20  E_IOERR_CLOSE:  
b140: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b150: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
b160: 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  E";       break;
b170: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b180: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f  TE_IOERR_DIR_CLO
b190: 53 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  SE:    zName = "
b1a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
b1b0: 5f 43 4c 4f 53 45 22 3b 20 20 20 62 72 65 61 6b  _CLOSE";   break
b1c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b1d0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
b1e0: 4e 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  N:      zName = 
b1f0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
b200: 4d 4f 50 45 4e 22 3b 20 20 20 20 20 62 72 65 61  MOPEN";     brea
b210: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b220: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
b230: 5a 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ZE:      zName =
b240: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
b250: 48 4d 53 49 5a 45 22 3b 20 20 20 20 20 62 72 65  HMSIZE";     bre
b260: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b270: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c  QLITE_IOERR_SHML
b280: 4f 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  OCK:      zName 
b290: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b2a0: 53 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72  SHMLOCK";     br
b2b0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b2c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b2d0: 4d 41 50 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  MAP:       zName
b2e0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b2f0: 5f 53 48 4d 4d 41 50 22 3b 20 20 20 20 20 20 62  _SHMMAP";      b
b300: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b310: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45   SQLITE_IOERR_SE
b320: 45 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  EK:         zNam
b330: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b340: 52 5f 53 45 45 4b 22 3b 20 20 20 20 20 20 20 20  R_SEEK";        
b350: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b360: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
b370: 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61  ELETE_NOENT: zNa
b380: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b390: 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22  RR_DELETE_NOENT"
b3a0: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
b3b0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b3c0: 4d 4d 41 50 3a 20 20 20 20 20 20 20 20 20 7a 4e  MMAP:         zN
b3d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b3e0: 45 52 52 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20  ERR_MMAP";      
b3f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b400: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b410: 5f 47 45 54 54 45 4d 50 50 41 54 48 3a 20 20 7a  _GETTEMPPATH:  z
b420: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b430: 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
b440: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
b450: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b460: 52 5f 43 4f 4e 56 50 41 54 48 3a 20 20 20 20 20  R_CONVPATH:     
b470: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b480: 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 22 3b  IOERR_CONVPATH";
b490: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b4a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52   case SQLITE_COR
b4b0: 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 20  RUPT:           
b4c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b4d0: 5f 43 4f 52 52 55 50 54 22 3b 20 20 20 20 20 20  _CORRUPT";      
b4e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b4f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
b500: 52 52 55 50 54 5f 56 54 41 42 3a 20 20 20 20 20  RRUPT_VTAB:     
b510: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b520: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 22 3b  E_CORRUPT_VTAB";
b530: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b540: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
b550: 4f 54 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20  OTFOUND:        
b560: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b570: 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20  TE_NOTFOUND";   
b580: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b590: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b5a0: 46 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20  FULL:           
b5b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b5c0: 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20  ITE_FULL";      
b5d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b5e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b5f0: 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20  _CANTOPEN:      
b600: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b610: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20  LITE_CANTOPEN"; 
b620: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b630: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b640: 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d  E_CANTOPEN_NOTEM
b650: 50 44 49 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  PDIR: zName = "S
b660: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e  QLITE_CANTOPEN_N
b670: 4f 54 45 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b  OTEMPDIR";break;
b680: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b690: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
b6a0: 52 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  R:     zName = "
b6b0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
b6c0: 49 53 44 49 52 22 3b 20 20 20 20 62 72 65 61 6b  ISDIR";    break
b6d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b6e0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
b6f0: 4c 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20  LPATH:  zName = 
b700: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
b710: 5f 46 55 4c 4c 50 41 54 48 22 3b 20 62 72 65 61  _FULLPATH"; brea
b720: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b730: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f  LITE_CANTOPEN_CO
b740: 4e 56 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d  NVPATH:  zName =
b750: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
b760: 4e 5f 43 4f 4e 56 50 41 54 48 22 3b 20 62 72 65  N_CONVPATH"; bre
b770: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b780: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20  QLITE_PROTOCOL: 
b790: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b7a0: 3d 20 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  = "SQLITE_PROTOC
b7b0: 4f 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  OL";          br
b7c0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b7d0: 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20  SQLITE_EMPTY:   
b7e0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b7f0: 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59   = "SQLITE_EMPTY
b800: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
b810: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b820: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20   SQLITE_SCHEMA: 
b830: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b840: 65 20 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45  e = "SQLITE_SCHE
b850: 4d 41 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  MA";            
b860: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b870: 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a  e SQLITE_TOOBIG:
b880: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
b890: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f  me = "SQLITE_TOO
b8a0: 42 49 47 22 3b 20 20 20 20 20 20 20 20 20 20 20  BIG";           
b8b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b8c0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
b8d0: 41 49 4e 54 3a 20 20 20 20 20 20 20 20 20 7a 4e  AINT:         zN
b8e0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b8f0: 4e 53 54 52 41 49 4e 54 22 3b 20 20 20 20 20 20  NSTRAINT";      
b900: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b910: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
b920: 52 41 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a  RAINT_UNIQUE:  z
b930: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b940: 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
b950: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
b960: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
b970: 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 3a 20  TRAINT_TRIGGER: 
b980: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b990: 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47  CONSTRAINT_TRIGG
b9a0: 45 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  ER";break;.     
b9b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
b9c0: 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
b9d0: 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY:.            
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ba00: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
ba10: 4f 52 45 49 47 4e 4b 45 59 22 3b 20 20 20 62 72  OREIGNKEY";   br
ba20: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ba30: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
ba40: 54 5f 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65  T_CHECK:   zName
ba50: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
ba60: 52 41 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62  RAINT_CHECK";  b
ba70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ba80: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
ba90: 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20  NT_PRIMARYKEY:. 
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
bac0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
bad0: 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
bae0: 59 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a  YKEY";   break;.
baf0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bb00: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54  E_CONSTRAINT_NOT
bb10: 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  NULL: zName = "S
bb20: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
bb30: 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b  _NOTNULL";break;
bb40: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bb50: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f  TE_CONSTRAINT_CO
bb60: 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20  MMITHOOK:.      
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb80: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bb90: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
bba0: 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22  AINT_COMMITHOOK"
bbb0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
bbc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
bbd0: 53 54 52 41 49 4e 54 5f 56 54 41 42 3a 20 20 20  STRAINT_VTAB:   
bbe0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bbf0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42  _CONSTRAINT_VTAB
bc00: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
bc10: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
bc20: 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f  NSTRAINT_FUNCTIO
bc30: 4e 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  N:.             
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bc60: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55  TE_CONSTRAINT_FU
bc70: 4e 43 54 49 4f 4e 22 3b 20 20 20 20 20 62 72 65  NCTION";     bre
bc80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bc90: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
bca0: 5f 52 4f 57 49 44 3a 20 20 20 7a 4e 61 6d 65 20  _ROWID:   zName 
bcb0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
bcc0: 41 49 4e 54 5f 52 4f 57 49 44 22 3b 20 20 62 72  AINT_ROWID";  br
bcd0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bce0: 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a  SQLITE_MISMATCH:
bcf0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bd00: 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41   = "SQLITE_MISMA
bd10: 54 43 48 22 3b 20 20 20 20 20 20 20 20 20 20 62  TCH";          b
bd20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bd30: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20   SQLITE_MISUSE: 
bd40: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
bd50: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 55  e = "SQLITE_MISU
bd60: 53 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  SE";            
bd70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bd80: 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20  e SQLITE_NOLFS: 
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
bda0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c  me = "SQLITE_NOL
bdb0: 46 53 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  FS";            
bdc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bdd0: 73 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20  se SQLITE_AUTH: 
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
bdf0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55  ame = "SQLITE_AU
be00: 54 48 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  TH";            
be10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
be20: 61 73 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41  ase SQLITE_FORMA
be30: 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  T:             z
be40: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
be50: 4f 52 4d 41 54 22 3b 20 20 20 20 20 20 20 20 20  ORMAT";         
be60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
be70: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47  case SQLITE_RANG
be80: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E:              
be90: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bea0: 52 41 4e 47 45 22 3b 20 20 20 20 20 20 20 20 20  RANGE";         
beb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bec0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
bed0: 41 44 42 3a 20 20 20 20 20 20 20 20 20 20 20 20  ADB:            
bee0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bef0: 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20 20 20 20  _NOTADB";       
bf00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bf10: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f    case SQLITE_RO
bf20: 57 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W:              
bf30: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bf40: 45 5f 52 4f 57 22 3b 20 20 20 20 20 20 20 20 20  E_ROW";         
bf50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bf60: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
bf70: 4f 54 49 43 45 3a 20 20 20 20 20 20 20 20 20 20  OTICE:          
bf80: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bf90: 54 45 5f 4e 4f 54 49 43 45 22 3b 20 20 20 20 20  TE_NOTICE";     
bfa0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bfb0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bfc0: 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57  NOTICE_RECOVER_W
bfd0: 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  AL: zName = "SQL
bfe0: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
bff0: 45 52 5f 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20  ER_WAL";break;. 
c000: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c010: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
c020: 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20  ROLLBACK:.      
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c040: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
c050: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  = "SQLITE_NOTICE
c060: 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43  _RECOVER_ROLLBAC
c070: 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K"; break;.     
c080: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52   case SQLITE_WAR
c090: 4e 49 4e 47 3a 20 20 20 20 20 20 20 20 20 20 20  NING:           
c0a0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c0b0: 5f 57 41 52 4e 49 4e 47 22 3b 20 20 20 20 20 20  _WARNING";      
c0c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c0d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41    case SQLITE_WA
c0e0: 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a  RNING_AUTOINDEX:
c0f0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c100: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
c110: 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  DEX"; break;.   
c120: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
c130: 4f 4e 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  ONE:            
c140: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c150: 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20  TE_DONE";       
c160: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c170: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e    }.  }.  if( zN
c180: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  ame==0 ){.    st
c190: 61 74 69 63 20 63 68 61 72 20 7a 42 75 66 5b 35  atic char zBuf[5
c1a0: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
c1b0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
c1c0: 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 53 51  zBuf), zBuf, "SQ
c1d0: 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29  LITE_UNKNOWN(%d)
c1e0: 22 2c 20 6f 72 69 67 52 63 29 3b 0a 20 20 20 20  ", origRc);.    
c1f0: 7a 4e 61 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20  zName = zBuf;.  
c200: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
c210: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
c220: 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69  * Return a stati
c230: 63 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  c string that de
c240: 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64  scribes the kind
c250: 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66   of error specif
c260: 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ied in the.** ar
c270: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74  gument..*/.const
c280: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72   char *sqlite3Er
c290: 72 53 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20  rStr(int rc){.  
c2a0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
c2b0: 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20  r* const aMsg[] 
c2c0: 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  = {.    /* SQLIT
c2d0: 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f  E_OK          */
c2e0: 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c   "not an error",
c2f0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45  .    /* SQLITE_E
c300: 52 52 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53  RROR       */ "S
c310: 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f  QL logic error o
c320: 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61  r missing databa
c330: 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  se",.    /* SQLI
c340: 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a  TE_INTERNAL    *
c350: 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  / 0,.    /* SQLI
c360: 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a  TE_PERM        *
c370: 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d 69 73  / "access permis
c380: 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20  sion denied",.  
c390: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52    /* SQLITE_ABOR
c3a0: 54 20 20 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c  T       */ "call
c3b0: 62 61 63 6b 20 72 65 71 75 65 73 74 65 64 20 71  back requested q
c3c0: 75 65 72 79 20 61 62 6f 72 74 22 2c 0a 20 20 20  uery abort",.   
c3d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20   /* SQLITE_BUSY 
c3e0: 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62         */ "datab
c3f0: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ase is locked",.
c400: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f      /* SQLITE_LO
c410: 43 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61  CKED      */ "da
c420: 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
c430: 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20  locked",.    /* 
c440: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20  SQLITE_NOMEM    
c450: 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65     */ "out of me
c460: 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51  mory",.    /* SQ
c470: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20  LITE_READONLY   
c480: 20 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20   */ "attempt to 
c490: 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79  write a readonly
c4a0: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
c4b0: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  /* SQLITE_INTERR
c4c0: 55 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72  UPT   */ "interr
c4d0: 75 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  upted",.    /* S
c4e0: 51 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20  QLITE_IOERR     
c4f0: 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65    */ "disk I/O e
c500: 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rror",.    /* SQ
c510: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20  LITE_CORRUPT    
c520: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64 69   */ "database di
c530: 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66  sk image is malf
c540: 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ormed",.    /* S
c550: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20  QLITE_NOTFOUND  
c560: 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70    */ "unknown op
c570: 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a  eration",.    /*
c580: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20   SQLITE_FULL    
c590: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
c5a0: 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c   or disk is full
c5b0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c5c0: 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20  _CANTOPEN    */ 
c5d0: 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
c5e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a  database file",.
c5f0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52      /* SQLITE_PR
c600: 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f  OTOCOL    */ "lo
c610: 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c  cking protocol",
c620: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45  .    /* SQLITE_E
c630: 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20 22 74  MPTY       */ "t
c640: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  able contains no
c650: 20 64 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53   data",.    /* S
c660: 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20  QLITE_SCHEMA    
c670: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73    */ "database s
c680: 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65  chema has change
c690: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
c6a0: 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f  E_TOOBIG      */
c6b0: 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62   "string or blob
c6c0: 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f   too big",.    /
c6d0: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  * SQLITE_CONSTRA
c6e0: 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61  INT  */ "constra
c6f0: 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20  int failed",.   
c700: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41   /* SQLITE_MISMA
c710: 54 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74  TCH    */ "datat
c720: 79 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20  ype mismatch",. 
c730: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53     /* SQLITE_MIS
c740: 55 53 45 20 20 20 20 20 20 2a 2f 20 22 6c 69 62  USE      */ "lib
c750: 72 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c  rary routine cal
c760: 6c 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65  led out of seque
c770: 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  nce",.    /* SQL
c780: 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20  ITE_NOLFS       
c790: 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73  */ "large file s
c7a0: 75 70 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c  upport is disabl
c7b0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c7c0: 54 45 5f 41 55 54 48 20 20 20 20 20 20 20 20 2a  TE_AUTH        *
c7d0: 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  / "authorization
c7e0: 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a   denied",.    /*
c7f0: 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20   SQLITE_FORMAT  
c800: 20 20 20 20 2a 2f 20 22 61 75 78 69 6c 69 61 72      */ "auxiliar
c810: 79 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61  y database forma
c820: 74 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a  t error",.    /*
c830: 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20 20 20   SQLITE_RANGE   
c840: 20 20 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20      */ "bind or 
c850: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74  column index out
c860: 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20   of range",.    
c870: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  /* SQLITE_NOTADB
c880: 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69        */ "file i
c890: 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69  s encrypted or i
c8a0: 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65  s not a database
c8b0: 22 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20  ",.  };.  const 
c8c0: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e  char *zErr = "un
c8d0: 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20  known error";.  
c8e0: 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20  switch( rc ){.  
c8f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
c900: 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a  ORT_ROLLBACK: {.
c910: 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22 61 62        zErr = "ab
c920: 6f 72 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42  ort due to ROLLB
c930: 41 43 4b 22 3b 0a 20 20 20 20 20 20 62 72 65 61  ACK";.      brea
c940: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
c950: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63  ault: {.      rc
c960: 20 26 3d 20 30 78 66 66 3b 0a 20 20 20 20 20 20   &= 0xff;.      
c970: 69 66 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30  if( ALWAYS(rc>=0
c980: 29 20 26 26 20 72 63 3c 41 72 72 61 79 53 69 7a  ) && rc<ArraySiz
c990: 65 28 61 4d 73 67 29 20 26 26 20 61 4d 73 67 5b  e(aMsg) && aMsg[
c9a0: 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  rc]!=0 ){.      
c9b0: 20 20 7a 45 72 72 20 3d 20 61 4d 73 67 5b 72 63    zErr = aMsg[rc
c9c0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
c9d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c9e0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72 3b  }.  return zErr;
c9f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
ca00: 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
ca10: 73 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63  s a busy callbac
ca20: 6b 20 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e  k that sleeps an
ca30: 64 20 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e  d tries.** again
ca40: 20 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74   until a timeout
ca50: 20 76 61 6c 75 65 20 69 73 20 72 65 61 63 68 65   value is reache
ca60: 64 2e 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20  d.  The timeout 
ca70: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69  value is.** an i
ca80: 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
ca90: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61   milliseconds pa
caa0: 73 73 65 64 20 69 6e 20 61 73 20 74 68 65 20 66  ssed in as the f
cab0: 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  irst.** argument
cac0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cad0: 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73  sqliteDefaultBus
cae0: 79 43 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64  yCallback(. void
caf0: 20 2a 70 74 72 2c 20 20 20 20 20 20 20 20 20 20   *ptr,          
cb00: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
cb10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
cb20: 69 6e 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20  int count       
cb30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
cb40: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c  er of times tabl
cb50: 65 20 68 61 73 20 62 65 65 6e 20 62 75 73 79 20  e has been busy 
cb60: 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  */.){.#if SQLITE
cb70: 5f 4f 53 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f  _OS_WIN || HAVE_
cb80: 55 53 4c 45 45 50 0a 20 20 73 74 61 74 69 63 20  USLEEP.  static 
cb90: 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b  const u8 delays[
cba0: 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c  ] =.     { 1, 2,
cbb0: 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20   5, 10, 15, 20, 
cbc0: 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30  25, 25,  25,  50
cbd0: 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20  ,  50, 100 };.  
cbe0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
cbf0: 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20  totals[] =.     
cc00: 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31  { 0, 1, 3,  8, 1
cc10: 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31  8, 33, 53, 78, 1
cc20: 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32  03, 128, 178, 22
cc30: 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44  8 };.# define ND
cc40: 45 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28 64  ELAY ArraySize(d
cc50: 65 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33  elays).  sqlite3
cc60: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
cc70: 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d  *)ptr;.  int tim
cc80: 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54  eout = db->busyT
cc90: 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65  imeout;.  int de
cca0: 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61  lay, prior;..  a
ccb0: 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20  ssert( count>=0 
ccc0: 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c  );.  if( count <
ccd0: 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64   NDELAY ){.    d
cce0: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f  elay = delays[co
ccf0: 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20  unt];.    prior 
cd00: 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b  = totals[count];
cd10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65  .  }else{.    de
cd20: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45  lay = delays[NDE
cd30: 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f  LAY-1];.    prio
cd40: 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41  r = totals[NDELA
cd50: 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f  Y-1] + delay*(co
cd60: 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b  unt-(NDELAY-1));
cd70: 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72  .  }.  if( prior
cd80: 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f   + delay > timeo
cd90: 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20  ut ){.    delay 
cda0: 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f  = timeout - prio
cdb0: 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79  r;.    if( delay
cdc0: 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  <=0 ) return 0;.
cdd0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
cde0: 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64  leep(db->pVfs, d
cdf0: 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65  elay*1000);.  re
ce00: 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20  turn 1;.#else.  
ce10: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73  sqlite3 *db = (s
ce20: 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20  qlite3 *)ptr;.  
ce30: 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28  int timeout = ((
ce40: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e  sqlite3 *)ptr)->
ce50: 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69  busyTimeout;.  i
ce60: 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30  f( (count+1)*100
ce70: 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20  0 > timeout ){. 
ce80: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
ce90: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
cea0: 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30  p(db->pVfs, 1000
ceb0: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
cec0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
ced0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
cee0: 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e  en busy handler.
cef0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
cf00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
cf10: 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  en an operation 
cf20: 66 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f  failed with a lo
cf30: 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72  ck..** If this r
cf40: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e  outine returns n
cf50: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
cf60: 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49  k is retried.  I
cf70: 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20  f it.** returns 
cf80: 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  0, the operation
cf90: 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20   aborts with an 
cfa0: 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
cfb0: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
cfc0: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
cfd0: 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  er(BusyHandler *
cfe0: 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
cff0: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
d000: 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c  || p->xFunc==0 |
d010: 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72  | p->nBusy<0 ) r
d020: 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20  eturn 0;.  rc = 
d030: 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67  p->xFunc(p->pArg
d040: 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69  , p->nBusy);.  i
d050: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
d060: 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20  p->nBusy = -1;. 
d070: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e   }else{.    p->n
d080: 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  Busy++;.  }.  re
d090: 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a  turn rc; .}../*.
d0a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d0b0: 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61  sets the busy ca
d0c0: 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71  llback for an Sq
d0d0: 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f  lite database to
d0e0: 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61   the.** given ca
d0f0: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
d100: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61  with the given a
d110: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
d120: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
d130: 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20  dler(.  sqlite3 
d140: 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75  *db,.  int (*xBu
d150: 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a  sy)(void*,int),.
d160: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
d170: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d180: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
d190: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
d1a0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
d1b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
d1c0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
d1d0: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
d1e0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
d1f0: 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  ex);.  db->busyH
d200: 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78  andler.xFunc = x
d210: 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79  Busy;.  db->busy
d220: 48 61 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70  Handler.pArg = p
d230: 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  Arg;.  db->busyH
d240: 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
d250: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65  ;.  db->busyTime
d260: 6f 75 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  out = 0;.  sqlit
d270: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
d280: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
d290: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
d2a0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
d2b0: 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43  _OMIT_PROGRESS_C
d2c0: 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68  ALLBACK./*.** Th
d2d0: 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
d2e0: 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c  the progress cal
d2f0: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
d300: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
d310: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
d320: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
d330: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
d340: 67 75 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67  gument. The prog
d350: 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69  ress callback wi
d360: 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ll.** be invoked
d370: 20 65 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f   every nOps opco
d380: 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  des..*/.void sql
d390: 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61  ite3_progress_ha
d3a0: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ndler(.  sqlite3
d3b0: 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70   *db, .  int nOp
d3c0: 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67  s,.  int (*xProg
d3d0: 72 65 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20  ress)(void*), . 
d3e0: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23   void *pArg.){.#
d3f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d400: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
d410: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
d420: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
d430: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
d440: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
d450: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
d460: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
d470: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
d480: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f  mutex);.  if( nO
d490: 70 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  ps>0 ){.    db->
d4a0: 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f  xProgress = xPro
d4b0: 67 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e  gress;.    db->n
d4c0: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 28 75  ProgressOps = (u
d4d0: 6e 73 69 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20  nsigned)nOps;.  
d4e0: 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41    db->pProgressA
d4f0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c  rg = pArg;.  }el
d500: 73 65 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f  se{.    db->xPro
d510: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 64  gress = 0;.    d
d520: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
d530: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72  = 0;.    db->pPr
d540: 6f 67 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20  ogressArg = 0;. 
d550: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
d560: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
d570: 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ex);.}.#endif...
d580: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
d590: 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65  ne installs a de
d5a0: 66 61 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c  fault busy handl
d5b0: 65 72 20 74 68 61 74 20 77 61 69 74 73 20 66 6f  er that waits fo
d5c0: 72 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  r the.** specifi
d5d0: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  ed number of mil
d5e0: 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65  liseconds before
d5f0: 20 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f   returning 0..*/
d600: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73  .int sqlite3_bus
d610: 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65  y_timeout(sqlite
d620: 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a  3 *db, int ms){.
d630: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d640: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
d650: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
d660: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
d670: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
d680: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
d690: 69 66 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b  if.  if( ms>0 ){
d6a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
d6b0: 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71  y_handler(db, sq
d6c0: 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43  liteDefaultBusyC
d6d0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29  allback, (void*)
d6e0: 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73  db);.    db->bus
d6f0: 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20  yTimeout = ms;. 
d700: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
d710: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
d720: 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  (db, 0, 0);.  }.
d730: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d740: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75  OK;.}../*.** Cau
d750: 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f  se any pending o
d760: 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70  peration to stop
d770: 20 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74   at its earliest
d780: 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f   opportunity..*/
d790: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e  .void sqlite3_in
d7a0: 74 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20  terrupt(sqlite3 
d7b0: 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *db){.#ifdef SQL
d7c0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
d7d0: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
d7e0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
d7f0: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
d800: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
d810: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
d820: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 64  ;.  }.#endif.  d
d830: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
d840: 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  ted = 1;.}.../*.
d850: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
d860: 20 69 73 20 65 78 61 63 74 6c 79 20 74 68 65 20   is exactly the 
d870: 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f  same as sqlite3_
d880: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
d890: 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61  ), except.** tha
d8a0: 74 20 69 74 20 69 73 20 64 65 73 69 67 6e 65 64  t it is designed
d8b0: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79   to be called by
d8c0: 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20   internal code. 
d8d0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69  The difference i
d8e0: 73 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d  s.** that if a m
d8f0: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e  alloc() fails in
d900: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
d910: 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65  function(), an e
d920: 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20  rror code.** is 
d930: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
d940: 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c   mallocFailed fl
d950: 61 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a  ag cleared. .*/.
d960: 69 6e 74 20 73 71 6c 69 74 65 33 43 72 65 61 74  int sqlite3Creat
d970: 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
d980: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
d990: 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  ar *zFunctionNam
d9a0: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  e,.  int nArg,. 
d9b0: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
d9c0: 20 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76   *pUserData,.  v
d9d0: 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71  oid (*xSFunc)(sq
d9e0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
d9f0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
da00: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
da10: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
da20: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
da30: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
da40: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
da50: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
da60: 2c 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74  ,.  FuncDestruct
da70: 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 0a  or *pDestructor.
da80: 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b  ){.  FuncDef *p;
da90: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20  .  int nName;.  
daa0: 69 6e 74 20 65 78 74 72 61 46 6c 61 67 73 3b 0a  int extraFlags;.
dab0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
dac0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
dad0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
dae0: 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d  ( zFunctionName=
daf0: 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28 78 53 46  =0 ||.      (xSF
db00: 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c  unc && (xFinal |
db10: 7c 20 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20  | xStep)) || .  
db20: 20 20 20 20 28 21 78 53 46 75 6e 63 20 26 26 20      (!xSFunc && 
db30: 28 78 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65  (xFinal && !xSte
db40: 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78  p)) ||.      (!x
db50: 53 46 75 6e 63 20 26 26 20 28 21 78 46 69 6e 61  SFunc && (!xFina
db60: 6c 20 26 26 20 78 53 74 65 70 29 29 20 7c 7c 0a  l && xStep)) ||.
db70: 20 20 20 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c        (nArg<-1 |
db80: 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41  | nArg>SQLITE_MA
db90: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20  X_FUNCTION_ARG) 
dba0: 7c 7c 0a 20 20 20 20 20 20 28 32 35 35 3c 28 6e  ||.      (255<(n
dbb0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
dbc0: 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f  rlen30( zFunctio
dbd0: 6e 4e 61 6d 65 29 29 29 20 29 7b 0a 20 20 20 20  nName))) ){.    
dbe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
dbf0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  SUSE_BKPT;.  }..
dc00: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
dc10: 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d  _FUNC_CONSTANT==
dc20: 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
dc30: 53 54 49 43 20 29 3b 0a 20 20 65 78 74 72 61 46  STIC );.  extraF
dc40: 6c 61 67 73 20 3d 20 65 6e 63 20 26 20 20 53 51  lags = enc &  SQ
dc50: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
dc60: 49 43 3b 0a 20 20 65 6e 63 20 26 3d 20 28 53 51  IC;.  enc &= (SQ
dc70: 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53  LITE_FUNC_ENCMAS
dc80: 4b 7c 53 51 4c 49 54 45 5f 41 4e 59 29 3b 0a 20  K|SQLITE_ANY);. 
dc90: 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
dca0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a  _OMIT_UTF16.  /*
dcb0: 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   If SQLITE_UTF16
dcc0: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
dcd0: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79   the encoding ty
dce0: 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68  pe, transform th
dcf0: 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f  is.  ** to one o
dd00: 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  f SQLITE_UTF16LE
dd10: 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36   or SQLITE_UTF16
dd20: 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  BE using the.  *
dd30: 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  * SQLITE_UTF16NA
dd40: 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49  TIVE macro. SQLI
dd50: 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20  TE_UTF16 is not 
dd60: 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  used internally.
dd70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51  .  **.  ** If SQ
dd80: 4c 49 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63  LITE_ANY is spec
dd90: 69 66 69 65 64 2c 20 61 64 64 20 74 68 72 65 65  ified, add three
dda0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
ddb0: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74   function.  ** t
ddc0: 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  o the hash table
ddd0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63  ..  */.  if( enc
dde0: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29  ==SQLITE_UTF16 )
ddf0: 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49  {.    enc = SQLI
de00: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
de10: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d    }else if( enc=
de20: 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20  =SQLITE_ANY ){. 
de30: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72     int rc;.    r
de40: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
de50: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74  eFunc(db, zFunct
de60: 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  ionName, nArg, S
de70: 51 4c 49 54 45 5f 55 54 46 38 7c 65 78 74 72 61  QLITE_UTF8|extra
de80: 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
de90: 70 55 73 65 72 44 61 74 61 2c 20 78 53 46 75 6e  pUserData, xSFun
dea0: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
deb0: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
dec0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ded0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
dee0: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
def0: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74  eFunc(db, zFunct
df00: 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  ionName, nArg, S
df10: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 7c 65 78  QLITE_UTF16LE|ex
df20: 74 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20  traFlags,.      
df30: 20 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78      pUserData, x
df40: 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46  SFunc, xStep, xF
df50: 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f  inal, pDestructo
df60: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
df70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
df80: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
df90: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e  rc;.    }.    en
dfa0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c = SQLITE_UTF16
dfb0: 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  BE;.  }.#else.  
dfc0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
dfd0: 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f  8;.#endif.  .  /
dfe0: 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 20 65 78  * Check if an ex
dff0: 69 73 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  isting function 
e000: 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64  is being overrid
e010: 64 65 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  den or deleted. 
e020: 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20  If so,.  ** and 
e030: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
e040: 20 56 4d 73 2c 20 74 68 65 6e 20 72 65 74 75 72   VMs, then retur
e050: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 49  n SQLITE_BUSY. I
e060: 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  f a function.  *
e070: 2a 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72  * is being overr
e080: 69 64 64 65 6e 2f 64 65 6c 65 74 65 64 20 62 75  idden/deleted bu
e090: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61  t there are no a
e0a0: 63 74 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77  ctive VMs, allow
e0b0: 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74   the.  ** operat
e0c0: 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ion to continue 
e0d0: 62 75 74 20 69 6e 76 61 6c 69 64 61 74 65 20 61  but invalidate a
e0e0: 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73  ll precompiled s
e0f0: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
e100: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e    p = sqlite3Fin
e110: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46  dFunction(db, zF
e120: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
e130: 67 2c 20 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a  g, (u8)enc, 0);.
e140: 20 20 69 66 28 20 70 20 26 26 20 28 70 2d 3e 66    if( p && (p->f
e150: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
e160: 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 3d  E_FUNC_ENCMASK)=
e170: 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d  =enc && p->nArg=
e180: 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28  =nArg ){.    if(
e190: 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
e1a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e1b0: 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
e1c0: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a  , SQLITE_BUSY, .
e1d0: 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20          "unable 
e1e0: 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79  to delete/modify
e1f0: 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64   user-function d
e200: 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61  ue to active sta
e210: 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20  tements");.     
e220: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
e230: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
e240: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e250: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73  E_BUSY;.    }els
e260: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
e270: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
e280: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
e290: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73    }.  }..  p = s
e2a0: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
e2b0: 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  on(db, zFunction
e2c0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29  Name, nArg, (u8)
e2d0: 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73 65 72  enc, 1);.  asser
e2e0: 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  t(p || db->mallo
e2f0: 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28 20  cFailed);.  if( 
e300: 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
e310: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
e320: 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
e330: 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   an older versio
e340: 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  n of the functio
e350: 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75  n with a configu
e360: 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69  red destructor i
e370: 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70  s.  ** being rep
e380: 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65  laced invoke the
e390: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
e3a0: 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20  tion here. */.  
e3b0: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
e3c0: 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70  db, p);..  if( p
e3d0: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
e3e0: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
e3f0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Ref++;.  }.  p->
e400: 75 2e 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20  u.pDestructor = 
e410: 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70  pDestructor;.  p
e420: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70  ->funcFlags = (p
e430: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
e440: 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53  LITE_FUNC_ENCMAS
e450: 4b 29 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b  K) | extraFlags;
e460: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e  .  testcase( p->
e470: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
e480: 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
e490: 20 29 3b 0a 20 20 70 2d 3e 78 53 46 75 6e 63 20   );.  p->xSFunc 
e4a0: 3d 20 78 53 46 75 6e 63 20 3f 20 78 53 46 75 6e  = xSFunc ? xSFun
e4b0: 63 20 3a 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e  c : xStep;.  p->
e4c0: 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e  xFinalize = xFin
e4d0: 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61  al;.  p->pUserDa
e4e0: 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a  ta = pUserData;.
e4f0: 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36    p->nArg = (u16
e500: 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20  )nArg;.  return 
e510: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e520: 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75  .** Create new u
e530: 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ser functions..*
e540: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
e550: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
e560: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
e570: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
e580: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
e590: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
e5a0: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53   *p,.  void (*xS
e5b0: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
e5c0: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
e5d0: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
e5e0: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
e5f0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
e600: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
e610: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
e620: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
e630: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65  ontext*).){.  re
e640: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  turn sqlite3_cre
e650: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
e660: 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c  db, zFunc, nArg,
e670: 20 65 6e 63 2c 20 70 2c 20 78 53 46 75 6e 63 2c   enc, p, xSFunc,
e680: 20 78 53 74 65 70 2c 0a 20 20 20 20 20 20 20 20   xStep,.        
e690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 78 46 69 6e              xFin
e6b0: 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73  al, 0);.}..int s
e6c0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
e6d0: 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c  nction_v2(.  sql
e6e0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
e6f0: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20  t char *zFunc,. 
e700: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
e710: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c   enc,.  void *p,
e720: 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63  .  void (*xSFunc
e730: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e740: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
e750: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
e760: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
e770: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
e780: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
e790: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
e7a0: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
e7b0: 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  xt*),.  void (*x
e7c0: 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29  Destroy)(void *)
e7d0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
e7e0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46  QLITE_ERROR;.  F
e7f0: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
e800: 41 72 67 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66  Arg = 0;..#ifdef
e810: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
e820: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
e830: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
e840: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
e850: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
e860: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
e870: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
e880: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
e890: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44  mutex);.  if( xD
e8a0: 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41  estroy ){.    pA
e8b0: 72 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75  rg = (FuncDestru
e8c0: 63 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62  ctor *)sqlite3Db
e8d0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
e8e0: 69 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75  izeof(FuncDestru
e8f0: 63 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ctor));.    if( 
e900: 21 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78  !pArg ){.      x
e910: 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20  Destroy(p);.    
e920: 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20    goto out;.    
e930: 7d 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73  }.    pArg->xDes
e940: 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b  troy = xDestroy;
e950: 0a 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72  .    pArg->pUser
e960: 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20  Data = p;.  }.  
e970: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
e980: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
e990: 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20  , nArg, enc, p, 
e9a0: 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78  xSFunc, xStep, x
e9b0: 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20  Final, pArg);.  
e9c0: 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
e9d0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
e9e0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
e9f0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44  ITE_OK );.    xD
ea00: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73  estroy(p);.    s
ea10: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
ea20: 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75   pArg);.  }.. ou
ea30: 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  t:.  rc = sqlite
ea40: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
ea50: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
ea60: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
ea70: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
ea80: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
ea90: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e  TE_OMIT_UTF16.in
eaa0: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
eab0: 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73  _function16(.  s
eac0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
ead0: 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74  nst void *zFunct
eae0: 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e  ionName,.  int n
eaf0: 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74  Arg,.  int eText
eb00: 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  Rep,.  void *p,.
eb10: 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29    void (*xSFunc)
eb20: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
eb30: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
eb40: 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  lue**),.  void (
eb50: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
eb60: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
eb70: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20  ite3_value**),. 
eb80: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
eb90: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
eba0: 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ).){.  int rc;. 
ebb0: 20 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a   char *zFunc8;..
ebc0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
ebd0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
ebe0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
ebf0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c  etyCheckOk(db) |
ec00: 7c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d  | zFunctionName=
ec10: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
ec20: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
ec30: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
ec40: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
ec50: 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
ec60: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
ec70: 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38  iled );.  zFunc8
ec80: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74   = sqlite3Utf16t
ec90: 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  o8(db, zFunction
eca0: 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
ecb0: 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
ecc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
ecd0: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
ece0: 63 38 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52  c8, nArg, eTextR
ecf0: 65 70 2c 20 70 2c 20 78 53 46 75 6e 63 2c 78 53  ep, p, xSFunc,xS
ed00: 74 65 70 2c 78 46 69 6e 61 6c 2c 30 29 3b 0a 20  tep,xFinal,0);. 
ed10: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
ed20: 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63  b, zFunc8);.  rc
ed30: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
ed40: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
ed50: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
ed60: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
ed70: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
ed80: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61  if.../*.** Decla
ed90: 72 65 20 74 68 61 74 20 61 20 66 75 6e 63 74 69  re that a functi
eda0: 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72  on has been over
edb0: 6c 6f 61 64 65 64 20 62 79 20 61 20 76 69 72 74  loaded by a virt
edc0: 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ual table..**.**
edd0: 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   If the function
ede0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
edf0: 61 73 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f  as a regular glo
ee00: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  bal function, th
ee10: 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
ee20: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20  ne is a no-op.  
ee30: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
ee40: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
ee50: 74 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61  then create.** a
ee60: 20 6e 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c   new one that al
ee70: 77 61 79 73 20 74 68 72 6f 77 73 20 61 20 72 75  ways throws a ru
ee80: 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a  n-time error.  .
ee90: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75  **.** When virtu
eea0: 61 6c 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64  al tables intend
eeb0: 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f   to provide an o
eec0: 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69  verloaded functi
eed0: 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75  on, they.** shou
eee0: 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ld call this rou
eef0: 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  tine to make sur
ef00: 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e  e the global fun
ef10: 63 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a  ction exists..**
ef20: 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69   A global functi
ef30: 6f 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e  on must exist in
ef40: 20 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20   order for name 
ef50: 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f  resolution to wo
ef60: 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a  rk.** properly..
ef70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
ef80: 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e  verload_function
ef90: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
efa0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
efb0: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
efc0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
efd0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65  QLITE_OK;..#ifde
efe0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
eff0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
f000: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
f010: 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61  eckOk(db) || zNa
f020: 6d 65 3d 3d 30 20 7c 7c 20 6e 41 72 67 3c 2d 32  me==0 || nArg<-2
f030: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f040: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
f050: 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  T;.  }.#endif.  
f060: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
f070: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
f080: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
f090: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e  dFunction(db, zN
f0a0: 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
f0b0: 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b  E_UTF8, 0)==0 ){
f0c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
f0d0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
f0e0: 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  zName, nArg, SQL
f0f0: 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
f100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f110: 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49       0, sqlite3I
f120: 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20  nvalidFunction, 
f130: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
f140: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
f150: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
f160: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f170: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f180: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
f190: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f1a0: 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52  IT_TRACE./*.** R
f1b0: 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20  egister a trace 
f1c0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70  function.  The p
f1d0: 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65  Arg from the pre
f1e0: 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
f1f0: 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72  ed trace.** is r
f200: 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a  eturned.  .**.**
f210: 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75   A NULL trace fu
f220: 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61  nction means tha
f230: 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20  t no tracing is 
f240: 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e  executes.  A non
f250: 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69  -NULL.** trace i
f260: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
f270: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
f280: 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  s invoked at the
f290: 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a   start of each.*
f2a0: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  * SQL statement.
f2b0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
f2c0: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
f2d0: 45 44 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  ED.void *sqlite3
f2e0: 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a  _trace(sqlite3 *
f2f0: 64 62 2c 20 76 6f 69 64 28 2a 78 54 72 61 63 65  db, void(*xTrace
f300: 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
f310: 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67  ar*), void *pArg
f320: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b  ){.  void *pOld;
f330: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
f340: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
f350: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
f360: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
f370: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
f380: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
f390: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
f3a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
f3b0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
f3c0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
f3d0: 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65  Old = db->pTrace
f3e0: 41 72 67 3b 0a 20 20 64 62 2d 3e 6d 54 72 61 63  Arg;.  db->mTrac
f3f0: 65 20 3d 20 78 54 72 61 63 65 20 3f 20 53 51 4c  e = xTrace ? SQL
f400: 49 54 45 5f 54 52 41 43 45 5f 4c 45 47 41 43 59  ITE_TRACE_LEGACY
f410: 20 3a 20 30 3b 0a 20 20 64 62 2d 3e 78 54 72 61   : 0;.  db->xTra
f420: 63 65 20 3d 20 28 69 6e 74 28 2a 29 28 75 33 32  ce = (int(*)(u32
f430: 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76 6f 69  ,void*,void*,voi
f440: 64 2a 29 29 78 54 72 61 63 65 3b 0a 20 20 64 62  d*))xTrace;.  db
f450: 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70 41  ->pTraceArg = pA
f460: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
f470: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
f480: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
f490: 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Old;.}.#endif /*
f4a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
f4b0: 52 45 43 41 54 45 44 20 2a 2f 0a 0a 2f 2a 20 52  RECATED */../* R
f4c0: 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20  egister a trace 
f4d0: 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67 20 74  callback using t
f4e0: 68 65 20 76 65 72 73 69 6f 6e 2d 32 20 69 6e 74  he version-2 int
f4f0: 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erface..*/.int s
f500: 71 6c 69 74 65 33 5f 74 72 61 63 65 5f 76 32 28  qlite3_trace_v2(
f510: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
f520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f540: 20 54 72 61 63 65 20 74 68 69 73 20 63 6f 6e 6e   Trace this conn
f550: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69  ection */.  unsi
f560: 67 6e 65 64 20 6d 54 72 61 63 65 2c 20 20 20 20  gned mTrace,    
f570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f580: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
f590: 66 20 65 76 65 6e 74 73 20 74 6f 20 62 65 20 74  f events to be t
f5a0: 72 61 63 65 64 20 2a 2f 0a 20 20 69 6e 74 28 2a  raced */.  int(*
f5b0: 78 54 72 61 63 65 29 28 75 6e 73 69 67 6e 65 64  xTrace)(unsigned
f5c0: 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76 6f 69  ,void*,void*,voi
f5d0: 64 2a 29 2c 20 20 2f 2a 20 43 61 6c 6c 62 61 63  d*),  /* Callbac
f5e0: 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20  k to invoke */. 
f5f0: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
f600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
f620: 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 23 69 66  ontext */.){.#if
f630: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
f640: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
f650: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
f660: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
f670: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f680: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
f690: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
f6a0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
f6b0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
f6c0: 20 6d 54 72 61 63 65 3d 3d 30 20 29 20 78 54 72   mTrace==0 ) xTr
f6d0: 61 63 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 78  ace = 0;.  if( x
f6e0: 54 72 61 63 65 3d 3d 30 20 29 20 6d 54 72 61 63  Trace==0 ) mTrac
f6f0: 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6d 54 72  e = 0;.  db->mTr
f700: 61 63 65 20 3d 20 6d 54 72 61 63 65 3b 0a 20 20  ace = mTrace;.  
f710: 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72  db->xTrace = xTr
f720: 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63  ace;.  db->pTrac
f730: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
f740: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f750: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f760: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f770: 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
f780: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
f790: 41 54 45 44 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ATED./*.** Regis
f7a0: 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75  ter a profile fu
f7b0: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72  nction.  The pAr
f7c0: 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  g from the previ
f7d0: 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
f7e0: 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e   .** profile fun
f7f0: 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65  ction is returne
f800: 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  d.  .**.** A NUL
f810: 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  L profile functi
f820: 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f  on means that no
f830: 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78   profiling is ex
f840: 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e  ecutes.  A non-N
f850: 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69  ULL.** profile i
f860: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
f870: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
f880: 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  s invoked at the
f890: 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a   conclusion of.*
f8a0: 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  * each SQL state
f8b0: 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e  ment that is run
f8c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
f8d0: 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71  e3_profile(.  sq
f8e0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
f8f0: 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f  d (*xProfile)(vo
f900: 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  id*,const char*,
f910: 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a  sqlite_uint64),.
f920: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
f930: 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23    void *pOld;..#
f940: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f950: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
f960: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
f970: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
f980: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
f990: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
f9a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f9b0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
f9c0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
f9d0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64  ->mutex);.  pOld
f9e0: 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41   = db->pProfileA
f9f0: 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69  rg;.  db->xProfi
fa00: 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20  le = xProfile;. 
fa10: 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67   db->pProfileArg
fa20: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
fa30: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
fa40: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
fa50: 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64  urn pOld;.}.#end
fa60: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
fa70: 54 5f 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a  T_DEPRECATED */.
fa80: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
fa90: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a  _OMIT_TRACE */..
faa0: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
fab0: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20   function to be 
fac0: 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74  invoked when a t
fad0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
fae0: 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ts..** If the in
faf0: 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72  voked function r
fb00: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
fb10: 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74   then the commit
fb20: 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f   becomes a.** ro
fb30: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  llback..*/.void 
fb40: 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f  *sqlite3_commit_
fb50: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
fb60: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
fb70: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
fb80: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
fb90: 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28  abase */.  int (
fba0: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
fbb0: 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  *),  /* Function
fbc0: 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61   to invoke on ea
fbd0: 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76  ch commit */.  v
fbe0: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
fbf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
fc00: 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
fc10: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
fc20: 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66  d *pOld;..#ifdef
fc30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
fc40: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
fc50: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
fc60: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
fc70: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
fc80: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
fc90: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
fca0: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
fcb0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
fcc0: 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62  ex);.  pOld = db
fcd0: 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20  ->pCommitArg;.  
fce0: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
fcf0: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
fd00: 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72  .  db->pCommitAr
fd10: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
fd20: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
fd30: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
fd40: 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a  turn pOld;.}../*
fd50: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
fd60: 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
fd70: 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
fd80: 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64  a row is updated
fd90: 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72  ,.** inserted or
fda0: 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74   deleted using t
fdb0: 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
fdc0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
fdd0: 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65   *sqlite3_update
fde0: 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
fdf0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
fe00: 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
fe10: 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
fe20: 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64  tabase */.  void
fe30: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
fe40: 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e  id*,int,char con
fe50: 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20  st *,char const 
fe60: 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c  *,sqlite_int64),
fe70: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fe90: 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  Argument to the 
fea0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
feb0: 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69   void *pRet;..#i
fec0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
fed0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
fee0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
fef0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
ff00: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
ff10: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
ff20: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
ff30: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
ff40: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
ff50: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
ff60: 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67  = db->pUpdateArg
ff70: 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43  ;.  db->xUpdateC
ff80: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
ff90: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61  ack;.  db->pUpda
ffa0: 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  teArg = pArg;.  
ffb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ffc0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
ffd0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
ffe0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
fff0: 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
10000 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
10010 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
10020 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n is rolled.** b
10030 61 63 6b 20 62 79 20 74 68 69 73 20 64 61 74 61  ack by this data
10040 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
10050 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
10060 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28  3_rollback_hook(
10070 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10090 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
100a0 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
100b0 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61   */.  void (*xCa
100c0 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20  llback)(void*), 
100d0 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63  /* Callback func
100e0 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
100f0 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
10100 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
10110 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
10120 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
10130 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  et;..#ifdef SQLI
10140 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
10150 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
10160 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
10170 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
10180 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
10190 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
101a0 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
101b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
101c0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
101d0 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f    pRet = db->pRo
101e0 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d  llbackArg;.  db-
101f0 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
10200 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
10210 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41    db->pRollbackA
10220 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
10230 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10240 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
10250 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23  eturn pRet;.}..#
10260 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
10270 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
10280 4f 4b 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  OK./*.** Registe
10290 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
102a0 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
102b0 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70  time a row is up
102c0 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74  dated,.** insert
102d0 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73  ed or deleted us
102e0 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61 73  ing this databas
102f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
10300 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70  .void *sqlite3_p
10310 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20  reupdate_hook(. 
10320 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
10330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
10340 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
10350 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
10360 2f 0a 20 20 76 6f 69 64 28 2a 78 43 61 6c 6c 62  /.  void(*xCallb
10370 61 63 6b 29 28 20 20 20 20 20 20 20 20 20 2f 2a  ack)(         /*
10380 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   Callback functi
10390 6f 6e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 2a 2c  on */.    void*,
103a0 73 71 6c 69 74 65 33 2a 2c 69 6e 74 2c 63 68 61  sqlite3*,int,cha
103b0 72 20 63 6f 6e 73 74 2a 2c 63 68 61 72 20 63 6f  r const*,char co
103c0 6e 73 74 2a 2c 73 71 6c 69 74 65 33 5f 69 6e 74  nst*,sqlite3_int
103d0 36 34 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  64,sqlite3_int64
103e0 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  ),.  void *pArg 
103f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10400 2a 20 46 69 72 73 74 20 63 61 6c 6c 62 61 63 6b  * First callback
10410 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
10420 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20    void *pRet;.  
10430 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
10440 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
10450 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 50 72    pRet = db->pPr
10460 65 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62  eUpdateArg;.  db
10470 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c  ->xPreUpdateCall
10480 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
10490 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61  ;.  db->pPreUpda
104a0 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  teArg = pArg;.  
104b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
104c0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
104d0 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
104e0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
104f0 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
10500 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 6e  TE_HOOK */..#ifn
10510 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10520 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  WAL./*.** The sq
10530 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
10540 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74   callback regist
10550 65 72 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  ered by sqlite3_
10560 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
10570 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20  nt()..** Invoke 
10580 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
10590 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75  kpoint if the nu
105a0 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69  mber of frames i
105b0 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a  n the log file.*
105c0 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
105d0 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72  n sqlite3.pWalAr
105e0 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74  g cast to an int
105f0 65 67 65 72 20 28 74 68 65 20 76 61 6c 75 65 20  eger (the value 
10600 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a  configured by.**
10610 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
10620 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20  int())..*/ .int 
10630 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c  sqlite3WalDefaul
10640 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70  tHook(.  void *p
10650 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  ClientData,     
10660 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20  /* Argument */. 
10670 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
10680 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
10690 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ction */.  const
106a0 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
106b0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f    /* Database */
106c0 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20  .  int nFrame   
106d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
106e0 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20  e of WAL */.){. 
106f0 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c   if( nFrame>=SQL
10700 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
10710 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20  ClientData) ){. 
10720 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
10730 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
10740 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63     sqlite3_wal_c
10750 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44  heckpoint(db, zD
10760 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  b);.    sqlite3E
10770 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
10780 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
10790 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
107a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
107b0 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
107c0 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c  Configure an sql
107d0 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20  ite3_wal_hook() 
107e0 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f  callback to auto
107f0 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70  matically checkp
10800 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61  oint.** a databa
10810 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74  se after committ
10820 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
10830 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
10840 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65  Frame or.** more
10850 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
10860 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67  og file. Passing
10870 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74   zero or a negat
10880 69 76 65 20 76 61 6c 75 65 20 61 73 20 74 68 65  ive value as the
10890 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d  .** nFrame param
108a0 65 74 65 72 20 64 69 73 61 62 6c 65 73 20 61 75  eter disables au
108b0 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
108c0 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a  nts entirely..**
108d0 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  .** The callback
108e0 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 74   registered by t
108f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70  his function rep
10900 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73 74 69  laces any existi
10910 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72  ng callback.** r
10920 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 20  egistered using 
10930 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
10940 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65  (). Likewise, re
10950 67 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c  gistering a call
10960 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71  back.** using sq
10970 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
10980 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61 75   disables the au
10990 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
109a0 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20  nt mechanism.** 
109b0 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68  configured by th
109c0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
109d0 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
109e0 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73  autocheckpoint(s
109f0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
10a00 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20  nFrame){.#ifdef 
10a10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
10a20 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10a30 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44  ER(db);.  UNUSED
10a40 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d  _PARAMETER(nFram
10a50 65 29 3b 0a 23 65 6c 73 65 0a 23 69 66 64 65 66  e);.#else.#ifdef
10a60 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
10a70 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
10a80 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
10a90 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
10aa0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
10ab0 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69  BKPT;.#endif.  i
10ac0 66 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20  f( nFrame>0 ){. 
10ad0 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68     sqlite3_wal_h
10ae0 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65 33 57  ook(db, sqlite3W
10af0 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53  alDefaultHook, S
10b00 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
10b10 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c  (nFrame));.  }el
10b20 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
10b30 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20  wal_hook(db, 0, 
10b40 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
10b50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10b60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  K;.}../*.** Regi
10b70 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
10b80 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
10b90 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61  ch time a transa
10ba0 63 74 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e  ction is written
10bb0 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77 72 69  .** into the wri
10bc0 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79 20  te-ahead-log by 
10bd0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
10be0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
10bf0 64 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  d *sqlite3_wal_h
10c00 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
10c10 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
10c20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
10c30 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
10c40 73 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  s db handle */. 
10c50 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29   int(*xCallback)
10c60 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65 33  (void *, sqlite3
10c70 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20  *, const char*, 
10c80 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  int),.  void *pA
10c90 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
10ca0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
10cb0 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
10cc0 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20   to xCallback() 
10cd0 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
10ce0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
10cf0 76 6f 69 64 20 2a 70 52 65 74 3b 0a 23 69 66 64  void *pRet;.#ifd
10d00 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10d10 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
10d20 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
10d30 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
10d40 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
10d50 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
10d60 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
10d70 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
10d80 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
10d90 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
10da0 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64  db->pWalArg;.  d
10db0 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20  b->xWalCallback 
10dc0 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
10dd0 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70 41 72  b->pWalArg = pAr
10de0 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
10df0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
10e00 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ex);.  return pR
10e10 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  et;.#else.  retu
10e20 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 0;.#endif.}..
10e30 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74  /*.** Checkpoint
10e40 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a   database zDb..*
10e50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61  /.int sqlite3_wa
10e60 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
10e70 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
10e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e90 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
10ea0 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  andle */.  const
10eb0 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
10ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
10ed0 6d 65 20 6f 66 20 61 74 74 61 63 68 65 64 20 64  me of attached d
10ee0 61 74 61 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c  atabase (or NULL
10ef0 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65  ) */.  int eMode
10f00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10f10 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
10f20 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61  _CHECKPOINT_* va
10f30 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  lue */.  int *pn
10f40 4c 6f 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Log,            
10f50 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
10f60 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67   Size of WAL log
10f70 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20   in frames */.  
10f80 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20 20 20  int *pnCkpt     
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fa0 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75  /* OUT: Total nu
10fb0 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 63  mber of frames c
10fc0 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29  heckpointed */.)
10fd0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
10fe0 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74 75 72  OMIT_WAL.  retur
10ff0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  n SQLITE_OK;.#el
11000 73 65 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  se.  int rc;    
11010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11020 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
11030 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ode */.  int iDb
11040 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54   = SQLITE_MAX_AT
11050 54 41 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69  TACHED;  /* sqli
11060 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20  te3.aDb[] index 
11070 6f 66 20 64 62 20 74 6f 20 63 68 65 63 6b 70 6f  of db to checkpo
11080 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  int */..#ifdef S
11090 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
110a0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
110b0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
110c0 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
110d0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
110e0 50 54 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  PT;.#endif..  /*
110f0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
11100 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
11110 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61   to -1 in case a
11120 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
11130 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29  */.  if( pnLog )
11140 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20   *pnLog = -1;.  
11150 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e  if( pnCkpt ) *pn
11160 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73  Ckpt = -1;..  as
11170 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
11180 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d  CKPOINT_PASSIVE=
11190 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
111a0 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
111b0 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61  T_FULL==1 );.  a
111c0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
111d0 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54  ECKPOINT_RESTART
111e0 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==2 );.  assert(
111f0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
11200 4e 54 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20 29  NT_TRUNCATE==3 )
11210 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53 51  ;.  if( eMode<SQ
11220 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
11230 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65  PASSIVE || eMode
11240 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  >SQLITE_CHECKPOI
11250 4e 54 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20  NT_TRUNCATE ){. 
11260 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
11270 46 3a 20 52 2d 30 33 39 39 36 2d 31 32 30 38 38  F: R-03996-12088
11280 20 54 68 65 20 4d 20 70 61 72 61 6d 65 74 65 72   The M parameter
11290 20 6d 75 73 74 20 62 65 20 61 20 76 61 6c 69 64   must be a valid
112a0 20 63 68 65 63 6b 70 6f 69 6e 74 0a 20 20 20 20   checkpoint.    
112b0 2a 2a 20 6d 6f 64 65 3a 20 2a 2f 0a 20 20 20 20  ** mode: */.    
112c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
112d0 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  SUSE;.  }..  sql
112e0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
112f0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
11300 66 28 20 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d  f( zDb && zDb[0]
11310 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   ){.    iDb = sq
11320 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
11330 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20  db, zDb);.  }.  
11340 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
11350 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
11360 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  OR;.    sqlite3E
11370 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
11380 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75  SQLITE_ERROR, "u
11390 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a  nknown database:
113a0 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65   %s", zDb);.  }e
113b0 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73  lse{.    db->bus
113c0 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d  yHandler.nBusy =
113d0 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
113e0 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64  ite3Checkpoint(d
113f0 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70  b, iDb, eMode, p
11400 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20  nLog, pnCkpt);. 
11410 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
11420 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72  db, rc);.  }.  r
11430 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
11440 69 74 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f  it(db, rc);..  /
11450 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
11460 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  o active stateme
11470 6e 74 73 2c 20 63 6c 65 61 72 20 74 68 65 20 69  nts, clear the i
11480 6e 74 65 72 72 75 70 74 20 66 6c 61 67 20 61 74  nterrupt flag at
11490 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e 74   this.  ** point
114a0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
114b0 6e 56 64 62 65 41 63 74 69 76 65 3d 3d 30 20 29  nVdbeActive==0 )
114c0 7b 0a 20 20 20 20 64 62 2d 3e 75 31 2e 69 73 49  {.    db->u1.isI
114d0 6e 74 65 72 72 75 70 74 65 64 20 3d 20 30 3b 0a  nterrupted = 0;.
114e0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d    }..  sqlite3_m
114f0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
11500 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
11510 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
11520 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20  *.** Checkpoint 
11530 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49 66  database zDb. If
11540 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72   zDb is NULL, or
11550 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a   if the buffer z
11560 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  Db points.** to 
11570 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d  contains a zero-
11580 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c 20 61  length string, a
11590 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
115a0 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20 63 68  bases are .** ch
115b0 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69  eckpointed..*/.i
115c0 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  nt sqlite3_wal_c
115d0 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
115e0 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
115f0 72 20 2a 7a 44 62 29 7b 0a 20 20 2f 2a 20 45 56  r *zDb){.  /* EV
11600 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 36  IDENCE-OF: R-416
11610 31 33 2d 32 30 35 35 33 20 54 68 65 20 73 71 6c  13-20553 The sql
11620 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
11630 69 6e 74 28 44 2c 58 29 20 69 73 20 65 71 75 69  int(D,X) is equi
11640 76 61 6c 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 73  valent to.  ** s
11650 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
11660 70 6f 69 6e 74 5f 76 32 28 44 2c 58 2c 53 51 4c  point_v2(D,X,SQL
11670 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
11680 41 53 53 49 56 45 2c 30 2c 30 29 2e 20 2a 2f 0a  ASSIVE,0,0). */.
11690 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
116a0 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
116b0 76 32 28 64 62 2c 7a 44 62 2c 53 51 4c 49 54 45  v2(db,zDb,SQLITE
116c0 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
116d0 49 56 45 2c 30 2c 30 29 3b 0a 7d 0a 0a 23 69 66  IVE,0,0);.}..#if
116e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
116f0 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61  _WAL./*.** Run a
11700 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64   checkpoint on d
11710 61 74 61 62 61 73 65 20 69 44 62 2e 20 54 68 69  atabase iDb. Thi
11720 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
11730 64 61 74 61 62 61 73 65 20 69 44 62 20 69 73 0a  database iDb is.
11740 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ** not currently
11750 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64   open in WAL mod
11760 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  e..**.** If a tr
11770 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
11780 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
11790 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69  e being checkpoi
117a0 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66  nted, this .** f
117b0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
117c0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e  SQLITE_LOCKED an
117d0 64 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  d a checkpoint i
117e0 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2e  s not attempted.
117f0 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72   If .** an error
11800 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 75   occurs while ru
11810 6e 6e 69 6e 67 20 74 68 65 20 63 68 65 63 6b 70  nning the checkp
11820 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65 20  oint, an SQLite 
11830 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
11840 2a 20 72 65 74 75 72 6e 65 64 20 28 69 2e 65 2e  * returned (i.e.
11850 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20   SQLITE_IOERR). 
11860 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
11870 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E_OK..**.** The 
11880 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73  mutex on databas
11890 65 20 68 61 6e 64 6c 65 20 64 62 20 73 68 6f 75  e handle db shou
118a0 6c 64 20 62 65 20 68 65 6c 64 20 62 79 20 74 68  ld be held by th
118b0 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75  e caller. The mu
118c0 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  tex.** associate
118d0 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  d with the speci
118e0 66 69 63 20 62 2d 74 72 65 65 20 62 65 69 6e 67  fic b-tree being
118f0 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 69 73   checkpointed is
11900 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69   taken by.** thi
11910 73 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65  s function while
11920 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
11930 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a  is running..**.*
11940 2a 20 49 66 20 69 44 62 20 69 73 20 70 61 73 73  * If iDb is pass
11950 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  ed SQLITE_MAX_AT
11960 54 41 43 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c  TACHED, then all
11970 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
11980 73 65 73 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b  ses are.** check
11990 70 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e 20 65  pointed. If an e
119a0 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
119b0 72 65 64 20 69 74 20 69 73 20 72 65 74 75 72 6e  red it is return
119c0 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d  ed immediately -
119d0 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20 69  .** no attempt i
119e0 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70  s made to checkp
119f0 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e 69  oint any remaini
11a00 6e 67 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a  ng databases..**
11a10 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65 4d  .** Parameter eM
11a20 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66 20 53 51  ode is one of SQ
11a30 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
11a40 50 41 53 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72  PASSIVE, FULL or
11a50 20 52 45 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74   RESTART..*/.int
11a60 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69   sqlite3Checkpoi
11a70 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nt(sqlite3 *db, 
11a80 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f  int iDb, int eMo
11a90 64 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20  de, int *pnLog, 
11aa0 69 6e 74 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20  int *pnCkpt){.  
11ab0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11ac0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
11ad0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
11ae0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b00 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
11b10 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
11b20 74 74 61 63 68 65 64 20 64 62 73 20 2a 2f 0a 20  ttached dbs */. 
11b30 20 69 6e 74 20 62 42 75 73 79 20 3d 20 30 3b 20   int bBusy = 0; 
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b50 20 2f 2a 20 54 72 75 65 20 69 66 20 53 51 4c 49   /* True if SQLI
11b60 54 45 5f 42 55 53 59 20 68 61 73 20 62 65 65 6e  TE_BUSY has been
11b70 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a   encountered */.
11b80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11b90 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
11ba0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
11bb0 73 65 72 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20  sert( !pnLog || 
11bc0 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20  *pnLog==-1 );.  
11bd0 61 73 73 65 72 74 28 20 21 70 6e 43 6b 70 74 20  assert( !pnCkpt 
11be0 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29  || *pnCkpt==-1 )
11bf0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
11c00 64 62 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53  db->nDb && rc==S
11c10 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
11c20 20 20 20 20 69 66 28 20 69 3d 3d 69 44 62 20 7c      if( i==iDb |
11c30 7c 20 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41  | iDb==SQLITE_MA
11c40 58 5f 41 54 54 41 43 48 45 44 20 29 7b 0a 20 20  X_ATTACHED ){.  
11c50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11c60 42 74 72 65 65 43 68 65 63 6b 70 6f 69 6e 74 28  BtreeCheckpoint(
11c70 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20  db->aDb[i].pBt, 
11c80 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e  eMode, pnLog, pn
11c90 43 6b 70 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c  Ckpt);.      pnL
11ca0 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e  og = 0;.      pn
11cb0 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Ckpt = 0;.      
11cc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  if( rc==SQLITE_B
11cd0 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62  USY ){.        b
11ce0 42 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  Busy = 1;.      
11cf0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
11d00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11d10 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72    }..  return (r
11d20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
11d30 62 42 75 73 79 29 20 3f 20 53 51 4c 49 54 45 5f  bBusy) ? SQLITE_
11d40 42 55 53 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e  BUSY : rc;.}.#en
11d50 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
11d60 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
11d70 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
11d80 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 6d  eturns true if m
11d90 61 69 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c  ain-memory shoul
11da0 64 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61  d be used instea
11db0 64 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72  d of.** a tempor
11dc0 61 72 79 20 66 69 6c 65 20 66 6f 72 20 74 72 61  ary file for tra
11dd0 6e 73 69 65 6e 74 20 70 61 67 65 72 20 66 69 6c  nsient pager fil
11de0 65 73 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74  es and statement
11df0 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68   journals..** Th
11e00 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
11e10 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
11e20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d  value of db->tem
11e30 70 5f 73 74 6f 72 65 20 28 72 75 6e 74 69 6d 65  p_store (runtime
11e40 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 29 20 61  .** parameter) a
11e50 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 20 74  nd the compile t
11e60 69 6d 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c  ime value of SQL
11e70 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20  ITE_TEMP_STORE. 
11e80 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  The.** following
11e90 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73   table describes
11ea0 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69   the relationshi
11eb0 70 20 62 65 74 77 65 65 6e 20 74 68 65 73 65 20  p between these 
11ec0 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e  two values.** an
11ed0 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 73  d this functions
11ee0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a   return value..*
11ef0 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54 45  *.**   SQLITE_TE
11f00 4d 50 5f 53 54 4f 52 45 20 20 20 20 20 64 62 2d  MP_STORE     db-
11f10 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20 20 20 20  >temp_store     
11f20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70  Location of temp
11f30 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  orary database.*
11f40 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
11f50 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
11f60 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
11f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
11f90 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
11fa0 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20         any      
11fb0 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
11fc0 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
11fd0 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
11fe0 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
11ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
12000 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
12010 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
12020 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12040 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
12050 6e 20 31 29 0a 2a 2a 20 20 20 31 20 20 20 20 20  n 1).**   1     
12060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12070 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
12080 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
12090 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20  turn 0).**   2  
120a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120b0 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
120c0 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
120d0 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
120e0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
120f0 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
12100 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
12110 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
12120 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
12130 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
12140 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
12150 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
12160 0a 2a 2a 20 20 20 33 20 20 20 20 20 20 20 20 20  .**   3         
12170 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20              any 
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
12190 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
121a0 20 31 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   1).*/.int sqlit
121b0 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63  e3TempInMemory(c
121c0 6f 6e 73 74 20 73 71 6c 69 74 65 33 20 2a 64 62  onst sqlite3 *db
121d0 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  ){.#if SQLITE_TE
121e0 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65  MP_STORE==1.  re
121f0 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f  turn ( db->temp_
12200 73 74 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64  store==2 );.#end
12210 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  if.#if SQLITE_TE
12220 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65  MP_STORE==2.  re
12230 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f  turn ( db->temp_
12240 73 74 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64  store!=1 );.#end
12250 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  if.#if SQLITE_TE
12260 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 55 4e  MP_STORE==3.  UN
12270 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
12280 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  b);.  return 1;.
12290 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
122a0 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c  E_TEMP_STORE<1 |
122b0 7c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  | SQLITE_TEMP_ST
122c0 4f 52 45 3e 33 0a 20 20 55 4e 55 53 45 44 5f 50  ORE>3.  UNUSED_P
122d0 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20  ARAMETER(db);.  
122e0 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
122f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
12300 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 45   UTF-8 encoded E
12310 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
12320 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
12330 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a  he most recent.*
12340 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73  * error..*/.cons
12350 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
12360 65 72 72 6d 73 67 28 73 71 6c 69 74 65 33 20 2a  errmsg(sqlite3 *
12370 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  db){.  const cha
12380 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20  r *z;.  if( !db 
12390 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
123a0 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49  lite3ErrStr(SQLI
123b0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a  TE_NOMEM_BKPT);.
123c0 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74    }.  if( !sqlit
123d0 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
123e0 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
123f0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
12400 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53  rrStr(SQLITE_MIS
12410 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20  USE_BKPT);.  }. 
12420 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
12430 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
12440 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
12450 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a  cFailed ){.    z
12460 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72   = sqlite3ErrStr
12470 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b  (SQLITE_NOMEM_BK
12480 50 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  PT);.  }else{.  
12490 20 20 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e    testcase( db->
124a0 70 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7a  pErr==0 );.    z
124b0 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
124c0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d  3_value_text(db-
124d0 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65  >pErr);.    asse
124e0 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
124f0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28  ailed );.    if(
12500 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a   z==0 ){.      z
12510 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72   = sqlite3ErrStr
12520 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20  (db->errCode);. 
12530 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
12540 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
12550 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
12560 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn z;.}..#ifnde
12570 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
12580 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  F16./*.** Return
12590 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20   UTF-16 encoded 
125a0 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
125b0 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
125c0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
125d0 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e  ** error..*/.con
125e0 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
125f0 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65  _errmsg16(sqlite
12600 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63  3 *db){.  static
12610 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66   const u16 outOf
12620 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f  Mem[] = {.    'o
12630 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27  ', 'u', 't', ' '
12640 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c  , 'o', 'f', ' ',
12650 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20   'm', 'e', 'm', 
12660 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30  'o', 'r', 'y', 0
12670 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  .  };.  static c
12680 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b  onst u16 misuse[
12690 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27  ] = {.    'l', '
126a0 69 27 2c 20 27 62 27 2c 20 27 72 27 2c 20 27 61  i', 'b', 'r', 'a
126b0 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 27 20 27  ', 'r', 'y', ' '
126c0 2c 20 0a 20 20 20 20 27 72 27 2c 20 27 6f 27 2c  , .    'r', 'o',
126d0 20 27 75 27 2c 20 27 74 27 2c 20 27 69 27 2c 20   'u', 't', 'i', 
126e0 27 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a  'n', 'e', ' ', .
126f0 20 20 20 20 27 63 27 2c 20 27 61 27 2c 20 27 6c      'c', 'a', 'l
12700 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27 64 27  ', 'l', 'e', 'd'
12710 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c  , ' ', .    'o',
12720 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20   'u', 't', ' ', 
12730 0a 20 20 20 20 27 6f 27 2c 20 27 66 27 2c 20 27  .    'o', 'f', '
12740 20 27 2c 20 0a 20 20 20 20 27 73 27 2c 20 27 65   ', .    's', 'e
12750 27 2c 20 27 71 27 2c 20 27 75 27 2c 20 27 65 27  ', 'q', 'u', 'e'
12760 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c  , 'n', 'c', 'e',
12770 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74   0.  };..  const
12780 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20   void *z;.  if( 
12790 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !db ){.    retur
127a0 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d  n (void *)outOfM
127b0 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  em;.  }.  if( !s
127c0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
127d0 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
127e0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69  .    return (voi
127f0 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a  d *)misuse;.  }.
12800 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12810 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
12820 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
12830 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
12840 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f  z = (void *)outO
12850 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fMem;.  }else{. 
12860 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
12870 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e  alue_text16(db->
12880 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a  pErr);.    if( z
12890 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
128a0 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
128b0 28 64 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65  (db, db->errCode
128c0 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
128d0 64 62 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20  db->errCode));. 
128e0 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
128f0 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62  _value_text16(db
12900 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20  ->pErr);.    }. 
12910 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29     /* A malloc()
12920 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65 64   may have failed
12930 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c   within the call
12940 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   to sqlite3_valu
12950 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a  e_text16().    *
12960 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73  * above. If this
12970 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
12980 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  en the db->mallo
12990 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65  cFailed flag nee
129a0 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ds to.    ** be 
129b0 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 72  cleared before r
129c0 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69  eturning. Do thi
129d0 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74  s directly, inst
129e0 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a  ead of via.    *
129f0 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  * sqlite3ApiExit
12a00 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74  (), to avoid set
12a10 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
12a20 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d  e handle error m
12a30 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  essage..    */. 
12a40 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 43 6c 65     sqlite3OomCle
12a50 61 72 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71  ar(db);.  }.  sq
12a60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
12a70 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
12a80 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64  return z;.}.#end
12a90 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
12aa0 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
12ab0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73  * Return the mos
12ac0 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63  t recent error c
12ad0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
12ae0 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69   an SQLite routi
12af0 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a  ne. If NULL is.*
12b00 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  * passed to this
12b10 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73   function, we as
12b20 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20  sume a malloc() 
12b30 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71  failed during sq
12b40 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f  lite3_open()..*/
12b50 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72  .int sqlite3_err
12b60 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  code(sqlite3 *db
12b70 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21  ){.  if( db && !
12b80 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
12b90 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
12ba0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
12bb0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
12bc0 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c  .  }.  if( !db |
12bd0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
12be0 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
12bf0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
12c00 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
12c10 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64   db->errCode & d
12c20 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e  b->errMask;.}.in
12c30 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  t sqlite3_extend
12c40 65 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74  ed_errcode(sqlit
12c50 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  e3 *db){.  if( d
12c60 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66  b && !sqlite3Saf
12c70 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
12c80 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
12c90 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
12ca0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
12cb0 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c   !db || db->mall
12cc0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
12cd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
12ce0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
12cf0 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f  return db->errCo
12d00 64 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  de;.}.int sqlite
12d10 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28 73  3_system_errno(s
12d20 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
12d30 65 74 75 72 6e 20 64 62 20 3f 20 64 62 2d 3e 69  eturn db ? db->i
12d40 53 79 73 45 72 72 6e 6f 20 3a 20 30 3b 0a 7d 20  SysErrno : 0;.} 
12d50 20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20   ../*.** Return 
12d60 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
12d70 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64  scribes the kind
12d80 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66   of error specif
12d90 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ied in the.** ar
12da0 67 75 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77  gument.  For now
12db0 2c 20 74 68 69 73 20 73 69 6d 70 6c 79 20 63 61  , this simply ca
12dc0 6c 6c 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  lls the internal
12dd0 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 29   sqlite3ErrStr()
12de0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  .** function..*/
12df0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
12e00 69 74 65 33 5f 65 72 72 73 74 72 28 69 6e 74 20  ite3_errstr(int 
12e10 72 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  rc){.  return sq
12e20 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 3b  lite3ErrStr(rc);
12e30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
12e40 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67   a new collating
12e50 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61   function for da
12e60 74 61 62 61 73 65 20 22 64 62 22 2e 20 20 54 68  tabase "db".  Th
12e70 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a  e name is zName.
12e80 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64  ** and the encod
12e90 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73  ing is enc..*/.s
12ea0 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65  tatic int create
12eb0 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c  Collation(.  sql
12ec0 69 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73  ite3* db,.  cons
12ed0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
12ee0 20 20 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64    u8 enc,.  void
12ef0 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
12f00 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
12f10 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
12f20 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c  nt,const void*),
12f30 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76  .  void(*xDel)(v
12f40 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53  oid*).){.  CollS
12f50 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74  eq *pColl;.  int
12f60 20 65 6e 63 32 3b 0a 20 20 0a 20 20 61 73 73 65   enc2;.  .  asse
12f70 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12f80 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
12f90 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51  ) );..  /* If SQ
12fa0 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70  LITE_UTF16 is sp
12fb0 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65  ecified as the e
12fc0 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72  ncoding type, tr
12fd0 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a  ansform this.  *
12fe0 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49  * to one of SQLI
12ff0 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51  TE_UTF16LE or SQ
13000 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69  LITE_UTF16BE usi
13010 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ng the.  ** SQLI
13020 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d  TE_UTF16NATIVE m
13030 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46  acro. SQLITE_UTF
13040 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  16 is not used i
13050 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  nternally..  */.
13060 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20    enc2 = enc;.  
13070 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d  testcase( enc2==
13080 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a  SQLITE_UTF16 );.
13090 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32    testcase( enc2
130a0 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  ==SQLITE_UTF16_A
130b0 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20  LIGNED );.  if( 
130c0 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
130d0 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49  16 || enc2==SQLI
130e0 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
130f0 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53   ){.    enc2 = S
13100 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
13110 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63  E;.  }.  if( enc
13120 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  2<SQLITE_UTF8 ||
13130 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46   enc2>SQLITE_UTF
13140 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75  16BE ){.    retu
13150 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
13160 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
13170 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 63   Check if this c
13180 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20  all is removing 
13190 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20  or replacing an 
131a0 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69  existing collati
131b0 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  on .  ** sequenc
131c0 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68  e. If so, and th
131d0 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
131e0 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e  Ms, return busy.
131f0 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61   If there.  ** a
13200 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
13210 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  , invalidate any
13220 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74   pre-compiled st
13230 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
13240 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
13250 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
13260 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c  (u8)enc2, zName,
13270 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   0);.  if( pColl
13280 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   && pColl->xCmp 
13290 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e  ){.    if( db->n
132a0 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20  VdbeActive ){.  
132b0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
132c0 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49  WithMsg(db, SQLI
132d0 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
132e0 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c    "unable to del
132f0 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61  ete/modify colla
13300 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75  tion sequence du
13310 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74  e to active stat
13320 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  ements");.      
13330 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
13340 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  SY;.    }.    sq
13350 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
13360 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
13370 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f  );..    /* If co
13380 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
13390 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65 61 74   pColl was creat
133a0 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 61  ed directly by a
133b0 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
133c0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
133d0 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f  ollation, and no
133e0 74 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 73  t generated by s
133f0 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20  ynthCollSeq(),. 
13400 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63     ** then any c
13410 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20 73 79  opies made by sy
13420 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65  nthCollSeq() nee
13430 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61  d to be invalida
13440 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f  ted..    ** Also
13450 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74  , collation dest
13460 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71  ructor - CollSeq
13470 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63 74 69  .xDel() - functi
13480 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20  on may need.    
13490 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e  ** to be called.
134a0 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69 66 28  .    */ .    if(
134b0 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e   (pColl->enc & ~
134c0 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
134d0 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20  GNED)==enc2 ){. 
134e0 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43       CollSeq *aC
134f0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73  oll = sqlite3Has
13500 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c  hFind(&db->aColl
13510 53 65 71 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  Seq, zName);.   
13520 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
13530 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b  for(j=0; j<3; j+
13540 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
13550 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b  Seq *p = &aColl[
13560 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  j];.        if( 
13570 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65  p->enc==pColl->e
13580 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
13590 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20  if( p->xDel ){. 
135a0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 44             p->xD
135b0 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20  el(p->pUser);.  
135c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
135d0 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b      p->xCmp = 0;
135e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
135f0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
13600 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
13610 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28  indCollSeq(db, (
13620 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20  u8)enc2, zName, 
13630 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d  1);.  if( pColl=
13640 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
13650 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
13660 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78   pColl->xCmp = x
13670 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c  Compare;.  pColl
13680 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b 0a  ->pUser = pCtx;.
13690 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20    pColl->xDel = 
136a0 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65  xDel;.  pColl->e
136b0 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20 7c  nc = (u8)(enc2 |
136c0 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f 55   (enc & SQLITE_U
136d0 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a  TF16_ALIGNED));.
136e0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
136f0 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
13700 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13710 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  K;.}.../*.** Thi
13720 73 20 61 72 72 61 79 20 64 65 66 69 6e 65 73 20  s array defines 
13730 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64  hard upper bound
13740 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65  s on limit value
13750 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69  s.  The.** initi
13760 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65 20 6b  alizer must be k
13770 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74 68  ept in sync with
13780 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49   the SQLITE_LIMI
13790 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20  T_*.** #defines 
137a0 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f  in sqlite3.h..*/
137b0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e  .static const in
137c0 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d  t aHardLimit[] =
137d0 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f   {.  SQLITE_MAX_
137e0 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
137f0 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c  _MAX_SQL_LENGTH,
13800 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  .  SQLITE_MAX_CO
13810 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  LUMN,.  SQLITE_M
13820 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a 20  AX_EXPR_DEPTH,. 
13830 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
13840 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53  OUND_SELECT,.  S
13850 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
13860 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  P,.  SQLITE_MAX_
13870 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20  FUNCTION_ARG,.  
13880 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
13890 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  HED,.  SQLITE_MA
138a0 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
138b0 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  ENGTH,.  SQLITE_
138c0 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
138d0 42 45 52 2c 20 20 20 20 20 20 2f 2a 20 49 4d 50  BER,      /* IMP
138e0 3a 20 52 2d 33 38 30 39 31 2d 33 32 33 35 32 20  : R-38091-32352 
138f0 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  */.  SQLITE_MAX_
13900 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c 0a 20  TRIGGER_DEPTH,. 
13910 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b   SQLITE_MAX_WORK
13920 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d 3b 0a 0a  ER_THREADS,.};..
13930 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
13940 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20  the hard limits 
13950 61 72 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f  are set to reaso
13960 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a  nable values.*/.
13970 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  #if SQLITE_MAX_L
13980 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f  ENGTH<100.# erro
13990 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  r SQLITE_MAX_LEN
139a0 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
139b0 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a  east 100.#endif.
139c0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  #if SQLITE_MAX_S
139d0 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20  QL_LENGTH<100.# 
139e0 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
139f0 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _SQL_LENGTH must
13a00 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30   be at least 100
13a10 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
13a20 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
13a30 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  H>SQLITE_MAX_LEN
13a40 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  GTH.# error SQLI
13a50 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
13a60 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72  H must not be gr
13a70 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54  eater than SQLIT
13a80 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e  E_MAX_LENGTH.#en
13a90 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
13aa0 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
13ab0 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c  CT<2.# error SQL
13ac0 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
13ad0 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20  _SELECT must be 
13ae0 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69  at least 2.#endi
13af0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
13b00 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72  _VDBE_OP<40.# er
13b10 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ror SQLITE_MAX_V
13b20 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61  DBE_OP must be a
13b30 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69  t least 40.#endi
13b40 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
13b50 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20  _FUNCTION_ARG<0 
13b60 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  || SQLITE_MAX_FU
13b70 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 32 37 0a 23  NCTION_ARG>127.#
13b80 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
13b90 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 6d  X_FUNCTION_ARG m
13ba0 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30  ust be between 0
13bb0 20 61 6e 64 20 31 32 37 0a 23 65 6e 64 69 66 0a   and 127.#endif.
13bc0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  #if SQLITE_MAX_A
13bd0 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c  TTACHED<0 || SQL
13be0 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
13bf0 3e 31 32 35 0a 23 20 65 72 72 6f 72 20 53 51 4c  >125.# error SQL
13c00 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
13c10 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
13c20 20 30 20 61 6e 64 20 31 32 35 0a 23 65 6e 64 69   0 and 125.#endi
13c30 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
13c40 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
13c50 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53  NGTH<1.# error S
13c60 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
13c70 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75  ATTERN_LENGTH mu
13c80 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
13c90 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
13ca0 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32  TE_MAX_COLUMN>32
13cb0 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  767.# error SQLI
13cc0 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75  TE_MAX_COLUMN mu
13cd0 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32  st not exceed 32
13ce0 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  767.#endif.#if S
13cf0 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
13d00 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72 72 6f  R_DEPTH<1.# erro
13d10 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49  r SQLITE_MAX_TRI
13d20 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73 74 20  GGER_DEPTH must 
13d30 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65  be at least 1.#e
13d40 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
13d50 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
13d60 44 53 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  DS<0 || SQLITE_M
13d70 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
13d80 53 3e 35 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  S>50.# error SQL
13d90 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
13da0 48 52 45 41 44 53 20 6d 75 73 74 20 62 65 20 62  HREADS must be b
13db0 65 74 77 65 65 6e 20 30 20 61 6e 64 20 35 30 0a  etween 0 and 50.
13dc0 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
13dd0 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
13de0 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20 52 65 70  of a limit.  Rep
13df0 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75  ort the old valu
13e00 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61  e..** If an inva
13e10 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64 65 78 20  lid limit index 
13e20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 72 65 70  is supplied, rep
13e30 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20  ort -1..** Make 
13e40 6e 6f 20 63 68 61 6e 67 65 73 20 62 75 74 20 73  no changes but s
13e50 74 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20  till report the 
13e60 6f 6c 64 20 76 61 6c 75 65 20 69 66 20 74 68 65  old value if the
13e70 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69 73  .** new limit is
13e80 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
13e90 20 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d   A new lower lim
13ea0 69 74 20 64 6f 65 73 20 6e 6f 74 20 73 68 72 69  it does not shri
13eb0 6e 6b 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 73  nk existing cons
13ec0 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65  tructs..** It me
13ed0 72 65 6c 79 20 70 72 65 76 65 6e 74 73 20 6e 65  rely prevents ne
13ee0 77 20 63 6f 6e 73 74 72 75 63 74 73 20 74 68 61  w constructs tha
13ef0 74 20 65 78 63 65 65 64 20 74 68 65 20 6c 69 6d  t exceed the lim
13f00 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69  it.** from formi
13f10 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
13f20 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 33  e3_limit(sqlite3
13f30 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49   *db, int limitI
13f40 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29  d, int newLimit)
13f50 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74  {.  int oldLimit
13f60 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
13f70 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
13f80 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
13f90 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
13fa0 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
13fb0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
13fc0 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  T;.    return -1
13fd0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
13fe0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
13ff0 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20 46 6f  R-30189-54097 Fo
14000 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63 61 74  r each limit cat
14010 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c 49 4d  egory SQLITE_LIM
14020 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74 68 65  IT_NAME.  ** the
14030 72 65 20 69 73 20 61 20 68 61 72 64 20 75 70 70  re is a hard upp
14040 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61 74 20  er bound set at 
14050 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79 20  compile-time by 
14060 61 20 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72  a C preprocessor
14070 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61 6c 6c  .  ** macro call
14080 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4e 41  ed SQLITE_MAX_NA
14090 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d 49 54  ME. (The "_LIMIT
140a0 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 69  _" in the name i
140b0 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20 20 2a  s changed to.  *
140c0 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f  * "_MAX_".).  */
140d0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
140e0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
140f0 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49  IT_LENGTH]==SQLI
14100 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b  TE_MAX_LENGTH );
14110 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
14120 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
14130 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d  IT_SQL_LENGTH]==
14140 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
14150 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72  ENGTH );.  asser
14160 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
14170 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
14180 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43  N]==SQLITE_MAX_C
14190 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73 65 72  OLUMN );.  asser
141a0 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
141b0 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f  LITE_LIMIT_EXPR_
141c0 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d  DEPTH]==SQLITE_M
141d0 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20 29 3b  AX_EXPR_DEPTH );
141e0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
141f0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
14200 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
14210 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  CT]==SQLITE_MAX_
14220 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29  COMPOUND_SELECT)
14230 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
14240 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
14250 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53 51  MIT_VDBE_OP]==SQ
14260 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
14270 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
14280 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
14290 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41  LIMIT_FUNCTION_A
142a0 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  RG]==SQLITE_MAX_
142b0 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29 3b 0a  FUNCTION_ARG );.
142c0 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
142d0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
142e0 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53 51 4c  T_ATTACHED]==SQL
142f0 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
14300 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
14310 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
14320 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45  LIMIT_LIKE_PATTE
14330 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20 20  RN_LENGTH]==.   
14340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14360 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
14370 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
14380 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  ERN_LENGTH );.  
14390 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
143a0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
143b0 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d  VARIABLE_NUMBER]
143c0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52  ==SQLITE_MAX_VAR
143d0 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20  IABLE_NUMBER);. 
143e0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
143f0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
14400 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 5d 3d  _TRIGGER_DEPTH]=
14410 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47  =SQLITE_MAX_TRIG
14420 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61  GER_DEPTH );.  a
14430 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
14440 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57  t[SQLITE_LIMIT_W
14450 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 3d 3d  ORKER_THREADS]==
14460 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
14470 52 5f 54 48 52 45 41 44 53 20 29 3b 0a 20 20 61  R_THREADS );.  a
14480 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4c 49  ssert( SQLITE_LI
14490 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
144a0 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c 49  DS==(SQLITE_N_LI
144b0 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20 69 66  MIT-1) );...  if
144c0 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c  ( limitId<0 || l
144d0 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e  imitId>=SQLITE_N
144e0 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 72 65  _LIMIT ){.    re
144f0 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f  turn -1;.  }.  o
14500 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c  ldLimit = db->aL
14510 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20  imit[limitId];. 
14520 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30   if( newLimit>=0
14530 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
14540 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
14550 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f 0a 20  52476-28732 */. 
14560 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
14570 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74  aHardLimit[limit
14580 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  Id] ){.      new
14590 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c 69 6d  Limit = aHardLim
145a0 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20 2f 2a  it[limitId];  /*
145b0 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d 32 35   IMP: R-51463-25
145c0 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  634 */.    }.   
145d0 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69   db->aLimit[limi
145e0 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  tId] = newLimit;
145f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c  .  }.  return ol
14600 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20  dLimit;         
14610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14620 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35 34 31  MP: R-53341-3541
14630 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  9 */.}../*.** Th
14640 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
14650 73 65 64 20 74 6f 20 70 61 72 73 65 20 62 6f 74  sed to parse bot
14660 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e 2d 55  h URIs and non-U
14670 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70 61 73  RI filenames pas
14680 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 75 73  sed by the.** us
14690 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63 74 69  er to API functi
146a0 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ons sqlite3_open
146b0 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  () or sqlite3_op
146c0 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66 6f 72  en_v2(), and for
146d0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55 52 49   database.** URI
146e0 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 70  s specified as p
146f0 61 72 74 20 6f 66 20 41 54 54 41 43 48 20 73 74  art of ATTACH st
14700 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20  atements..**.** 
14710 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
14720 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
14730 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ion is the name 
14740 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75 73  of the VFS to us
14750 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20  e (or.** a NULL 
14760 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65 20 64  to signify the d
14770 65 66 61 75 6c 74 20 56 46 53 29 20 69 66 20 74  efault VFS) if t
14780 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f 74 20  he URI does not 
14790 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73 3d 78  contain a "vfs=x
147a0 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70 61 72  xx".** query par
147b0 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65 63 6f  ameter. The seco
147c0 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e 74  nd argument cont
147d0 61 69 6e 73 20 74 68 65 20 55 52 49 20 28 6f 72  ains the URI (or
147e0 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d   non-URI filenam
147f0 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20 57 68  e).** itself. Wh
14800 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
14810 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 2a   is called the *
14820 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c 65 20  pFlags variable 
14830 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a  should contain.*
14840 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 66 6c  * the default fl
14850 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ags to open the 
14860 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
14870 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75 65 20  with. The value 
14880 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a 70 46  stored in.** *pF
14890 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70 64 61  lags may be upda
148a0 74 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  ted before retur
148b0 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52 49 20  ning if the URI 
148c0 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61 69 6e  filename contain
148d0 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78 78 78  s .** "cache=xxx
148e0 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78 22 20  " or "mode=xxx" 
148f0 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73  query parameters
14900 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
14910 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
14920 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e   is returned. In
14930 20 74 68 69 73 20 63 61 73 65 20 2a 70 70 56 66   this case *ppVf
14940 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  s is set to poin
14950 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46 53 20  t to.** the VFS 
14960 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75  that should be u
14970 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  sed to open the 
14980 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
14990 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20 74 6f  pzFile is set to
149a0 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  .** point to a b
149b0 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
149c0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
149d0 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 20 49   file to open. I
149e0 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
149f0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
14a00 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
14a10 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73 71 6c  ntually call sql
14a20 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f 20 72  ite3_free() to r
14a30 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20 62  elease.** this b
14a40 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uffer..**.** If 
14a50 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
14a60 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74 65 20   then an SQLite 
14a70 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
14a80 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a 45 72  turned and *pzEr
14a90 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65 20 73  rMsg.** may be s
14aa0 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
14ab0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
14ac0 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61  ng an English la
14ad0 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a 2a 2a  nguage error .**
14ae0 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20   message. It is 
14af0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
14b00 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
14b10 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72   to eventually r
14b20 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73 20 62  elease.** this b
14b30 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69 6e 67  uffer by calling
14b40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
14b50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
14b60 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e 73 74  arseUri(.  const
14b70 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 56   char *zDefaultV
14b80 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 46  fs,        /* VF
14b90 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f 20 22  S to use if no "
14ba0 76 66 73 3d 78 78 78 22 20 71 75 65 72 79 20 6f  vfs=xxx" query o
14bb0 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ption */.  const
14bc0 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20 20 20   char *zUri,    
14bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
14be0 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 52 49  l-terminated URI
14bf0 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20 20 75   to parse */.  u
14c00 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70 46 6c  nsigned int *pFl
14c10 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ags,           /
14c20 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49 54 45  * IN/OUT: SQLITE
14c30 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20  _OPEN_XXX flags 
14c40 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
14c50 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20 20 20   **ppVfs,       
14c60 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 46 53       /* OUT: VFS
14c70 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20 63 68   to use */ .  ch
14c80 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20 20 20  ar **pzFile,    
14c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14ca0 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65 20 63   OUT: Filename c
14cb0 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52 49 20  omponent of URI 
14cc0 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  */.  char **pzEr
14cd0 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20 20  rMsg            
14ce0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72       /* OUT: Err
14cf0 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66 20 72  or message (if r
14d00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f  c!=SQLITE_OK) */
14d10 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
14d20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69  QLITE_OK;.  unsi
14d30 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 20 3d  gned int flags =
14d40 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f 6e 73   *pFlags;.  cons
14d50 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 7a  t char *zVfs = z
14d60 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20 63 68  DefaultVfs;.  ch
14d70 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61  ar *zFile;.  cha
14d80 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72 69 20  r c;.  int nUri 
14d90 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
14da0 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73 73 65  0(zUri);..  asse
14db0 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30  rt( *pzErrMsg==0
14dc0 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66 6c 61   );..  if( ((fla
14dd0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
14de0 5f 55 52 49 29 20 20 20 20 20 20 20 20 20 20 20  _URI)           
14df0 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 38 37 32    /* IMP: R-4872
14e00 35 2d 33 32 32 30 36 20 2a 2f 0a 20 20 20 20 20  5-32206 */.     
14e10 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
14e20 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f  3GlobalConfig.bO
14e30 70 65 6e 55 72 69 29 20 2f 2a 20 49 4d 50 3a 20  penUri) /* IMP: 
14e40 52 2d 35 31 36 38 39 2d 34 36 35 34 38 20 2a 2f  R-51689-46548 */
14e50 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d 35 20 26  .   && nUri>=5 &
14e60 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c 20 22  & memcmp(zUri, "
14e70 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20 2f 2a  file:", 5)==0 /*
14e80 20 49 4d 50 3a 20 52 2d 35 37 38 38 34 2d 33 37   IMP: R-57884-37
14e90 34 39 36 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20  496 */.  ){.    
14ea0 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20  char *zOpt;.    
14eb0 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20 20  int eState;     
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14ed0 20 50 61 72 73 65 72 20 73 74 61 74 65 20 77 68   Parser state wh
14ee0 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49 20 2a  en parsing URI *
14ef0 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b 20 20  /.    int iIn;  
14f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f10 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68 61      /* Input cha
14f20 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a  racter index */.
14f30 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20 30      int iOut = 0
14f40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14f50 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68 61 72    /* Output char
14f60 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20  acter index */. 
14f70 20 20 20 75 36 34 20 6e 42 79 74 65 20 3d 20 6e     u64 nByte = n
14f80 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20 20 20  Uri+2;          
14f90 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
14fa0 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a  ce to allocate *
14fb0 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  /..    /* Make s
14fc0 75 72 65 20 74 68 65 20 53 51 4c 49 54 45 5f 4f  ure the SQLITE_O
14fd0 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69 73 20  PEN_URI flag is 
14fe0 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20  set to indicate 
14ff0 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70 65 6e  to the VFS xOpen
15000 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20   .    ** method 
15010 74 68 61 74 20 74 68 65 72 65 20 6d 61 79 20 62  that there may b
15020 65 20 65 78 74 72 61 20 70 61 72 61 6d 65 74 65  e extra paramete
15030 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  rs following the
15040 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a   file-name.  */.
15050 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
15060 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20  ITE_OPEN_URI;.. 
15070 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20 69 49     for(iIn=0; iI
15080 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29 20 6e  n<nUri; iIn++) n
15090 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b 69 49  Byte += (zUri[iI
150a0 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20 7a 46  n]=='&');.    zF
150b0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ile = sqlite3_ma
150c0 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b 0a 20  lloc64(nByte);. 
150d0 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20     if( !zFile ) 
150e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
150f0 4d 45 4d 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 69  MEM_BKPT;..    i
15100 49 6e 20 3d 20 35 3b 0a 23 69 66 64 65 66 20 53  In = 5;.#ifdef S
15110 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f  QLITE_ALLOW_URI_
15120 41 55 54 48 4f 52 49 54 59 0a 20 20 20 20 69 66  AUTHORITY.    if
15130 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35  ( strncmp(zUri+5
15140 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29  , "///", 3)==0 )
15150 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b  {.      iIn = 7;
15160 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  .      /* The fo
15170 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69 6f  llowing conditio
15180 6e 20 63 61 75 73 65 73 20 55 52 49 73 20 77 69  n causes URIs wi
15190 74 68 20 66 69 76 65 20 6c 65 61 64 69 6e 67 20  th five leading 
151a0 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20  / characters.   
151b0 20 20 20 2a 2a 20 6c 69 6b 65 20 66 69 6c 65 3a     ** like file:
151c0 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 20 74  /////host/path t
151d0 6f 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  o be converted i
151e0 6e 74 6f 20 55 4e 43 73 20 6c 69 6b 65 20 2f 2f  nto UNCs like //
151f0 68 6f 73 74 2f 70 61 74 68 2e 0a 20 20 20 20 20  host/path..     
15200 20 2a 2a 20 54 68 65 20 63 6f 72 72 65 63 74 20   ** The correct 
15210 55 52 49 20 66 6f 72 20 74 68 61 74 20 55 4e 43  URI for that UNC
15220 20 68 61 73 20 6f 6e 6c 79 20 74 77 6f 20 6f 72   has only two or
15230 20 66 6f 75 72 20 6c 65 61 64 69 6e 67 20 2f 20   four leading / 
15240 63 68 61 72 61 63 74 65 72 73 0a 20 20 20 20 20  characters.     
15250 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f 73 74 2f   ** file://host/
15260 70 61 74 68 20 6f 72 20 66 69 6c 65 3a 2f 2f 2f  path or file:///
15270 2f 68 6f 73 74 2f 70 61 74 68 2e 20 20 42 75 74  /host/path.  But
15280 20 35 20 6c 65 61 64 69 6e 67 20 73 6c 61 73 68   5 leading slash
15290 65 73 20 69 73 20 61 20 0a 20 20 20 20 20 20 2a  es is a .      *
152a0 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f 72 2c 20  * common error, 
152b0 77 65 20 61 72 65 20 74 6f 6c 64 2c 20 73 6f 20  we are told, so 
152c0 77 65 20 68 61 6e 64 6c 65 20 69 74 20 61 73 20  we handle it as 
152d0 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2e 20  a special case. 
152e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  */.      if( str
152f0 6e 63 6d 70 28 7a 55 72 69 2b 37 2c 20 22 2f 2f  ncmp(zUri+7, "//
15300 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 20 69 49 6e  /", 3)==0 ){ iIn
15310 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20  ++; }.    }else 
15320 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69  if( strncmp(zUri
15330 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68 6f 73 74  +5, "//localhost
15340 2f 22 2c 20 31 32 29 3d 3d 30 20 29 7b 0a 20 20  /", 12)==0 ){.  
15350 20 20 20 20 69 49 6e 20 3d 20 31 36 3b 0a 20 20      iIn = 16;.  
15360 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a    }.#else.    /*
15370 20 44 69 73 63 61 72 64 20 74 68 65 20 73 63 68   Discard the sch
15380 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72 69 74  eme and authorit
15390 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 74 68  y segments of th
153a0 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66  e URI. */.    if
153b0 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26  ( zUri[5]=='/' &
153c0 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29  & zUri[6]=='/' )
153d0 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b  {.      iIn = 7;
153e0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55  .      while( zU
153f0 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b  ri[iIn] && zUri[
15400 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b  iIn]!='/' ) iIn+
15410 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 49 6e  +;.      if( iIn
15420 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31 36 20  !=7 && (iIn!=16 
15430 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c  || memcmp("local
15440 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c  host", &zUri[7],
15450 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   9)) ){.        
15460 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
15470 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76  te3_mprintf("inv
15480 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f 72 69  alid uri authori
15490 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20  ty: %.*s", .    
154a0 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c 20 26          iIn-7, &
154b0 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20  zUri[7]);.      
154c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
154d0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ROR;.        got
154e0 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b  o parse_uri_out;
154f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
15500 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f  endif..    /* Co
15510 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  py the filename 
15520 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70 61  and any query pa
15530 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74 68  rameters into th
15540 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e 20  e zFile buffer. 
15550 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20 25  .    ** Decode %
15560 48 48 20 65 73 63 61 70 65 20 63 6f 64 65 73 20  HH escape codes 
15570 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20 0a  along the way. .
15580 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69      **.    ** Wi
15590 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20  thin this loop, 
155a0 76 61 72 69 61 62 6c 65 20 65 53 74 61 74 65 20  variable eState 
155b0 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 30 2c  may be set to 0,
155c0 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64 69   1 or 2, dependi
155d0 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ng.    ** on the
155e0 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
155f0 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  . As follows:.  
15600 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a    **.    **   0:
15610 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61   Parsing file-na
15620 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20  me..    **   1: 
15630 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65 63  Parsing name sec
15640 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76  tion of a name=v
15650 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d  alue query param
15660 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32  eter..    **   2
15670 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65 20  : Parsing value 
15680 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d  section of a nam
15690 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61  e=value query pa
156a0 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a  rameter..    */.
156b0 20 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b 0a      eState = 0;.
156c0 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20      while( (c = 
156d0 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26  zUri[iIn])!=0 &&
156e0 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20 20   c!='#' ){.     
156f0 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66   iIn++;.      if
15700 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20 20  ( c=='%' .      
15710 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69   && sqlite3Isxdi
15720 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a  git(zUri[iIn]) .
15730 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
15740 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69  3Isxdigit(zUri[i
15750 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29 7b  In+1]) .      ){
15760 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63 74  .        int oct
15770 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65 78  et = (sqlite3Hex
15780 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b  ToInt(zUri[iIn++
15790 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20  ]) << 4);.      
157a0 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69 74    octet += sqlit
157b0 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b  e3HexToInt(zUri[
157c0 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20  iIn++]);..      
157d0 20 20 61 73 73 65 72 74 28 20 6f 63 74 65 74 3e    assert( octet>
157e0 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36 20  =0 && octet<256 
157f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  );.        if( o
15800 63 74 65 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  ctet==0 ){.#ifnd
15810 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15820 5f 55 52 49 5f 30 30 5f 45 52 52 4f 52 0a 20 20  _URI_00_ERROR.  
15830 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
15840 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
15850 77 68 65 6e 20 22 25 30 30 22 20 61 70 70 65 61  when "%00" appea
15860 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 55 52  rs within the UR
15870 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20 20  I. In this.     
15880 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77 65 20       ** case we 
15890 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74 20  ignore all text 
158a0 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  in the remainder
158b0 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20 6e 61   of the path, na
158c0 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20  me or.          
158d0 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74  ** value current
158e0 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65 64 2e  ly being parsed.
158f0 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63   So ignore the c
15900 75 72 72 65 6e 74 20 63 68 61 72 61 63 74 65 72  urrent character
15910 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
15920 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20 6e 65  d skip to the ne
15930 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22  xt "?", "=" or "
15940 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61  &", as appropria
15950 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  te. */.         
15960 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72   while( (c = zUr
15970 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21  i[iIn])!=0 && c!
15980 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20 20 20  ='#' .          
15990 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d      && (eState!=
159a0 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20  0 || c!='?').   
159b0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65             && (e
159c0 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d  State!=1 || (c!=
159d0 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29 29 0a  '=' && c!='&')).
159e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
159f0 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c 20 63   (eState!=2 || c
15a00 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20 20 20  !='&').         
15a10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15a20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  iIn++;.         
15a30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   }.          con
15a40 74 69 6e 75 65 3b 0a 23 65 6c 73 65 0a 20 20 20  tinue;.#else.   
15a50 20 20 20 20 20 20 20 2f 2a 20 49 66 20 45 4e 41         /* If ENA
15a60 42 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52 4f 52  BLE_URI_00_ERROR
15a70 20 69 73 20 64 65 66 69 6e 65 64 2c 20 22 25 30   is defined, "%0
15a80 30 22 20 69 6e 20 61 20 55 52 49 20 69 73 20 61  0" in a URI is a
15a90 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20  n error. */.    
15aa0 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
15ab0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
15ac0 66 28 22 75 6e 65 78 70 65 63 74 65 64 20 25 25  f("unexpected %%
15ad0 30 30 20 69 6e 20 75 72 69 22 29 3b 0a 20 20 20  00 in uri");.   
15ae0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
15af0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
15b00 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75      goto parse_u
15b10 72 69 5f 6f 75 74 3b 0a 23 65 6e 64 69 66 0a 20  ri_out;.#endif. 
15b20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15b30 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20 20 20   c = octet;.    
15b40 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61    }else if( eSta
15b50 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27 26 27  te==1 && (c=='&'
15b60 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b 0a 20   || c=='=') ){. 
15b70 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
15b80 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20  [iOut-1]==0 ){. 
15b90 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
15ba0 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61 6d 65  mpty option name
15bb0 2e 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6f 70  . Ignore this op
15bc0 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65 72 2e  tion altogether.
15bd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68   */.          wh
15be0 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26  ile( zUri[iIn] &
15bf0 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 23 27  & zUri[iIn]!='#'
15c00 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31 5d 21   && zUri[iIn-1]!
15c10 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20  ='&' ) iIn++;.  
15c20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
15c30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15c40 20 20 20 20 69 66 28 20 63 3d 3d 27 26 27 20 29      if( c=='&' )
15c50 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c  {.          zFil
15c60 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
15c70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
15c80 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74  .          eStat
15c90 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d  e = 2;.        }
15ca0 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a  .        c = 0;.
15cb0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
15cc0 28 65 53 74 61 74 65 3d 3d 30 20 26 26 20 63 3d  (eState==0 && c=
15cd0 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74 61 74 65  ='?') || (eState
15ce0 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27 29 20 29  ==2 && c=='&') )
15cf0 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b  {.        c = 0;
15d00 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 20  .        eState 
15d10 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
15d20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d     zFile[iOut++]
15d30 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = c;.    }.    
15d40 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 29 20  if( eState==1 ) 
15d50 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
15d60 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
15d70 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  iOut++] = '\0';.
15d80 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
15d90 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 2f  ] = '\0';..    /
15da0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 72 65  * Check if there
15db0 20 77 65 72 65 20 61 6e 79 20 6f 70 74 69 6f 6e   were any option
15dc0 73 20 73 70 65 63 69 66 69 65 64 20 74 68 61 74  s specified that
15dd0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 74 65 72   should be inter
15de0 70 72 65 74 65 64 20 0a 20 20 20 20 2a 2a 20 68  preted .    ** h
15df0 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74 68 61  ere. Options tha
15e00 74 20 61 72 65 20 69 6e 74 65 72 70 72 65 74 65  t are interprete
15e10 64 20 68 65 72 65 20 69 6e 63 6c 75 64 65 20 22  d here include "
15e20 76 66 73 22 20 61 6e 64 20 74 68 6f 73 65 20 74  vfs" and those t
15e30 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65  hat.    ** corre
15e40 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73 20 74  spond to flags t
15e50 68 61 74 20 6d 61 79 20 62 65 20 70 61 73 73 65  hat may be passe
15e60 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  d to the sqlite3
15e70 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20 20 2a  _open_v2().    *
15e80 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20 20 20  * method. */.   
15e90 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65 5b 73   zOpt = &zFile[s
15ea0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
15eb0 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68  File)+1];.    wh
15ec0 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a  ile( zOpt[0] ){.
15ed0 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 20 3d        int nOpt =
15ee0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
15ef0 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 63 68  (zOpt);.      ch
15f00 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70 74  ar *zVal = &zOpt
15f10 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20 20 20  [nOpt+1];.      
15f20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74  int nVal = sqlit
15f30 65 33 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c 29  e3Strlen30(zVal)
15f40 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 70  ;..      if( nOp
15f50 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==3 && memcmp("
15f60 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d  vfs", zOpt, 3)==
15f70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 56 66  0 ){.        zVf
15f80 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20  s = zVal;.      
15f90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
15fa0 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 7b  truct OpenMode {
15fb0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
15fc0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
15fd0 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20      int mode;.  
15fe0 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65 20 3d        } *aMode =
15ff0 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72   0;.        char
16000 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20 30 3b   *zModeType = 0;
16010 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61 73  .        int mas
16020 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  k = 0;.        i
16030 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20  nt limit = 0;.. 
16040 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d         if( nOpt=
16050 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 63 61  =5 && memcmp("ca
16060 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d  che", zOpt, 5)==
16070 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
16080 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65  tatic struct Ope
16090 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f 64 65  nMode aCacheMode
160a0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
160b0 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c 20 20     { "shared",  
160c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
160d0 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20  EDCACHE },.     
160e0 20 20 20 20 20 20 20 7b 20 22 70 72 69 76 61 74         { "privat
160f0 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  e", SQLITE_OPEN_
16100 50 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a  PRIVATECACHE },.
16110 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c              { 0,
16120 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d   0 }.          }
16130 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73  ;..          mas
16140 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  k = SQLITE_OPEN_
16150 53 48 41 52 45 44 43 41 43 48 45 7c 53 51 4c 49  SHAREDCACHE|SQLI
16160 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
16170 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20 20 20  ACHE;.          
16180 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65 4d 6f  aMode = aCacheMo
16190 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69  de;.          li
161a0 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  mit = mask;.    
161b0 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20        zModeType 
161c0 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20 20 20  = "cache";.     
161d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
161e0 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d 63   nOpt==4 && memc
161f0 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c  mp("mode", zOpt,
16200 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)==0 ){.      
16210 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63      static struc
16220 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65 6e  t OpenMode aOpen
16230 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Mode[] = {.     
16240 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c 20 20         { "ro",  
16250 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16260 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20 20  ONLY },.        
16270 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53 51 4c      { "rw",  SQL
16280 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
16290 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 20  TE }, .         
162a0 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51 4c 49     { "rwc", SQLI
162b0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
162c0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
162d0 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20  CREATE },.      
162e0 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72 79 22        { "memory"
162f0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45  , SQLITE_OPEN_ME
16300 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20 20 20  MORY },.        
16310 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20      { 0, 0 }.   
16320 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20         };..     
16330 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49       mask = SQLI
16340 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
16350 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   | SQLITE_OPEN_R
16360 45 41 44 57 52 49 54 45 0a 20 20 20 20 20 20 20  EADWRITE.       
16370 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
16380 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
16390 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   | SQLITE_OPEN_M
163a0 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20 20 20  EMORY;.         
163b0 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d 6f   aMode = aOpenMo
163c0 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69  de;.          li
163d0 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c 61  mit = mask & fla
163e0 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d  gs;.          zM
163f0 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63 65 73  odeType = "acces
16400 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  s";.        }.. 
16410 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f 64 65         if( aMode
16420 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
16430 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69  t i;.          i
16440 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  nt mode = 0;.   
16450 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
16460 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29  aMode[i].z; i++)
16470 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
16480 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 4d  nst char *z = aM
16490 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20 20  ode[i].z;.      
164a0 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d 3d        if( nVal==
164b0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
164c0 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  z) && 0==memcmp(
164d0 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20 29  zVal, z, nVal) )
164e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
164f0 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e  mode = aMode[i].
16500 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  mode;.          
16510 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16520 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16530 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
16540 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  f( mode==0 ){.  
16550 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72            *pzErr
16560 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
16570 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 25  rintf("no such %
16580 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d 6f  s mode: %s", zMo
16590 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20  deType, zVal);. 
165a0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
165b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
165c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
165d0 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20  arse_uri_out;.  
165e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
165f0 20 20 20 20 69 66 28 20 28 6d 6f 64 65 20 26 20      if( (mode & 
16600 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d  ~SQLITE_OPEN_MEM
16610 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a 20 20  ORY)>limit ){.  
16620 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72            *pzErr
16630 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
16640 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65 20 6e  rintf("%s mode n
16650 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22 2c  ot allowed: %s",
16660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16680 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79           zModeTy
16690 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20  pe, zVal);.     
166a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
166b0 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 20  TE_PERM;.       
166c0 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f       goto parse_
166d0 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  uri_out;.       
166e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
166f0 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26 20  lags = (flags & 
16700 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20  ~mask) | mode;. 
16710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16720 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d 20 26  ..      zOpt = &
16730 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20  zVal[nVal+1];.  
16740 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    }..  }else{.  
16750 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65    zFile = sqlite
16760 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 55 72 69 2b  3_malloc64(nUri+
16770 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69  2);.    if( !zFi
16780 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
16790 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
167a0 20 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c     memcpy(zFile,
167b0 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20   zUri, nUri);.  
167c0 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20    zFile[nUri] = 
167d0 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
167e0 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a  nUri+1] = '\0';.
167f0 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
16800 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20  LITE_OPEN_URI;. 
16810 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20 73   }..  *ppVfs = s
16820 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
16830 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 2a 70 70  zVfs);.  if( *pp
16840 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  Vfs==0 ){.    *p
16850 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
16860 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75  3_mprintf("no su
16870 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a 56 66  ch vfs: %s", zVf
16880 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  s);.    rc = SQL
16890 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
168a0 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20  parse_uri_out:. 
168b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
168c0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
168d0 33 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20  3_free(zFile);. 
168e0 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20     zFile = 0;.  
168f0 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c  }.  *pFlags = fl
16900 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d  ags;.  *pzFile =
16910 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e   zFile;.  return
16920 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
16930 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
16940 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65   the work of ope
16950 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ning a database 
16960 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20  on behalf of.** 
16970 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 61  sqlite3_open() a
16980 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  nd sqlite3_open1
16990 36 28 29 2e 20 54 68 65 20 64 61 74 61 62 61 73  6(). The databas
169a0 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c  e filename "zFil
169b0 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55  ename"  .** is U
169c0 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f  TF-8 encoded..*/
169d0 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
169e0 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f 6e 73  Database(.  cons
169f0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
16a00 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66  e, /* Database f
16a10 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e  ilename UTF-8 en
16a20 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  coded */.  sqlit
16a30 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20  e3 **ppDb,      
16a40 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
16a50 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
16a60 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  le */.  unsigned
16a70 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 2f   int flags,    /
16a80 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c  * Operational fl
16a90 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ags */.  const c
16aa0 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20  har *zVfs       
16ab0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 56  /* Name of the V
16ac0 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a  FS to use */.){.
16ad0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16af0 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63    /* Store alloc
16b00 61 74 65 64 20 68 61 6e 64 6c 65 20 68 65 72 65  ated handle here
16b10 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
16b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b30 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
16b40 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  code */.  int is
16b50 54 68 72 65 61 64 73 61 66 65 3b 20 20 20 20 20  Threadsafe;     
16b60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
16b70 65 20 66 6f 72 20 74 68 72 65 61 64 73 61 66 65  e for threadsafe
16b80 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
16b90 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20    char *zOpen = 
16ba0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
16bb0 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72    /* Filename ar
16bc0 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74  gument to pass t
16bd0 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f  o BtreeOpen() */
16be0 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
16bf0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
16c00 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73     /* Error mess
16c10 61 67 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  age from sqlite3
16c20 50 61 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a 23  ParseUri() */..#
16c30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
16c40 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
16c50 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72 65  if( ppDb==0 ) re
16c60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
16c70 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
16c80 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66    *ppDb = 0;.#if
16c90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16ca0 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
16cb0 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
16cc0 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
16cd0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
16ce0 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61  dif..  /* Only a
16cf0 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63 6f  llow sensible co
16d00 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69  mbinations of bi
16d10 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20  ts in the flags 
16d20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a  argument.  .  **
16d30 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20   Throw an error 
16d40 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65  if any non-sense
16d50 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20   combination is 
16d60 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20 2a  used.  If we.  *
16d70 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69  * do not block i
16d80 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69  llegal combinati
16d90 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f 75  ons here, it cou
16da0 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 20  ld trigger.  ** 
16db0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
16dc0 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c 61  nts in deeper la
16dd0 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65 20  yers.  Sensible 
16de0 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a  combinations.  *
16df0 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  * are:.  **.  **
16e00 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    1:  SQLITE_OPE
16e10 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20  N_READONLY.  ** 
16e20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   2:  SQLITE_OPEN
16e30 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a 20  _READWRITE.  ** 
16e40 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   6:  SQLITE_OPEN
16e50 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
16e60 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
16e70 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53    */.  assert( S
16e80 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
16e90 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a  NLY  == 0x01 );.
16ea0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
16eb0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
16ec0 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73 73  == 0x02 );.  ass
16ed0 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
16ee0 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30 78  _CREATE    == 0x
16ef0 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  04 );.  testcase
16f00 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
16f10 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45 41  ==0x02 ); /* REA
16f20 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63  DONLY */.  testc
16f30 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
16f40 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20  7))==0x04 ); /* 
16f50 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20 74  READWRITE */.  t
16f60 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
16f70 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29 3b  ags&7))==0x40 );
16f80 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c 20   /* READWRITE | 
16f90 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28 20  CREATE */.  if( 
16fa0 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 20  ((1<<(flags&7)) 
16fb0 26 20 30 78 34 36 29 3d 3d 30 20 29 7b 0a 20 20  & 0x46)==0 ){.  
16fc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16fd0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 20 20 2f 2a  MISUSE_BKPT;  /*
16fe0 20 49 4d 50 3a 20 52 2d 36 35 34 39 37 2d 34 34   IMP: R-65497-44
16ff0 35 39 34 20 2a 2f 0a 20 20 7d 0a 0a 20 20 69 66  594 */.  }..  if
17000 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
17010 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
17020 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72  ==0 ){.    isThr
17030 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d  eadsafe = 0;.  }
17040 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
17050 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
17060 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68  UTEX ){.    isTh
17070 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20  readsafe = 0;.  
17080 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
17090 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  & SQLITE_OPEN_FU
170a0 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  LLMUTEX ){.    i
170b0 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b  sThreadsafe = 1;
170c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73  .  }else{.    is
170d0 54 68 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c  Threadsafe = sql
170e0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
170f0 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d  .bFullMutex;.  }
17100 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
17110 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
17120 54 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66  TECACHE ){.    f
17130 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
17140 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
17150 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
17160 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
17170 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61  g.sharedCacheEna
17180 62 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67  bled ){.    flag
17190 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
171a0 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
171b0 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68  }..  /* Remove h
171c0 61 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d  armful bits from
171d0 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
171e0 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  eter.  **.  ** T
171f0 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  he SQLITE_OPEN_N
17200 4f 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54  OMUTEX and SQLIT
17210 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
17220 20 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a   flags were.  **
17230 20 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74   dealt with in t
17240 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
17250 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73   block.  Besides
17260 20 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79   these, the only
17270 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75  .  ** valid inpu
17280 74 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69  t flags for sqli
17290 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72  te3_open_v2() ar
172a0 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  e SQLITE_OPEN_RE
172b0 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c  ADONLY,.  ** SQL
172c0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
172d0 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  TE, SQLITE_OPEN_
172e0 43 52 45 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f  CREATE, SQLITE_O
172f0 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 2c  PEN_SHAREDCACHE,
17300 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45  .  ** SQLITE_OPE
17310 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 2c 20  N_PRIVATECACHE, 
17320 61 6e 64 20 73 6f 6d 65 20 72 65 73 65 72 76 65  and some reserve
17330 64 20 62 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c  d bits.  Silentl
17340 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20  y mask.  ** off 
17350 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 2e  all other flags.
17360 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d  .  */.  flags &=
17370 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e    ~( SQLITE_OPEN
17380 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c  _DELETEONCLOSE |
17390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
173a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
173b0 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20  USIVE |.        
173c0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
173d0 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20  EN_MAIN_DB |.   
173e0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
173f0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
17400 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
17410 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52    SQLITE_OPEN_TR
17420 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20  ANSIENT_DB | .  
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
17440 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
17450 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20  URNAL | .       
17460 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
17470 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
17480 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
17490 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53     SQLITE_OPEN_S
174a0 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  UBJOURNAL | .   
174b0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
174c0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
174d0 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20  OURNAL |.       
174e0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
174f0 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20  PEN_NOMUTEX |.  
17500 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
17510 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
17520 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EX |.           
17530 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
17540 57 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20  WAL.            
17550 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
17560 74 65 20 74 68 65 20 73 71 6c 69 74 65 20 64 61  te the sqlite da
17570 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ta structure */.
17580 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61    db = sqlite3Ma
17590 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
175a0 28 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69  (sqlite3) );.  i
175b0 66 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20  f( db==0 ) goto 
175c0 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66  opendb_out;.  if
175d0 28 20 69 73 54 68 72 65 61 64 73 61 66 65 20 29  ( isThreadsafe )
175e0 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20  {.    db->mutex 
175f0 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
17600 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
17610 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20  _RECURSIVE);.   
17620 20 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d   if( db->mutex==
17630 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
17640 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20  e3_free(db);.   
17650 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20     db = 0;.     
17660 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
17670 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
17680 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
17690 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
176a0 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78  db->errMask = 0x
176b0 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20  ff;.  db->nDb = 
176c0 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  2;.  db->magic =
176d0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55   SQLITE_MAGIC_BU
176e0 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20  SY;.  db->aDb = 
176f0 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a  db->aDbStatic;..
17700 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
17710 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69  (db->aLimit)==si
17720 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29  zeof(aHardLimit)
17730 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d   );.  memcpy(db-
17740 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69  >aLimit, aHardLi
17750 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e  mit, sizeof(db->
17760 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e  aLimit));.  db->
17770 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
17780 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
17790 44 53 5d 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  DS] = SQLITE_DEF
177a0 41 55 4c 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  AULT_WORKER_THRE
177b0 41 44 53 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43  ADS;.  db->autoC
177c0 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d  ommit = 1;.  db-
177d0 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d  >nextAutovac = -
177e0 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d 6d 61 70 20  1;.  db->szMmap 
177f0 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
17800 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20  onfig.szMmap;.  
17810 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
17820 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61 78   = 0;.  db->nMax
17830 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20 30 78 37  SorterMmap = 0x7
17840 46 46 46 46 46 46 46 3b 0a 20 20 64 62 2d 3e 66  FFFFFFF;.  db->f
17850 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
17860 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53  hortColNames | S
17870 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67  QLITE_EnableTrig
17880 67 65 72 20 7c 20 53 51 4c 49 54 45 5f 43 61 63  ger | SQLITE_Cac
17890 68 65 53 70 69 6c 6c 0a 23 69 66 20 21 64 65 66  heSpill.#if !def
178a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41  ined(SQLITE_DEFA
178b0 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  ULT_AUTOMATIC_IN
178c0 44 45 58 29 20 7c 7c 20 53 51 4c 49 54 45 5f 44  DEX) || SQLITE_D
178d0 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43  EFAULT_AUTOMATIC
178e0 5f 49 4e 44 45 58 0a 20 20 20 20 20 20 20 20 20  _INDEX.         
178f0 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
17900 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65 6e 64 69  _AutoIndex.#endi
17910 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  f.#if SQLITE_DEF
17920 41 55 4c 54 5f 43 4b 50 54 46 55 4c 4c 46 53 59  AULT_CKPTFULLFSY
17930 4e 43 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  NC.             
17940 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 6b 70      | SQLITE_Ckp
17950 74 46 75 6c 6c 46 53 79 6e 63 0a 23 65 6e 64 69  tFullFSync.#endi
17960 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  f.#if SQLITE_DEF
17970 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  AULT_FILE_FORMAT
17980 3c 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  <4.             
17990 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67      | SQLITE_Leg
179a0 61 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69  acyFileFmt.#endi
179b0 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
179c0 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
179d0 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20  NSION.          
179e0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
179f0 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65  LoadExtension.#e
17a00 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
17a10 44 45 46 41 55 4c 54 5f 52 45 43 55 52 53 49 56  DEFAULT_RECURSIV
17a20 45 5f 54 52 49 47 47 45 52 53 0a 20 20 20 20 20  E_TRIGGERS.     
17a30 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
17a40 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73  LITE_RecTriggers
17a50 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
17a60 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ned(SQLITE_DEFAU
17a70 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29  LT_FOREIGN_KEYS)
17a80 20 26 26 20 53 51 4c 49 54 45 5f 44 45 46 41 55   && SQLITE_DEFAU
17a90 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a  LT_FOREIGN_KEYS.
17aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ab0 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67   | SQLITE_Foreig
17ac0 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a 23 69 66  nKeys.#endif.#if
17ad0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
17ae0 52 45 56 45 52 53 45 5f 55 4e 4f 52 44 45 52 45  REVERSE_UNORDERE
17af0 44 5f 53 45 4c 45 43 54 53 29 0a 20 20 20 20 20  D_SELECTS).     
17b00 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
17b10 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65  LITE_ReverseOrde
17b20 72 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  r.#endif.#if def
17b30 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
17b40 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
17b50 5f 43 48 45 43 4b 29 0a 20 20 20 20 20 20 20 20  _CHECK).        
17b60 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
17b70 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 0a 23 65 6e  E_CellSizeCk.#en
17b80 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
17b90 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
17ba0 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 29 0a 20 20  S3_TOKENIZER).  
17bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17bc0 20 53 51 4c 49 54 45 5f 46 74 73 33 54 6f 6b 65   SQLITE_Fts3Toke
17bd0 6e 69 7a 65 72 0a 23 65 6e 64 69 66 0a 20 20 20  nizer.#endif.   
17be0 20 20 20 3b 0a 20 20 73 71 6c 69 74 65 33 48 61     ;.  sqlite3Ha
17bf0 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c  shInit(&db->aCol
17c00 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53  lSeq);.#ifndef S
17c10 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
17c20 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65  ALTABLE.  sqlite
17c30 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61  3HashInit(&db->a
17c40 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  Module);.#endif.
17c50 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65  .  /* Add the de
17c60 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
17c70 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e  sequence BINARY.
17c80 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f   BINARY works fo
17c90 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a  r both UTF-8.  *
17ca0 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f  * and UTF-16, so
17cb0 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66   add a version f
17cc0 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64  or each to avoid
17cd0 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79   any unnecessary
17ce0 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e  .  ** conversion
17cf0 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f  s. The only erro
17d00 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72  r that can occur
17d10 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f   here is a mallo
17d20 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a  c() failure..  *
17d30 2a 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d  *.  ** EVIDENCE-
17d40 4f 46 3a 20 52 2d 35 32 37 38 36 2d 34 34 38 37  OF: R-52786-4487
17d50 38 20 53 51 4c 69 74 65 20 64 65 66 69 6e 65 73  8 SQLite defines
17d60 20 74 68 72 65 65 20 62 75 69 6c 74 2d 69 6e 20   three built-in 
17d70 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 2a 2a 20 66  collating.  ** f
17d80 75 6e 63 74 69 6f 6e 73 3a 0a 20 20 2a 2f 0a 20  unctions:.  */. 
17d90 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
17da0 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42  (db, sqlite3StrB
17db0 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54  INARY, SQLITE_UT
17dc0 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75  F8, 0, binCollFu
17dd0 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
17de0 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71  Collation(db, sq
17df0 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20  lite3StrBINARY, 
17e00 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20  SQLITE_UTF16BE, 
17e10 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20  0, binCollFunc, 
17e20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c  0);.  createColl
17e30 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65  ation(db, sqlite
17e40 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51 4c 49  3StrBINARY, SQLI
17e50 54 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62  TE_UTF16LE, 0, b
17e60 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
17e70 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
17e80 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20  n(db, "NOCASE", 
17e90 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
17ea0 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46  nocaseCollatingF
17eb0 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
17ec0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
17ed0 52 54 52 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55  RTRIM", SQLITE_U
17ee0 54 46 38 2c 20 28 76 6f 69 64 2a 29 31 2c 20 62  TF8, (void*)1, b
17ef0 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
17f00 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
17f10 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
17f20 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
17f30 20 7d 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45   }.  /* EVIDENCE
17f40 2d 4f 46 3a 20 52 2d 30 38 33 30 38 2d 31 37 32  -OF: R-08308-172
17f50 32 34 20 54 68 65 20 64 65 66 61 75 6c 74 20 63  24 The default c
17f60 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
17f70 6e 20 66 6f 72 20 61 6c 6c 0a 20 20 2a 2a 20 73  n for all.  ** s
17f80 74 72 69 6e 67 73 20 69 73 20 42 49 4e 41 52 59  trings is BINARY
17f90 2e 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 70 44  . .  */.  db->pD
17fa0 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  fltColl = sqlite
17fb0 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
17fc0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 73 71   SQLITE_UTF8, sq
17fd0 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20  lite3StrBINARY, 
17fe0 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  0);.  assert( db
17ff0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29  ->pDfltColl!=0 )
18000 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68  ;..  /* Parse th
18010 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61  e filename/URI a
18020 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64 62  rgument. */.  db
18030 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c  ->openFlags = fl
18040 61 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ags;.  rc = sqli
18050 74 65 33 50 61 72 73 65 55 72 69 28 7a 56 66 73  te3ParseUri(zVfs
18060 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c  , zFilename, &fl
18070 61 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20  ags, &db->pVfs, 
18080 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67  &zOpen, &zErrMsg
18090 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
180a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
180b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
180c0 45 4d 20 29 20 73 71 6c 69 74 65 33 4f 6f 6d 46  EM ) sqlite3OomF
180d0 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 73 71  ault(db);.    sq
180e0 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
180f0 67 28 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d 73  g(db, rc, zErrMs
18100 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a 45  g ? "%s" : 0, zE
18110 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
18120 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
18130 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  );.    goto open
18140 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  db_out;.  }..  /
18150 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65  * Open the backe
18160 6e 64 20 64 61 74 61 62 61 73 65 20 64 72 69 76  nd database driv
18170 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  er */.  rc = sql
18180 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62  ite3BtreeOpen(db
18190 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 64  ->pVfs, zOpen, d
181a0 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  b, &db->aDb[0].p
181b0 42 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  Bt, 0,.         
181c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
181d0 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50  lags | SQLITE_OP
181e0 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 69  EN_MAIN_DB);.  i
181f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18200 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
18210 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
18220 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  EM ){.      rc =
18230 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
18240 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  PT;.    }.    sq
18250 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
18260 63 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65  c);.    goto ope
18270 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 73  ndb_out;.  }.  s
18280 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
18290 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
182a0 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ;.  db->aDb[0].p
182b0 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33  Schema = sqlite3
182c0 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 64 62  SchemaGet(db, db
182d0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
182e0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
182f0 46 61 69 6c 65 64 20 29 20 45 4e 43 28 64 62 29  Failed ) ENC(db)
18300 20 3d 20 53 43 48 45 4d 41 5f 45 4e 43 28 64 62   = SCHEMA_ENC(db
18310 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
18320 65 4c 65 61 76 65 28 64 62 2d 3e 61 44 62 5b 30  eLeave(db->aDb[0
18330 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44  ].pBt);.  db->aD
18340 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73  b[1].pSchema = s
18350 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28  qlite3SchemaGet(
18360 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 54 68  db, 0);..  /* Th
18370 65 20 64 65 66 61 75 6c 74 20 73 61 66 65 74 79  e default safety
18380 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d  _level for the m
18390 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
183a0 46 55 4c 4c 3b 20 66 6f 72 20 74 68 65 20 74 65  FULL; for the te
183b0 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  mp.  ** database
183c0 20 69 74 20 69 73 20 4f 46 46 2e 20 54 68 69 73   it is OFF. This
183d0 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 61 67   matches the pag
183e0 65 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c 74  er layer default
183f0 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e  s.  .  */.  db->
18400 61 44 62 5b 30 5d 2e 7a 44 62 53 4e 61 6d 65 20  aDb[0].zDbSName 
18410 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e  = "main";.  db->
18420 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65  aDb[0].safety_le
18430 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  vel = SQLITE_DEF
18440 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AULT_SYNCHRONOUS
18450 2b 31 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  +1;.  db->aDb[1]
18460 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 22 74 65 6d  .zDbSName = "tem
18470 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  p";.  db->aDb[1]
18480 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
18490 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55  PAGER_SYNCHRONOU
184a0 53 5f 4f 46 46 3b 0a 0a 20 20 64 62 2d 3e 6d 61  S_OFF;..  db->ma
184b0 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
184c0 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64  IC_OPEN;.  if( d
184d0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
184e0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
184f0 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  db_out;.  }..  /
18500 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62  * Register all b
18510 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e  uilt-in function
18520 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74  s, but do not at
18530 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68  tempt to read th
18540 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
18550 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73  schema yet. This
18560 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69   is delayed unti
18570 6c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  l the first time
18580 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
18590 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a  ** is accessed..
185a0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72    */.  sqlite3Er
185b0 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
185c0 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67  K);.  sqlite3Reg
185d0 69 73 74 65 72 50 65 72 43 6f 6e 6e 65 63 74 69  isterPerConnecti
185e0 6f 6e 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f  onBuiltinFunctio
185f0 6e 73 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73  ns(db);.  rc = s
18600 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
18610 62 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  b);..#ifdef SQLI
18620 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 20  TE_ENABLE_FTS5. 
18630 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6e 79   /* Register any
18640 20 62 75 69 6c 74 2d 69 6e 20 46 54 53 35 20 6d   built-in FTS5 m
18650 6f 64 75 6c 65 20 62 65 66 6f 72 65 20 6c 6f 61  odule before loa
18660 64 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61 74  ding the automat
18670 69 63 0a 20 20 2a 2a 20 65 78 74 65 6e 73 69 6f  ic.  ** extensio
18680 6e 73 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  ns. This allows 
18690 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73  automatic extens
186a0 69 6f 6e 73 20 74 6f 20 72 65 67 69 73 74 65 72  ions to register
186b0 20 46 54 53 35 20 0a 20 20 2a 2a 20 74 6f 6b 65   FTS5 .  ** toke
186c0 6e 69 7a 65 72 73 20 61 6e 64 20 61 75 78 69 6c  nizers and auxil
186d0 69 61 72 79 20 66 75 6e 63 74 69 6f 6e 73 2e 20  iary functions. 
186e0 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d   */.  if( !db->m
186f0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
18700 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18710 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18720 46 74 73 35 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts5Init(db);.  
18730 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4c  }.#endif..  /* L
18740 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78  oad automatic ex
18750 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e  tensions - exten
18760 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20  sions that have 
18770 62 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a  been registered.
18780 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73    ** using the s
18790 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63  qlite3_automatic
187a0 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49  _extension() API
187b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
187c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
187d0 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61    sqlite3AutoLoa
187e0 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b  dExtensions(db);
187f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18800 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
18810 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18820 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
18830 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
18840 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
18850 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
18860 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS1.  if( !db->m
18870 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
18880 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
18890 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 73 71  lite3Fts1Init(sq
188a0 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20  lite3*);.    rc 
188b0 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69  = sqlite3Fts1Ini
188c0 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
188d0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
188e0 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69  _ENABLE_FTS2.  i
188f0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
18900 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
18910 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74  TE_OK ){.    ext
18920 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46  ern int sqlite3F
18930 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a  ts2Init(sqlite3*
18940 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
18950 74 65 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b  te3Fts2Init(db);
18960 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
18970 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
18980 45 5f 46 54 53 33 20 2f 2a 20 61 75 74 6f 6d 61  E_FTS3 /* automa
18990 74 69 63 61 6c 6c 79 20 64 65 66 69 6e 65 64 20  tically defined 
189a0 62 79 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  by SQLITE_ENABLE
189b0 5f 46 54 53 34 20 2a 2f 0a 20 20 69 66 28 20 21  _FTS4 */.  if( !
189c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
189d0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
189e0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
189f0 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28 64 62  lite3Fts3Init(db
18a00 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
18a10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
18a20 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64  BLE_ICU.  if( !d
18a30 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18a40 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
18a50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
18a60 69 74 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b  ite3IcuInit(db);
18a70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
18a80 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
18a90 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21 64  E_RTREE.  if( !d
18aa0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18ab0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
18ac0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
18ad0 74 65 33 52 74 72 65 65 49 6e 69 74 28 64 62 29  te3RtreeInit(db)
18ae0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
18af0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18b00 4c 45 5f 44 42 53 54 41 54 5f 56 54 41 42 0a 20  LE_DBSTAT_VTAB. 
18b10 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
18b20 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
18b30 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63  LITE_OK){.    rc
18b40 20 3d 20 73 71 6c 69 74 65 33 44 62 73 74 61 74   = sqlite3Dbstat
18b50 52 65 67 69 73 74 65 72 28 64 62 29 3b 0a 20 20  Register(db);.  
18b60 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
18b70 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4a   SQLITE_ENABLE_J
18b80 53 4f 4e 31 0a 20 20 69 66 28 20 21 64 62 2d 3e  SON1.  if( !db->
18b90 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
18ba0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a  rc==SQLITE_OK){.
18bb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18bc0 4a 73 6f 6e 31 49 6e 69 74 28 64 62 29 3b 0a 20  Json1Init(db);. 
18bd0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
18be0 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
18bf0 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20  _LOCKING_MODE=1 
18c00 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20  makes EXCLUSIVE 
18c10 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  the default lock
18c20 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20  ing.  ** mode.  
18c30 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
18c40 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20  _LOCKING_MODE=0 
18c50 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20  make NORMAL the 
18c60 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a  default locking.
18c70 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e    ** mode.  Doin
18c80 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c  g nothing at all
18c90 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d   also makes NORM
18ca0 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a  AL the default..
18cb0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
18cc0 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
18cd0 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66  NG_MODE.  db->df
18ce0 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c  ltLockMode = SQL
18cf0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
18d00 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69  ING_MODE;.  sqli
18d10 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
18d20 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65 65  ode(sqlite3Btree
18d30 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d  Pager(db->aDb[0]
18d40 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20  .pBt),.         
18d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d60 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
18d70 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23  LOCKING_MODE);.#
18d80 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63 20  endif..  if( rc 
18d90 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64  ) sqlite3Error(d
18da0 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 45 6e  b, rc);..  /* En
18db0 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69  able the lookasi
18dc0 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  de-malloc subsys
18dd0 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f  tem */.  setupLo
18de0 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73  okaside(db, 0, s
18df0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
18e00 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a  ig.szLookaside,.
18e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
18e30 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f  lobalConfig.nLoo
18e40 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69  kaside);..  sqli
18e50 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63  te3_wal_autochec
18e60 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49 54  kpoint(db, SQLIT
18e70 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55  E_DEFAULT_WAL_AU
18e80 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a  TOCHECKPOINT);..
18e90 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 69 66  opendb_out:.  if
18ea0 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65  ( db ){.    asse
18eb0 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30  rt( db->mutex!=0
18ec0 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66 65   || isThreadsafe
18ed0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
18ee0 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  | sqlite3GlobalC
18ef0 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
18f00 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
18f10 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
18f20 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20  b->mutex);.  }. 
18f30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
18f40 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 61 73 73  rcode(db);.  ass
18f50 65 72 74 28 20 64 62 21 3d 30 20 7c 7c 20 72 63  ert( db!=0 || rc
18f60 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
18f70 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
18f80 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
18f90 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
18fa0 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a 20  );.    db = 0;. 
18fb0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
18fc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18fd0 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
18fe0 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20  TE_MAGIC_SICK;. 
18ff0 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64 62 3b   }.  *ppDb = db;
19000 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
19010 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69  NABLE_SQLLOG.  i
19020 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
19030 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29  Config.xSqllog )
19040 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69 6e 67  {.    /* Opening
19050 20 61 20 64 62 20 68 61 6e 64 6c 65 2e 20 46 6f   a db handle. Fo
19060 75 72 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  urth parameter i
19070 73 20 70 61 73 73 65 64 20 30 2e 20 2a 2f 0a 20  s passed 0. */. 
19080 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20 3d 20     void *pArg = 
19090 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
190a0 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 3b 0a  fig.pSqllogArg;.
190b0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
190c0 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28  lConfig.xSqllog(
190d0 70 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c 65 6e  pArg, db, zFilen
190e0 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  ame, 0);.  }.#en
190f0 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
19100 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
19110 29 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ).  if( rc==SQLI
19120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e  TE_OK ){.    con
19130 73 74 20 63 68 61 72 20 2a 7a 48 65 78 4b 65 79  st char *zHexKey
19140 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
19150 61 72 61 6d 65 74 65 72 28 7a 4f 70 65 6e 2c 20  arameter(zOpen, 
19160 22 68 65 78 6b 65 79 22 29 3b 0a 20 20 20 20 69  "hexkey");.    i
19170 66 28 20 7a 48 65 78 4b 65 79 20 26 26 20 7a 48  f( zHexKey && zH
19180 65 78 4b 65 79 5b 30 5d 20 29 7b 0a 20 20 20 20  exKey[0] ){.    
19190 20 20 75 38 20 69 42 79 74 65 3b 0a 20 20 20 20    u8 iByte;.    
191a0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 63    int i;.      c
191b0 68 61 72 20 7a 4b 65 79 5b 34 30 5d 3b 0a 20 20  har zKey[40];.  
191c0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 69 42 79      for(i=0, iBy
191d0 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a  te=0; i<sizeof(z
191e0 4b 65 79 29 2a 32 20 26 26 20 73 71 6c 69 74 65  Key)*2 && sqlite
191f0 33 49 73 78 64 69 67 69 74 28 7a 48 65 78 4b 65  3Isxdigit(zHexKe
19200 79 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  y[i]); i++){.   
19210 20 20 20 20 20 69 42 79 74 65 20 3d 20 28 69 42       iByte = (iB
19220 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69 74 65  yte<<4) + sqlite
19230 33 48 65 78 54 6f 49 6e 74 28 7a 48 65 78 4b 65  3HexToInt(zHexKe
19240 79 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  y[i]);.        i
19250 66 28 20 28 69 26 31 29 21 3d 30 20 29 20 7a 4b  f( (i&1)!=0 ) zK
19260 65 79 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b  ey[i/2] = iByte;
19270 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
19280 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62  qlite3_key_v2(db
19290 2c 20 30 2c 20 7a 4b 65 79 2c 20 69 2f 32 29 3b  , 0, zKey, i/2);
192a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
192b0 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  f.  sqlite3_free
192c0 28 7a 4f 70 65 6e 29 3b 0a 20 20 72 65 74 75 72  (zOpen);.  retur
192d0 6e 20 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 0a  n rc & 0xff;.}..
192e0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
192f0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
19300 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19310 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63  _open(.  const c
19320 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
19330 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
19340 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f  b .){.  return o
19350 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c  penDatabase(zFil
19360 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20  ename, ppDb,.   
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19380 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
19390 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
193a0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30  E_OPEN_CREATE, 0
193b0 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
193c0 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73  _open_v2(.  cons
193d0 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65  t char *filename
193e0 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ,   /* Database 
193f0 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29  filename (UTF-8)
19400 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a   */.  sqlite3 **
19410 70 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a  ppDb,         /*
19420 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20   OUT: SQLite db 
19430 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
19440 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
19450 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a      /* Flags */.
19460 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
19470 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  fs        /* Nam
19480 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20  e of VFS module 
19490 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72  to use */.){.  r
194a0 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61  eturn openDataba
194b0 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44  se(filename, ppD
194c0 62 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  b, (unsigned int
194d0 29 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d  )flags, zVfs);.}
194e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
194f0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
19500 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
19510 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
19520 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
19530 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69  n16(.  const voi
19540 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  d *zFilename, . 
19550 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a   sqlite3 **ppDb.
19560 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ){.  char const 
19570 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f  *zFilename8;   /
19580 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f  * zFilename enco
19590 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73  ded in UTF-8 ins
195a0 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a  tead of UTF-16 *
195b0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
195c0 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72  e *pVal;.  int r
195d0 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  c;..#ifdef SQLIT
195e0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
195f0 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30  OR.  if( ppDb==0
19600 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
19610 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
19620 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30  ndif.  *ppDb = 0
19630 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
19640 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
19650 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e   rc = sqlite3_in
19660 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66  itialize();.  if
19670 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
19680 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a  ;.#endif.  if( z
19690 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 7a 46  Filename==0 ) zF
196a0 69 6c 65 6e 61 6d 65 20 3d 20 22 5c 30 30 30 5c  ilename = "\000\
196b0 30 30 30 22 3b 0a 20 20 70 56 61 6c 20 3d 20 73  000";.  pVal = s
196c0 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30  qlite3ValueNew(0
196d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
196e0 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
196f0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c  , zFilename, SQL
19700 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c  ITE_UTF16NATIVE,
19710 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
19720 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20  .  zFilename8 = 
19730 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
19740 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54  (pVal, SQLITE_UT
19750 46 38 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65  F8);.  if( zFile
19760 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20  name8 ){.    rc 
19770 3d 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a  = openDatabase(z
19780 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c  Filename8, ppDb,
19790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
197a0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
197b0 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
197c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
197d0 45 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  E, 0);.    asser
197e0 74 28 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d  t( *ppDb || rc==
197f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
19800 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19810 54 45 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50  TE_OK && !DbHasP
19820 72 6f 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30  roperty(*ppDb, 0
19830 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65  , DB_SchemaLoade
19840 64 29 20 29 7b 0a 20 20 20 20 20 20 53 43 48 45  d) ){.      SCHE
19850 4d 41 5f 45 4e 43 28 2a 70 70 44 62 29 20 3d 20  MA_ENC(*ppDb) = 
19860 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c  ENC(*ppDb) = SQL
19870 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
19880 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
19890 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
198a0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
198b0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
198c0 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74  ee(pVal);..  ret
198d0 75 72 6e 20 72 63 20 26 20 30 78 66 66 3b 0a 7d  urn rc & 0xff;.}
198e0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
198f0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
19900 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
19910 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  a new collation 
19920 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68  sequence with th
19930 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
19940 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
19950 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
19960 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ation(.  sqlite3
19970 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  * db, .  const c
19980 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
19990 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
199a0 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
199b0 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
199c0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
199d0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  t,const void*).)
199e0 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
199f0 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
19a00 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65  ion_v2(db, zName
19a10 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  , enc, pCtx, xCo
19a20 6d 70 61 72 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  mpare, 0);.}../*
19a30 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
19a40 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
19a50 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
19a60 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
19a70 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
19a80 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
19a90 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  on_v2(.  sqlite3
19aa0 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  * db, .  const c
19ab0 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
19ac0 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
19ad0 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
19ae0 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
19af0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
19b00 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a  t,const void*),.
19b10 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f    void(*xDel)(vo
19b20 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
19b30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
19b40 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
19b50 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
19b60 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
19b70 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20  ) || zName==0 ) 
19b80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
19b90 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
19ba0 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
19bb0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
19bc0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
19bd0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
19be0 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65  );.  rc = create
19bf0 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
19c00 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43  ame, (u8)enc, pC
19c10 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44  tx, xCompare, xD
19c20 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  el);.  rc = sqli
19c30 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
19c40 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
19c50 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
19c60 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
19c70 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
19c80 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
19c90 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
19ca0 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
19cb0 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
19cc0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
19cd0 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
19ce0 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
19cf0 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65  tion16(.  sqlite
19d00 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
19d10 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  void *zName,.  i
19d20 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
19d30 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
19d40 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
19d50 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
19d60 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  t,const void*).)
19d70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
19d80 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
19d90 7a 4e 61 6d 65 38 3b 0a 0a 23 69 66 64 65 66 20  zName8;..#ifdef 
19da0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
19db0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
19dc0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
19dd0 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65  kOk(db) || zName
19de0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
19df0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
19e00 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
19e10 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
19e20 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
19e30 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
19e40 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65  ailed );.  zName
19e50 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36  8 = sqlite3Utf16
19e60 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d  to8(db, zName, -
19e70 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  1, SQLITE_UTF16N
19e80 41 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e  ATIVE);.  if( zN
19e90 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d  ame8 ){.    rc =
19ea0 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
19eb0 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38  (db, zName8, (u8
19ec0 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d  )enc, pCtx, xCom
19ed0 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  pare, 0);.    sq
19ee0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
19ef0 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72  zName8);.  }.  r
19f00 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
19f10 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
19f20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
19f30 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
19f40 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
19f50 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
19f60 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
19f70 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f  ** Register a co
19f80 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
19f90 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63   factory callbac
19fa0 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  k with the datab
19fb0 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
19fc0 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72  . Replace any pr
19fd0 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c  eviously install
19fe0 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
19ff0 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a  uence factory..*
1a000 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
1a010 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a  llation_needed(.
1a020 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
1a030 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65    void *pCollNee
1a040 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28  dedArg, .  void(
1a050 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f  *xCollNeeded)(vo
1a060 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74  id*,sqlite3*,int
1a070 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20   eTextRep,const 
1a080 63 68 61 72 2a 29 0a 29 7b 0a 23 69 66 64 65 66  char*).){.#ifdef
1a090 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1a0a0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1a0b0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1a0c0 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
1a0d0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1a0e0 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
1a0f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1a100 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1a110 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
1a120 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a   = xCollNeeded;.
1a130 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
1a140 64 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70  d16 = 0;.  db->p
1a150 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20  CollNeededArg = 
1a160 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a  pCollNeededArg;.
1a170 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1a180 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1a190 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1a1a0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
1a1b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1a1c0 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  16./*.** Registe
1a1d0 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  r a collation se
1a1e0 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63  quence factory c
1a1f0 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
1a200 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1a210 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20  .** db. Replace 
1a220 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69  any previously i
1a230 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69  nstalled collati
1a240 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
1a250 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ory..*/.int sqli
1a260 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
1a270 65 64 65 64 31 36 28 0a 20 20 73 71 6c 69 74 65  eded16(.  sqlite
1a280 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a  3 *db, .  void *
1a290 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20  pCollNeededArg, 
1a2a0 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65  .  void(*xCollNe
1a2b0 65 64 65 64 31 36 29 28 76 6f 69 64 2a 2c 73 71  eded16)(void*,sq
1a2c0 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74  lite3*,int eText
1a2d0 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  Rep,const void*)
1a2e0 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
1a2f0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1a300 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1a310 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1a320 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
1a330 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1a340 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1a350 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1a360 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78  >mutex);.  db->x
1a370 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a  CollNeeded = 0;.
1a380 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
1a390 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65  d16 = xCollNeede
1a3a0 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c  d16;.  db->pColl
1a3b0 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c  NeededArg = pCol
1a3c0 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71  lNeededArg;.  sq
1a3d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1a3e0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1a3f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a400 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
1a410 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
1a420 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
1a430 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
1a440 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  ED./*.** This fu
1a450 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e  nction is now an
1a460 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74   anachronism. It
1a470 20 75 73 65 64 20 74 6f 20 62 65 20 75 73 65 64   used to be used
1a480 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d   to recover from
1a490 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66   a.** malloc() f
1a4a0 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69  ailure, but SQLi
1a4b0 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73  te now does this
1a4c0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a   automatically..
1a4d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67  */.int sqlite3_g
1a4e0 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f  lobal_recover(vo
1a4f0 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  id){.  return SQ
1a500 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
1a510 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f  f../*.** Test to
1a520 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20   see whether or 
1a530 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
1a540 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69   connection is i
1a550 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20  n autocommit.** 
1a560 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52  mode.  Return TR
1a570 55 45 20 69 66 20 69 74 20 69 73 20 61 6e 64 20  UE if it is and 
1a580 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41  FALSE if not.  A
1a590 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69  utocommit mode i
1a5a0 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75  s on.** by defau
1a5b0 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20  lt.  Autocommit 
1a5c0 69 73 20 64 69 73 61 62 6c 65 64 20 62 79 20 61  is disabled by a
1a5d0 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74   BEGIN statement
1a5e0 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a   and reenabled.*
1a5f0 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f  * by the next CO
1a600 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  MMIT or ROLLBACK
1a610 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a620 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
1a630 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
1a640 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1a650 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1a660 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1a670 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
1a680 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
1a690 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
1a6a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1a6b0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
1a6c0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a  db->autoCommit;.
1a6d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
1a6e0 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
1a6f0 61 72 65 20 73 75 62 73 74 69 74 75 74 65 73 20  are substitutes 
1a700 66 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51  for constants SQ
1a710 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a  LITE_CORRUPT,.**
1a720 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20   SQLITE_MISUSE, 
1a730 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c  SQLITE_CANTOPEN,
1a740 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e   SQLITE_NOMEM an
1a750 64 20 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72  d possibly other
1a760 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61   error.** consta
1a770 6e 74 73 2e 20 20 54 68 65 79 20 73 65 72 76 65  nts.  They serve
1a780 20 74 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a   two purposes:.*
1a790 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65  *.**   1.  Serve
1a7a0 20 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74   as a convenient
1a7b0 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20   place to set a 
1a7c0 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20  breakpoint in a 
1a7d0 64 65 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20  debugger.**     
1a7e0 20 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e    to detect when
1a7f0 20 76 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63   version error c
1a800 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73  onditions occurs
1a810 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e  ..**.**   2.  In
1a820 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67  voke sqlite3_log
1a830 28 29 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  () to provide th
1a840 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f  e source code lo
1a850 63 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20  cation where.** 
1a860 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65        a low-leve
1a870 6c 20 65 72 72 6f 72 20 69 73 20 66 69 72 73 74  l error is first
1a880 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 73 74   detected..*/.st
1a890 61 74 69 63 20 69 6e 74 20 72 65 70 6f 72 74 45  atic int reportE
1a8a0 72 72 6f 72 28 69 6e 74 20 69 45 72 72 2c 20 69  rror(int iErr, i
1a8b0 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74  nt lineno, const
1a8c0 20 63 68 61 72 20 2a 7a 54 79 70 65 29 7b 0a 20   char *zType){. 
1a8d0 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 69 45 72   sqlite3_log(iEr
1a8e0 72 2c 20 22 25 73 20 61 74 20 6c 69 6e 65 20 25  r, "%s at line %
1a8f0 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20  d of [%.10s]",. 
1a900 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 79               zTy
1a910 70 65 2c 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73  pe, lineno, 20+s
1a920 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
1a930 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 45 72  ));.  return iEr
1a940 72 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  r;.}.int sqlite3
1a950 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74  CorruptError(int
1a960 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
1a970 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
1a980 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
1a990 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  0 );.  return re
1a9a0 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45  portError(SQLITE
1a9b0 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e 65 6e 6f  _CORRUPT, lineno
1a9c0 2c 20 22 64 61 74 61 62 61 73 65 20 63 6f 72 72  , "database corr
1a9d0 75 70 74 69 6f 6e 22 29 3b 0a 7d 0a 69 6e 74 20  uption");.}.int 
1a9e0 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45 72 72  sqlite3MisuseErr
1a9f0 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
1aa00 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
1aa10 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1aa20 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65 74  xLog!=0 );.  ret
1aa30 75 72 6e 20 72 65 70 6f 72 74 45 72 72 6f 72 28  urn reportError(
1aa40 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 6c  SQLITE_MISUSE, l
1aa50 69 6e 65 6e 6f 2c 20 22 6d 69 73 75 73 65 22 29  ineno, "misuse")
1aa60 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  ;.}.int sqlite3C
1aa70 61 6e 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74  antopenError(int
1aa80 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
1aa90 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
1aaa0 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
1aab0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  0 );.  return re
1aac0 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45  portError(SQLITE
1aad0 5f 43 41 4e 54 4f 50 45 4e 2c 20 6c 69 6e 65 6e  _CANTOPEN, linen
1aae0 6f 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  o, "cannot open 
1aaf0 66 69 6c 65 22 29 3b 0a 7d 0a 23 69 66 64 65 66  file");.}.#ifdef
1ab00 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
1ab10 74 20 73 71 6c 69 74 65 33 4e 6f 6d 65 6d 45 72  t sqlite3NomemEr
1ab20 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
1ab30 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
1ab40 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ab50 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65  .xLog!=0 );.  re
1ab60 74 75 72 6e 20 72 65 70 6f 72 74 45 72 72 6f 72  turn reportError
1ab70 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 6c  (SQLITE_NOMEM, l
1ab80 69 6e 65 6e 6f 2c 20 22 4f 4f 4d 22 29 3b 0a 7d  ineno, "OOM");.}
1ab90 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6f 65 72  .int sqlite3Ioer
1aba0 72 6e 6f 6d 65 6d 45 72 72 6f 72 28 69 6e 74 20  rnomemError(int 
1abb0 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63  lineno){.  testc
1abc0 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ase( sqlite3Glob
1abd0 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30  alConfig.xLog!=0
1abe0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 70   );.  return rep
1abf0 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  ortError(SQLITE_
1ac00 49 4f 45 52 52 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e  IOERR_NOMEM, lin
1ac10 65 6e 6f 2c 20 22 49 2f 4f 20 4f 4f 4d 20 65 72  eno, "I/O OOM er
1ac20 72 6f 72 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ror");.}.#endif.
1ac30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ac40 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
1ac50 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
1ac60 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74  convenience rout
1ac70 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73  ine that makes s
1ac80 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72  ure that all thr
1ac90 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  ead-specific.** 
1aca0 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68  data for this th
1acb0 72 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65  read has been de
1acc0 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
1acd0 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65   SQLite no longe
1ace0 72 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70  r uses thread-sp
1acf0 65 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74  ecific data so t
1ad00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
1ad10 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20  ow a.** no-op.  
1ad20 49 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66  It is retained f
1ad30 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f  or historical co
1ad40 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a  mpatibility..*/.
1ad50 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72  void sqlite3_thr
1ad60 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64  ead_cleanup(void
1ad70 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ){.}.#endif../*.
1ad80 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69  ** Return meta i
1ad90 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
1ada0 20 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75   a specific colu
1adb0 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  mn of a database
1adc0 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63   table..** See c
1add0 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65  omment in sqlite
1ade0 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e  3.h (sqlite.h.in
1adf0 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
1ae00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61  /.int sqlite3_ta
1ae10 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
1ae20 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ata(.  sqlite3 *
1ae30 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
1ae40 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1ae50 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e   handle */.  con
1ae60 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
1ae70 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ,        /* Data
1ae80 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c  base name or NUL
1ae90 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  L */.  const cha
1aea0 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20  r *zTableName,  
1aeb0 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65     /* Table name
1aec0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1aed0 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20   *zColumnName,  
1aee0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
1aef0 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   */.  char const
1af00 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20   **pzDataType,  
1af10 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63    /* OUTPUT: Dec
1af20 6c 61 72 65 64 20 64 61 74 61 20 74 79 70 65 20  lared data type 
1af30 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
1af40 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20  **pzCollSeq,    
1af50 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c   /* OUTPUT: Coll
1af60 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
1af70 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e  ame */.  int *pN
1af80 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20  otNull,         
1af90 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
1afa0 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c  True if NOT NULL
1afb0 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73   constraint exis
1afc0 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72  ts */.  int *pPr
1afd0 69 6d 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20  imaryKey,       
1afe0 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
1aff0 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61  rue if column pa
1b000 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e  rt of PK */.  in
1b010 74 20 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20  t *pAutoinc     
1b020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1b030 50 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c  PUT: True if col
1b040 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72  umn is auto-incr
1b050 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ement */.){.  in
1b060 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45  t rc;.  char *zE
1b070 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62  rrMsg = 0;.  Tab
1b080 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20  le *pTab = 0;.  
1b090 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30  Column *pCol = 0
1b0a0 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 30  ;.  int iCol = 0
1b0b0 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
1b0c0 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20  zDataType = 0;. 
1b0d0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
1b0e0 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74  llSeq = 0;.  int
1b0f0 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20   notnull = 0;.  
1b100 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d  int primarykey =
1b110 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e   0;.  int autoin
1b120 63 20 3d 20 30 3b 0a 0a 0a 23 69 66 64 65 66 20  c = 0;...#ifdef 
1b130 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1b140 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1b150 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1b160 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 54 61 62 6c  kOk(db) || zTabl
1b170 65 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  eName==0 ){.    
1b180 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1b190 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
1b1a0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75  endif..  /* Ensu
1b1b0 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
1b1c0 73 63 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20  schema has been 
1b1d0 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69  loaded */.  sqli
1b1e0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1b1f0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71  db->mutex);.  sq
1b200 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
1b210 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73  ll(db);.  rc = s
1b220 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26  qlite3Init(db, &
1b230 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
1b240 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
1b250 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
1b260 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  out;.  }..  /* L
1b270 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
1b280 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20  in question */. 
1b290 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
1b2a0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61  indTable(db, zTa
1b2b0 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65  bleName, zDbName
1b2c0 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c  );.  if( !pTab |
1b2d0 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
1b2e0 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b  ){.    pTab = 0;
1b2f0 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
1b300 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  out;.  }..  /* F
1b310 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66  ind the column f
1b320 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73  or which info is
1b330 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20   requested */.  
1b340 69 66 28 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 3d  if( zColumnName=
1b350 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 51 75 65  =0 ){.    /* Que
1b360 72 79 20 66 6f 72 20 65 78 69 73 74 61 6e 63 65  ry for existance
1b370 20 6f 66 20 74 61 62 6c 65 20 6f 6e 6c 79 20 2a   of table only *
1b380 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  /.  }else{.    f
1b390 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
1b3a0 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
1b3b0 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20  ++){.      pCol 
1b3c0 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
1b3d0 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  ol];.      if( 0
1b3e0 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
1b3f0 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  (pCol->zName, zC
1b400 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20  olumnName) ){.  
1b410 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1b420 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1b430 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e  f( iCol==pTab->n
1b440 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Col ){.      if(
1b450 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
1b460 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  && sqlite3IsRowi
1b470 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29  d(zColumnName) )
1b480 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d  {.        iCol =
1b490 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
1b4a0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 69 43 6f        pCol = iCo
1b4b0 6c 3e 3d 30 20 3f 20 26 70 54 61 62 2d 3e 61 43  l>=0 ? &pTab->aC
1b4c0 6f 6c 5b 69 43 6f 6c 5d 20 3a 20 30 3b 0a 20 20  ol[iCol] : 0;.  
1b4d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b4e0 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20     pTab = 0;.   
1b4f0 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
1b500 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
1b510 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
1b520 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
1b530 20 73 74 6f 72 65 73 20 74 68 65 20 6d 65 74 61   stores the meta
1b540 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61   information tha
1b550 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
1b560 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63  ed.  ** to the c
1b570 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76  aller in local v
1b580 61 72 69 61 62 6c 65 73 20 7a 44 61 74 61 54 79  ariables zDataTy
1b590 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f  pe, zCollSeq, no
1b5a0 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65  tnull, primaryke
1b5b0 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69  y.  ** and autoi
1b5c0 6e 63 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  nc. At this poin
1b5d0 74 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  t there are two 
1b5e0 70 6f 73 73 69 62 69 6c 69 74 69 65 73 3a 0a 20  possibilities:. 
1b5f0 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e   ** .  **     1.
1b600 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20 63   The specified c
1b610 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72  olumn name was r
1b620 6f 77 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20  owid", "oid" or 
1b630 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20  "_rowid_" .  ** 
1b640 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 72 65         and there
1b650 20 69 73 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c   is no explicitl
1b660 79 20 64 65 63 6c 61 72 65 64 20 49 50 4b 20 63  y declared IPK c
1b670 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a  olumn. .  **.  *
1b680 2a 20 20 20 20 20 32 2e 20 54 68 65 20 74 61 62  *     2. The tab
1b690 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77  le is not a view
1b6a0 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20   and the column 
1b6b0 6e 61 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20  name identified 
1b6c0 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  an .  **        
1b6d0 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61  explicitly decla
1b6e0 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79  red column. Copy
1b6f0 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
1b700 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20  n from *pCol..  
1b710 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29  */ .  if( pCol )
1b720 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20  {.    zDataType 
1b730 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54  = sqlite3ColumnT
1b740 79 70 65 28 70 43 6f 6c 2c 30 29 3b 0a 20 20 20  ype(pCol,0);.   
1b750 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c   zCollSeq = pCol
1b760 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74  ->zColl;.    not
1b770 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74  null = pCol->not
1b780 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69  Null!=0;.    pri
1b790 6d 61 72 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c  marykey  = (pCol
1b7a0 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c  ->colFlags & COL
1b7b0 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30  FLAG_PRIMKEY)!=0
1b7c0 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20  ;.    autoinc = 
1b7d0 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f  pTab->iPKey==iCo
1b7e0 6c 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  l && (pTab->tabF
1b7f0 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
1b800 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d  crement)!=0;.  }
1b810 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54  else{.    zDataT
1b820 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
1b830 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20  .    primarykey 
1b840 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  = 1;.  }.  if( !
1b850 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  zCollSeq ){.    
1b860 7a 43 6f 6c 6c 53 65 71 20 3d 20 73 71 6c 69 74  zCollSeq = sqlit
1b870 65 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d  e3StrBINARY;.  }
1b880 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73  ..error_out:.  s
1b890 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1b8a0 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57  All(db);..  /* W
1b8b0 68 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74  hether the funct
1b8c0 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64  ion call succeed
1b8d0 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65  ed or failed, se
1b8e0 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72  t the output par
1b8f0 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20  ameters.  ** to 
1b900 77 68 61 74 65 76 65 72 20 74 68 65 69 72 20 6c  whatever their l
1b910 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74  ocal counterpart
1b920 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e  s contain. If an
1b930 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72   error did occur
1b940 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20  ,.  ** this has 
1b950 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65  the effect of ze
1b960 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74  roing all output
1b970 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a   parameters..  *
1b980 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54 79  /.  if( pzDataTy
1b990 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65  pe ) *pzDataType
1b9a0 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20   = zDataType;.  
1b9b0 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20  if( pzCollSeq ) 
1b9c0 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f  *pzCollSeq = zCo
1b9d0 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f  llSeq;.  if( pNo
1b9e0 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c  tNull ) *pNotNul
1b9f0 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69  l = notnull;.  i
1ba00 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29  f( pPrimaryKey )
1ba10 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20   *pPrimaryKey = 
1ba20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66  primarykey;.  if
1ba30 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41  ( pAutoinc ) *pA
1ba40 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63  utoinc = autoinc
1ba50 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
1ba60 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20  OK==rc && !pTab 
1ba70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1ba80 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67  Free(db, zErrMsg
1ba90 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d  );.    zErrMsg =
1baa0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1bab0 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  db, "no such tab
1bac0 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73  le column: %s.%s
1bad0 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20  ", zTableName,. 
1bae0 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61         zColumnNa
1baf0 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
1bb00 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1bb10 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
1bb20 74 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 28 7a  thMsg(db, rc, (z
1bb30 45 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20  ErrMsg?"%s":0), 
1bb40 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
1bb50 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
1bb60 72 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73  rrMsg);.  rc = s
1bb70 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
1bb80 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
1bb90 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1bba0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1bbb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
1bbc0 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
1bbd0 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
1bbe0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
1bbf0 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e  ime slept..*/.in
1bc00 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28  t sqlite3_sleep(
1bc10 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74  int ms){.  sqlit
1bc20 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20  e3_vfs *pVfs;.  
1bc30 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d  int rc;.  pVfs =
1bc40 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
1bc50 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73  d(0);.  if( pVfs
1bc60 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1bc70 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
1bc80 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c  ion works in mil
1bc90 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74  liseconds, but t
1bca0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73  he underlying Os
1bcb0 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50  Sleep() .  ** AP
1bcc0 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f  I uses microseco
1bcd0 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31  nds. Hence the 1
1bce0 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  000's..  */.  rc
1bcf0 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65   = (sqlite3OsSle
1bd00 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73  ep(pVfs, 1000*ms
1bd10 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  )/1000);.  retur
1bd20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
1bd30 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
1bd40 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65   the extended re
1bd50 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69  sult codes..*/.i
1bd60 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  nt sqlite3_exten
1bd70 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
1bd80 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
1bd90 74 20 6f 6e 6f 66 66 29 7b 0a 23 69 66 64 65 66  t onoff){.#ifdef
1bda0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1bdb0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1bdc0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1bdd0 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
1bde0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1bdf0 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
1be00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1be10 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1be20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f   db->errMask = o
1be30 6e 6f 66 66 20 3f 20 30 78 66 66 66 66 66 66 66  noff ? 0xfffffff
1be40 66 20 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69  f : 0xff;.  sqli
1be50 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1be60 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
1be70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1be80 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
1be90 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c  the xFileControl
1bea0 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70 61 72   method on a par
1beb0 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
1bec0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1bed0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71  _file_control(sq
1bee0 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1bef0 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20   char *zDbName, 
1bf00 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
1bf10 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  rg){.  int rc = 
1bf20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1bf30 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b 0a 0a  Btree *pBtree;..
1bf40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1bf50 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1bf60 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1bf70 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
1bf80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1bf90 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
1bfa0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
1bfb0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1bfc0 65 78 29 3b 0a 20 20 70 42 74 72 65 65 20 3d 20  ex);.  pBtree = 
1bfd0 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
1bfe0 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65  tree(db, zDbName
1bff0 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  );.  if( pBtree 
1c000 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
1c010 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  ager;.    sqlite
1c020 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20  3_file *fd;.    
1c030 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1c040 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70  r(pBtree);.    p
1c050 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
1c060 74 72 65 65 50 61 67 65 72 28 70 42 74 72 65 65  treePager(pBtree
1c070 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1c080 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Pager!=0 );.    
1c090 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
1c0a0 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20  rFile(pPager);. 
1c0b0 20 20 20 61 73 73 65 72 74 28 20 66 64 21 3d 30     assert( fd!=0
1c0c0 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d   );.    if( op==
1c0d0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c  SQLITE_FCNTL_FIL
1c0e0 45 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20  E_POINTER ){.   
1c0f0 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c     *(sqlite3_fil
1c100 65 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a 20  e**)pArg = fd;. 
1c110 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c120 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
1c130 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  f( op==SQLITE_FC
1c140 4e 54 4c 5f 56 46 53 5f 50 4f 49 4e 54 45 52 20  NTL_VFS_POINTER 
1c150 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74  ){.      *(sqlit
1c160 65 33 5f 76 66 73 2a 2a 29 70 41 72 67 20 3d 20  e3_vfs**)pArg = 
1c170 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
1c180 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
1c190 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c1a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d     }else if( op=
1c1b0 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4a 4f  =SQLITE_FCNTL_JO
1c1c0 55 52 4e 41 4c 5f 50 4f 49 4e 54 45 52 20 29 7b  URNAL_POINTER ){
1c1d0 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33  .      *(sqlite3
1c1e0 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 73  _file**)pArg = s
1c1f0 71 6c 69 74 65 33 50 61 67 65 72 4a 72 6e 6c 46  qlite3PagerJrnlF
1c200 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ile(pPager);.   
1c210 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1c220 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
1c230 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b   fd->pMethods ){
1c240 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1c250 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
1c260 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a  (fd, op, pArg);.
1c270 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c280 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
1c290 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a 20 20 20  FOUND;.    }.   
1c2a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1c2b0 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
1c2c0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1c2d0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1c2e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1c2f0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ../*.** Interfac
1c300 65 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67  e to the testing
1c310 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73   logic..*/.int s
1c320 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1c330 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  rol(int op, ...)
1c340 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
1c350 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
1c360 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a  IT_BUILTIN_TEST.
1c370 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1c380 45 52 28 6f 70 29 3b 0a 23 65 6c 73 65 0a 20 20  ER(op);.#else.  
1c390 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61  va_list ap;.  va
1c3a0 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a  _start(ap, op);.
1c3b0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1c3c0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
1c3d0 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
1c3e0 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e  state of the PRN
1c3f0 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  G..    */.    ca
1c400 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1c410 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a  RL_PRNG_SAVE: {.
1c420 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e        sqlite3Prn
1c430 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20  gSaveState();.  
1c440 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c450 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1c460 52 65 73 74 6f 72 65 20 74 68 65 20 73 74 61 74  Restore the stat
1c470 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f  e of the PRNG to
1c480 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 20   the last state 
1c490 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20  saved using.    
1c4a0 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49  ** PRNG_SAVE.  I
1c4b0 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20  f PRNG_SAVE has 
1c4c0 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65  never before bee
1c4d0 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20  n called, then. 
1c4e0 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20     ** this verb 
1c4f0 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52  acts like PRNG_R
1c500 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ESET..    */.   
1c510 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1c520 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f  TCTRL_PRNG_RESTO
1c530 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  RE: {.      sqli
1c540 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74  te3PrngRestoreSt
1c550 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65  ate();.      bre
1c560 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1c570 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74  *.    ** Reset t
1c580 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20  he PRNG back to 
1c590 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  its uninitialize
1c5a0 64 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65  d state.  The ne
1c5b0 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  xt call.    ** t
1c5c0 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d  o sqlite3_random
1c5d0 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65  ness() will rese
1c5e0 65 64 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e  ed the PRNG usin
1c5f0 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a  g a single call.
1c600 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52      ** to the xR
1c610 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64  andomness method
1c620 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   of the default 
1c630 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  VFS..    */.    
1c640 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1c650 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a  CTRL_PRNG_RESET:
1c660 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1c670 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29  _randomness(0,0)
1c680 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c690 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1c6a0 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
1c6b0 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43  t_control(BITVEC
1c6c0 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f  _TEST, size, pro
1c6d0 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20  gram).    **.   
1c6e0 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61   ** Run a test a
1c6f0 67 61 69 6e 73 74 20 61 20 42 69 74 76 65 63 20  gainst a Bitvec 
1c700 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20  object of size. 
1c710 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67   The program arg
1c720 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20  ument.    ** is 
1c730 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65  an array of inte
1c740 67 65 72 73 20 74 68 61 74 20 64 65 66 69 6e 65  gers that define
1c750 73 20 74 68 65 20 74 65 73 74 2e 20 20 52 65 74  s the test.  Ret
1c760 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20  urn -1 on a.    
1c770 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ** memory alloca
1c780 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e  tion error, 0 on
1c790 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e   success, or non
1c7a0 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72  -zero for an err
1c7b0 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74  or..    ** See t
1c7c0 68 65 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  he sqlite3Bitvec
1c7d0 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f  BuiltinTest() fo
1c7e0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
1c7f0 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
1c800 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1c810 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43  _TESTCTRL_BITVEC
1c820 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69  _TEST: {.      i
1c830 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
1c840 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
1c850 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61  nt *aProg = va_a
1c860 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20  rg(ap, int*);.  
1c870 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c880 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73  BitvecBuiltinTes
1c890 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20  t(sz, aProg);.  
1c8a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c8b0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1c8c0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1c8d0 6e 74 72 6f 6c 28 46 41 55 4c 54 5f 49 4e 53 54  ntrol(FAULT_INST
1c8e0 41 4c 4c 2c 20 78 43 61 6c 6c 62 61 63 6b 29 0a  ALL, xCallback).
1c8f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 72      **.    ** Ar
1c900 72 61 6e 67 65 20 74 6f 20 69 6e 76 6f 6b 65 20  range to invoke 
1c910 78 43 61 6c 6c 62 61 63 6b 28 29 20 77 68 65 6e  xCallback() when
1c920 65 76 65 72 20 73 71 6c 69 74 65 33 46 61 75 6c  ever sqlite3Faul
1c930 74 53 69 6d 28 29 20 69 73 20 63 61 6c 6c 65 64  tSim() is called
1c940 2c 0a 20 20 20 20 2a 2a 20 69 66 20 78 43 61 6c  ,.    ** if xCal
1c950 6c 62 61 63 6b 20 69 73 20 6e 6f 74 20 4e 55 4c  lback is not NUL
1c960 4c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  L..    **.    **
1c970 20 41 73 20 61 20 74 65 73 74 20 6f 66 20 74 68   As a test of th
1c980 65 20 66 61 75 6c 74 20 73 69 6d 75 6c 61 74 6f  e fault simulato
1c990 72 20 6d 65 63 68 61 6e 69 73 6d 20 69 74 73 65  r mechanism itse
1c9a0 6c 66 2c 20 73 71 6c 69 74 65 33 46 61 75 6c 74  lf, sqlite3Fault
1c9b0 53 69 6d 28 30 29 0a 20 20 20 20 2a 2a 20 69 73  Sim(0).    ** is
1c9c0 20 63 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74   called immediat
1c9d0 65 6c 79 20 61 66 74 65 72 20 69 6e 73 74 61 6c  ely after instal
1c9e0 6c 69 6e 67 20 74 68 65 20 6e 65 77 20 63 61 6c  ling the new cal
1c9f0 6c 62 61 63 6b 20 61 6e 64 20 74 68 65 20 72 65  lback and the re
1ca00 74 75 72 6e 0a 20 20 20 20 2a 2a 20 76 61 6c 75  turn.    ** valu
1ca10 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 46 61  e from sqlite3Fa
1ca20 75 6c 74 53 69 6d 28 30 29 20 62 65 63 6f 6d 65  ultSim(0) become
1ca30 73 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f  s the return fro
1ca40 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  m.    ** sqlite3
1ca50 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e  _test_control().
1ca60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1ca70 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1ca80 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20  _FAULT_INSTALL: 
1ca90 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20  {.      /* MSVC 
1caa0 69 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70  is picky about p
1cab0 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73  ulling func ptrs
1cac0 20 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a   from va lists..
1cad0 20 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f        ** http://
1cae0 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66  support.microsof
1caf0 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20  t.com/kb/47961. 
1cb00 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47       ** sqlite3G
1cb10 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73  lobalConfig.xTes
1cb20 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61  tCallback = va_a
1cb30 72 67 28 61 70 2c 20 69 6e 74 28 2a 29 28 69 6e  rg(ap, int(*)(in
1cb40 74 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20  t));.      */.  
1cb50 20 20 20 20 74 79 70 65 64 65 66 20 69 6e 74 28      typedef int(
1cb60 2a 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e  *TESTCALLBACKFUN
1cb70 43 5f 74 29 28 69 6e 74 29 3b 0a 20 20 20 20 20  C_t)(int);.     
1cb80 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1cb90 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61  nfig.xTestCallba
1cba0 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ck = va_arg(ap, 
1cbb0 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43  TESTCALLBACKFUNC
1cbc0 5f 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  _t);.      rc = 
1cbd0 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
1cbe0 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
1cbf0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1cc00 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
1cc10 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49  est_control(BENI
1cc20 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c  GN_MALLOC_HOOKS,
1cc30 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20   xBegin, xEnd). 
1cc40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67     **.    ** Reg
1cc50 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63  ister hooks to c
1cc60 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65 20  all to indicate 
1cc70 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66  which malloc() f
1cc80 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a 20  ailures .    ** 
1cc90 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20  are benign..    
1cca0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1ccb0 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49  TE_TESTCTRL_BENI
1ccc0 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a  GN_MALLOC_HOOKS:
1ccd0 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65 66   {.      typedef
1cce0 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e   void (*void_fun
1ccf0 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20  ction)(void);.  
1cd00 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f      void_functio
1cd10 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a  n xBenignBegin;.
1cd20 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74        void_funct
1cd30 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a  ion xBenignEnd;.
1cd40 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65 67        xBenignBeg
1cd50 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  in = va_arg(ap, 
1cd60 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a  void_function);.
1cd70 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e 64        xBenignEnd
1cd80 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
1cd90 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20  id_function);.  
1cda0 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69 67      sqlite3Benig
1cdb0 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65  nMallocHooks(xBe
1cdc0 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69  nignBegin, xBeni
1cdd0 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62 72  gnEnd);.      br
1cde0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1cdf0 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1ce00 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1ce10 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1ce20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e  PENDING_BYTE, un
1ce30 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20 20  signed int X).  
1ce40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20    **.    ** Set 
1ce50 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
1ce60 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e   to the value in
1ce70 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 69   the argument, i
1ce80 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61  f X>0..    ** Ma
1ce90 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66  ke no changes if
1cea0 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20 74   X==0.  Return t
1ceb0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1cec0 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20 20  pending byte.   
1ced0 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74 69   ** as it existi
1cee0 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ng before this r
1cef0 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
1cf00 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
1cf10 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68 61   IMPORTANT:  Cha
1cf20 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e  nging the PENDIN
1cf30 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34 30  G byte from 0x40
1cf40 30 30 30 30 30 30 20 72 65 73 75 6c 74 73 20 69  000000 results i
1cf50 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f  n.    ** an inco
1cf60 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62 61 73  mpatible databas
1cf70 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20  e file format.  
1cf80 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e  Changing the PEN
1cf90 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a 2a  DING byte.    **
1cfa0 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61 62   while any datab
1cfb0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ase connection i
1cfc0 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20 69  s open results i
1cfd0 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a  n undefined and.
1cfe0 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 72 69 6f      ** deleterio
1cff0 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20  us behavior..   
1d000 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1d010 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e  ITE_TESTCTRL_PEN
1d020 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20  DING_BYTE: {.   
1d030 20 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f     rc = PENDING_
1d040 42 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53 51  BYTE;.#ifndef SQ
1d050 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20  LITE_OMIT_WSD.  
1d060 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75 6e      {.        un
1d070 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56 61  signed int newVa
1d080 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  l = va_arg(ap, u
1d090 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
1d0a0 20 20 20 20 20 20 69 66 28 20 6e 65 77 56 61 6c        if( newVal
1d0b0 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69 6e   ) sqlite3Pendin
1d0c0 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a  gByte = newVal;.
1d0d0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1d0e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d0f0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1d100 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1d110 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1d120 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 69  STCTRL_ASSERT, i
1d130 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
1d140 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20   ** This action 
1d150 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74  provides a run-t
1d160 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20  ime test to see 
1d170 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20  whether or not. 
1d180 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 77     ** assert() w
1d190 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  as enabled at co
1d1a0 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20  mpile-time.  If 
1d1b0 58 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 73  X is true and as
1d1c0 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69 73  sert().    ** is
1d1d0 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74   enabled, then t
1d1e0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1d1f0 69 73 20 74 72 75 65 2e 20 20 49 66 20 58 20 69  is true.  If X i
1d200 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20 2a  s true and.    *
1d210 2a 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  * assert() is di
1d220 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  sabled, then the
1d230 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1d240 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73 0a   zero.  If X is.
1d250 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64      ** false and
1d260 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61   assert() is ena
1d270 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 61  bled, then the a
1d280 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20 61  ssertion fires a
1d290 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72  nd the.    ** pr
1d2a0 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20 49  ocess aborts.  I
1d2b0 66 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e 64  f X is false and
1d2c0 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73   assert() is dis
1d2d0 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a  abled, then the.
1d2e0 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61      ** return va
1d2f0 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20  lue is zero..   
1d300 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1d310 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
1d320 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c  ERT: {.      vol
1d330 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b  atile int x = 0;
1d340 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2f  .      assert( /
1d350 2a 73 69 64 65 2d 65 66 66 65 63 74 73 2d 6f 6b  *side-effects-ok
1d360 2a 2f 20 28 78 20 3d 20 76 61 5f 61 72 67 28 61  */ (x = va_arg(a
1d370 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20  p,int))!=0 );.  
1d380 20 20 20 20 72 63 20 3d 20 78 3b 0a 20 20 20 20      rc = x;.    
1d390 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1d3a0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1d3b0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1d3c0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1d3d0 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74  CTRL_ALWAYS, int
1d3e0 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   X).    **.    *
1d3f0 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72  * This action pr
1d400 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d  ovides a run-tim
1d410 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 68 6f  e test to see ho
1d420 77 20 74 68 65 20 41 4c 57 41 59 53 20 61 6e 64  w the ALWAYS and
1d430 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61  .    ** NEVER ma
1d440 63 72 6f 73 20 77 65 72 65 20 64 65 66 69 6e 65  cros were define
1d450 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1d460 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1d470 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
1d480 65 20 69 73 20 41 4c 57 41 59 53 28 58 29 2e 20  e is ALWAYS(X). 
1d490 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
1d4a0 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20  The recommended 
1d4b0 74 65 73 74 20 69 73 20 58 3d 3d 32 2e 20 20 49  test is X==2.  I
1d4c0 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
1d4d0 75 65 20 69 73 20 32 2c 20 74 68 61 74 20 6d 65  ue is 2, that me
1d4e0 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59  ans.    ** ALWAY
1d4f0 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20  S() and NEVER() 
1d500 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70  are both no-op p
1d510 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72  ass-through macr
1d520 6f 73 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  os, which is the
1d530 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  .    ** default 
1d540 73 65 74 74 69 6e 67 2e 20 20 49 66 20 74 68 65  setting.  If the
1d550 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1d560 20 31 2c 20 74 68 65 6e 20 41 4c 57 41 59 53 28   1, then ALWAYS(
1d570 29 20 69 73 20 65 69 74 68 65 72 0a 20 20 20 20  ) is either.    
1d580 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64 20 74 6f  ** hard-coded to
1d590 20 74 72 75 65 20 6f 72 20 65 6c 73 65 20 69 74   true or else it
1d5a0 20 61 73 73 65 72 74 73 20 69 66 20 69 74 73 20   asserts if its 
1d5b0 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73  argument is fals
1d5c0 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69  e..    ** The fi
1d5d0 72 73 74 20 62 65 68 61 76 69 6f 72 20 28 68 61  rst behavior (ha
1d5e0 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65  rd-coded to true
1d5f0 29 20 69 73 20 74 68 65 20 63 61 73 65 20 69 66  ) is the case if
1d600 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54  .    ** SQLITE_T
1d610 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73  ESTCTRL_ASSERT s
1d620 68 6f 77 73 20 74 68 61 74 20 61 73 73 65 72 74  hows that assert
1d630 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 20 61  () is disabled a
1d640 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20  nd the second.  
1d650 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 20 28 61    ** behavior (a
1d660 73 73 65 72 74 20 69 66 20 74 68 65 20 61 72 67  ssert if the arg
1d670 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41 59 53 28  ument to ALWAYS(
1d680 29 20 69 73 20 66 61 6c 73 65 29 20 69 73 20 74  ) is false) is t
1d690 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a  he case if.    *
1d6a0 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  * SQLITE_TESTCTR
1d6b0 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74  L_ASSERT shows t
1d6c0 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20  hat assert() is 
1d6d0 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a  enabled..    **.
1d6e0 20 20 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74      ** The run-t
1d6f0 69 6d 65 20 74 65 73 74 20 70 72 6f 63 65 64 75  ime test procedu
1d700 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f  re might look so
1d710 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69  mething like thi
1d720 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
1d730 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
1d740 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1d750 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
1d760 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20  AYS, 2)==2 ){.  
1d770 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
1d780 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28  AYS() and NEVER(
1d790 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73  ) are no-op pass
1d7a0 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a  -through macros.
1d7b0 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20      **    }else 
1d7c0 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74  if( sqlite3_test
1d7d0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1d7e0 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c  TESTCTRL_ASSERT,
1d7f0 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20   1) ){.    **   
1d800 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20     // ALWAYS(x) 
1d810 61 73 73 65 72 74 73 20 74 68 61 74 20 78 20 69  asserts that x i
1d820 73 20 74 72 75 65 2e 20 4e 45 56 45 52 28 78 29  s true. NEVER(x)
1d830 20 61 73 73 65 72 74 73 20 78 20 69 73 20 66 61   asserts x is fa
1d840 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d  lse..    **    }
1d850 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20  else{.    **    
1d860 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 69    // ALWAYS(x) i
1d870 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20  s a constant 1. 
1d880 20 4e 45 56 45 52 28 78 29 20 69 73 20 61 20 63   NEVER(x) is a c
1d890 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a  onstant 0..    *
1d8a0 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20  *    }.    */.  
1d8b0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1d8c0 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b  STCTRL_ALWAYS: {
1d8d0 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76  .      int x = v
1d8e0 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
1d8f0 20 20 20 20 20 72 63 20 3d 20 41 4c 57 41 59 53       rc = ALWAYS
1d900 28 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  (x);.      break
1d910 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1d920 20 20 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33      **   sqlite3
1d930 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1d940 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59  LITE_TESTCTRL_BY
1d950 54 45 4f 52 44 45 52 29 3b 0a 20 20 20 20 2a 2a  TEORDER);.    **
1d960 0a 20 20 20 20 2a 2a 20 54 68 65 20 69 6e 74 65  .    ** The inte
1d970 67 65 72 20 72 65 74 75 72 6e 65 64 20 72 65 76  ger returned rev
1d980 65 61 6c 73 20 74 68 65 20 62 79 74 65 2d 6f 72  eals the byte-or
1d990 64 65 72 20 6f 66 20 74 68 65 20 63 6f 6d 70 75  der of the compu
1d9a0 74 65 72 20 6f 6e 20 77 68 69 63 68 0a 20 20 20  ter on which.   
1d9b0 20 2a 2a 20 53 51 4c 69 74 65 20 69 73 20 72 75   ** SQLite is ru
1d9c0 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20 20  nning:.    **.  
1d9d0 20 20 2a 2a 20 20 20 20 20 20 20 31 20 20 20 20    **       1    
1d9e0 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20   big-endian,    
1d9f0 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75  determined at ru
1da00 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 20  n-time.    **   
1da10 20 20 20 31 30 20 20 20 20 20 6c 69 74 74 6c 65     10     little
1da20 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69  -endian, determi
1da30 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a  ned at run-time.
1da40 20 20 20 20 2a 2a 20 20 34 33 32 31 30 31 20 20      **  432101  
1da50 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20     big-endian,  
1da60 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20    determined at 
1da70 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20  compile-time.   
1da80 20 2a 2a 20 20 31 32 33 34 31 30 20 20 20 20 20   **  123410     
1da90 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64  little-endian, d
1daa0 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d  etermined at com
1dab0 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2f  pile-time.    */
1dac0 20 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54   .    case SQLIT
1dad0 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f  E_TESTCTRL_BYTEO
1dae0 52 44 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 63  RDER: {.      rc
1daf0 20 3d 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52   = SQLITE_BYTEOR
1db00 44 45 52 2a 31 30 30 20 2b 20 53 51 4c 49 54 45  DER*100 + SQLITE
1db10 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e 2a 31 30  _LITTLEENDIAN*10
1db20 20 2b 20 53 51 4c 49 54 45 5f 42 49 47 45 4e 44   + SQLITE_BIGEND
1db30 49 41 4e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IAN;.      break
1db40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1db50 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1db60 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1db70 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20  STCTRL_RESERVE, 
1db80 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
1db90 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   N).    **.    *
1dba0 2a 20 53 65 74 20 74 68 65 20 6e 52 65 73 65 72  * Set the nReser
1dbb0 76 65 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72  ve size to N for
1dbc0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
1dbd0 73 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  se on the databa
1dbe0 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63  se.    ** connec
1dbf0 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a  tion db..    */.
1dc00 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1dc10 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45  TESTCTRL_RESERVE
1dc20 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1dc30 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61  3 *db = va_arg(a
1dc40 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  p, sqlite3*);.  
1dc50 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61      int x = va_a
1dc60 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
1dc70 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1dc80 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
1dc90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
1dca0 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
1dcb0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20  db->aDb[0].pBt, 
1dcc0 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, x, 0);.      
1dcd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1dce0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1dcf0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1dd00 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69   }..    /*  sqli
1dd10 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1dd20 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1dd30 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20  _OPTIMIZATIONS, 
1dd40 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
1dd50 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   N).    **.    *
1dd60 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
1dd70 62 6c 65 20 76 61 72 69 6f 75 73 20 6f 70 74 69  ble various opti
1dd80 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74 65  mizations for te
1dd90 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20  sting purposes. 
1dda0 20 54 68 65 20 0a 20 20 20 20 2a 2a 20 61 72 67   The .    ** arg
1ddb0 75 6d 65 6e 74 20 4e 20 69 73 20 61 20 62 69 74  ument N is a bit
1ddc0 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61  mask of optimiza
1ddd0 74 69 6f 6e 73 20 74 6f 20 62 65 20 64 69 73 61  tions to be disa
1dde0 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61  bled.  For norma
1ddf0 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69  l.    ** operati
1de00 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 30  on N should be 0
1de10 2e 20 20 54 68 65 20 69 64 65 61 20 69 73 20 74  .  The idea is t
1de20 68 61 74 20 61 20 74 65 73 74 20 70 72 6f 67 72  hat a test progr
1de30 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20 20 20  am (like the.   
1de40 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54 65   ** SQL Logic Te
1de50 73 74 20 6f 72 20 53 4c 54 20 74 65 73 74 20 6d  st or SLT test m
1de60 6f 64 75 6c 65 29 20 63 61 6e 20 72 75 6e 20 74  odule) can run t
1de70 68 65 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74  he same SQL mult
1de80 69 70 6c 65 20 74 69 6d 65 73 0a 20 20 20 20 2a  iple times.    *
1de90 2a 20 77 69 74 68 20 76 61 72 69 6f 75 73 20 6f  * with various o
1dea0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73  ptimizations dis
1deb0 61 62 6c 65 64 20 74 6f 20 76 65 72 69 66 79 20  abled to verify 
1dec0 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e  that the same an
1ded0 73 77 65 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f  swer.    ** is o
1dee0 62 74 61 69 6e 65 64 20 69 6e 20 65 76 65 72 79  btained in every
1def0 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
1df00 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1df10 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
1df20 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73 71  IONS: {.      sq
1df30 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
1df40 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
1df50 3b 0a 20 20 20 20 20 20 64 62 2d 3e 64 62 4f 70  ;.      db->dbOp
1df60 74 46 6c 61 67 73 20 3d 20 28 75 31 36 29 28 76  tFlags = (u16)(v
1df70 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 20 26  a_arg(ap, int) &
1df80 20 30 78 66 66 66 66 29 3b 0a 20 20 20 20 20 20   0xffff);.      
1df90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
1dfa0 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45  fdef SQLITE_N_KE
1dfb0 59 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73 71 6c  YWORD.    /* sql
1dfc0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1dfd0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1dfe0 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63 6f 6e  L_ISKEYWORD, con
1dff0 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 29 0a  st char *zWord).
1e000 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
1e010 20 7a 57 6f 72 64 20 69 73 20 61 20 6b 65 79 77   zWord is a keyw
1e020 6f 72 64 20 72 65 63 6f 67 6e 69 7a 65 64 20 62  ord recognized b
1e030 79 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68  y the parser, th
1e040 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 20 20  en return the.  
1e050 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6b    ** number of k
1e060 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 69 66 20  eywords.  Or if 
1e070 7a 57 6f 72 64 20 69 73 20 6e 6f 74 20 61 20 6b  zWord is not a k
1e080 65 79 77 6f 72 64 2c 20 72 65 74 75 72 6e 20 30  eyword, return 0
1e090 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
1e0a0 20 54 68 69 73 20 74 65 73 74 20 66 65 61 74 75   This test featu
1e0b0 72 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  re is only avail
1e0c0 61 62 6c 65 20 69 6e 20 74 68 65 20 61 6d 61 6c  able in the amal
1e0d0 67 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65 0a 20  gamation since. 
1e0e0 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45     ** the SQLITE
1e0f0 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63 72 6f  _N_KEYWORD macro
1e100 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20   is not defined 
1e110 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69 66 20  in this file if 
1e120 53 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20 69 73  SQLite.    ** is
1e130 20 62 75 69 6c 74 20 75 73 69 6e 67 20 73 65 70   built using sep
1e140 61 72 61 74 65 20 73 6f 75 72 63 65 20 66 69 6c  arate source fil
1e150 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  es..    */.    c
1e160 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1e170 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20 7b  TRL_ISKEYWORD: {
1e180 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1e190 72 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f 61 72  r *zWord = va_ar
1e1a0 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
1e1b0 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  *);.      int n 
1e1c0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1e1d0 30 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20 20 20  0(zWord);.      
1e1e0 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4b 65 79  rc = (sqlite3Key
1e1f0 77 6f 72 64 43 6f 64 65 28 28 75 38 2a 29 7a 57  wordCode((u8*)zW
1e200 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44 29 20  ord, n)!=TK_ID) 
1e210 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  ? SQLITE_N_KEYWO
1e220 52 44 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72  RD : 0;.      br
1e230 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1e240 66 20 0a 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  f ..    /* sqlit
1e250 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1e260 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e270 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 2c 20 73  SCRATCHMALLOC, s
1e280 7a 2c 20 26 70 4e 65 77 2c 20 70 46 72 65 65 29  z, &pNew, pFree)
1e290 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1e2a0 50 61 73 73 20 70 46 72 65 65 20 69 6e 74 6f 20  Pass pFree into 
1e2b0 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
1e2c0 65 65 28 29 2e 20 0a 20 20 20 20 2a 2a 20 49 66  ee(). .    ** If
1e2d0 20 73 7a 3e 30 20 74 68 65 6e 20 61 6c 6c 6f 63   sz>0 then alloc
1e2e0 61 74 65 20 61 20 73 63 72 61 74 63 68 20 62 75  ate a scratch bu
1e2f0 66 66 65 72 20 69 6e 74 6f 20 70 4e 65 77 2e 20  ffer into pNew. 
1e300 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73   .    */.    cas
1e310 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1e320 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 3a  L_SCRATCHMALLOC:
1e330 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
1e340 46 72 65 65 2c 20 2a 2a 70 70 4e 65 77 3b 0a 20  Free, **ppNew;. 
1e350 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20       int sz;.   
1e360 20 20 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61     sz = va_arg(a
1e370 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 70  p, int);.      p
1e380 70 4e 65 77 20 3d 20 76 61 5f 61 72 67 28 61 70  pNew = va_arg(ap
1e390 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20 20 20 20 20  , void**);.     
1e3a0 20 70 46 72 65 65 20 3d 20 76 61 5f 61 72 67 28   pFree = va_arg(
1e3b0 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
1e3c0 20 20 69 66 28 20 73 7a 20 29 20 2a 70 70 4e 65    if( sz ) *ppNe
1e3d0 77 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74  w = sqlite3Scrat
1e3e0 63 68 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20  chMalloc(sz);.  
1e3f0 20 20 20 20 73 71 6c 69 74 65 33 53 63 72 61 74      sqlite3Scrat
1e400 63 68 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20  chFree(pFree);. 
1e410 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e420 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
1e430 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1e440 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1e450 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
1e460 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20  , int onoff);.  
1e470 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70    **.    ** If p
1e480 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69  arameter onoff i
1e490 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66  s non-zero, conf
1e4a0 69 67 75 72 65 20 74 68 65 20 77 72 61 70 70 65  igure the wrappe
1e4b0 72 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 0a 20  rs so that all. 
1e4c0 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74     ** subsequent
1e4d0 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c 74   calls to localt
1e4e0 69 6d 65 28 29 20 61 6e 64 20 76 61 72 69 61 6e  ime() and varian
1e4f0 74 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66  ts fail. If onof
1e500 66 20 69 73 20 7a 65 72 6f 2c 0a 20 20 20 20 2a  f is zero,.    *
1e510 2a 20 75 6e 64 6f 20 74 68 69 73 20 73 65 74 74  * undo this sett
1e520 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
1e530 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1e540 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46  CTRL_LOCALTIME_F
1e550 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  AULT: {.      sq
1e560 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1e570 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c  g.bLocaltimeFaul
1e580 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
1e590 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
1e5a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1e5b0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1e5c0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1e5d0 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52  STCTRL_NEVER_COR
1e5e0 52 55 50 54 2c 20 69 6e 74 29 3b 0a 20 20 20 20  RUPT, int);.    
1e5f0 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 6f 72  **.    ** Set or
1e600 20 63 6c 65 61 72 20 61 20 66 6c 61 67 20 74 68   clear a flag th
1e610 61 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  at indicates tha
1e620 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1e630 69 6c 65 20 69 73 20 61 6c 77 61 79 73 20 77 65  ile is always we
1e640 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 65  ll-.    ** forme
1e650 64 20 61 6e 64 20 6e 65 76 65 72 20 63 6f 72 72  d and never corr
1e660 75 70 74 2e 20 20 54 68 69 73 20 66 6c 61 67 20  upt.  This flag 
1e670 69 73 20 63 6c 65 61 72 20 62 79 20 64 65 66 61  is clear by defa
1e680 75 6c 74 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ult, indicating 
1e690 74 68 61 74 0a 20 20 20 20 2a 2a 20 64 61 74 61  that.    ** data
1e6a0 62 61 73 65 20 66 69 6c 65 73 20 6d 69 67 68 74  base files might
1e6b0 20 68 61 76 65 20 61 72 62 69 74 72 61 72 79 20   have arbitrary 
1e6c0 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 53 65 74  corruption.  Set
1e6d0 74 69 6e 67 20 74 68 65 20 66 6c 61 67 20 64 75  ting the flag du
1e6e0 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74 65 73 74  ring.    ** test
1e6f0 69 6e 67 20 63 61 75 73 65 73 20 63 65 72 74 61  ing causes certa
1e700 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
1e710 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
1e720 64 65 20 74 6f 20 62 65 20 61 63 74 69 76 61 74  de to be activat
1e730 65 64 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  ed.    ** that d
1e740 65 6d 6f 6e 73 74 72 61 74 20 69 6e 76 61 72 69  emonstrat invari
1e750 61 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d 66 6f 72  ants on well-for
1e760 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
1e770 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  es..    */.    c
1e780 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1e790 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50  TRL_NEVER_CORRUP
1e7a0 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
1e7b0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
1e7c0 65 76 65 72 43 6f 72 72 75 70 74 20 3d 20 76 61  everCorrupt = va
1e7d0 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
1e7e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e7f0 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  }..    /* Set th
1e800 65 20 74 68 72 65 73 68 6f 6c 64 20 61 74 20 77  e threshold at w
1e810 68 69 63 68 20 4f 50 5f 4f 6e 63 65 20 63 6f 75  hich OP_Once cou
1e820 6e 74 65 72 73 20 72 65 73 65 74 20 62 61 63 6b  nters reset back
1e830 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2a   to zero..    **
1e840 20 42 79 20 64 65 66 61 75 6c 74 20 74 68 69 73   By default this
1e850 20 69 73 20 30 78 37 66 66 66 66 66 66 65 20 28   is 0x7ffffffe (
1e860 6f 76 65 72 20 32 20 62 69 6c 6c 69 6f 6e 29 2c  over 2 billion),
1e870 20 62 75 74 20 74 68 61 74 20 76 61 6c 75 65 20   but that value 
1e880 69 73 0a 20 20 20 20 2a 2a 20 74 6f 6f 20 62 69  is.    ** too bi
1e890 67 20 74 6f 20 74 65 73 74 20 69 6e 20 61 20 72  g to test in a r
1e8a0 65 61 73 6f 6e 61 62 6c 65 20 61 6d 6f 75 6e 74  easonable amount
1e8b0 20 6f 66 20 74 69 6d 65 2c 20 73 6f 20 74 68 69   of time, so thi
1e8c0 73 20 63 6f 6e 74 72 6f 6c 20 69 73 0a 20 20 20  s control is.   
1e8d0 20 2a 2a 20 70 72 6f 76 69 64 65 64 20 74 6f 20   ** provided to 
1e8e0 73 65 74 20 61 20 73 6d 61 6c 6c 20 61 6e 64 20  set a small and 
1e8f0 65 61 73 69 6c 79 20 72 65 61 63 68 61 62 6c 65  easily reachable
1e900 20 72 65 73 65 74 20 76 61 6c 75 65 2e 0a 20 20   reset value..  
1e910 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1e920 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 4e  LITE_TESTCTRL_ON
1e930 43 45 5f 52 45 53 45 54 5f 54 48 52 45 53 48 4f  CE_RESET_THRESHO
1e940 4c 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LD: {.      sqli
1e950 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1e960 69 4f 6e 63 65 52 65 73 65 74 54 68 72 65 73 68  iOnceResetThresh
1e970 6f 6c 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  old = va_arg(ap,
1e980 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
1e990 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1e9a0 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1e9b0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1e9c0 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f  TESTCTRL_VDBE_CO
1e9d0 56 45 52 41 47 45 2c 20 78 43 61 6c 6c 62 61 63  VERAGE, xCallbac
1e9e0 6b 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a 0a  k, ptr);.    **.
1e9f0 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 56      ** Set the V
1ea00 44 42 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c  DBE coverage cal
1ea10 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74  lback function t
1ea20 6f 20 78 43 61 6c 6c 62 61 63 6b 20 77 69 74 68  o xCallback with
1ea30 20 63 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2a   context .    **
1ea40 20 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20 20   pointer ptr..  
1ea50 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1ea60 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44  LITE_TESTCTRL_VD
1ea70 42 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a 23  BE_COVERAGE: {.#
1ea80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
1ea90 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20  E_COVERAGE.     
1eaa0 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a   typedef void (*
1eab0 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29  branch_callback)
1eac0 28 76 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c 75 38  (void*,int,u8,u8
1ead0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1eae0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64  GlobalConfig.xVd
1eaf0 62 65 42 72 61 6e 63 68 20 3d 20 76 61 5f 61 72  beBranch = va_ar
1eb00 67 28 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c  g(ap,branch_call
1eb10 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  back);.      sql
1eb20 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1eb30 2e 70 56 64 62 65 42 72 61 6e 63 68 41 72 67 20  .pVdbeBranchArg 
1eb40 3d 20 76 61 5f 61 72 67 28 61 70 2c 76 6f 69 64  = va_arg(ap,void
1eb50 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  *);.#endif.     
1eb60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1eb70 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1eb80 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1eb90 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52  ITE_TESTCTRL_SOR
1eba0 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d  TER_MMAP, db, nM
1ebb0 61 78 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65  ax); */.    case
1ebc0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1ebd0 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a  _SORTER_MMAP: {.
1ebe0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1ebf0 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
1ec00 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
1ec10 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d  db->nMaxSorterMm
1ec20 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
1ec30 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
1ec40 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1ec50 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1ec60 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1ec70 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 29 3b  ESTCTRL_ISINIT);
1ec80 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
1ec90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1eca0 69 66 20 53 51 4c 69 74 65 20 68 61 73 20 62 65  if SQLite has be
1ecb0 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  en initialized a
1ecc0 6e 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  nd SQLITE_ERROR 
1ecd0 69 66 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20  if.    ** not.. 
1ece0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1ecf0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
1ed00 53 49 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20 69  SINIT: {.      i
1ed10 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
1ed20 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30  Config.isInit==0
1ed30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45   ) rc = SQLITE_E
1ed40 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
1ed50 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1ed60 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1ed70 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1ed80 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c  STCTRL_IMPOSTER,
1ed90 20 64 62 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f   db, dbName, onO
1eda0 66 66 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 2a  ff, tnum);.    *
1edb0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65  *.    ** This te
1edc0 73 74 20 63 6f 6e 74 72 6f 6c 20 69 73 20 75 73  st control is us
1edd0 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 6d 70  ed to create imp
1ede0 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20 22  oster tables.  "
1edf0 64 62 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72  db" is a pointer
1ee00 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64  .    ** to the d
1ee10 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1ee20 6f 6e 2e 20 20 64 62 4e 61 6d 65 20 69 73 20 74  on.  dbName is t
1ee30 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
1ee40 20 28 65 78 3a 20 22 6d 61 69 6e 22 20 6f 72 0a   (ex: "main" or.
1ee50 20 20 20 20 2a 2a 20 22 74 65 6d 70 22 29 20 77      ** "temp") w
1ee60 68 69 63 68 20 77 69 6c 6c 20 72 65 63 65 69 76  hich will receiv
1ee70 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72 2e 20  e the imposter. 
1ee80 20 22 6f 6e 4f 66 66 22 20 74 75 72 6e 73 20 69   "onOff" turns i
1ee90 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 0a  mposter mode on.
1eea0 20 20 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20      ** or off.  
1eeb0 22 74 6e 75 6d 22 20 69 73 20 74 68 65 20 72 6f  "tnum" is the ro
1eec0 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
1eed0 2d 74 72 65 65 20 74 6f 20 77 68 69 63 68 20 74  -tree to which t
1eee0 68 65 20 69 6d 70 6f 73 74 65 72 0a 20 20 20 20  he imposter.    
1eef0 2a 2a 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  ** table should 
1ef00 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 2a 2a 0a  connect..    **.
1ef10 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 69 6d      ** Enable im
1ef20 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 6c 79  poster mode only
1ef30 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
1ef40 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1ef50 6e 20 70 61 72 73 65 64 2e 20 20 54 68 65 6e 0a  n parsed.  Then.
1ef60 20 20 20 20 2a 2a 20 72 75 6e 20 61 20 73 69 6e      ** run a sin
1ef70 67 6c 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  gle CREATE TABLE
1ef80 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 63 6f   statement to co
1ef90 6e 73 74 72 75 63 74 20 74 68 65 20 69 6d 70 6f  nstruct the impo
1efa0 73 74 65 72 20 74 61 62 6c 65 20 69 6e 0a 20 20  ster table in.  
1efb0 20 20 2a 2a 20 74 68 65 20 70 61 72 73 65 64 20    ** the parsed 
1efc0 73 63 68 65 6d 61 2e 20 20 54 68 65 6e 20 74 75  schema.  Then tu
1efd0 72 6e 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65  rn imposter mode
1efe0 20 62 61 63 6b 20 6f 66 66 20 61 67 61 69 6e 2e   back off again.
1eff0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1f000 66 20 6f 6e 4f 66 66 3d 3d 30 20 61 6e 64 20 74  f onOff==0 and t
1f010 6e 75 6d 3e 30 20 74 68 65 6e 20 72 65 73 65 74  num>0 then reset
1f020 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
1f030 61 6c 6c 20 64 61 74 61 62 61 73 65 73 2c 20 63  all databases, c
1f040 61 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  ausing.    ** th
1f050 65 20 73 63 68 65 6d 61 20 74 6f 20 62 65 20 72  e schema to be r
1f060 65 70 61 72 73 65 64 20 74 68 65 20 6e 65 78 74  eparsed the next
1f070 20 74 69 6d 65 20 69 74 20 69 73 20 6e 65 65 64   time it is need
1f080 65 64 2e 20 20 54 68 69 73 20 68 61 73 20 74 68  ed.  This has th
1f090 65 0a 20 20 20 20 2a 2a 20 65 66 66 65 63 74 20  e.    ** effect 
1f0a0 6f 66 20 65 72 61 73 69 6e 67 20 61 6c 6c 20 69  of erasing all i
1f0b0 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 0a  mposter tables..
1f0c0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1f0d0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1f0e0 49 4d 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20  IMPOSTER: {.    
1f0f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1f100 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1f110 65 33 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e3*);.      sqli
1f120 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1f130 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
1f140 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d    db->init.iDb =
1f150 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
1f160 6d 65 28 64 62 2c 20 76 61 5f 61 72 67 28 61 70  me(db, va_arg(ap
1f170 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a  ,const char*));.
1f180 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62        db->init.b
1f190 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69  usy = db->init.i
1f1a0 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 3d 20 76  mposterTable = v
1f1b0 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
1f1c0 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65       db->init.ne
1f1d0 77 54 6e 75 6d 20 3d 20 76 61 5f 61 72 67 28 61  wTnum = va_arg(a
1f1e0 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  p,int);.      if
1f1f0 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
1f200 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e  =0 && db->init.n
1f210 65 77 54 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20  ewTnum>0 ){.    
1f220 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
1f230 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e  AllSchemasOfConn
1f240 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20  ection(db);.    
1f250 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1f260 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1f270 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
1f280 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1f290 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23  .  va_end(ap);.#
1f2a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1f2b0 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53  OMIT_BUILTIN_TES
1f2c0 54 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  T */.  return rc
1f2d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1f2e0 69 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75  is a utility rou
1f2f0 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20  tine, useful to 
1f300 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
1f310 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73  ons, that checks
1f320 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20  .** to see if a 
1f330 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 61  database file wa
1f340 73 20 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e  s a URI that con
1f350 74 61 69 6e 65 64 20 61 20 73 70 65 63 69 66 69  tained a specifi
1f360 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61  c query .** para
1f370 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f  meter, and if so
1f380 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c   obtains the val
1f390 75 65 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  ue of the query 
1f3a0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
1f3b0 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
1f3c0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
1f3d0 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20  ilename pointer 
1f3e0 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20  passed into the 
1f3f0 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f  xOpen().** metho
1f400 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65  d of a VFS imple
1f410 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
1f420 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20  zParam argument 
1f430 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
1f440 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61  he.** query para
1f450 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20  meter we seek.  
1f460 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1f470 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  urns the value o
1f480 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20  f the zParam.** 
1f490 70 61 72 61 6d 65 74 65 72 20 69 66 20 69 74 20  parameter if it 
1f4a0 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65 20  exists.  If the 
1f4b0 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e  parameter does n
1f4c0 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 72  ot exist, this r
1f4d0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
1f4e0 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
1f4f0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
1f500 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72  *sqlite3_uri_par
1f510 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61  ameter(const cha
1f520 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f  r *zFilename, co
1f530 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
1f540 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  ){.  if( zFilena
1f550 6d 65 3d 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d  me==0 || zParam=
1f560 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1f570 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
1f580 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
1f590 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
1f5a0 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65  while( zFilename
1f5b0 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78  [0] ){.    int x
1f5c0 20 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e   = strcmp(zFilen
1f5d0 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20  ame, zParam);.  
1f5e0 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
1f5f0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1f600 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
1f610 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65     if( x==0 ) re
1f620 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
1f630 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d      zFilename +=
1f640 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1f650 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b  (zFilename) + 1;
1f660 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1f670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1f680 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
1f690 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72   for a query par
1f6a0 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ameter..*/.int s
1f6b0 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
1f6c0 61 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  an(const char *z
1f6d0 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20  Filename, const 
1f6e0 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e  char *zParam, in
1f6f0 74 20 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73  t bDflt){.  cons
1f700 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  t char *z = sqli
1f710 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
1f720 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  r(zFilename, zPa
1f730 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20  ram);.  bDflt = 
1f740 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75  bDflt!=0;.  retu
1f750 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65  rn z ? sqlite3Ge
1f760 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c  tBoolean(z, bDfl
1f770 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f  t) : bDflt;.}../
1f780 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34  *.** Return a 64
1f790 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
1f7a0 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20 70  ue for a query p
1f7b0 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c  arameter..*/.sql
1f7c0 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74  ite3_int64 sqlit
1f7d0 65 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20  e3_uri_int64(.  
1f7e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1f7f0 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c  ename,    /* Fil
1f800 65 6e 61 6d 65 20 61 73 20 70 61 73 73 65 64 20  ename as passed 
1f810 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f  to xOpen */.  co
1f820 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
1f830 2c 20 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70  ,       /* URI p
1f840 61 72 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20  arameter sought 
1f850 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
1f860 36 34 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f  64 bDflt       /
1f870 2a 20 72 65 74 75 72 6e 20 69 66 20 70 61 72 61  * return if para
1f880 6d 65 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67  meter is missing
1f890 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
1f8a0 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
1f8b0 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a  _uri_parameter(z
1f8c0 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d  Filename, zParam
1f8d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  );.  sqlite3_int
1f8e0 36 34 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26  64 v;.  if( z &&
1f8f0 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78   sqlite3DecOrHex
1f900 54 6f 49 36 34 28 7a 2c 20 26 76 29 3d 3d 53 51  ToI64(z, &v)==SQ
1f910 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62  LITE_OK ){.    b
1f920 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20  Dflt = v;.  }.  
1f930 72 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a  return bDflt;.}.
1f940 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1f950 65 20 42 74 72 65 65 20 70 6f 69 6e 74 65 72 20  e Btree pointer 
1f960 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a 44  identified by zD
1f970 62 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e  bName.  Return N
1f980 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
1f990 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69  ..*/.Btree *sqli
1f9a0 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65  te3DbNameToBtree
1f9b0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
1f9c0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
1f9d0 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  e){.  int i;.  f
1f9e0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
1f9f0 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
1fa00 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 0a   db->aDb[i].pBt.
1fa10 20 20 20 20 20 26 26 20 28 7a 44 62 4e 61 6d 65       && (zDbName
1fa20 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
1fa30 72 49 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 64  rICmp(zDbName, d
1fa40 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61  b->aDb[i].zDbSNa
1fa50 6d 65 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20  me)==0).    ){. 
1fa60 20 20 20 20 20 72 65 74 75 72 6e 20 64 62 2d 3e       return db->
1fa70 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
1fa80 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1fa90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1faa0 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f  n the filename o
1fab0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
1fac0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
1fad0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
1fae0 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73  nection..*/.cons
1faf0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
1fb00 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69  db_filename(sqli
1fb10 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
1fb20 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20  har *zDbName){. 
1fb30 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23 69 66   Btree *pBt;.#if
1fb40 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1fb50 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1fb60 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1fb70 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
1fb80 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
1fb90 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
1fba0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
1fbb0 65 6e 64 69 66 0a 20 20 70 42 74 20 3d 20 73 71  endif.  pBt = sq
1fbc0 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72  lite3DbNameToBtr
1fbd0 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b  ee(db, zDbName);
1fbe0 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20  .  return pBt ? 
1fbf0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
1fc00 69 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a 20 30  ilename(pBt) : 0
1fc10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1fc20 6e 20 31 20 69 66 20 64 61 74 61 62 61 73 65 20  n 1 if database 
1fc30 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  is read-only or 
1fc40 30 20 69 66 20 72 65 61 64 2f 77 72 69 74 65 2e  0 if read/write.
1fc50 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a    Return -1 if.*
1fc60 2a 20 6e 6f 20 73 75 63 68 20 64 61 74 61 62 61  * no such databa
1fc70 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e  se exists..*/.in
1fc80 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61  t sqlite3_db_rea
1fc90 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a 64  donly(sqlite3 *d
1fca0 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1fcb0 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65  DbName){.  Btree
1fcc0 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53 51   *pBt;.#ifdef SQ
1fcd0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1fce0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1fcf0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1fd00 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
1fd10 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
1fd20 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
1fd30 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n -1;.  }.#endif
1fd40 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33  .  pBt = sqlite3
1fd50 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62  DbNameToBtree(db
1fd60 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65  , zDbName);.  re
1fd70 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74  turn pBt ? sqlit
1fd80 65 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c  e3BtreeIsReadonl
1fd90 79 28 70 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a 0a  y(pBt) : -1;.}..
1fda0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1fdb0 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a  ABLE_SNAPSHOT./*
1fdc0 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 73 6e 61  .** Obtain a sna
1fdd0 70 73 68 6f 74 20 68 61 6e 64 6c 65 20 66 6f 72  pshot handle for
1fde0 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 6f 66   the snapshot of
1fdf0 20 64 61 74 61 62 61 73 65 20 7a 44 62 20 63 75   database zDb cu
1fe00 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 62 65 69 6e  rrently .** bein
1fe10 67 20 72 65 61 64 20 62 79 20 68 61 6e 64 6c 65  g read by handle
1fe20 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
1fe30 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74  te3_snapshot_get
1fe40 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1fe50 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
1fe60 7a 44 62 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73  zDb,.  sqlite3_s
1fe70 6e 61 70 73 68 6f 74 20 2a 2a 70 70 53 6e 61 70  napshot **ppSnap
1fe80 73 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63  shot.){.  int rc
1fe90 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1fea0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1feb0 4f 4d 49 54 5f 57 41 4c 0a 20 20 69 6e 74 20 69  OMIT_WAL.  int i
1fec0 44 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  Db;..#ifdef SQLI
1fed0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1fee0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1fef0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1ff00 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
1ff10 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1ff20 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
1ff30 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1ff40 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1ff50 29 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  );..  iDb = sqli
1ff60 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
1ff70 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 69 44  , zDb);.  if( iD
1ff80 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b  b==0 || iDb>1 ){
1ff90 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
1ffa0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
1ffb0 42 74 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73  Bt;.    if( 0==s
1ffc0 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
1ffd0 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
1ffe0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1fff0 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
20000 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Bt, 0);.      if
20010 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20020 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
20030 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70  sqlite3PagerSnap
20040 73 68 6f 74 47 65 74 28 73 71 6c 69 74 65 33 42  shotGet(sqlite3B
20050 74 72 65 65 50 61 67 65 72 28 70 42 74 29 2c 20  treePager(pBt), 
20060 70 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20  ppSnapshot);.   
20070 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
20080 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
20090 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
200a0 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53 51  ;.#endif   /* SQ
200b0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
200c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
200d0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65  ./*.** Open a re
200e0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ad-transaction o
200f0 6e 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 69  n the snapshot i
20100 64 65 6e 64 69 66 69 65 64 20 62 79 20 70 53 6e  dendified by pSn
20110 61 70 73 68 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73  apshot..*/.int s
20120 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
20130 6f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  open(.  sqlite3 
20140 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68  *db, .  const ch
20150 61 72 20 2a 7a 44 62 2c 20 0a 20 20 73 71 6c 69  ar *zDb, .  sqli
20160 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53  te3_snapshot *pS
20170 6e 61 70 73 68 6f 74 0a 29 7b 0a 20 20 69 6e 74  napshot.){.  int
20180 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
20190 4f 52 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  OR;.#ifndef SQLI
201a0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66  TE_OMIT_WAL..#if
201b0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
201c0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
201d0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
201e0 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
201f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20200 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
20210 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
20220 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
20230 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
20240 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d   db->autoCommit=
20250 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44  =0 ){.    int iD
20260 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  b;.    iDb = sql
20270 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
20280 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  b, zDb);.    if(
20290 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31   iDb==0 || iDb>1
202a0 20 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20   ){.      Btree 
202b0 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
202c0 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  Db].pBt;.      i
202d0 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72  f( 0==sqlite3Btr
202e0 65 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28  eeIsInReadTrans(
202f0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
20300 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20310 72 53 6e 61 70 73 68 6f 74 4f 70 65 6e 28 73 71  rSnapshotOpen(sq
20320 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
20330 70 42 74 29 2c 20 70 53 6e 61 70 73 68 6f 74 29  pBt), pSnapshot)
20340 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
20350 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20360 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
20370 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
20380 72 61 6e 73 28 70 42 74 2c 20 30 29 3b 0a 20 20  rans(pBt, 0);.  
20390 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
203a0 61 67 65 72 53 6e 61 70 73 68 6f 74 4f 70 65 6e  agerSnapshotOpen
203b0 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
203c0 65 72 28 70 42 74 29 2c 20 30 29 3b 0a 20 20 20  er(pBt), 0);.   
203d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
203e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
203f0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
20400 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64  db->mutex);.#end
20410 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  if   /* SQLITE_O
20420 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74  MIT_WAL */.  ret
20430 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20440 20 46 72 65 65 20 61 20 73 6e 61 70 73 68 6f 74   Free a snapshot
20450 20 68 61 6e 64 6c 65 20 6f 62 74 61 69 6e 65 64   handle obtained
20460 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 73 6e   from sqlite3_sn
20470 61 70 73 68 6f 74 5f 67 65 74 28 29 2e 0a 2a 2f  apshot_get()..*/
20480 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 73 6e  .void sqlite3_sn
20490 61 70 73 68 6f 74 5f 66 72 65 65 28 73 71 6c 69  apshot_free(sqli
204a0 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53  te3_snapshot *pS
204b0 6e 61 70 73 68 6f 74 29 7b 0a 20 20 73 71 6c 69  napshot){.  sqli
204c0 74 65 33 5f 66 72 65 65 28 70 53 6e 61 70 73 68  te3_free(pSnapsh
204d0 6f 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ot);.}.#endif /*
204e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
204f0 4e 41 50 53 48 4f 54 20 2a 2f 0a                 NAPSHOT */.