/ Hex Artifact Content
Login

Artifact b67a45397b93b7ba8fbd6bfcb03423d245baed05:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64  u.h".#endif.#ifd
0320: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0330: 5f 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74  _JSON1.int sqlit
0340: 65 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69  e3Json1Init(sqli
0350: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69  te3*);.#endif.#i
0360: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
0370: 4c 45 5f 46 54 53 35 0a 69 6e 74 20 73 71 6c 69  LE_FTS5.int sqli
0380: 74 65 33 46 74 73 35 49 6e 69 74 28 73 71 6c 69  te3Fts5Init(sqli
0390: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  te3*);.#endif..#
03a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d  ifndef SQLITE_AM
03b0: 41 4c 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d  ALGAMATION./* IM
03c0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
03d0: 20 52 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54   R-46656-45156 T
03e0: 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69  he sqlite3_versi
03f0: 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73  on[] string cons
0400: 74 61 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  tant.** contains
0410: 20 74 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c   the text of SQL
0420: 49 54 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72  ITE_VERSION macr
0430: 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  o. .*/.const cha
0440: 72 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  r sqlite3_versio
0450: 6e 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52  n[] = SQLITE_VER
0460: 53 49 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  SION;.#endif../*
0470: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0480: 4f 46 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37  OF: R-53536-4257
0490: 35 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  5 The sqlite3_li
04a0: 62 76 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74  bversion() funct
04b0: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61  ion returns.** a
04c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
04d0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  to the sqlite3_v
04e0: 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20  ersion[] string 
04f0: 63 6f 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f  constant. .*/.co
0500: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0510: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69  3_libversion(voi
0520: 64 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  d){ return sqlit
0530: 65 33 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f  e3_version; }../
0540: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
0550: 2d 4f 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33  -OF: R-63124-393
0560: 30 30 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73  00 The sqlite3_s
0570: 6f 75 72 63 65 69 64 28 29 20 66 75 6e 63 74 69  ourceid() functi
0580: 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20  on returns a.** 
0590: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
05a0: 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f  ing constant who
05b0: 73 65 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  se value is the 
05c0: 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53  same as the.** S
05d0: 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20  QLITE_SOURCE_ID 
05e0: 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d  C preprocessor m
05f0: 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20  acro. .*/.const 
0600: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f  char *sqlite3_so
0610: 75 72 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65  urceid(void){ re
0620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52  turn SQLITE_SOUR
0630: 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  CE_ID; }../* IMP
0640: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0650: 52 2d 33 35 32 31 30 2d 36 33 35 30 38 20 54 68  R-35210-63508 Th
0660: 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  e sqlite3_libver
0670: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75  sion_number() fu
0680: 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  nction.** return
0690: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75  s an integer equ
06a0: 61 6c 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52  al to SQLITE_VER
06b0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a  SION_NUMBER..*/.
06c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  int sqlite3_libv
06d0: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f  ersion_number(vo
06e0: 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  id){ return SQLI
06f0: 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
0700: 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  R; }../* IMPLEME
0710: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30  NTATION-OF: R-20
0720: 37 39 30 2d 31 34 30 32 35 20 54 68 65 20 73 71  790-14025 The sq
0730: 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65  lite3_threadsafe
0740: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
0750: 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61  rns.** zero if a
0760: 6e 64 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74  nd only if SQLit
0770: 65 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77  e was compiled w
0780: 69 74 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64  ith mutexing cod
0790: 65 20 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f  e omitted due to
07a0: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54  .** the SQLITE_T
07b0: 48 52 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c  HREADSAFE compil
07c0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65  e-time option be
07d0: 69 6e 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f  ing set to 0..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72  .int sqlite3_thr
07f0: 65 61 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72  eadsafe(void){ r
0800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52  eturn SQLITE_THR
0810: 45 41 44 53 41 46 45 3b 20 7d 0a 0a 2f 2a 0a 2a  EADSAFE; }../*.*
0820: 2a 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * When compiling
0830: 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72   the test fixtur
0840: 65 20 6f 72 20 77 69 74 68 20 64 65 62 75 67 67  e or with debugg
0850: 69 6e 67 20 65 6e 61 62 6c 65 64 20 28 6f 6e 20  ing enabled (on 
0860: 57 69 6e 33 32 29 2c 0a 2a 2a 20 74 68 69 73 20  Win32),.** this 
0870: 76 61 72 69 61 62 6c 65 20 62 65 69 6e 67 20 73  variable being s
0880: 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 77  et to non-zero w
0890: 69 6c 6c 20 63 61 75 73 65 20 4f 53 54 52 41 43  ill cause OSTRAC
08a0: 45 20 6d 61 63 72 6f 73 20 74 6f 20 65 6d 69 74  E macros to emit
08b0: 0a 2a 2a 20 65 78 74 72 61 20 64 69 61 67 6e 6f  .** extra diagno
08c0: 73 74 69 63 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  stic information
08d0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
08e0: 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
08f0: 0a 23 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  .# ifndef SQLITE
0900: 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 0a  _DEBUG_OS_TRACE.
0910: 23 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  #   define SQLIT
0920: 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45  E_DEBUG_OS_TRACE
0930: 20 30 0a 23 20 65 6e 64 69 66 0a 20 20 69 6e 74   0.# endif.  int
0940: 20 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 20   sqlite3OSTrace 
0950: 3d 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f  = SQLITE_DEBUG_O
0960: 53 5f 54 52 41 43 45 3b 0a 23 65 6e 64 69 66 0a  S_TRACE;.#endif.
0970: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0980: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
0990: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
09a0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
09b0: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E)./*.** If the 
09c0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
09d0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  on pointer is no
09e0: 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a 2a 2a  t NULL and if.**
09f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
0a00: 4f 54 52 41 43 45 20 69 73 20 65 6e 61 62 6c 65  OTRACE is enable
0a10: 64 2c 20 74 68 65 6e 20 6d 65 73 73 61 67 65 73  d, then messages
0a20: 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20 49   describing.** I
0a30: 2f 4f 20 61 63 74 69 76 65 20 61 72 65 20 77 72  /O active are wr
0a40: 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68 69 73  itten using this
0a50: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 73   function.  Thes
0a60: 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20 61 72  e messages.** ar
0a70: 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 64  e intended for d
0a80: 65 62 75 67 67 69 6e 67 20 61 63 74 69 76 69 74  ebugging activit
0a90: 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53 51 4c 49 54  y only..*/.SQLIT
0aa0: 45 5f 41 50 49 20 76 6f 69 64 20 28 53 51 4c 49  E_API void (SQLI
0ab0: 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74 65  TE_CDECL *sqlite
0ac0: 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20  3IoTrace)(const 
0ad0: 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b  char*, ...) = 0;
0ae0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
0af0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0b00: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
0b10: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
0b20: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  ng which is the.
0b30: 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  ** name of a dir
0b40: 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61  ectory, then tha
0b50: 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  t directory will
0b60: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
0b70: 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66  e.** temporary f
0b80: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  iles..**.** See 
0b90: 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41  also the "PRAGMA
0ba0: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
0bb0: 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61  ctory" SQL comma
0bc0: 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nd..*/.char *sql
0bd0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
0be0: 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ory = 0;../*.** 
0bf0: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0c00: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0c10: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0c20: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0c30: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0c40: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0c50: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0c60: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0c70: 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62 61  re.** all databa
0c80: 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66 69  se files specifi
0c90: 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ed with a relati
0ca0: 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a 0a  ve pathname..**.
0cb0: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  ** See also the 
0cc0: 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f  "PRAGMA data_sto
0cd0: 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53 51  re_directory" SQ
0ce0: 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68  L command..*/.ch
0cf0: 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74 61  ar *sqlite3_data
0d00: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  _directory = 0;.
0d10: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0d20: 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a 2a  e SQLite.  .**.*
0d30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0d40: 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ust be called to
0d50: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
0d60: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
0d70: 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20 6d  n,.** VFS, and m
0d80: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73 20  utex subsystems 
0d90: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61  prior to doing a
0da0: 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b 20  ny serious work 
0db0: 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e 20  with.** SQLite. 
0dc0: 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73 20   But as long as 
0dd0: 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70 69  you do not compi
0de0: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f  le with SQLITE_O
0df0: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a 20  MIT_AUTOINIT.** 
0e00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
0e10: 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74 6f  l be called auto
0e20: 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65 79  matically by key
0e30: 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20 61   routines such a
0e40: 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  s.** sqlite3_ope
0e50: 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  n().  .**.** Thi
0e60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
0e70: 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20 69  o-op except on i
0e80: 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63 61  ts very first ca
0e90: 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63 65  ll for the proce
0ea0: 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74 68  ss,.** or for th
0eb0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66 74  e first call aft
0ec0: 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
0ed0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a 2a  ite3_shutdown..*
0ee0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
0ef0: 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74 68  hread to call th
0f00: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
0f10: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
0f20: 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65 74  on to.** complet
0f30: 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71 75  ion.  If subsequ
0f40: 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c 6c  ent threads call
0f50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
0f60: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  fore the first.*
0f70: 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69 6e  * thread has fin
0f80: 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69 61  ished the initia
0f90: 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73  lization process
0fa0: 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73 65  , then the subse
0fb0: 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64 73  quent.** threads
0fc0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fd0: 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  l the first thre
0fe0: 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74 68  ad finishes with
0ff0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1000: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
1010: 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67 68  irst thread migh
1020: 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  t call this rout
1030: 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79 2e  ine recursively.
1040: 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20 63    Recursive.** c
1050: 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75  alls to this rou
1060: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tine should not 
1070: 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73 65  block, of course
1080: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
1090: 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  .** initializati
10a0: 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c 64  on process would
10b0: 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65 2e   never complete.
10c0: 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65 20  .**.** Let X be 
10d0: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  the first thread
10e0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 72   to enter this r
10f0: 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20 62  outine.  Let Y b
1100: 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  e some other.** 
1110: 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77 68  thread.  Then wh
1120: 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ile the initial 
1130: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  invocation of th
1140: 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58 20  is routine by X 
1150: 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74 65  is.** incomplete
1160: 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65 64  , it is required
1170: 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   that:.**.**    
1180: 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69 73  *  Calls to this
1190: 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59 20   routine from Y 
11a0: 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69 6c  must block until
11b0: 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74 0a   the outer-most.
11c0: 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62 79  **       call by
11d0: 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a 2a   X completes..**
11e0: 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72 73  .**    *  Recurs
11f0: 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68 69  ive calls to thi
1200: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
1210: 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20 69  hread X return i
1220: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
1230: 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f 63      without bloc
1240: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
1250: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1260: 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f 4c  void){.  MUTEX_L
1270: 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
1280: 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20  tex *pMaster; ) 
1290: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
12a0: 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a  n static mutex *
12b0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1300: 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69 6e  _EXTRA_INIT.  in
1310: 74 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20  t bRunExtraInit 
1320: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
1340: 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  tra initializati
1350: 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6e  on needed */.#en
1360: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1370: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63  TE_OMIT_WSD.  rc
1380: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
1390: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
13a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13b0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
13c0: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
13d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 6f 6c  .  /* If the fol
13e0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20  lowing assert() 
13f0: 66 61 69 6c 73 20 6f 6e 20 73 6f 6d 65 20 6f 62  fails on some ob
1400: 73 63 75 72 65 20 70 72 6f 63 65 73 73 6f 72 2f  scure processor/
1410: 63 6f 6d 70 69 6c 65 72 0a 20 20 2a 2a 20 63 6f  compiler.  ** co
1420: 6d 62 69 6e 61 74 69 6f 6e 2c 20 74 68 65 20 77  mbination, the w
1430: 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 74 6f  ork-around is to
1440: 20 73 65 74 20 74 68 65 20 63 6f 72 72 65 63 74   set the correct
1450: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 73 69   pointer.  ** si
1460: 7a 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ze at compile-ti
1470: 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  me using -DSQLIT
1480: 45 5f 50 54 52 53 49 5a 45 3d 6e 20 63 6f 6d 70  E_PTRSIZE=n comp
1490: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
14a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  */.  assert( SQL
14b0: 49 54 45 5f 50 54 52 53 49 5a 45 3d 3d 73 69 7a  ITE_PTRSIZE==siz
14c0: 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 0a 20  eof(char*) );.. 
14d0: 20 2f 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73   /* If SQLite is
14e0: 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c 65 74   already complet
14f0: 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  ely initialized,
1500: 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 0a   then this call.
1510: 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
1520: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 73 68 6f  initialize() sho
1530: 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20  uld be a no-op. 
1540: 20 42 75 74 20 74 68 65 20 69 6e 69 74 69 61 6c   But the initial
1550: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d 75 73  ization.  ** mus
1560: 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e 20 20  t be complete.  
1570: 53 6f 20 69 73 49 6e 69 74 20 6d 75 73 74 20 6e  So isInit must n
1580: 6f 74 20 62 65 20 73 65 74 20 75 6e 74 69 6c 20  ot be set until 
1590: 74 68 65 20 76 65 72 79 20 65 6e 64 0a 20 20 2a  the very end.  *
15a0: 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * of this routin
15b0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  e..  */.  if( sq
15c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15d0: 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72  g.isInit ) retur
15e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
15f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
1600: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
1610: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   is initialized.
1620: 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 0a    If unable to .
1630: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
1640: 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  the mutex subsys
1650: 74 65 6d 2c 20 72 65 74 75 72 6e 20 65 61 72 6c  tem, return earl
1660: 79 20 77 69 74 68 20 74 68 65 20 65 72 72 6f 72  y with the error
1670: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 79  ..  ** If the sy
1680: 73 74 65 6d 20 69 73 20 73 6f 20 73 69 63 6b 20  stem is so sick 
1690: 74 68 61 74 20 77 65 20 61 72 65 20 75 6e 61 62  that we are unab
16a0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  le to allocate a
16b0: 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20 74 68 65   mutex,.  ** the
16c0: 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 53  re is not much S
16d0: 51 4c 69 74 65 20 69 73 20 67 6f 69 6e 67 20 74  QLite is going t
16e0: 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 2e  o be able to do.
16f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d  .  **.  ** The m
1700: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 20 6d  utex subsystem m
1710: 75 73 74 20 74 61 6b 65 20 63 61 72 65 20 6f 66  ust take care of
1720: 20 73 65 72 69 61 6c 69 7a 69 6e 67 20 69 74 73   serializing its
1730: 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69 74 69 61   own.  ** initia
1740: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  lization..  */. 
1750: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 75 74   rc = sqlite3Mut
1760: 65 78 49 6e 69 74 28 29 3b 0a 20 20 69 66 28 20  exInit();.  if( 
1770: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1780: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1790: 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20 73 79   the malloc() sy
17a0: 73 74 65 6d 20 61 6e 64 20 74 68 65 20 72 65 63  stem and the rec
17b0: 75 72 73 69 76 65 20 70 49 6e 69 74 4d 75 74 65  ursive pInitMute
17c0: 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a 20 54 68  x mutex..  ** Th
17d0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  is operation is 
17e0: 70 72 6f 74 65 63 74 65 64 20 62 79 20 74 68 65  protected by the
17f0: 20 53 54 41 54 49 43 5f 4d 41 53 54 45 52 20 6d   STATIC_MASTER m
1800: 75 74 65 78 2e 20 20 4e 6f 74 65 20 74 68 61 74  utex.  Note that
1810: 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c 6c 6f 63  .  ** MutexAlloc
1820: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  () is called for
1830: 20 61 20 73 74 61 74 69 63 20 6d 75 74 65 78 20   a static mutex 
1840: 70 72 69 6f 72 20 74 6f 20 69 6e 69 74 69 61 6c  prior to initial
1850: 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6d  izing the.  ** m
1860: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20  alloc subsystem 
1870: 2d 20 74 68 69 73 20 69 6d 70 6c 69 65 73 20 74  - this implies t
1880: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
1890: 6f 6e 20 6f 66 20 61 20 73 74 61 74 69 63 0a 20  on of a static. 
18a0: 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74 20 6e   ** mutex must n
18b0: 6f 74 20 72 65 71 75 69 72 65 20 73 75 70 70 6f  ot require suppo
18c0: 72 74 20 66 72 6f 6d 20 74 68 65 20 6d 61 6c 6c  rt from the mall
18d0: 6f 63 20 73 75 62 73 79 73 74 65 6d 2e 0a 20 20  oc subsystem..  
18e0: 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  */.  MUTEX_LOGIC
18f0: 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69  ( pMaster = sqli
1900: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
1910: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1920: 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73  C_MASTER); ).  s
1930: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1940: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
1950: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1960: 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d  ig.isMutexInit =
1970: 20 31 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   1;.  if( !sqlit
1980: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1990: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
19a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
19b0: 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a 20 20 7d  allocInit();.  }
19c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
19e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
19f0: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 31  isMallocInit = 1
1a00: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
1a10: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1a20: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1a30: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1a40: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
1a50: 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 73  x =.           s
1a60: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1a70: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
1a80: 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20 20  CURSIVE);.      
1a90: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1aa0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
1ab0: 65 78 20 26 26 20 21 73 71 6c 69 74 65 33 47 6c  ex && !sqlite3Gl
1ac0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1ad0: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
1ae0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1af0: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
1b00: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
1b10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b20: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1b30: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
1b40: 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ex++;.  }.  sqli
1b50: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1b60: 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pMaster);..  /* 
1b70: 49 66 20 72 63 20 69 73 20 6e 6f 74 20 53 51 4c  If rc is not SQL
1b80: 49 54 45 5f 4f 4b 20 61 74 20 74 68 69 73 20 70  ITE_OK at this p
1b90: 6f 69 6e 74 2c 20 74 68 65 6e 20 65 69 74 68 65  oint, then eithe
1ba0: 72 20 74 68 65 20 6d 61 6c 6c 6f 63 0a 20 20 2a  r the malloc.  *
1bb0: 2a 20 73 75 62 73 79 73 74 65 6d 20 63 6f 75 6c  * subsystem coul
1bc0: 64 20 6e 6f 74 20 62 65 20 69 6e 69 74 69 61 6c  d not be initial
1bd0: 69 7a 65 64 20 6f 72 20 74 68 65 20 73 79 73 74  ized or the syst
1be0: 65 6d 20 66 61 69 6c 65 64 20 74 6f 20 61 6c 6c  em failed to all
1bf0: 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70  ocate.  ** the p
1c00: 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65 78 2e  InitMutex mutex.
1c10: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
1c20: 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e   in either case.
1c30: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53    */.  if( rc!=S
1c40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c50: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1c60: 20 20 2f 2a 20 44 6f 20 74 68 65 20 72 65 73 74    /* Do the rest
1c70: 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
1c80: 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20 74 68 65  zation under the
1c90: 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78   recursive mutex
1ca0: 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 77 65   so.  ** that we
1cb0: 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1cc0: 20 68 61 6e 64 6c 65 20 72 65 63 75 72 73 69 76   handle recursiv
1cd0: 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a 20 20 2a  e calls into.  *
1ce0: 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  * sqlite3_initia
1cf0: 6c 69 7a 65 28 29 2e 20 20 54 68 65 20 72 65 63  lize().  The rec
1d00: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6e 6f 72  ursive calls nor
1d10: 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68 72 6f 75  mally come throu
1d20: 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  gh.  ** sqlite3_
1d30: 6f 73 5f 69 6e 69 74 28 29 20 77 68 65 6e 20 69  os_init() when i
1d40: 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65  t invokes sqlite
1d50: 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 29  3_vfs_register()
1d60: 2c 20 62 75 74 20 6f 74 68 65 72 0a 20 20 2a 2a  , but other.  **
1d70: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1d80: 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 70   might also be p
1d90: 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  ossible..  **.  
1da0: 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
1db0: 4e 2d 4f 46 3a 20 52 2d 30 30 31 34 30 2d 33 37  N-OF: R-00140-37
1dc0: 34 34 35 20 53 51 4c 69 74 65 20 61 75 74 6f 6d  445 SQLite autom
1dd0: 61 74 69 63 61 6c 6c 79 20 73 65 72 69 61 6c 69  atically seriali
1de0: 7a 65 73 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 74  zes calls.  ** t
1df0: 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68  o the xInit meth
1e00: 6f 64 2c 20 73 6f 20 74 68 65 20 78 49 6e 69 74  od, so the xInit
1e10: 20 6d 65 74 68 6f 64 20 6e 65 65 64 20 6e 6f 74   method need not
1e20: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2e 0a   be threadsafe..
1e30: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f    **.  ** The fo
1e40: 6c 6c 6f 77 69 6e 67 20 6d 75 74 65 78 20 69 73  llowing mutex is
1e50: 20 77 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73   what serializes
1e60: 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 61   access to the a
1e70: 70 70 64 65 66 20 70 63 61 63 68 65 20 78 49 6e  ppdef pcache xIn
1e80: 69 74 0a 20 20 2a 2a 20 6d 65 74 68 6f 64 73 2e  it.  ** methods.
1e90: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 70 63    The sqlite3_pc
1ea0: 61 63 68 65 5f 6d 65 74 68 6f 64 73 2e 78 49 6e  ache_methods.xIn
1eb0: 69 74 28 29 20 61 6c 6c 20 69 73 20 65 6d 62 65  it() all is embe
1ec0: 64 64 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a  dded in the.  **
1ed0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1ee0: 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65  PcacheInitialize
1ef0: 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ()..  */.  sqlit
1f00: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
1f10: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1f20: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a  ig.pInitMutex);.
1f30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1f40: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
1f50: 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 47 6c  ==0 && sqlite3Gl
1f60: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
1f70: 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20  gress==0 ){.    
1f80: 46 75 6e 63 44 65 66 48 61 73 68 20 2a 70 48 61  FuncDefHash *pHa
1f90: 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28 46 75 6e  sh = &GLOBAL(Fun
1fa0: 63 44 65 66 48 61 73 68 2c 20 73 71 6c 69 74 65  cDefHash, sqlite
1fb0: 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73  3GlobalFunctions
1fc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
1fd0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
1fe0: 67 72 65 73 73 20 3d 20 31 3b 0a 23 69 66 64 65  gress = 1;.#ifde
1ff0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2000: 53 51 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20 20 20  SQLLOG.    {.   
2010: 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73     extern void s
2020: 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c  qlite3_init_sqll
2030: 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20  og(void);.      
2040: 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c  sqlite3_init_sql
2050: 6c 6f 67 28 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  log();.    }.#en
2060: 64 69 66 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  dif.    memset(p
2070: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
2080: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e  sqlite3GlobalFun
2090: 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20 73 71  ctions));.    sq
20a0: 6c 69 74 65 33 52 65 67 69 73 74 65 72 47 6c 6f  lite3RegisterGlo
20b0: 62 61 6c 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a  balFunctions();.
20c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
20d0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
20e0: 61 63 68 65 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  acheInit==0 ){. 
20f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2100: 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a  3PcacheInitializ
2110: 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  e();.    }.    i
2120: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2130: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2140: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
2150: 50 43 61 63 68 65 49 6e 69 74 20 3d 20 31 3b 0a  PCacheInit = 1;.
2160: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2170: 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20 20 20 20  e3OsInit();.    
2180: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2190: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21a0: 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 42 75   sqlite3PCacheBu
21b0: 66 66 65 72 53 65 74 75 70 28 20 73 71 6c 69 74  fferSetup( sqlit
21c0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
21d0: 50 61 67 65 2c 20 0a 20 20 20 20 20 20 20 20 20  Page, .         
21e0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
21f0: 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c  nfig.szPage, sql
2200: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2210: 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 73  .nPage);.      s
2220: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2230: 69 67 2e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 23  ig.isInit = 1;.#
2240: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54  ifdef SQLITE_EXT
2250: 52 41 5f 49 4e 49 54 0a 20 20 20 20 20 20 62 52  RA_INIT.      bR
2260: 75 6e 45 78 74 72 61 49 6e 69 74 20 3d 20 31 3b  unExtraInit = 1;
2270: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
2280: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2290: 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73  onfig.inProgress
22a0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
22b0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
22c0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
22d0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b  fig.pInitMutex);
22e0: 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75  ..  /* Go back u
22f0: 6e 64 65 72 20 74 68 65 20 73 74 61 74 69 63 20  nder the static 
2300: 6d 75 74 65 78 20 61 6e 64 20 63 6c 65 61 6e 20  mutex and clean 
2310: 75 70 20 74 68 65 20 72 65 63 75 72 73 69 76 65  up the recursive
2320: 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70  .  ** mutex to p
2330: 72 65 76 65 6e 74 20 61 20 72 65 73 6f 75 72 63  revent a resourc
2340: 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73  e leak..  */.  s
2350: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
2360: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
2370: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2380: 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78  ig.nRefInitMutex
2390: 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  --;.  if( sqlite
23a0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
23b0: 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29  efInitMutex<=0 )
23c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
23d0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
23e0: 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3d  g.nRefInitMutex=
23f0: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
2400: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 73 71 6c  3_mutex_free(sql
2410: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2420: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20  .pInitMutex);.  
2430: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2440: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
2450: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
2460: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2470: 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pMaster);..  /* 
2480: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
2490: 20 6a 75 73 74 20 61 20 73 61 6e 69 74 79 20 63   just a sanity c
24a0: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
24b0: 65 20 53 51 4c 69 74 65 20 68 61 73 0a 20 20 2a  e SQLite has.  *
24c0: 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20  * been compiled 
24d0: 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 74 20 69  correctly.  It i
24e0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72  s important to r
24f0: 75 6e 20 74 68 69 73 20 63 6f 64 65 2c 20 62 75  un this code, bu
2500: 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  t.  ** we don't 
2510: 77 61 6e 74 20 74 6f 20 72 75 6e 20 69 74 20 74  want to run it t
2520: 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61  oo often and soa
2530: 6b 20 75 70 20 43 50 55 20 63 79 63 6c 65 73 20  k up CPU cycles 
2540: 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73  for no.  ** reas
2550: 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75 6e 20 69  on.  So we run i
2560: 74 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 69 6e  t once during in
2570: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
2580: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
2590: 47 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  G.#ifndef SQLITE
25a0: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
25b0: 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69 73 20 73  OINT.  /* This s
25c0: 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73  ection of code's
25d0: 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74 22 20 69   only "output" i
25e0: 73 20 76 69 61 20 61 73 73 65 72 74 28 29 20 73  s via assert() s
25f0: 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  tatements. */.  
2600: 69 66 20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  if ( rc==SQLITE_
2610: 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34 20 78 20  OK ){.    u64 x 
2620: 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 36 33 29  = (((u64)1)<<63)
2630: 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79  -1;.    double y
2640: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73 69 7a  ;.    assert(siz
2650: 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20 20 20 20  eof(x)==8);.    
2660: 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29  assert(sizeof(x)
2670: 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b 0a 20 20  ==sizeof(y));.  
2680: 20 20 6d 65 6d 63 70 79 28 26 79 2c 20 26 78 2c    memcpy(&y, &x,
2690: 20 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   8);.    assert(
26a0: 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 79 29   sqlite3IsNaN(y)
26b0: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   );.  }.#endif.#
26c0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 65  endif..  /* Do e
26d0: 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74  xtra initializat
26e0: 69 6f 6e 20 73 74 65 70 73 20 72 65 71 75 65 73  ion steps reques
26f0: 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ted by the SQLIT
2700: 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 2a  E_EXTRA_INIT.  *
2710: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  * compile-time o
2720: 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  ption..  */.#ifd
2730: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
2740: 49 4e 49 54 0a 20 20 69 66 28 20 62 52 75 6e 45  INIT.  if( bRunE
2750: 78 74 72 61 49 6e 69 74 20 29 7b 0a 20 20 20 20  xtraInit ){.    
2760: 69 6e 74 20 53 51 4c 49 54 45 5f 45 58 54 52 41  int SQLITE_EXTRA
2770: 5f 49 4e 49 54 28 63 6f 6e 73 74 20 63 68 61 72  _INIT(const char
2780: 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  *);.    rc = SQL
2790: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 30  ITE_EXTRA_INIT(0
27a0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
27b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27c0: 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65 20 65 66  *.** Undo the ef
27d0: 66 65 63 74 73 20 6f 66 20 73 71 6c 69 74 65 33  fects of sqlite3
27e0: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20  _initialize().  
27f0: 4d 75 73 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c  Must not be call
2800: 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72  ed while.** ther
2810: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
2820: 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  g database conne
2830: 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79  ctions or memory
2840: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a   allocations or.
2850: 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 70 61 72  ** while any par
2860: 74 20 6f 66 20 53 51 4c 69 74 65 20 69 73 20 6f  t of SQLite is o
2870: 74 68 65 72 77 69 73 65 20 69 6e 20 75 73 65 20  therwise in use 
2880: 69 6e 20 61 6e 79 20 74 68 72 65 61 64 2e 20 20  in any thread.  
2890: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
28a0: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
28b0: 65 2e 20 20 42 75 74 20 69 74 20 69 73 20 73 61  e.  But it is sa
28c0: 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69  fe to invoke thi
28d0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20  s routine.** on 
28e0: 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20 61  when SQLite is a
28f0: 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e  lready shut down
2900: 2e 20 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  .  If SQLite is 
2910: 61 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f 77  already shut dow
2920: 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72  n.** when this r
2930: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
2940: 64 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  d, then this rou
2950: 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65  tine is a harmle
2960: 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74  ss no-op..*/.int
2970: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
2980: 6e 28 76 6f 69 64 29 7b 0a 23 69 66 64 65 66 20  n(void){.#ifdef 
2990: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
29a0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
29b0: 65 33 5f 77 73 64 5f 69 6e 69 74 28 34 30 39 36  e3_wsd_init(4096
29c0: 2c 20 32 34 29 3b 0a 20 20 69 66 28 20 72 63 21  , 24);.  if( rc!
29d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
29f0: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73  .#endif..  if( s
2a00: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2a10: 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a 23 69 66  ig.isInit ){.#if
2a20: 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41  def SQLITE_EXTRA
2a30: 5f 53 48 55 54 44 4f 57 4e 0a 20 20 20 20 76 6f  _SHUTDOWN.    vo
2a40: 69 64 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  id SQLITE_EXTRA_
2a50: 53 48 55 54 44 4f 57 4e 28 76 6f 69 64 29 3b 0a  SHUTDOWN(void);.
2a60: 20 20 20 20 53 51 4c 49 54 45 5f 45 58 54 52 41      SQLITE_EXTRA
2a70: 5f 53 48 55 54 44 4f 57 4e 28 29 3b 0a 23 65 6e  _SHUTDOWN();.#en
2a80: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
2a90: 6f 73 5f 65 6e 64 28 29 3b 0a 20 20 20 20 73 71  os_end();.    sq
2aa0: 6c 69 74 65 33 5f 72 65 73 65 74 5f 61 75 74 6f  lite3_reset_auto
2ab0: 5f 65 78 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20  _extension();.  
2ac0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2ad0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 30  onfig.isInit = 0
2ae0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
2af0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2b00: 69 73 50 43 61 63 68 65 49 6e 69 74 20 29 7b 0a  isPCacheInit ){.
2b10: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2b20: 65 53 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 20  eShutdown();.   
2b30: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2b40: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2b50: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
2b60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2b70: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
2b80: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2b90: 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 20  MallocEnd();.   
2ba0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2bb0: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
2bc0: 74 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20  t = 0;..#ifndef 
2bd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 55 54  SQLITE_OMIT_SHUT
2be0: 44 4f 57 4e 5f 44 49 52 45 43 54 4f 52 49 45 53  DOWN_DIRECTORIES
2bf0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70  .    /* The heap
2c00: 20 73 75 62 73 79 73 74 65 6d 20 68 61 73 20 6e   subsystem has n
2c10: 6f 77 20 62 65 65 6e 20 73 68 75 74 64 6f 77 6e  ow been shutdown
2c20: 20 61 6e 64 20 74 68 65 73 65 20 76 61 6c 75 65   and these value
2c30: 73 20 61 72 65 20 73 75 70 70 6f 73 65 64 0a 20  s are supposed. 
2c40: 20 20 20 2a 2a 20 74 6f 20 62 65 20 4e 55 4c 4c     ** to be NULL
2c50: 20 6f 72 20 70 6f 69 6e 74 20 74 6f 20 6d 65 6d   or point to mem
2c60: 6f 72 79 20 74 68 61 74 20 77 61 73 20 6f 62 74  ory that was obt
2c70: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
2c80: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 0a 20 20 20  e3_malloc(),.   
2c90: 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20   ** which would 
2ca0: 72 65 6c 79 20 6f 6e 20 74 68 61 74 20 68 65 61  rely on that hea
2cb0: 70 20 73 75 62 73 79 73 74 65 6d 3b 20 74 68 65  p subsystem; the
2cc0: 72 65 66 6f 72 65 2c 20 6d 61 6b 65 20 73 75 72  refore, make sur
2cd0: 65 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 76  e these.    ** v
2ce0: 61 6c 75 65 73 20 63 61 6e 6e 6f 74 20 72 65 66  alues cannot ref
2cf0: 65 72 20 74 6f 20 68 65 61 70 20 6d 65 6d 6f 72  er to heap memor
2d00: 79 20 74 68 61 74 20 77 61 73 20 6a 75 73 74 20  y that was just 
2d10: 69 6e 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e  invalidated when
2d20: 20 74 68 65 0a 20 20 20 20 2a 2a 20 68 65 61 70   the.    ** heap
2d30: 20 73 75 62 73 79 73 74 65 6d 20 77 61 73 20 73   subsystem was s
2d40: 68 75 74 64 6f 77 6e 2e 20 20 54 68 69 73 20 69  hutdown.  This i
2d50: 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 69 66 20 74  s only done if t
2d60: 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 20  he current call 
2d70: 74 6f 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66  to.    ** this f
2d80: 75 6e 63 74 69 6f 6e 20 72 65 73 75 6c 74 65 64  unction resulted
2d90: 20 69 6e 20 74 68 65 20 68 65 61 70 20 73 75 62   in the heap sub
2da0: 73 79 73 74 65 6d 20 61 63 74 75 61 6c 6c 79 20  system actually 
2db0: 62 65 69 6e 67 20 73 68 75 74 64 6f 77 6e 2e 0a  being shutdown..
2dc0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
2dd0: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
2de0: 79 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  y = 0;.    sqlit
2df0: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
2e00: 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  y = 0;.#endif.  
2e10: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2e20: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75  lobalConfig.isMu
2e30: 74 65 78 49 6e 69 74 20 29 7b 0a 20 20 20 20 73  texInit ){.    s
2e40: 71 6c 69 74 65 33 4d 75 74 65 78 45 6e 64 28 29  qlite3MutexEnd()
2e50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
2e60: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65  balConfig.isMute
2e70: 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  xInit = 0;.  }..
2e80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e90: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
2ea0: 73 20 41 50 49 20 61 6c 6c 6f 77 73 20 61 70 70  s API allows app
2eb0: 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64  lications to mod
2ec0: 69 66 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 63  ify the global c
2ed0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a  onfiguration of.
2ee0: 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  ** the SQLite li
2ef0: 62 72 61 72 79 20 61 74 20 72 75 6e 2d 74 69 6d  brary at run-tim
2f00: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
2f10: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
2f20: 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  y be called when
2f30: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
2f40: 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74  tstanding.** dat
2f50: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2f60: 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  s or memory allo
2f70: 63 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 72  cations.  This r
2f80: 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a  outine is not.**
2f90: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 46 61   threadsafe.  Fa
2fa0: 69 6c 75 72 65 20 74 6f 20 68 65 65 64 20 74 68  ilure to heed th
2fb0: 65 73 65 20 77 61 72 6e 69 6e 67 73 20 63 61 6e  ese warnings can
2fc0: 20 6c 65 61 64 20 74 6f 20 75 6e 70 72 65 64 69   lead to unpredi
2fd0: 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69  ctable.** behavi
2fe0: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
2ff0: 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70  e3_config(int op
3000: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
3010: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d  t ap;.  int rc =
3020: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
3030: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  * sqlite3_config
3040: 28 29 20 73 68 61 6c 6c 20 72 65 74 75 72 6e 20  () shall return 
3050: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66  SQLITE_MISUSE if
3060: 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 77   it is invoked w
3070: 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53 51  hile.  ** the SQ
3080: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 69 73 20  Lite library is 
3090: 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28  in use. */.  if(
30a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
30b0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65  nfig.isInit ) re
30c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
30d0: 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76 61 5f 73  SE_BKPT;..  va_s
30e0: 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
30f0: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20  switch( op ){.. 
3100: 20 20 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66     /* Mutex conf
3110: 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
3120: 73 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  s are only avail
3130: 61 62 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64  able in a thread
3140: 73 61 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  safe.    ** comp
3150: 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20  ile..    */.#if 
3160: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
3170: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
3180: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
3190: 30 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 34 34  0  /* IMP: R-544
31a0: 36 36 2d 34 36 37 35 36 20 2a 2f 0a 20 20 20 20  66-46756 */.    
31b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
31c0: 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 3a  IG_SINGLETHREAD:
31d0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
31e0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 32 37 34 38  ENCE-OF: R-02748
31f0: 2d 31 39 30 39 36 20 54 68 69 73 20 6f 70 74 69  -19096 This opti
3200: 6f 6e 20 73 65 74 73 20 74 68 65 20 74 68 72 65  on sets the thre
3210: 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20  ading mode to.  
3220: 20 20 20 20 2a 2a 20 53 69 6e 67 6c 65 2d 74 68      ** Single-th
3230: 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73  read. */.      s
3240: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3250: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
3260: 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d  0;  /* Disable m
3270: 75 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a  utex on core */.
3280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3290: 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
32a0: 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a 20 44 69  utex = 0;  /* Di
32b0: 73 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63  sable mutex on c
32c0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
32d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
32e0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
32f0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
3300: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3310: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a  _THREADSAFE>0 /*
3320: 20 49 4d 50 3a 20 52 2d 32 30 35 32 30 2d 35 34   IMP: R-20520-54
3330: 30 38 36 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  086 */.    case 
3340: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55  SQLITE_CONFIG_MU
3350: 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a 20 20 20  LTITHREAD: {.   
3360: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
3370: 46 3a 20 52 2d 31 34 33 37 34 2d 34 32 34 36 38  F: R-14374-42468
3380: 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73 65 74   This option set
3390: 73 20 74 68 65 20 74 68 72 65 61 64 69 6e 67 20  s the threading 
33a0: 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  mode to.      **
33b0: 20 4d 75 6c 74 69 2d 74 68 72 65 61 64 2e 20 2a   Multi-thread. *
33c0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
33d0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
33e0: 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20  eMutex = 1;  /* 
33f0: 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20  Enable mutex on 
3400: 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  core */.      sq
3410: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3420: 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30  g.bFullMutex = 0
3430: 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75  ;  /* Disable mu
3440: 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f  tex on connectio
3450: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ns */.      brea
3460: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3470: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3480: 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26  TE_THREADSAFE) &
3490: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
34a0: 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  AFE>0 /* IMP: R-
34b0: 35 39 35 39 33 2d 32 31 38 31 30 20 2a 2f 0a 20  59593-21810 */. 
34c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
34d0: 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49 5a 45 44  ONFIG_SERIALIZED
34e0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
34f0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 32 32  DENCE-OF: R-4122
3500: 30 2d 35 31 38 30 30 20 54 68 69 73 20 6f 70 74  0-51800 This opt
3510: 69 6f 6e 20 73 65 74 73 20 74 68 65 20 74 68 72  ion sets the thr
3520: 65 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f 0a 20  eading mode to. 
3530: 20 20 20 20 20 2a 2a 20 53 65 72 69 61 6c 69 7a       ** Serializ
3540: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ed. */.      sql
3550: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3560: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b  .bCoreMutex = 1;
3570: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65    /* Enable mute
3580: 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20  x on core */.   
3590: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
35a0: 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
35b0: 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62 6c  x = 1;  /* Enabl
35c0: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65  e mutex on conne
35d0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ctions */.      
35e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
35f0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3600: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3610: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3620: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
3630: 3a 20 52 2d 36 33 36 36 36 2d 34 38 37 35 35 20  : R-63666-48755 
3640: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3650: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a  TE_CONFIG_MUTEX:
3660: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63   {.      /* Spec
3670: 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  ify an alternati
3680: 76 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65  ve mutex impleme
3690: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
36a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
36b0: 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61  nfig.mutex = *va
36c0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
36d0: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29  _mutex_methods*)
36e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
36f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
3700: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
3710: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
3720: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
3730: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 34 34 35  0 /* IMP: R-1445
3740: 30 2d 33 37 35 39 37 20 2a 2f 0a 20 20 20 20 63  0-37597 */.    c
3750: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3760: 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b 0a 20 20  G_GETMUTEX: {.  
3770: 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20      /* Retrieve 
3780: 74 68 65 20 63 75 72 72 65 6e 74 20 6d 75 74 65  the current mute
3790: 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  x implementation
37a0: 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72   */.      *va_ar
37b0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75  g(ap, sqlite3_mu
37c0: 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20  tex_methods*) = 
37d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
37e0: 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20 20 20 20  fig.mutex;.     
37f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
3800: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
3810: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c  QLITE_CONFIG_MAL
3820: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
3830: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
3840: 35 35 39 34 2d 32 31 30 33 30 20 54 68 65 20 53  5594-21030 The S
3850: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c  QLITE_CONFIG_MAL
3860: 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73  LOC option takes
3870: 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
3880: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
3890: 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  h is a pointer t
38a0: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
38b0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71   the.      ** sq
38c0: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
38d0: 73 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  s structure. The
38e0: 20 61 72 67 75 6d 65 6e 74 20 73 70 65 63 69 66   argument specif
38f0: 69 65 73 20 61 6c 74 65 72 6e 61 74 69 76 65 0a  ies alternative.
3900: 20 20 20 20 20 20 2a 2a 20 6c 6f 77 2d 6c 65 76        ** low-lev
3910: 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  el memory alloca
3920: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 6f  tion routines to
3930: 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63   be used in plac
3940: 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 0a  e of the memory.
3950: 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
3960: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 62 75 69  ion routines bui
3970: 6c 74 20 69 6e 74 6f 20 53 51 4c 69 74 65 2e 20  lt into SQLite. 
3980: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3990: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d  GlobalConfig.m =
39a0: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
39b0: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
39c0: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
39d0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
39e0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
39f0: 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20  TMALLOC: {.     
3a00: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
3a10: 20 52 2d 35 31 32 31 33 2d 34 36 34 31 34 20 54   R-51213-46414 T
3a20: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
3a30: 5f 47 45 54 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f  _GETMALLOC optio
3a40: 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20  n takes a.      
3a50: 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65  ** single argume
3a60: 6e 74 20 77 68 69 63 68 20 69 73 20 61 20 70 6f  nt which is a po
3a70: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
3a80: 61 6e 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20  ance of the.    
3a90: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d    ** sqlite3_mem
3aa0: 5f 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75  _methods structu
3ab0: 72 65 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f  re. The sqlite3_
3ac0: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75  mem_methods stru
3ad0: 63 74 75 72 65 20 69 73 0a 20 20 20 20 20 20 2a  cture is.      *
3ae0: 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  * filled with th
3af0: 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
3b00: 6e 65 64 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ned memory alloc
3b10: 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 2e 20  ation routines. 
3b20: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
3b30: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3b40: 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20  .m.xMalloc==0 ) 
3b50: 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66  sqlite3MemSetDef
3b60: 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 2a 76  ault();.      *v
3b70: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
3b80: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 20  3_mem_methods*) 
3b90: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
3ba0: 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20 20 20 62  onfig.m;.      b
3bb0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3bc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3bd0: 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a 20 7b 0a  IG_MEMSTATUS: {.
3be0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3bf0: 45 2d 4f 46 3a 20 52 2d 36 31 32 37 35 2d 33 35  E-OF: R-61275-35
3c00: 31 35 37 20 54 68 65 20 53 51 4c 49 54 45 5f 43  157 The SQLITE_C
3c10: 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 20  ONFIG_MEMSTATUS 
3c20: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a 20 20 20  option takes.   
3c30: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67     ** single arg
3c40: 75 6d 65 6e 74 20 6f 66 20 74 79 70 65 20 69 6e  ument of type in
3c50: 74 2c 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  t, interpreted a
3c60: 73 20 61 20 62 6f 6f 6c 65 61 6e 2c 20 77 68 69  s a boolean, whi
3c70: 63 68 20 65 6e 61 62 6c 65 73 0a 20 20 20 20 20  ch enables.     
3c80: 20 2a 2a 20 6f 72 20 64 69 73 61 62 6c 65 73 20   ** or disables 
3c90: 74 68 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f  the collection o
3ca0: 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  f memory allocat
3cb0: 69 6f 6e 20 73 74 61 74 69 73 74 69 63 73 2e 20  ion statistics. 
3cc0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3cd0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65  GlobalConfig.bMe
3ce0: 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67 28 61  mstat = va_arg(a
3cf0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3d00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3d10: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3d20: 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20 20  IG_SCRATCH: {.  
3d30: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
3d40: 4f 46 3a 20 52 2d 30 38 34 30 34 2d 36 30 38 38  OF: R-08404-6088
3d50: 37 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65  7 There are thre
3d60: 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20  e arguments to. 
3d70: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43       ** SQLITE_C
3d80: 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 41  ONFIG_SCRATCH: A
3d90: 20 70 6f 69 6e 74 65 72 20 61 6e 20 38 2d 62 79   pointer an 8-by
3da0: 74 65 20 61 6c 69 67 6e 65 64 20 6d 65 6d 6f 72  te aligned memor
3db0: 79 20 62 75 66 66 65 72 20 66 72 6f 6d 0a 20 20  y buffer from.  
3dc0: 20 20 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65      ** which the
3dd0: 20 73 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74   scratch allocat
3de0: 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 64 72 61  ions will be dra
3df0: 77 6e 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 20  wn, the size of 
3e00: 65 61 63 68 20 73 63 72 61 74 63 68 0a 20 20 20  each scratch.   
3e10: 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e     ** allocation
3e20: 20 28 73 7a 29 2c 20 61 6e 64 20 74 68 65 20 6d   (sz), and the m
3e30: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
3e40: 20 73 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74   scratch allocat
3e50: 69 6f 6e 73 20 28 4e 29 2e 20 2a 2f 0a 20 20 20  ions (N). */.   
3e60: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3e70: 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63 68 20  Config.pScratch 
3e80: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
3e90: 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d*);.      sqlit
3ea0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
3eb0: 7a 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72  zScratch = va_ar
3ec0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3ed0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3ee0: 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 20 3d  onfig.nScratch =
3ef0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
3f00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3f10: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3f20: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45  LITE_CONFIG_PAGE
3f30: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
3f40: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
3f50: 2d 31 38 37 36 31 2d 33 36 36 30 31 20 54 68 65  -18761-36601 The
3f60: 72 65 20 61 72 65 20 74 68 72 65 65 20 61 72 67  re are three arg
3f70: 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20 20  uments to.      
3f80: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ** SQLITE_CONFIG
3f90: 5f 50 41 47 45 43 41 43 48 45 3a 20 41 20 70 6f  _PAGECACHE: A po
3fa0: 69 6e 74 65 72 20 74 6f 20 38 2d 62 79 74 65 20  inter to 8-byte 
3fb0: 61 6c 69 67 6e 65 64 20 6d 65 6d 6f 72 79 20 28  aligned memory (
3fc0: 70 4d 65 6d 29 2c 0a 20 20 20 20 20 20 2a 2a 20  pMem),.      ** 
3fd0: 74 68 65 20 73 69 7a 65 20 6f 66 20 65 61 63 68  the size of each
3fe0: 20 70 61 67 65 20 63 61 63 68 65 20 6c 69 6e 65   page cache line
3ff0: 20 28 73 7a 29 2c 20 61 6e 64 20 74 68 65 20 6e   (sz), and the n
4000: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 6c  umber of cache l
4010: 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 28 4e  ines.      ** (N
4020: 29 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ). */.      sqli
4030: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4040: 70 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  pPage = va_arg(a
4050: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
4060: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4070: 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d 20 76 61  nfig.szPage = va
4080: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
4090: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
40a0: 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d  alConfig.nPage =
40b0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
40c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
40d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
40e0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43  LITE_CONFIG_PCAC
40f0: 48 45 5f 48 44 52 53 5a 3a 20 7b 0a 20 20 20 20  HE_HDRSZ: {.    
4100: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
4110: 3a 20 52 2d 33 39 31 30 30 2d 32 37 33 31 37 20  : R-39100-27317 
4120: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
4130: 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 20 6f  G_PCACHE_HDRSZ o
4140: 70 74 69 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20  ption takes.    
4150: 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 70 61    ** a single pa
4160: 72 61 6d 65 74 65 72 20 77 68 69 63 68 20 69 73  rameter which is
4170: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
4180: 20 69 6e 74 65 67 65 72 20 61 6e 64 20 77 72 69   integer and wri
4190: 74 65 73 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a  tes into.      *
41a0: 2a 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 74  * that integer t
41b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 74  he number of ext
41c0: 72 61 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ra bytes per pag
41d0: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65  e required for e
41e0: 61 63 68 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ach page.      *
41f0: 2a 20 69 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46  * in SQLITE_CONF
4200: 49 47 5f 50 41 47 45 43 41 43 48 45 2e 20 2a 2f  IG_PAGECACHE. */
4210: 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61  .      *va_arg(a
4220: 70 2c 20 69 6e 74 2a 29 20 3d 20 0a 20 20 20 20  p, int*) = .    
4230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 65 61        sqlite3Hea
4240: 64 65 72 53 69 7a 65 42 74 72 65 65 28 29 20 2b  derSizeBtree() +
4250: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4260: 65 33 48 65 61 64 65 72 53 69 7a 65 50 63 61 63  e3HeaderSizePcac
4270: 68 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20 20  he() +.         
4280: 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53 69   sqlite3HeaderSi
4290: 7a 65 50 63 61 63 68 65 31 28 29 3b 0a 20 20 20  zePcache1();.   
42a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
42b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
42c0: 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 3a 20  _CONFIG_PCACHE: 
42d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70  {.      /* no-op
42e0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
42f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4300: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
4310: 54 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20  TPCACHE: {.     
4320: 20 2f 2a 20 6e 6f 77 20 61 6e 20 65 72 72 6f 72   /* now an error
4330: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
4340: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
4350: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4360: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4370: 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 3a  _CONFIG_PCACHE2:
4380: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
4390: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 33 32 35  ENCE-OF: R-63325
43a0: 2d 34 38 33 37 38 20 54 68 65 20 53 51 4c 49 54  -48378 The SQLIT
43b0: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 32  E_CONFIG_PCACHE2
43c0: 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a   option takes a.
43d0: 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
43e0: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
43f0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
4400: 6e 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  n sqlite3_pcache
4410: 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20 20 20 20  _methods2.      
4420: 2a 2a 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  ** object. This 
4430: 6f 62 6a 65 63 74 20 73 70 65 63 69 66 69 65 73  object specifies
4440: 20 74 68 65 20 69 6e 74 65 72 66 61 63 65 20 74   the interface t
4450: 6f 20 61 20 63 75 73 74 6f 6d 20 70 61 67 65 20  o a custom page 
4460: 63 61 63 68 65 0a 20 20 20 20 20 20 2a 2a 20 69  cache.      ** i
4470: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 2a  mplementation. *
4480: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
4490: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63  lobalConfig.pcac
44a0: 68 65 32 20 3d 20 2a 76 61 5f 61 72 67 28 61 70  he2 = *va_arg(ap
44b0: 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  , sqlite3_pcache
44c0: 5f 6d 65 74 68 6f 64 73 32 2a 29 3b 0a 20 20 20  _methods2*);.   
44d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
44e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
44f0: 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45  CONFIG_GETPCACHE
4500: 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  2: {.      /* EV
4510: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 30  IDENCE-OF: R-220
4520: 33 35 2d 34 36 31 38 32 20 54 68 65 20 53 51 4c  35-46182 The SQL
4530: 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43  ITE_CONFIG_GETPC
4540: 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b  ACHE2 option tak
4550: 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69  es a.      ** si
4560: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  ngle argument wh
4570: 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ich is a pointer
4580: 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 70   to an sqlite3_p
4590: 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20  cache_methods2. 
45a0: 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20       ** object. 
45b0: 53 51 4c 69 74 65 20 63 6f 70 69 65 73 20 6f 66  SQLite copies of
45c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
45d0: 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e  e cache implemen
45e0: 74 61 74 69 6f 6e 20 69 6e 74 6f 0a 20 20 20 20  tation into.    
45f0: 20 20 2a 2a 20 74 68 61 74 20 6f 62 6a 65 63 74    ** that object
4600: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  . */.      if( s
4610: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4620: 69 67 2e 70 63 61 63 68 65 32 2e 78 49 6e 69 74  ig.pcache2.xInit
4630: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
4640: 71 6c 69 74 65 33 50 43 61 63 68 65 53 65 74 44  qlite3PCacheSetD
4650: 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20  efault();.      
4660: 7d 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28  }.      *va_arg(
4670: 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63  ap, sqlite3_pcac
4680: 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29 20 3d 20  he_methods2*) = 
4690: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
46a0: 66 69 67 2e 70 63 61 63 68 65 32 3b 0a 20 20 20  fig.pcache2;.   
46b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
46c0: 0a 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ./* EVIDENCE-OF:
46d0: 20 52 2d 30 36 36 32 36 2d 31 32 39 31 31 20 54   R-06626-12911 T
46e0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
46f0: 5f 48 45 41 50 20 6f 70 74 69 6f 6e 20 69 73 20  _HEAP option is 
4700: 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  only.** availabl
4710: 65 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 63  e if SQLite is c
4720: 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 65 69 74  ompiled with eit
4730: 68 65 72 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  her SQLITE_ENABL
4740: 45 5f 4d 45 4d 53 59 53 33 20 6f 72 0a 2a 2a 20  E_MEMSYS3 or.** 
4750: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
4760: 4d 53 59 53 35 20 61 6e 64 20 72 65 74 75 72 6e  MSYS5 and return
4770: 73 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  s SQLITE_ERROR i
4780: 66 20 69 6e 76 6f 6b 65 64 20 6f 74 68 65 72 77  f invoked otherw
4790: 69 73 65 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69  ise. */.#if defi
47a0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
47b0: 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65  E_MEMSYS3) || de
47c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
47d0: 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20  BLE_MEMSYS5).   
47e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
47f0: 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20  FIG_HEAP: {.    
4800: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
4810: 3a 20 52 2d 31 39 38 35 34 2d 34 32 31 32 36 20  : R-19854-42126 
4820: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
4830: 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
4840: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     ** SQLITE_CON
4850: 46 49 47 5f 48 45 41 50 3a 20 41 6e 20 38 2d 62  FIG_HEAP: An 8-b
4860: 79 74 65 20 61 6c 69 67 6e 65 64 20 70 6f 69 6e  yte aligned poin
4870: 74 65 72 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72  ter to the memor
4880: 79 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  y, the.      ** 
4890: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
48a0: 69 6e 20 74 68 65 20 6d 65 6d 6f 72 79 20 62 75  in the memory bu
48b0: 66 66 65 72 2c 20 61 6e 64 20 74 68 65 20 6d 69  ffer, and the mi
48c0: 6e 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 69 6f 6e  nimum allocation
48d0: 20 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   size..      */.
48e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
48f0: 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20  balConfig.pHeap 
4900: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
4910: 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d*);.      sqlit
4920: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
4930: 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Heap = va_arg(ap
4940: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
4950: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4960: 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67  g.mnReq = va_arg
4970: 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20  (ap, int);..    
4980: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
4990: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c  balConfig.mnReq<
49a0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
49b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
49c0: 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20 20 20 20  .mnReq = 1;.    
49d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
49e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
49f0: 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b  mnReq>(1<<12) ){
4a00: 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 61 70 20  .        /* cap 
4a10: 6d 69 6e 20 72 65 71 75 65 73 74 20 73 69 7a 65  min request size
4a20: 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20   at 2^12 */.    
4a30: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4a40: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
4a50: 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d  (1<<12);.      }
4a60: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
4a70: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4a80: 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20  pHeap==0 ){.    
4a90: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4aa0: 4f 46 3a 20 52 2d 34 39 39 32 30 2d 36 30 31 38  OF: R-49920-6018
4ab0: 39 20 49 66 20 74 68 65 20 66 69 72 73 74 20 70  9 If the first p
4ac0: 6f 69 6e 74 65 72 20 28 74 68 65 20 6d 65 6d 6f  ointer (the memo
4ad0: 72 79 20 70 6f 69 6e 74 65 72 29 0a 20 20 20 20  ry pointer).    
4ae0: 20 20 20 20 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20      ** is NULL, 
4af0: 74 68 65 6e 20 53 51 4c 69 74 65 20 72 65 76 65  then SQLite reve
4b00: 72 74 73 20 74 6f 20 75 73 69 6e 67 20 69 74 73  rts to using its
4b10: 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f 72 79 20   default memory 
4b20: 61 6c 6c 6f 63 61 74 6f 72 0a 20 20 20 20 20 20  allocator.      
4b30: 20 20 2a 2a 20 28 74 68 65 20 73 79 73 74 65 6d    ** (the system
4b40: 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d   malloc() implem
4b50: 65 6e 74 61 74 69 6f 6e 29 2c 20 75 6e 64 6f 69  entation), undoi
4b60: 6e 67 20 61 6e 79 20 70 72 69 6f 72 20 69 6e 76  ng any prior inv
4b70: 6f 63 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20  ocation of.     
4b80: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     ** SQLITE_CON
4b90: 46 49 47 5f 4d 41 4c 4c 4f 43 2e 0a 20 20 20 20  FIG_MALLOC..    
4ba0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
4bb0: 2a 20 53 65 74 74 69 6e 67 20 73 71 6c 69 74 65  * Setting sqlite
4bc0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20  3GlobalConfig.m 
4bd0: 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 20 77 69 6c  to all zeros wil
4be0: 6c 20 63 61 75 73 65 20 6d 61 6c 6c 6f 63 20 74  l cause malloc t
4bf0: 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 76  o.        ** rev
4c00: 65 72 74 20 74 6f 20 69 74 73 20 64 65 66 61 75  ert to its defau
4c10: 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  lt implementatio
4c20: 6e 20 77 68 65 6e 20 73 71 6c 69 74 65 33 5f 69  n when sqlite3_i
4c30: 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73 20 72  nitialize() is r
4c40: 75 6e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  un.        */.  
4c50: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71        memset(&sq
4c60: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4c70: 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  g.m, 0, sizeof(s
4c80: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4c90: 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65  ig.m));.      }e
4ca0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
4cb0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
4cc0: 31 30 30 36 2d 30 38 39 31 38 20 49 66 20 74 68  1006-08918 If th
4cd0: 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72  e memory pointer
4ce0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
4cf0: 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  n the.        **
4d00: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 65 6d   alternative mem
4d10: 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73  ory allocator is
4d20: 20 65 6e 67 61 67 65 64 20 74 6f 20 68 61 6e 64   engaged to hand
4d30: 6c 65 20 61 6c 6c 20 6f 66 20 53 51 4c 69 74 65  le all of SQLite
4d40: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d  s.        ** mem
4d50: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6e  ory allocation n
4d60: 65 65 64 73 2e 20 2a 2f 0a 23 69 66 64 65 66 20  eeds. */.#ifdef 
4d70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
4d80: 4d 53 59 53 33 0a 20 20 20 20 20 20 20 20 73 71  MSYS3.        sq
4d90: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4da0: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
4db0: 6d 47 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23  mGetMemsys3();.#
4dc0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
4dd0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4de0: 53 35 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  S5.        sqlit
4df0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4e00: 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65   = *sqlite3MemGe
4e10: 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64  tMemsys5();.#end
4e20: 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
4e30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
4e40: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
4e50: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f  QLITE_CONFIG_LOO
4e60: 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20  KASIDE: {.      
4e70: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4e80: 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20  fig.szLookaside 
4e90: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
4ea0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4eb0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f  GlobalConfig.nLo
4ec0: 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67  okaside = va_arg
4ed0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4ee0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4ef0: 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64    .    /* Record
4f00: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
4f10: 65 20 6c 6f 67 67 65 72 20 66 75 6e 63 74 69 6f  e logger functio
4f20: 6e 20 61 6e 64 20 69 74 73 20 66 69 72 73 74 20  n and its first 
4f30: 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a 2a  argument..    **
4f40: 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
4f50: 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20 69  NULL.  Logging i
4f60: 73 20 64 69 73 61 62 6c 65 64 20 69 66 20 74 68  s disabled if th
4f70: 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  e function point
4f80: 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c  er is.    ** NUL
4f90: 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  L..    */.    ca
4fa0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
4fb0: 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  _LOG: {.      /*
4fc0: 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20 61   MSVC is picky a
4fd0: 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e  bout pulling fun
4fe0: 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c  c ptrs from va l
4ff0: 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68  ists..      ** h
5000: 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69  ttp://support.mi
5010: 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34  crosoft.com/kb/4
5020: 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71  7961.      ** sq
5030: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
5040: 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28  g.xLog = va_arg(
5050: 61 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69 64  ap, void(*)(void
5060: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  *,int,const char
5070: 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20  *));.      */.  
5080: 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64      typedef void
5090: 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69  (*LOGFUNC_t)(voi
50a0: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61  d*,int,const cha
50b0: 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r*);.      sqlit
50c0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
50d0: 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Log = va_arg(ap,
50e0: 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20   LOGFUNC_t);.   
50f0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
5100: 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20 3d  Config.pLogArg =
5110: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
5120: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
5130: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45  .    }..    /* E
5140: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35  VIDENCE-OF: R-55
5150: 35 34 38 2d 33 33 38 31 37 20 54 68 65 20 63 6f  548-33817 The co
5160: 6d 70 69 6c 65 2d 74 69 6d 65 20 73 65 74 74 69  mpile-time setti
5170: 6e 67 20 66 6f 72 20 55 52 49 20 66 69 6c 65 6e  ng for URI filen
5180: 61 6d 65 73 0a 20 20 20 20 2a 2a 20 63 61 6e 20  ames.    ** can 
5190: 62 65 20 63 68 61 6e 67 65 64 20 61 74 20 73 74  be changed at st
51a0: 61 72 74 2d 74 69 6d 65 20 75 73 69 6e 67 20 74  art-time using t
51b0: 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  he.    ** sqlite
51c0: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
51d0: 43 4f 4e 46 49 47 5f 55 52 49 2c 31 29 20 6f 72  CONFIG_URI,1) or
51e0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
51f0: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
5200: 4e 46 49 47 5f 55 52 49 2c 30 29 20 63 6f 6e 66  NFIG_URI,0) conf
5210: 69 67 75 72 61 74 69 6f 6e 20 63 61 6c 6c 73 2e  iguration calls.
5220: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5230: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55   SQLITE_CONFIG_U
5240: 52 49 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  RI: {.      /* E
5250: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35  VIDENCE-OF: R-25
5260: 34 35 31 2d 36 31 31 32 35 20 54 68 65 20 53 51  451-61125 The SQ
5270: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 20  LITE_CONFIG_URI 
5280: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73  option takes a s
5290: 69 6e 67 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61  ingle.      ** a
52a0: 72 67 75 6d 65 6e 74 20 6f 66 20 74 79 70 65 20  rgument of type 
52b0: 69 6e 74 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f  int. If non-zero
52c0: 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64 6c  , then URI handl
52d0: 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a  ing is globally.
52e0: 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64        ** enabled
52f0: 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  . If the paramet
5300: 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  er is zero, then
5310: 20 55 52 49 20 68 61 6e 64 6c 69 6e 67 20 69 73   URI handling is
5320: 20 67 6c 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20   globally.      
5330: 2a 2a 20 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a  ** disabled. */.
5340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5350: 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55  balConfig.bOpenU
5360: 72 69 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ri = va_arg(ap, 
5370: 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
5380: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
5390: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
53a0: 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f  _COVERING_INDEX_
53b0: 53 43 41 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  SCAN: {.      /*
53c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
53d0: 33 36 35 39 32 2d 30 32 37 37 32 20 54 68 65 20  36592-02772 The 
53e0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f  SQLITE_CONFIG_CO
53f0: 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41  VERING_INDEX_SCA
5400: 4e 0a 20 20 20 20 20 20 2a 2a 20 6f 70 74 69 6f  N.      ** optio
5410: 6e 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65  n takes a single
5420: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
5430: 74 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  t which is inter
5440: 70 72 65 74 65 64 20 61 73 20 61 0a 20 20 20 20  preted as a.    
5450: 20 20 2a 2a 20 62 6f 6f 6c 65 61 6e 20 69 6e 20    ** boolean in 
5460: 6f 72 64 65 72 20 74 6f 20 65 6e 61 62 6c 65 20  order to enable 
5470: 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 75  or disable the u
5480: 73 65 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69  se of covering i
5490: 6e 64 69 63 65 73 20 66 6f 72 0a 20 20 20 20 20  ndices for.     
54a0: 20 2a 2a 20 66 75 6c 6c 20 74 61 62 6c 65 20 73   ** full table s
54b0: 63 61 6e 73 20 69 6e 20 74 68 65 20 71 75 65 72  cans in the quer
54c0: 79 20 6f 70 74 69 6d 69 7a 65 72 2e 20 2a 2f 0a  y optimizer. */.
54d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
54e0: 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
54f0: 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  s = va_arg(ap, i
5500: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
5510: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
5520: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
5530: 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65 20 53 51  LLOG.    case SQ
5540: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
5550: 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65  OG: {.      type
5560: 64 65 66 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47  def void(*SQLLOG
5570: 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73  FUNC_t)(void*, s
5580: 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63  qlite3*, const c
5590: 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20  har*, int);.    
55a0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
55b0: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20  onfig.xSqllog = 
55c0: 76 61 5f 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f  va_arg(ap, SQLLO
55d0: 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  GFUNC_t);.      
55e0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
55f0: 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d  fig.pSqllogArg =
5600: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
5610: 20 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   *);.      break
5620: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
5630: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5640: 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45  CONFIG_MMAP_SIZE
5650: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
5660: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 36  DENCE-OF: R-5806
5670: 33 2d 33 38 32 35 38 20 53 51 4c 49 54 45 5f 43  3-38258 SQLITE_C
5680: 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 20  ONFIG_MMAP_SIZE 
5690: 74 61 6b 65 73 20 74 77 6f 20 36 34 2d 62 69 74  takes two 64-bit
56a0: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  .      ** intege
56b0: 72 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  r (sqlite3_int64
56c0: 29 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72  ) values that ar
56d0: 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 6d 6d  e the default mm
56e0: 61 70 20 73 69 7a 65 20 6c 69 6d 69 74 0a 20 20  ap size limit.  
56f0: 20 20 20 20 2a 2a 20 28 74 68 65 20 64 65 66 61      ** (the defa
5700: 75 6c 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20  ult setting for 
5710: 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65  PRAGMA mmap_size
5720: 29 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  ) and the maximu
5730: 6d 20 61 6c 6c 6f 77 65 64 0a 20 20 20 20 20 20  m allowed.      
5740: 2a 2a 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d  ** mmap size lim
5750: 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  it. */.      sql
5760: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61  ite3_int64 szMma
5770: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  p = va_arg(ap, s
5780: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20  qlite3_int64);. 
5790: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
57a0: 36 34 20 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61  64 mxMmap = va_a
57b0: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69  rg(ap, sqlite3_i
57c0: 6e 74 36 34 29 3b 0a 20 20 20 20 20 20 2f 2a 20  nt64);.      /* 
57d0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
57e0: 33 33 36 37 2d 34 33 31 39 30 20 49 66 20 65 69  3367-43190 If ei
57f0: 74 68 65 72 20 61 72 67 75 6d 65 6e 74 20 74 6f  ther argument to
5800: 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 0a   this option is.
5810: 20 20 20 20 20 20 2a 2a 20 6e 65 67 61 74 69 76        ** negativ
5820: 65 2c 20 74 68 65 6e 20 74 68 61 74 20 61 72 67  e, then that arg
5830: 75 6d 65 6e 74 20 69 73 20 63 68 61 6e 67 65 64  ument is changed
5840: 20 74 6f 20 69 74 73 20 63 6f 6d 70 69 6c 65 2d   to its compile-
5850: 74 69 6d 65 20 64 65 66 61 75 6c 74 2e 0a 20 20  time default..  
5860: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
5870: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
5880: 34 39 39 33 2d 34 35 30 33 31 20 54 68 65 20 6d  4993-45031 The m
5890: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 6d  aximum allowed m
58a0: 6d 61 70 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  map size will be
58b0: 0a 20 20 20 20 20 20 2a 2a 20 73 69 6c 65 6e 74  .      ** silent
58c0: 6c 79 20 74 72 75 6e 63 61 74 65 64 20 69 66 20  ly truncated if 
58d0: 6e 65 63 65 73 73 61 72 79 20 73 6f 20 74 68 61  necessary so tha
58e0: 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  t it does not ex
58f0: 63 65 65 64 20 74 68 65 0a 20 20 20 20 20 20 2a  ceed the.      *
5900: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6d  * compile-time m
5910: 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a 65  aximum mmap size
5920: 20 73 65 74 20 62 79 20 74 68 65 20 53 51 4c 49   set by the SQLI
5930: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
5940: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  .      ** compil
5950: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20  e-time option.. 
5960: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
5970: 28 20 6d 78 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78  ( mxMmap<0 || mx
5980: 4d 6d 61 70 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Mmap>SQLITE_MAX_
5990: 4d 4d 41 50 5f 53 49 5a 45 20 29 7b 0a 20 20 20  MMAP_SIZE ){.   
59a0: 20 20 20 20 20 6d 78 4d 6d 61 70 20 3d 20 53 51       mxMmap = SQ
59b0: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
59c0: 5a 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ZE;.      }.    
59d0: 20 20 69 66 28 20 73 7a 4d 6d 61 70 3c 30 20 29    if( szMmap<0 )
59e0: 20 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45   szMmap = SQLITE
59f0: 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49  _DEFAULT_MMAP_SI
5a00: 5a 45 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  ZE;.      if( sz
5a10: 4d 6d 61 70 3e 6d 78 4d 6d 61 70 29 20 73 7a 4d  Mmap>mxMmap) szM
5a20: 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20  map = mxMmap;.  
5a30: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
5a40: 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 3d  lConfig.mxMmap =
5a50: 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 73   mxMmap;.      s
5a60: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
5a70: 69 67 2e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d  ig.szMmap = szMm
5a80: 61 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ap;.      break;
5a90: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  .    }..#if SQLI
5aa0: 54 45 5f 4f 53 5f 57 49 4e 20 26 26 20 64 65 66  TE_OS_WIN && def
5ab0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5ac0: 32 5f 4d 41 4c 4c 4f 43 29 20 2f 2a 20 49 4d 50  2_MALLOC) /* IMP
5ad0: 3a 20 52 2d 30 34 37 38 30 2d 35 35 38 31 35 20  : R-04780-55815 
5ae0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
5af0: 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e 33 32 5f  TE_CONFIG_WIN32_
5b00: 48 45 41 50 53 49 5a 45 3a 20 7b 0a 20 20 20 20  HEAPSIZE: {.    
5b10: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
5b20: 3a 20 52 2d 33 34 39 32 36 2d 30 33 33 36 30 20  : R-34926-03360 
5b30: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49  SQLITE_CONFIG_WI
5b40: 4e 33 32 5f 48 45 41 50 53 49 5a 45 20 74 61 6b  N32_HEAPSIZE tak
5b50: 65 73 20 61 20 33 32 2d 62 69 74 0a 20 20 20 20  es a 32-bit.    
5b60: 20 20 2a 2a 20 75 6e 73 69 67 6e 65 64 20 69 6e    ** unsigned in
5b70: 74 65 67 65 72 20 76 61 6c 75 65 20 74 68 61 74  teger value that
5b80: 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6d   specifies the m
5b90: 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74  aximum size of t
5ba0: 68 65 20 63 72 65 61 74 65 64 0a 20 20 20 20 20  he created.     
5bb0: 20 2a 2a 20 68 65 61 70 2e 20 2a 2f 0a 20 20 20   ** heap. */.   
5bc0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
5bd0: 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76  Config.nHeap = v
5be0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
5bf0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5c00: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63   }.#endif..    c
5c10: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
5c20: 47 5f 50 4d 41 53 5a 3a 20 7b 0a 20 20 20 20 20  G_PMASZ: {.     
5c30: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5c40: 6e 66 69 67 2e 73 7a 50 6d 61 20 3d 20 76 61 5f  nfig.szPma = va_
5c50: 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64  arg(ap, unsigned
5c60: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
5c70: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  ak;.    }..    d
5c80: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5c90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
5ca0: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
5cb0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65      }.  }.  va_e
5cc0: 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e  nd(ap);.  return
5cd0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
5ce0: 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61 73 69  t up the lookasi
5cf0: 64 65 20 62 75 66 66 65 72 73 20 66 6f 72 20 61  de buffers for a
5d00: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
5d10: 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  tion..** Return 
5d20: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
5d30: 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f  cess.  .** If lo
5d40: 6f 6b 61 73 69 64 65 20 69 73 20 61 6c 72 65 61  okaside is alrea
5d50: 64 79 20 61 63 74 69 76 65 2c 20 72 65 74 75 72  dy active, retur
5d60: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a  n SQLITE_BUSY..*
5d70: 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61 72 61  *.** The sz para
5d80: 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d  meter is the num
5d90: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
5da0: 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65 20 73  each lookaside s
5db0: 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e 74 20  lot..** The cnt 
5dc0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
5dd0: 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   number of slots
5de0: 2e 20 20 49 66 20 70 53 74 61 72 74 20 69 73 20  .  If pStart is 
5df0: 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70 61 63  NULL the.** spac
5e00: 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b 61 73  e for the lookas
5e10: 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 6f 62  ide memory is ob
5e20: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
5e30: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
5e40: 20 49 66 20 70 53 74 61 72 74 20 69 73 20 6e 6f   If pStart is no
5e50: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69  t NULL then it i
5e60: 73 20 73 7a 2a 63 6e 74 20 62 79 74 65 73 20 6f  s sz*cnt bytes o
5e70: 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73 65 20  f memory to use 
5e80: 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61  for.** the looka
5e90: 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  side memory..*/.
5ea0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 75 70  static int setup
5eb0: 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69 74 65  Lookaside(sqlite
5ec0: 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70 42 75  3 *db, void *pBu
5ed0: 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 63  f, int sz, int c
5ee0: 6e 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nt){.#ifndef SQL
5ef0: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49  ITE_OMIT_LOOKASI
5f00: 44 45 0a 20 20 76 6f 69 64 20 2a 70 53 74 61 72  DE.  void *pStar
5f10: 74 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  t;.  if( db->loo
5f20: 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20  kaside.nOut ){. 
5f30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5f40: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  _BUSY;.  }.  /* 
5f50: 46 72 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e  Free any existin
5f60: 67 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66  g lookaside buff
5f70: 65 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64  er for this hand
5f80: 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  le before.  ** a
5f90: 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
5fa0: 6f 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20  one so we don't 
5fb0: 68 61 76 65 20 74 6f 20 68 61 76 65 20 73 70 61  have to have spa
5fc0: 63 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74  ce for .  ** bot
5fd0: 68 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  h at the same ti
5fe0: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  me..  */.  if( d
5ff0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
6000: 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71  lloced ){.    sq
6010: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c  lite3_free(db->l
6020: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29  ookaside.pStart)
6030: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
6040: 69 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69  ize of a lookasi
6050: 64 65 20 73 6c 6f 74 20 61 66 74 65 72 20 52 4f  de slot after RO
6060: 55 4e 44 44 4f 57 4e 38 20 6e 65 65 64 73 20 74  UNDDOWN8 needs t
6070: 6f 20 62 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a  o be larger.  **
6080: 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 20   than a pointer 
6090: 74 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20  to be useful..  
60a0: 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44  */.  sz = ROUNDD
60b0: 4f 57 4e 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d  OWN8(sz);  /* IM
60c0: 50 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32  P: R-33038-09382
60d0: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69   */.  if( sz<=(i
60e0: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
60f0: 69 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d  ideSlot*) ) sz =
6100: 20 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20   0;.  if( cnt<0 
6110: 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  ) cnt = 0;.  if(
6120: 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30   sz==0 || cnt==0
6130: 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a   ){.    sz = 0;.
6140: 20 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a      pStart = 0;.
6150: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66    }else if( pBuf
6160: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
6170: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
6180: 6c 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72  loc();.    pStar
6190: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
61a0: 63 28 20 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a  c( sz*cnt );  /*
61b0: 20 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35   IMP: R-61949-35
61c0: 37 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  727 */.    sqlit
61d0: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
61e0: 63 28 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74  c();.    if( pSt
61f0: 61 72 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69  art ) cnt = sqli
6200: 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53  te3MallocSize(pS
6210: 74 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73  tart)/sz;.  }els
6220: 65 7b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20  e{.    pStart = 
6230: 70 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  pBuf;.  }.  db->
6240: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
6250: 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d   = pStart;.  db-
6260: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65  >lookaside.pFree
6270: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b   = 0;.  db->look
6280: 61 73 69 64 65 2e 73 7a 20 3d 20 28 75 31 36 29  aside.sz = (u16)
6290: 73 7a 3b 0a 20 20 69 66 28 20 70 53 74 61 72 74  sz;.  if( pStart
62a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
62b0: 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74     LookasideSlot
62c0: 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28   *p;.    assert(
62d0: 20 73 7a 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f   sz > (int)sizeo
62e0: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
62f0: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f  ) );.    p = (Lo
6300: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70 53 74  okasideSlot*)pSt
6310: 61 72 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63  art;.    for(i=c
6320: 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  nt-1; i>=0; i--)
6330: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74  {.      p->pNext
6340: 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65   = db->lookaside
6350: 2e 70 46 72 65 65 3b 0a 20 20 20 20 20 20 64 62  .pFree;.      db
6360: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65  ->lookaside.pFre
6370: 65 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 20 3d  e = p;.      p =
6380: 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a   (LookasideSlot*
6390: 29 26 28 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a  )&((u8*)p)[sz];.
63a0: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f      }.    db->lo
63b0: 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 70  okaside.pEnd = p
63c0: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
63d0: 69 64 65 2e 62 44 69 73 61 62 6c 65 20 3d 20 30  ide.bDisable = 0
63e0: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
63f0: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20  ide.bMalloced = 
6400: 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20  pBuf==0 ?1:0;.  
6410: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c  }else{.    db->l
6420: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20  ookaside.pStart 
6430: 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = db;.    db->lo
6440: 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 64  okaside.pEnd = d
6450: 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  b;.    db->looka
6460: 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20 3d 20  side.bDisable = 
6470: 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  1;.    db->looka
6480: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d  side.bMalloced =
6490: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   0;.  }.#endif /
64a0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  * SQLITE_OMIT_LO
64b0: 4f 4b 41 53 49 44 45 20 2a 2f 0a 20 20 72 65 74  OKASIDE */.  ret
64c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
64d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
64e0: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
64f0: 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
6500: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
6510: 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  */.sqlite3_mutex
6520: 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74   *sqlite3_db_mut
6530: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ex(sqlite3 *db){
6540: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6550: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
6560: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
6570: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
6580: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
6590: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
65a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
65b0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
65c0: 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a  rn db->mutex;.}.
65d0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20 61  ./*.** Free up a
65e0: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
65f0: 20 77 65 20 63 61 6e 20 66 72 6f 6d 20 74 68 65   we can from the
6600: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a   given database.
6610: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ** connection..*
6620: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
6630: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
6640: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
6650: 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 53  int i;..#ifdef S
6660: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
6670: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
6680: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
6690: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
66a0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
66b0: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
66c0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
66d0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
66e0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
66f0: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
6700: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
6710: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
6720: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
6730: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
6740: 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  t ){.      Pager
6750: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
6760: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
6770: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6780: 50 61 67 65 72 53 68 72 69 6e 6b 28 70 50 61 67  PagerShrink(pPag
6790: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
67a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
67b0: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
67c0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
67d0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
67e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
67f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
6800: 61 6e 79 20 64 69 72 74 79 20 70 61 67 65 73 20  any dirty pages 
6810: 69 6e 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  in the pager-cac
6820: 68 65 20 66 6f 72 20 61 6e 79 20 61 74 74 61 63  he for any attac
6830: 68 65 64 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  hed database.** 
6840: 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  to disk..*/.int 
6850: 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65  sqlite3_db_cache
6860: 66 6c 75 73 68 28 73 71 6c 69 74 65 33 20 2a 64  flush(sqlite3 *d
6870: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
6880: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6890: 4b 3b 0a 20 20 69 6e 74 20 62 53 65 65 6e 42 75  K;.  int bSeenBu
68a0: 73 79 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  sy = 0;..#ifdef 
68b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
68c0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
68d0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
68e0: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
68f0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
6900: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
6910: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6920: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
6930: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
6940: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28  rAll(db);.  for(
6950: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
6960: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
6970: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
6980: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
6990: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
69a0: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
69b0: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
69c0: 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  ) ){.      Pager
69d0: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
69e0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
69f0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
6a00: 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28  lite3PagerFlush(
6a10: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
6a20: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
6a30: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53  SY ){.        bS
6a40: 65 65 6e 42 75 73 79 20 3d 20 31 3b 0a 20 20 20  eenBusy = 1;.   
6a50: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6a60: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
6a70: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
6a80: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
6a90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
6aa0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
6ab0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  ex);.  return ((
6ac0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
6ad0: 20 62 53 65 65 6e 42 75 73 79 29 20 3f 20 53 51   bSeenBusy) ? SQ
6ae0: 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 29 3b  LITE_BUSY : rc);
6af0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
6b00: 75 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73  uration settings
6b10: 20 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75   for an individu
6b20: 61 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  al database conn
6b30: 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71  ection.*/.int sq
6b40: 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
6b50: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
6b60: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
6b70: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
6b80: 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  c;.  va_start(ap
6b90: 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
6ba0: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
6bb0: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
6bc0: 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20  LOOKASIDE: {.   
6bd0: 20 20 20 76 6f 69 64 20 2a 70 42 75 66 20 3d 20     void *pBuf = 
6be0: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
6bf0: 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 38  ); /* IMP: R-268
6c00: 33 35 2d 31 30 39 36 34 20 2a 2f 0a 20 20 20 20  35-10964 */.    
6c10: 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72    int sz = va_ar
6c20: 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20  g(ap, int);     
6c30: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 37 38 37    /* IMP: R-4787
6c40: 31 2d 32 35 39 39 34 20 2a 2f 0a 20 20 20 20 20  1-25994 */.     
6c50: 20 69 6e 74 20 63 6e 74 20 3d 20 76 61 5f 61 72   int cnt = va_ar
6c60: 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20  g(ap, int);     
6c70: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 34 36 30   /* IMP: R-04460
6c80: 2d 35 33 33 38 36 20 2a 2f 0a 20 20 20 20 20 20  -53386 */.      
6c90: 72 63 20 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73  rc = setupLookas
6ca0: 69 64 65 28 64 62 2c 20 70 42 75 66 2c 20 73 7a  ide(db, pBuf, sz
6cb0: 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , cnt);.      br
6cc0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
6cd0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
6ce0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
6cf0: 75 63 74 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  uct {.        in
6d00: 74 20 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  t op;      /* Th
6d10: 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  e opcode */.    
6d20: 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 20 20 20      u32 mask;   
6d30: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 68 65 20   /* Mask of the 
6d40: 62 69 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 66  bit in sqlite3.f
6d50: 6c 61 67 73 20 74 6f 20 73 65 74 2f 63 6c 65 61  lags to set/clea
6d60: 72 20 2a 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c  r */.      } aFl
6d70: 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  agOp[] = {.     
6d80: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
6d90: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59  NFIG_ENABLE_FKEY
6da0: 2c 20 20 20 20 53 51 4c 49 54 45 5f 46 6f 72 65  ,    SQLITE_Fore
6db0: 69 67 6e 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20  ignKeys    },.  
6dc0: 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44        { SQLITE_D
6dd0: 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54  BCONFIG_ENABLE_T
6de0: 52 49 47 47 45 52 2c 20 53 51 4c 49 54 45 5f 45  RIGGER, SQLITE_E
6df0: 6e 61 62 6c 65 54 72 69 67 67 65 72 20 20 7d 2c  nableTrigger  },
6e00: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
6e10: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
6e20: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6e30: 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a  E_ERROR; /* IMP:
6e40: 20 52 2d 34 32 37 39 30 2d 32 33 33 37 32 20 2a   R-42790-23372 *
6e50: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
6e60: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 6c   i<ArraySize(aFl
6e70: 61 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  agOp); i++){.   
6e80: 20 20 20 20 20 69 66 28 20 61 46 6c 61 67 4f 70       if( aFlagOp
6e90: 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20  [i].op==op ){.  
6ea0: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66          int onof
6eb0: 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  f = va_arg(ap, i
6ec0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
6ed0: 6e 74 20 2a 70 52 65 73 20 3d 20 76 61 5f 61 72  nt *pRes = va_ar
6ee0: 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20  g(ap, int*);.   
6ef0: 20 20 20 20 20 20 20 69 6e 74 20 6f 6c 64 46 6c         int oldFl
6f00: 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b  ags = db->flags;
6f10: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
6f20: 6e 6f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  noff>0 ){.      
6f30: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
6f40: 7c 3d 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61  |= aFlagOp[i].ma
6f50: 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  sk;.          }e
6f60: 6c 73 65 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30  lse if( onoff==0
6f70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6f80: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46  db->flags &= ~aF
6f90: 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20  lagOp[i].mask;. 
6fa0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6fb0: 20 20 20 20 20 69 66 28 20 6f 6c 64 46 6c 61 67       if( oldFlag
6fc0: 73 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a  s!=db->flags ){.
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6fe0: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
6ff0: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
7000: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7010: 20 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20         if( pRes 
7020: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
7030: 70 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  pRes = (db->flag
7040: 73 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  s & aFlagOp[i].m
7050: 61 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20 20 20  ask)!=0;.       
7060: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
7070: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
7080: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7090: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
70a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
70b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e     }.  }.  va_en
70c0: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
70d0: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
70e0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
70f0: 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31   buffer z[0..n-1
7100: 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73  ] contains all s
7110: 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  paces..*/.static
7120: 20 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28 63   int allSpaces(c
7130: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
7140: 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e  t n){.  while( n
7150: 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20  >0 && z[n-1]==' 
7160: 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65  ' ){ n--; }.  re
7170: 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  turn n==0;.}../*
7180: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
7190: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
71a0: 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  g function named
71b0: 20 22 42 49 4e 41 52 59 22 20 77 68 69 63 68 20   "BINARY" which 
71c0: 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61  is always.** ava
71d0: 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ilable..**.** If
71e0: 20 74 68 65 20 70 61 64 46 6c 61 67 20 61 72 67   the padFlag arg
71f0: 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
7200: 4c 20 74 68 65 6e 20 73 70 61 63 65 20 70 61 64  L then space pad
7210: 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a  ding at the end.
7220: 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69 73  ** of strings is
7230: 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20   ignored.  This 
7240: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 52  implements the R
7250: 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a  TRIM collation..
7260: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69  */.static int bi
7270: 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69  nCollFunc(.  voi
7280: 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e  d *padFlag,.  in
7290: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
72a0: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
72b0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
72c0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
72d0: 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d  int rc, n;.  n =
72e0: 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e   nKey1<nKey2 ? n
72f0: 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20  Key1 : nKey2;.  
7300: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
7310: 52 2d 36 35 30 33 33 2d 32 38 34 34 39 20 54 68  R-65033-28449 Th
7320: 65 20 62 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52  e built-in BINAR
7330: 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 6f 6d 70  Y collation comp
7340: 61 72 65 73 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ares.  ** string
7350: 73 20 62 79 74 65 20 62 79 20 62 79 74 65 20 75  s byte by byte u
7360: 73 69 6e 67 20 74 68 65 20 6d 65 6d 63 6d 70 28  sing the memcmp(
7370: 29 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20  ) function from 
7380: 74 68 65 20 73 74 61 6e 64 61 72 64 20 43 0a 20  the standard C. 
7390: 20 2a 2a 20 6c 69 62 72 61 72 79 2e 20 2a 2f 0a   ** library. */.
73a0: 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b    rc = memcmp(pK
73b0: 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a  ey1, pKey2, n);.
73c0: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
73d0: 20 20 20 69 66 28 20 70 61 64 46 6c 61 67 0a 20     if( padFlag. 
73e0: 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73      && allSpaces
73f0: 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31 29 2b  (((char*)pKey1)+
7400: 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20  n, nKey1-n).    
7410: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
7420: 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20  char*)pKey2)+n, 
7430: 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a  nKey2-n).    ){.
7440: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
7450: 45 2d 4f 46 3a 20 52 2d 33 31 36 32 34 2d 32 34  E-OF: R-31624-24
7460: 37 33 37 20 52 54 52 49 4d 20 69 73 20 6c 69 6b  737 RTRIM is lik
7470: 65 20 42 49 4e 41 52 59 20 65 78 63 65 70 74 20  e BINARY except 
7480: 74 68 61 74 20 65 78 74 72 61 0a 20 20 20 20 20  that extra.     
7490: 20 2a 2a 20 73 70 61 63 65 73 20 61 74 20 74 68   ** spaces at th
74a0: 65 20 65 6e 64 20 6f 66 20 65 69 74 68 65 72 20  e end of either 
74b0: 73 74 72 69 6e 67 20 64 6f 20 6e 6f 74 20 63 68  string do not ch
74c0: 61 6e 67 65 20 74 68 65 20 72 65 73 75 6c 74 2e  ange the result.
74d0: 20 49 6e 20 6f 74 68 65 72 0a 20 20 20 20 20 20   In other.      
74e0: 2a 2a 20 77 6f 72 64 73 2c 20 73 74 72 69 6e 67  ** words, string
74f0: 73 20 77 69 6c 6c 20 63 6f 6d 70 61 72 65 20 65  s will compare e
7500: 71 75 61 6c 20 74 6f 20 6f 6e 65 20 61 6e 6f 74  qual to one anot
7510: 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  her as long as t
7520: 68 65 79 0a 20 20 20 20 20 20 2a 2a 20 64 69 66  hey.      ** dif
7530: 66 65 72 20 6f 6e 6c 79 20 69 6e 20 74 68 65 20  fer only in the 
7540: 6e 75 6d 62 65 72 20 6f 66 20 73 70 61 63 65 73  number of spaces
7550: 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 20 20 20   at the end..   
7560: 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b     */.    }else{
7570: 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79  .      rc = nKey
7580: 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d  1 - nKey2;.    }
7590: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
75a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68  ;.}../*.** Anoth
75b0: 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  er built-in coll
75c0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20  ating sequence: 
75d0: 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54  NOCASE. .**.** T
75e0: 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  his collating se
75f0: 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64  quence is intend
7600: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ed to be used fo
7610: 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64  r "case independ
7620: 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ent.** compariso
7630: 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f  n". SQLite's kno
7640: 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72 20  wledge of upper 
7650: 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65  and lower case e
7660: 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78  quivalents.** ex
7670: 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68  tends only to th
7680: 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73 20  e 26 characters 
7690: 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c  used in the Engl
76a0: 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a  ish language..**
76b0: 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e  .** At the momen
76c0: 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  t there is only 
76d0: 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e  a UTF-8 implemen
76e0: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  tation..*/.stati
76f0: 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c  c int nocaseColl
7700: 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69  atingFunc(.  voi
7710: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
7720: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
7730: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
7740: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
7750: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
7760: 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53  int r = sqlite3S
7770: 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28  trNICmp(.      (
7780: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
7790: 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y1, (const char 
77a0: 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c  *)pKey2, (nKey1<
77b0: 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65  nKey2)?nKey1:nKe
77c0: 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  y2);.  UNUSED_PA
77d0: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
77e0: 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a  ;.  if( 0==r ){.
77f0: 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b      r = nKey1-nK
7800: 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey2;.  }.  retur
7810: 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n r;.}../*.** Re
7820: 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f  turn the ROWID o
7830: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
7840: 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69  t insert.*/.sqli
7850: 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  te_int64 sqlite3
7860: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
7870: 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  id(sqlite3 *db){
7880: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7890: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
78a0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
78b0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
78c0: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
78d0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
78e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
78f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
7900: 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  rn db->lastRowid
7910: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7920: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
7930: 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 6d  changes in the m
7940: 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20  ost recent call 
7950: 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  to sqlite3_exec(
7960: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
7970: 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65  3_changes(sqlite
7980: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
7990: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
79a0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
79b0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
79c0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
79d0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
79e0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
79f0: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
7a00: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
7a10: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
7a20: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
7a30: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
7a40: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
7a50: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
7a60: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
7a70: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
7a80: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
7a90: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7aa0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
7ab0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
7ac0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
7ad0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
7ae0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
7af0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7b00: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
7b10: 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
7b20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
7b30: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
7b40: 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74  ints. This funct
7b50: 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c  ion only manipul
7b60: 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66 20 74  ates fields of t
7b70: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  he.** database h
7b80: 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74  andle object, it
7b90: 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20   does not close 
7ba0: 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74  any savepoints t
7bb0: 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a  hat may be open.
7bc0: 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72 65 65  ** at the b-tree
7bd0: 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f  /pager level..*/
7be0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 6f  .void sqlite3Clo
7bf0: 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73 71 6c  seSavepoints(sql
7c00: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77 68 69  ite3 *db){.  whi
7c10: 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  le( db->pSavepoi
7c20: 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65 70 6f  nt ){.    Savepo
7c30: 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e  int *pTmp = db->
7c40: 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  pSavepoint;.    
7c50: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
7c60: 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   pTmp->pNext;.  
7c70: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7c80: 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20  db, pTmp);.  }. 
7c90: 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20   db->nSavepoint 
7ca0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74  = 0;.  db->nStat
7cb0: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  ement = 0;.  db-
7cc0: 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
7cd0: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  vepoint = 0;.}..
7ce0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
7cf0: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
7d00: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
7d10: 77 69 74 68 20 46 75 6e 63 44 65 66 20 70 2c 20  with FuncDef p, 
7d20: 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a  if any. Except,.
7d30: 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ** if this is no
7d40: 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70 79 20  t the last copy 
7d50: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c  of the function,
7d60: 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69   do not invoke i
7d70: 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63  t. Multiple.** c
7d80: 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  opies of a singl
7d90: 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 63  e function are c
7da0: 72 65 61 74 65 64 20 77 68 65 6e 20 63 72 65 61  reated when crea
7db0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  te_function() is
7dc0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20   called.** with 
7dd0: 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20 74 68  SQLITE_ANY as th
7de0: 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  e encoding..*/.s
7df0: 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e 63 74  tatic void funct
7e00: 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c 69 74  ionDestroy(sqlit
7e10: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
7e20: 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73 74 72  *p){.  FuncDestr
7e30: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
7e40: 6f 72 20 3d 20 70 2d 3e 70 44 65 73 74 72 75 63  or = p->pDestruc
7e50: 74 6f 72 3b 0a 20 20 69 66 28 20 70 44 65 73 74  tor;.  if( pDest
7e60: 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44  ructor ){.    pD
7e70: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d  estructor->nRef-
7e80: 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 65 73 74  -;.    if( pDest
7e90: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20  ructor->nRef==0 
7ea0: 29 7b 0a 20 20 20 20 20 20 70 44 65 73 74 72 75  ){.      pDestru
7eb0: 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79 28 70  ctor->xDestroy(p
7ec0: 44 65 73 74 72 75 63 74 6f 72 2d 3e 70 55 73 65  Destructor->pUse
7ed0: 72 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71  rData);.      sq
7ee0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7ef0: 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  pDestructor);.  
7f00: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
7f10: 20 44 69 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20   Disconnect all 
7f20: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 6f 62 6a  sqlite3_vtab obj
7f30: 65 63 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  ects that belong
7f40: 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 6e   to database con
7f50: 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54  nection.** db. T
7f60: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68  his is called wh
7f70: 65 6e 20 64 62 20 69 73 20 62 65 69 6e 67 20 63  en db is being c
7f80: 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  losed..*/.static
7f90: 20 76 6f 69 64 20 64 69 73 63 6f 6e 6e 65 63 74   void disconnect
7fa0: 41 6c 6c 56 74 61 62 28 73 71 6c 69 74 65 33 20  AllVtab(sqlite3 
7fb0: 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  *db){.#ifndef SQ
7fc0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
7fd0: 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20 69 3b 0a  LTABLE.  int i;.
7fe0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20    HashElem *p;. 
7ff0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
8000: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72  erAll(db);.  for
8010: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
8020: 20 69 2b 2b 29 7b 0a 20 20 20 20 53 63 68 65 6d   i++){.    Schem
8030: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  a *pSchema = db-
8040: 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b  >aDb[i].pSchema;
8050: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62  .    if( db->aDb
8060: 5b 69 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20  [i].pSchema ){. 
8070: 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74       for(p=sqlit
8080: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
8090: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70  ema->tblHash); p
80a0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
80b0: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 20 20  xt(p)){.        
80c0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54  Table *pTab = (T
80d0: 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73  able *)sqliteHas
80e0: 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20  hData(p);.      
80f0: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
8100: 70 54 61 62 29 20 29 20 73 71 6c 69 74 65 33 56  pTab) ) sqlite3V
8110: 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62  tabDisconnect(db
8120: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d  , pTab);.      }
8130: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
8140: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
8150: 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  st(&db->aModule)
8160: 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73  ; p; p=sqliteHas
8170: 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 4d  hNext(p)){.    M
8180: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d  odule *pMod = (M
8190: 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61  odule *)sqliteHa
81a0: 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 69  shData(p);.    i
81b0: 66 28 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62  f( pMod->pEpoTab
81c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
81d0: 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28  3VtabDisconnect(
81e0: 64 62 2c 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  db, pMod->pEpoTa
81f0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
8200: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
8210: 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c  kList(db);.  sql
8220: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
8230: 6c 28 64 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55  l(db);.#else.  U
8240: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
8250: 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  db);.#endif.}../
8260: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
8270: 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   if database con
8280: 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 73 20 75  nection db has u
8290: 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61  nfinalized prepa
82a0: 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  red.** statement
82b0: 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20  s or unfinished 
82c0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f  sqlite3_backup o
82d0: 62 6a 65 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61  bjects.  .*/.sta
82e0: 74 69 63 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69  tic int connecti
82f0: 6f 6e 49 73 42 75 73 79 28 73 71 6c 69 74 65 33  onIsBusy(sqlite3
8300: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a   *db){.  int j;.
8310: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8320: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
8330: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
8340: 20 64 62 2d 3e 70 56 64 62 65 20 29 20 72 65 74   db->pVdbe ) ret
8350: 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30  urn 1;.  for(j=0
8360: 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b  ; j<db->nDb; j++
8370: 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  ){.    Btree *pB
8380: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70  t = db->aDb[j].p
8390: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20  Bt;.    if( pBt 
83a0: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  && sqlite3BtreeI
83b0: 73 49 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29  sInBackup(pBt) )
83c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
83d0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
83e0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69  .** Close an exi
83f0: 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74  sting SQLite dat
8400: 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20  abase.*/.static 
8410: 69 6e 74 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  int sqlite3Close
8420: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
8430: 74 20 66 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a  t forceZombie){.
8440: 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
8450: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
8460: 20 52 2d 36 33 32 35 37 2d 31 31 37 34 30 20 43   R-63257-11740 C
8470: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 63  alling sqlite3_c
8480: 6c 6f 73 65 28 29 20 6f 72 0a 20 20 20 20 2a 2a  lose() or.    **
8490: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
84a0: 32 28 29 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  2() with a NULL 
84b0: 70 6f 69 6e 74 65 72 20 61 72 67 75 6d 65 6e 74  pointer argument
84c0: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
84d0: 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 20 20 72 65 74  o-op. */.    ret
84e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
84f0: 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
8500: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
8510: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
8520: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
8530: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
8540: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
8550: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
8560: 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69  ..  /* Force xDi
8570: 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f  sconnect calls o
8580: 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61  n all virtual ta
8590: 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e  bles */.  discon
85a0: 6e 65 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b  nectAllVtab(db);
85b0: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e  ..  /* If a tran
85c0: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c  saction is open,
85d0: 20 74 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41   the disconnectA
85e0: 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62  llVtab() call ab
85f0: 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f  ove.  ** will no
8600: 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68  t have called th
8610: 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20  e xDisconnect() 
8620: 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69  method on any vi
8630: 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65  rtual.  ** table
8640: 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54  s in the db->aVT
8650: 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68  rans[] array. Th
8660: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
8670: 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28  te3VtabRollback(
8680: 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c  ).  ** call will
8690: 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20   do so. We need 
86a0: 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72  to do this befor
86b0: 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20  e the check for 
86c0: 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20  active.  ** SQL 
86d0: 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77  statements below
86e0: 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65  , as the v-table
86f0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
8700: 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20  may be storing. 
8710: 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65   ** some prepare
8720: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74  d statements int
8730: 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ernally..  */.  
8740: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
8750: 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c  ack(db);..  /* L
8760: 65 67 61 63 79 20 62 65 68 61 76 69 6f 72 20 28  egacy behavior (
8770: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20  sqlite3_close() 
8780: 62 65 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20  behavior) is to 
8790: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49  return.  ** SQLI
87a0: 54 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 63  TE_BUSY if the c
87b0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f  onnection can no
87c0: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
87d0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
87e0: 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65  if( !forceZombie
87f0: 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73   && connectionIs
8800: 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20  Busy(db) ){.    
8810: 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
8820: 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  Msg(db, SQLITE_B
8830: 55 53 59 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  USY, "unable to 
8840: 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66  close due to unf
8850: 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20 20 20 20  inalized ".     
8860: 20 20 22 73 74 61 74 65 6d 65 6e 74 73 20 6f 72    "statements or
8870: 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61 63 6b   unfinished back
8880: 75 70 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ups");.    sqlit
8890: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
88a0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72  b->mutex);.    r
88b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
88c0: 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  Y;.  }..#ifdef S
88d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
88e0: 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LOG.  if( sqlite
88f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
8900: 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20  qllog ){.    /* 
8910: 43 6c 6f 73 69 6e 67 20 74 68 65 20 68 61 6e 64  Closing the hand
8920: 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d  le. Fourth param
8930: 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74  eter is passed t
8940: 68 65 20 76 61 6c 75 65 20 32 2e 20 2a 2f 0a 20  he value 2. */. 
8950: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
8960: 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 73  Config.xSqllog(s
8970: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
8980: 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 64  ig.pSqllogArg, d
8990: 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d 0a 23 65  b, 0, 2);.  }.#e
89a0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  ndif..  /* Conve
89b0: 72 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  rt the connectio
89c0: 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20  n into a zombie 
89d0: 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69  and then close i
89e0: 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61  t..  */.  db->ma
89f0: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
8a00: 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c  IC_ZOMBIE;.  sql
8a10: 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e  ite3LeaveMutexAn
8a20: 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29  dCloseZombie(db)
8a30: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
8a40: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
8a50: 77 6f 20 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e  wo variations on
8a60: 20 74 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65   the public inte
8a70: 72 66 61 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e  rface for closin
8a80: 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
8a90: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20  connection. The 
8aa0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20  sqlite3_close() 
8ab0: 76 65 72 73 69 6f 6e 20 72 65 74 75 72 6e 73 20  version returns 
8ac0: 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a  SQLITE_BUSY and.
8ad0: 2a 2a 20 6c 65 61 76 65 73 20 74 68 65 20 63 6f  ** leaves the co
8ae0: 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20  nnection option 
8af0: 69 66 20 74 68 65 72 65 20 61 72 65 20 75 6e 66  if there are unf
8b00: 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65  inalized prepare
8b10: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  d.** statements 
8b20: 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71  or unfinished sq
8b30: 6c 69 74 65 33 5f 62 61 63 6b 75 70 73 2e 20 20  lite3_backups.  
8b40: 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  The sqlite3_clos
8b50: 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f  e_v2().** versio
8b60: 6e 20 66 6f 72 63 65 73 20 74 68 65 20 63 6f 6e  n forces the con
8b70: 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d  nection to becom
8b80: 65 20 61 20 7a 6f 6d 62 69 65 20 69 66 20 74 68  e a zombie if th
8b90: 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f  ere are.** unclo
8ba0: 73 65 64 20 72 65 73 6f 75 72 63 65 73 2c 20 61  sed resources, a
8bb0: 6e 64 20 61 72 72 61 6e 67 65 73 20 66 6f 72 20  nd arranges for 
8bc0: 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65  deallocation whe
8bd0: 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72  n the last.** pr
8be0: 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74 20  epare statement 
8bf0: 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  or sqlite3_backu
8c00: 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74  p closes..*/.int
8c10: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73   sqlite3_close(s
8c20: 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74  qlite3 *db){ ret
8c30: 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  urn sqlite3Close
8c40: 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71  (db,0); }.int sq
8c50: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73  lite3_close_v2(s
8c60: 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74  qlite3 *db){ ret
8c70: 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  urn sqlite3Close
8c80: 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a  (db,1); }.../*.*
8c90: 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d 75 74 65  * Close the mute
8ca0: 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 63 6f  x on database co
8cb0: 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a  nnection db..**.
8cc0: 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  ** Furthermore, 
8cd0: 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  if database conn
8ce0: 65 63 74 69 6f 6e 20 64 62 20 69 73 20 61 20 7a  ection db is a z
8cf0: 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e 67 20 74  ombie (meaning t
8d00: 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 68 61 73  hat there.** has
8d10: 20 62 65 65 6e 20 61 20 70 72 69 6f 72 20 63 61   been a prior ca
8d20: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c  ll to sqlite3_cl
8d30: 6f 73 65 28 64 62 29 20 6f 72 20 73 71 6c 69 74  ose(db) or sqlit
8d40: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29 29  e3_close_v2(db))
8d50: 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79 20 73 71   and.** every sq
8d60: 6c 69 74 65 33 5f 73 74 6d 74 20 68 61 73 20 6e  lite3_stmt has n
8d70: 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  ow been finalize
8d80: 64 20 61 6e 64 20 65 76 65 72 79 20 73 71 6c 69  d and every sqli
8d90: 74 65 33 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a  te3_backup has.*
8da0: 2a 20 66 69 6e 69 73 68 65 64 2c 20 74 68 65 6e  * finished, then
8db0: 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72   free all resour
8dc0: 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
8dd0: 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e  ite3LeaveMutexAn
8de0: 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c  dCloseZombie(sql
8df0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73  ite3 *db){.  Has
8e00: 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20 20  hElem *i;       
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e20: 48 61 73 68 20 74 61 62 6c 65 20 69 74 65 72 61  Hash table itera
8e30: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a  tor */.  int j;.
8e40: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
8e50: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 73  re outstanding s
8e60: 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 72 20 73  qlite3_stmt or s
8e70: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62  qlite3_backup ob
8e80: 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66  jects.  ** or if
8e90: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
8ea0: 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
8eb0: 20 63 6c 6f 73 65 64 20 62 79 20 73 71 6c 69 74   closed by sqlit
8ec0: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20  e3_close_v2(),. 
8ed0: 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20 6c 65   ** then just le
8ee0: 61 76 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e  ave the mutex an
8ef0: 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
8f00: 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d   if( db->magic!=
8f10: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d  SQLITE_MAGIC_ZOM
8f20: 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f  BIE || connectio
8f30: 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20  nIsBusy(db) ){. 
8f40: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
8f50: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
8f60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
8f70: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
8f80: 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
8f90: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
8fa0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
8fb0: 65 63 74 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20  ection has.  ** 
8fc0: 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71 6c 69 74  closed all sqlit
8fd0: 65 33 5f 73 74 6d 74 20 61 6e 64 20 73 71 6c 69  e3_stmt and sqli
8fe0: 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63  te3_backup objec
8ff0: 74 73 20 61 6e 64 20 68 61 73 20 62 65 65 6e 0a  ts and has been.
9000: 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 73    ** passed to s
9010: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65  qlite3_close (me
9020: 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20 69 73  aning that it is
9030: 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65   a zombie).  The
9040: 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20  refore,.  ** go 
9050: 61 68 65 61 64 20 61 6e 64 20 66 72 65 65 20 61  ahead and free a
9060: 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20  ll resources..  
9070: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72  */..  /* If a tr
9080: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
9090: 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  n, roll it back.
90a0: 20 54 68 69 73 20 61 6c 73 6f 20 65 6e 73 75 72   This also ensur
90b0: 65 73 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20  es that if.  ** 
90c0: 61 6e 79 20 64 61 74 61 62 61 73 65 20 73 63 68  any database sch
90d0: 65 6d 61 73 20 68 61 76 65 20 62 65 65 6e 20 6d  emas have been m
90e0: 6f 64 69 66 69 65 64 20 62 79 20 61 6e 20 75 6e  odified by an un
90f0: 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61  committed transa
9100: 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68 65 79 20  ction.  ** they 
9110: 61 72 65 20 72 65 73 65 74 2e 20 41 6e 64 20 74  are reset. And t
9120: 68 61 74 20 74 68 65 20 72 65 71 75 69 72 65 64  hat the required
9130: 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
9140: 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65 0a 20 20   held to make.  
9150: 2a 2a 20 74 68 65 20 70 61 67 65 72 20 72 6f 6c  ** the pager rol
9160: 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61  lback and schema
9170: 20 72 65 73 65 74 20 61 6e 20 61 74 6f 6d 69 63   reset an atomic
9180: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20   operation. */. 
9190: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
91a0: 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
91b0: 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61  K);..  /* Free a
91c0: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53  ny outstanding S
91d0: 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75  avepoint structu
91e0: 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  res. */.  sqlite
91f0: 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
9200: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  (db);..  /* Clos
9210: 65 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63  e all database c
9220: 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
9230: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e  for(j=0; j<db->n
9240: 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; j++){.    st
9250: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
9260: 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20  db->aDb[j];.    
9270: 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a  if( pDb->pBt ){.
9280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
9290: 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74  eeClose(pDb->pBt
92a0: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42  );.      pDb->pB
92b0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
92c0: 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20   j!=1 ){.       
92d0: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20   pDb->pSchema = 
92e0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
92f0: 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20  .  }.  /* Clear 
9300: 74 68 65 20 54 45 4d 50 20 73 63 68 65 6d 61 20  the TEMP schema 
9310: 73 65 70 61 72 61 74 65 6c 79 20 61 6e 64 20 6c  separately and l
9320: 61 73 74 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ast */.  if( db-
9330: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
9340: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63  ){.    sqlite3Sc
9350: 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44  hemaClear(db->aD
9360: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20  b[1].pSchema);. 
9370: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
9380: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
9390: 0a 20 20 2f 2a 20 46 72 65 65 20 75 70 20 74 68  .  /* Free up th
93a0: 65 20 61 72 72 61 79 20 6f 66 20 61 75 78 69 6c  e array of auxil
93b0: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 2a  iary databases *
93c0: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61  /.  sqlite3Colla
93d0: 70 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79  pseDatabaseArray
93e0: 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20  (db);.  assert( 
93f0: 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20  db->nDb<=2 );.  
9400: 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d  assert( db->aDb=
9410: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
9420: 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65  ;..  /* Tell the
9430: 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e   code in notify.
9440: 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65  c that the conne
9450: 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  ction no longer 
9460: 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c  holds any.  ** l
9470: 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f  ocks and does no
9480: 74 20 72 65 71 75 69 72 65 20 61 6e 79 20 66 75  t require any fu
9490: 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  rther unlock-not
94a0: 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
94b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e   */.  sqlite3Con
94c0: 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62  nectionClosed(db
94d0: 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  );..  for(j=0; j
94e0: 3c 41 72 72 61 79 53 69 7a 65 28 64 62 2d 3e 61  <ArraySize(db->a
94f0: 46 75 6e 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20  Func.a); j++){. 
9500: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 78     FuncDef *pNex
9510: 74 2c 20 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20  t, *pHash, *p;. 
9520: 20 20 20 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75     for(p=db->aFu
9530: 6e 63 2e 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48  nc.a[j]; p; p=pH
9540: 61 73 68 29 7b 0a 20 20 20 20 20 20 70 48 61 73  ash){.      pHas
9550: 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20  h = p->pHash;.  
9560: 20 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a      while( p ){.
9570: 20 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e          function
9580: 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a  Destroy(db, p);.
9590: 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20          pNext = 
95a0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  p->pNext;.      
95b0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
95c0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
95d0: 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20  p = pNext;.     
95e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   }.    }.  }.  f
95f0: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
9600: 69 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  irst(&db->aCollS
9610: 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65  eq); i; i=sqlite
9620: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
9630: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
9640: 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71   = (CollSeq *)sq
9650: 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
9660: 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61  .    /* Invoke a
9670: 6e 79 20 64 65 73 74 72 75 63 74 6f 72 73 20 72  ny destructors r
9680: 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 63 6f  egistered for co
9690: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
96a0: 20 75 73 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20   user data. */. 
96b0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b     for(j=0; j<3;
96c0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
96d0: 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29   pColl[j].xDel )
96e0: 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b  {.        pColl[
96f0: 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d  j].xDel(pColl[j]
9700: 2e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 7d  .pUser);.      }
9710: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9720: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
9730: 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ll);.  }.  sqlit
9740: 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d  e3HashClear(&db-
9750: 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e  >aCollSeq);.#ifn
9760: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9770: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 66  VIRTUALTABLE.  f
9780: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
9790: 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  irst(&db->aModul
97a0: 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  e); i; i=sqliteH
97b0: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
97c0: 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20   Module *pMod = 
97d0: 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65  (Module *)sqlite
97e0: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
97f0: 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74   if( pMod->xDest
9800: 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f  roy ){.      pMo
9810: 64 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d 6f 64  d->xDestroy(pMod
9820: 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20  ->pAux);.    }. 
9830: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 45 70     sqlite3VtabEp
9840: 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 43 6c 65 61  onymousTableClea
9850: 72 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 20  r(db, pMod);.   
9860: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9870: 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20  b, pMod);.  }.  
9880: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
9890: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a  (&db->aModule);.
98a0: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
98b0: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
98c0: 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f  E_OK); /* Deallo
98d0: 63 61 74 65 73 20 61 6e 79 20 63 61 63 68 65 64  cates any cached
98e0: 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20   error strings. 
98f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  */.  sqlite3Valu
9900: 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29 3b  eFree(db->pErr);
9910: 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 45  .  sqlite3CloseE
9920: 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 23  xtensions(db);.#
9930: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
9940: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20  UTHENTICATION.  
9950: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
9960: 3e 61 75 74 68 2e 7a 41 75 74 68 55 73 65 72 29  >auth.zAuthUser)
9970: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
9980: 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 50  (db->auth.zAuthP
9990: 57 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62  W);.#endif..  db
99a0: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
99b0: 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20  _MAGIC_ERROR;.. 
99c0: 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74   /* The temp-dat
99d0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20  abase schema is 
99e0: 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72  allocated differ
99f0: 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f  ently from the o
9a00: 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a  ther schema.  **
9a10: 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20   objects (using 
9a20: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64  sqliteMalloc() d
9a30: 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64  irectly, instead
9a40: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
9a50: 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20  Schema())..  ** 
9a60: 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  So it needs to b
9a70: 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f  e freed here. To
9a80: 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c  do: Why not roll
9a90: 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61   the temp schema
9aa0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73   into.  ** the s
9ab0: 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ame sqliteMalloc
9ac0: 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68  () as the one th
9ad0: 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  at allocates the
9ae0: 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20   database .  ** 
9af0: 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a  structure?.  */.
9b00: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9b10: 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  db, db->aDb[1].p
9b20: 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
9b30: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
9b40: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
9b50: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
9b60: 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20  MAGIC_CLOSED;.  
9b70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
9b80: 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ee(db->mutex);. 
9b90: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f   assert( db->loo
9ba0: 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29  kaside.nOut==0 )
9bb0: 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61  ;  /* Fails on a
9bc0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
9bd0: 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20  y leak */.  if( 
9be0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
9bf0: 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73  alloced ){.    s
9c00: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e  qlite3_free(db->
9c10: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
9c20: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
9c30: 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a  _free(db);.}../*
9c40: 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
9c50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
9c60: 20 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73    If tripCode is
9c70: 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20   not SQLITE_OK, 
9c80: 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 77 72 69 74  then.** any writ
9c90: 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  e cursors are in
9ca0: 76 61 6c 69 64 61 74 65 64 20 28 22 74 72 69 70  validated ("trip
9cb0: 70 65 64 22 20 2d 20 61 73 20 69 6e 20 22 74 72  ped" - as in "tr
9cc0: 69 70 70 69 6e 67 20 61 20 63 69 72 63 75 69 74  ipping a circuit
9cd0: 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29 20 61 6e  .** breaker") an
9ce0: 64 20 6d 61 64 65 20 74 6f 20 72 65 74 75 72 6e  d made to return
9cf0: 20 74 72 69 70 43 6f 64 65 20 69 66 20 74 68 65   tripCode if the
9d00: 72 65 20 61 72 65 20 61 6e 79 20 66 75 72 74 68  re are any furth
9d10: 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  er.** attempts t
9d20: 6f 20 75 73 65 20 74 68 61 74 20 63 75 72 73 6f  o use that curso
9d30: 72 2e 20 20 52 65 61 64 20 63 75 72 73 6f 72 73  r.  Read cursors
9d40: 20 72 65 6d 61 69 6e 20 6f 70 65 6e 20 61 6e 64   remain open and
9d50: 20 76 61 6c 69 64 0a 2a 2a 20 62 75 74 20 61 72   valid.** but ar
9d60: 65 20 22 73 61 76 65 64 22 20 69 6e 20 63 61 73  e "saved" in cas
9d70: 65 20 74 68 65 20 74 61 62 6c 65 20 70 61 67 65  e the table page
9d80: 73 20 61 72 65 20 6d 6f 76 65 64 20 61 72 6f 75  s are moved arou
9d90: 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nd..*/.void sqli
9da0: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73  te3RollbackAll(s
9db0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
9dc0: 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74  tripCode){.  int
9dd0: 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e   i;.  int inTran
9de0: 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 63 68  s = 0;.  int sch
9df0: 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 61 73 73  emaChange;.  ass
9e00: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9e10: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
9e20: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
9e30: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
9e40: 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e  ();..  /* Obtain
9e50: 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d 75 74 65   all b-tree mute
9e60: 78 65 73 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e  xes before makin
9e70: 67 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f 20 42  g any calls to B
9e80: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 2e 20  treeRollback(). 
9e90: 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 69 6d  .  ** This is im
9ea0: 70 6f 72 74 61 6e 74 20 69 6e 20 63 61 73 65 20  portant in case 
9eb0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
9ec0: 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
9ed0: 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f 64 69 66  k has.  ** modif
9ee0: 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ied the database
9ef0: 20 73 63 68 65 6d 61 2e 20 49 66 20 74 68 65 20   schema. If the 
9f00: 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20 61  b-tree mutexes a
9f10: 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a 20 20 2a  re not taken.  *
9f20: 2a 20 68 65 72 65 2c 20 74 68 65 6e 20 61 6e 6f  * here, then ano
9f30: 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
9f40: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 69 67  e connection mig
9f50: 68 74 20 73 6e 65 61 6b 20 69 6e 20 62 65 74 77  ht sneak in betw
9f60: 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 64 61 74  een.  ** the dat
9f70: 61 62 61 73 65 20 72 6f 6c 6c 62 61 63 6b 20 61  abase rollback a
9f80: 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65 74 2c  nd schema reset,
9f90: 20 77 68 69 63 68 20 63 61 6e 20 63 61 75 73 65   which can cause
9fa0: 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63 6f 72 72   false.  ** corr
9fb0: 75 70 74 69 6f 6e 20 72 65 70 6f 72 74 73 20 69  uption reports i
9fc0: 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e 20 20 2a  n some cases.  *
9fd0: 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
9fe0: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
9ff0: 73 63 68 65 6d 61 43 68 61 6e 67 65 20 3d 20 28  schemaChange = (
a000: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
a010: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
a020: 29 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74  )!=0 && db->init
a030: 2e 62 75 73 79 3d 3d 30 3b 0a 0a 20 20 66 6f 72  .busy==0;..  for
a040: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
a050: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
a060: 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d   *p = db->aDb[i]
a070: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20  .pBt;.    if( p 
a080: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
a090: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
a0a0: 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20  ns(p) ){.       
a0b0: 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20   inTrans = 1;.  
a0c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
a0d0: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
a0e0: 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 21 73  (p, tripCode, !s
a0f0: 63 68 65 6d 61 43 68 61 6e 67 65 29 3b 0a 20 20  chemaChange);.  
a100: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
a110: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62  3VtabRollback(db
a120: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42  );.  sqlite3EndB
a130: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
a140: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
a150: 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  &SQLITE_InternCh
a160: 61 6e 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d  anges)!=0 && db-
a170: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
a180: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
a190: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
a1a0: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71  ents(db);.    sq
a1b0: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
a1c0: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
a1d0: 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  (db);.  }.  sqli
a1e0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
a1f0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20  (db);..  /* Any 
a200: 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
a210: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68  int violations h
a220: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73  ave now been res
a230: 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e  olved. */.  db->
a240: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
a250: 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  0;.  db->nDeferr
a260: 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
a270: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
a280: 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a  QLITE_DeferFKs;.
a290: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73  .  /* If one has
a2a0: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
a2b0: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c  , invoke the rol
a2c0: 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62  lback-hook callb
a2d0: 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ack */.  if( db-
a2e0: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
a2f0: 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c  ck && (inTrans |
a300: 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  | !db->autoCommi
a310: 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52  t) ){.    db->xR
a320: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28  ollbackCallback(
a330: 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
a340: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
a350: 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20  Return a static 
a360: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
a370: 67 20 74 68 65 20 6e 61 6d 65 20 63 6f 72 72 65  g the name corre
a380: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
a390: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70  error code.** sp
a3a0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 61  ecified in the a
a3b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20  rgument..*/.#if 
a3c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
a3d0: 45 45 44 5f 45 52 52 5f 4e 41 4d 45 29 0a 63 6f  EED_ERR_NAME).co
a3e0: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
a3f0: 33 45 72 72 4e 61 6d 65 28 69 6e 74 20 72 63 29  3ErrName(int rc)
a400: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
a410: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zName = 0;.  int
a420: 20 69 2c 20 6f 72 69 67 52 63 20 3d 20 72 63 3b   i, origRc = rc;
a430: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 20  .  for(i=0; i<2 
a440: 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b  && zName==0; i++
a450: 2c 20 72 63 20 26 3d 20 30 78 66 66 29 7b 0a 20  , rc &= 0xff){. 
a460: 20 20 20 73 77 69 74 63 68 28 20 72 63 20 29 7b     switch( rc ){
a470: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a480: 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20 20  TE_OK:          
a490: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a4a0: 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20  SQLITE_OK";     
a4b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
a4c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a4d0: 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20  ITE_ERROR:      
a4e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a4f0: 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20  "SQLITE_ERROR"; 
a500: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a510: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a520: 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20  LITE_INTERNAL:  
a530: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
a540: 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41   "SQLITE_INTERNA
a550: 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  L";          bre
a560: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a570: 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20  QLITE_PERM:     
a580: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a590: 3d 20 22 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b  = "SQLITE_PERM";
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
a5b0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a5c0: 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20 20  SQLITE_ABORT:   
a5d0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a5e0: 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54   = "SQLITE_ABORT
a5f0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
a600: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a610: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
a620: 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a 4e 61 6d  LLBACK:     zNam
a630: 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52  e = "SQLITE_ABOR
a640: 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 20 20 20  T_ROLLBACK";    
a650: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a660: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 20  e SQLITE_BUSY:  
a670: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
a680: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53  me = "SQLITE_BUS
a690: 59 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Y";             
a6a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a6b0: 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  se SQLITE_BUSY_R
a6c0: 45 43 4f 56 45 52 59 3a 20 20 20 20 20 20 7a 4e  ECOVERY:      zN
a6d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55  ame = "SQLITE_BU
a6e0: 53 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 20 20  SY_RECOVERY";   
a6f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a700: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  ase SQLITE_BUSY_
a710: 53 4e 41 50 53 48 4f 54 3a 20 20 20 20 20 20 7a  SNAPSHOT:      z
a720: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42  Name = "SQLITE_B
a730: 55 53 59 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20  USY_SNAPSHOT";  
a740: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a750: 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  case SQLITE_LOCK
a760: 45 44 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ED:             
a770: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a780: 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20 20 20  LOCKED";        
a790: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a7a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43   case SQLITE_LOC
a7b0: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3a  KED_SHAREDCACHE:
a7c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a7d0: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
a7e0: 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  CHE";break;.    
a7f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
a800: 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20  MEM:            
a810: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a820: 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20  E_NOMEM";       
a830: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a840: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
a850: 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20  EADONLY:        
a860: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a870: 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20  TE_READONLY";   
a880: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a890: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a8a0: 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52  READONLY_RECOVER
a8b0: 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  Y:  zName = "SQL
a8c0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43  ITE_READONLY_REC
a8d0: 4f 56 45 52 59 22 3b 20 62 72 65 61 6b 3b 0a 20  OVERY"; break;. 
a8e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a8f0: 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f  _READONLY_CANTLO
a900: 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  CK:  zName = "SQ
a910: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41  LITE_READONLY_CA
a920: 4e 54 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  NTLOCK"; break;.
a930: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a940: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42  E_READONLY_ROLLB
a950: 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ACK:  zName = "S
a960: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
a970: 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b  OLLBACK"; break;
a980: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a990: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
a9a0: 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  VED:   zName = "
a9b0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
a9c0: 44 42 4d 4f 56 45 44 22 3b 20 20 62 72 65 61 6b  DBMOVED";  break
a9d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a9e0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20  ITE_INTERRUPT:  
a9f0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
aa00: 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  "SQLITE_INTERRUP
aa10: 54 22 3b 20 20 20 20 20 20 20 20 20 62 72 65 61  T";         brea
aa20: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
aa30: 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20  LITE_IOERR:     
aa40: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
aa50: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b   "SQLITE_IOERR";
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
aa70: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
aa80: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
aa90: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
aaa0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
aab0: 52 45 41 44 22 3b 20 20 20 20 20 20 20 20 62 72  READ";        br
aac0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
aad0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
aae0: 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e 61 6d 65  RT_READ:   zName
aaf0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
ab00: 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b 20 20 62  _SHORT_READ";  b
ab10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ab20: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
ab30: 49 54 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ITE:        zNam
ab40: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
ab50: 52 5f 57 52 49 54 45 22 3b 20 20 20 20 20 20 20  R_WRITE";       
ab60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ab70: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  e SQLITE_IOERR_F
ab80: 53 59 4e 43 3a 20 20 20 20 20 20 20 20 7a 4e 61  SYNC:        zNa
ab90: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
aba0: 52 52 5f 46 53 59 4e 43 22 3b 20 20 20 20 20 20  RR_FSYNC";      
abb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
abc0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
abd0: 44 49 52 5f 46 53 59 4e 43 3a 20 20 20 20 7a 4e  DIR_FSYNC:    zN
abe0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
abf0: 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b 20  ERR_DIR_FSYNC"; 
ac00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ac10: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
ac20: 5f 54 52 55 4e 43 41 54 45 3a 20 20 20 20 20 7a  _TRUNCATE:     z
ac30: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
ac40: 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 22 3b 20  OERR_TRUNCATE"; 
ac50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ac60: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
ac70: 52 5f 46 53 54 41 54 3a 20 20 20 20 20 20 20 20  R_FSTAT:        
ac80: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ac90: 49 4f 45 52 52 5f 46 53 54 41 54 22 3b 20 20 20  IOERR_FSTAT";   
aca0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
acb0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
acc0: 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20  RR_UNLOCK:      
acd0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ace0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20  _IOERR_UNLOCK"; 
acf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ad00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
ad10: 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20  ERR_RDLOCK:     
ad20: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ad30: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22 3b  E_IOERR_RDLOCK";
ad40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ad50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
ad60: 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20 20 20 20  OERR_DELETE:    
ad70: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ad80: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 22  TE_IOERR_DELETE"
ad90: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
ada0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
adb0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20  IOERR_NOMEM:    
adc0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
add0: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22  ITE_IOERR_NOMEM"
ade0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
adf0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ae00: 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3a 20 20  _IOERR_ACCESS:  
ae10: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ae20: 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
ae30: 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S";      break;.
ae40: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ae50: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
ae60: 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20 20 20 20  ERVEDLOCK:.     
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae80: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
ae90: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
aea0: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
aeb0: 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CK"; break;.    
aec0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
aed0: 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20  ERR_LOCK:       
aee0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
aef0: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20 20  E_IOERR_LOCK";  
af00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
af10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
af20: 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20 20 20 20  OERR_CLOSE:     
af30: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
af40: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 22 3b  TE_IOERR_CLOSE";
af50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
af60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
af70: 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3a  IOERR_DIR_CLOSE:
af80: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
af90: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c  ITE_IOERR_DIR_CL
afa0: 4f 53 45 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  OSE";   break;. 
afb0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
afc0: 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3a 20  _IOERR_SHMOPEN: 
afd0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
afe0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50  LITE_IOERR_SHMOP
aff0: 45 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  EN";     break;.
b000: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b010: 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3a  E_IOERR_SHMSIZE:
b020: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b030: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
b040: 49 5a 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  IZE";     break;
b050: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b060: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b  TE_IOERR_SHMLOCK
b070: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
b080: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b090: 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72 65 61 6b  LOCK";     break
b0a0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b0b0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
b0c0: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
b0d0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
b0e0: 4d 4d 41 50 22 3b 20 20 20 20 20 20 62 72 65 61  MMAP";      brea
b0f0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b100: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 3a  LITE_IOERR_SEEK:
b110: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b120: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
b130: 45 45 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65  EEK";        bre
b140: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b150: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
b160: 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20  TE_NOENT: zName 
b170: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b180: 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b 62 72  DELETE_NOENT";br
b190: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b1a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
b1b0: 50 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  P:         zName
b1c0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b1d0: 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20 20 20 62  _MMAP";        b
b1e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b1f0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45   SQLITE_IOERR_GE
b200: 54 54 45 4d 50 50 41 54 48 3a 20 20 7a 4e 61 6d  TTEMPPATH:  zNam
b210: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b220: 52 5f 47 45 54 54 45 4d 50 50 41 54 48 22 3b 20  R_GETTEMPPATH"; 
b230: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b240: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e SQLITE_IOERR_C
b250: 4f 4e 56 50 41 54 48 3a 20 20 20 20 20 7a 4e 61  ONVPATH:     zNa
b260: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b270: 52 52 5f 43 4f 4e 56 50 41 54 48 22 3b 20 20 20  RR_CONVPATH";   
b280: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b290: 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  se SQLITE_CORRUP
b2a0: 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  T:            zN
b2b0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b2c0: 52 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20  RRUPT";         
b2d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b2e0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ase SQLITE_CORRU
b2f0: 50 54 5f 56 54 41 42 3a 20 20 20 20 20 20 20 7a  PT_VTAB:       z
b300: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b310: 4f 52 52 55 50 54 5f 56 54 41 42 22 3b 20 20 20  ORRUPT_VTAB";   
b320: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b330: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46  case SQLITE_NOTF
b340: 4f 55 4e 44 3a 20 20 20 20 20 20 20 20 20 20 20  OUND:           
b350: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b360: 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20 20 20  NOTFOUND";      
b370: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b380: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c   case SQLITE_FUL
b390: 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L:              
b3a0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b3b0: 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 20  _FULL";         
b3c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b3d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
b3e0: 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20  NTOPEN:         
b3f0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b400: 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20  E_CANTOPEN";    
b410: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b420: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b430: 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49  ANTOPEN_NOTEMPDI
b440: 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  R: zName = "SQLI
b450: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45  TE_CANTOPEN_NOTE
b460: 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b 0a 20 20  MPDIR";break;.  
b470: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b480: 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3a 20  CANTOPEN_ISDIR: 
b490: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b4a0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44  ITE_CANTOPEN_ISD
b4b0: 49 52 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  IR";    break;. 
b4c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b4d0: 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
b4e0: 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  TH:  zName = "SQ
b4f0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
b500: 4c 4c 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a  LLPATH"; break;.
b510: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b520: 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50  E_CANTOPEN_CONVP
b530: 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ATH:  zName = "S
b540: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43  QLITE_CANTOPEN_C
b550: 4f 4e 56 50 41 54 48 22 3b 20 62 72 65 61 6b 3b  ONVPATH"; break;
b560: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b570: 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 20  TE_PROTOCOL:    
b580: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b590: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22  SQLITE_PROTOCOL"
b5a0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
b5b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b5c0: 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20  ITE_EMPTY:      
b5d0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b5e0: 22 53 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20  "SQLITE_EMPTY"; 
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b600: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b610: 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20 20 20  LITE_SCHEMA:    
b620: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b630: 20 22 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 22   "SQLITE_SCHEMA"
b640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
b650: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b660: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20  QLITE_TOOBIG:   
b670: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b680: 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47  = "SQLITE_TOOBIG
b690: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
b6a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b6b0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b6c0: 54 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  T:         zName
b6d0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
b6e0: 52 41 49 4e 54 22 3b 20 20 20 20 20 20 20 20 62  RAINT";        b
b6f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b700: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
b710: 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61 6d  NT_UNIQUE:  zNam
b720: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
b730: 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b 20  TRAINT_UNIQUE"; 
b740: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b750: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
b760: 49 4e 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e 61  INT_TRIGGER: zNa
b770: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
b780: 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 22  STRAINT_TRIGGER"
b790: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
b7a0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
b7b0: 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3a  AINT_FOREIGNKEY:
b7c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7e0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b7f0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
b800: 49 47 4e 4b 45 59 22 3b 20 20 20 62 72 65 61 6b  IGNKEY";   break
b810: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b820: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
b830: 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d 20  HECK:   zName = 
b840: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
b850: 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62 72 65 61  NT_CHECK";  brea
b860: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b870: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b880: 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20 20  PRIMARYKEY:.    
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b8b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
b8c0: 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
b8d0: 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  Y";   break;.   
b8e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b8f0: 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c  ONSTRAINT_NOTNUL
b900: 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  L: zName = "SQLI
b910: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f  TE_CONSTRAINT_NO
b920: 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20 20  TNULL";break;.  
b930: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b940: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49  CONSTRAINT_COMMI
b950: 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20 20  THOOK:.         
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b980: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b990: 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20  T_COMMITHOOK";  
b9a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b9b0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
b9c0: 41 49 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a 4e  AINT_VTAB:    zN
b9d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b9e0: 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 22 3b 20  NSTRAINT_VTAB"; 
b9f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ba00: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
ba10: 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a  RAINT_FUNCTION:.
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba40: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ba50: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54  CONSTRAINT_FUNCT
ba60: 49 4f 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ION";     break;
ba70: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ba80: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f  TE_CONSTRAINT_RO
ba90: 57 49 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  WID:   zName = "
baa0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
bab0: 54 5f 52 4f 57 49 44 22 3b 20 20 62 72 65 61 6b  T_ROWID";  break
bac0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bad0: 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20  ITE_MISMATCH:   
bae0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
baf0: 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48  "SQLITE_MISMATCH
bb00: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
bb10: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bb20: 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20  LITE_MISUSE:    
bb30: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bb40: 20 22 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22   "SQLITE_MISUSE"
bb50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
bb60: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bb70: 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20  QLITE_NOLFS:    
bb80: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bb90: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22  = "SQLITE_NOLFS"
bba0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
bbb0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bbc0: 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20  SQLITE_AUTH:    
bbd0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bbe0: 20 3d 20 22 53 51 4c 49 54 45 5f 41 55 54 48 22   = "SQLITE_AUTH"
bbf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
bc00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bc10: 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20   SQLITE_FORMAT: 
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
bc30: 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d  e = "SQLITE_FORM
bc40: 41 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  AT";            
bc50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bc60: 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20  e SQLITE_RANGE: 
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
bc80: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e  me = "SQLITE_RAN
bc90: 47 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  GE";            
bca0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bcb0: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  se SQLITE_NOTADB
bcc0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
bcd0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
bce0: 54 41 44 42 22 3b 20 20 20 20 20 20 20 20 20 20  TADB";          
bcf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bd00: 61 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20  ase SQLITE_ROW: 
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
bd20: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
bd30: 4f 57 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  OW";            
bd40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bd50: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49  case SQLITE_NOTI
bd60: 43 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  CE:             
bd70: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bd80: 4e 4f 54 49 43 45 22 3b 20 20 20 20 20 20 20 20  NOTICE";        
bd90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bda0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
bdb0: 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 3a  ICE_RECOVER_WAL:
bdc0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bdd0: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
bde0: 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  WAL";break;.    
bdf0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
be00: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c  TICE_RECOVER_ROL
be10: 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20 20 20 20  LBACK:.         
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
be40: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
be50: 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b  COVER_ROLLBACK";
be60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
be70: 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  se SQLITE_WARNIN
be80: 47 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  G:            zN
be90: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41  ame = "SQLITE_WA
bea0: 52 4e 49 4e 47 22 3b 20 20 20 20 20 20 20 20 20  RNING";         
beb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bec0: 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49  ase SQLITE_WARNI
bed0: 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a 20 20 7a  NG_AUTOINDEX:  z
bee0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57  Name = "SQLITE_W
bef0: 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58  ARNING_AUTOINDEX
bf00: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
bf10: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45  case SQLITE_DONE
bf20: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
bf30: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bf40: 44 4f 4e 45 22 3b 20 20 20 20 20 20 20 20 20 20  DONE";          
bf50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bf60: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65  .  }.  if( zName
bf70: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ==0 ){.    stati
bf80: 63 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b  c char zBuf[50];
bf90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
bfa0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
bfb0: 66 29 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49 54  f), zBuf, "SQLIT
bfc0: 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c 20  E_UNKNOWN(%d)", 
bfd0: 6f 72 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e 61  origRc);.    zNa
bfe0: 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20  me = zBuf;.  }. 
bff0: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
c000: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
c010: 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73  eturn a static s
c020: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
c030: 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66  ibes the kind of
c040: 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64   error specified
c050: 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d   in the.** argum
c060: 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ent..*/.const ch
c070: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74  ar *sqlite3ErrSt
c080: 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61  r(int rc){.  sta
c090: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20  tic const char* 
c0a0: 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b  const aMsg[] = {
c0b0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  .    /* SQLITE_O
c0c0: 4b 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e  K          */ "n
c0d0: 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20  ot an error",.  
c0e0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f    /* SQLITE_ERRO
c0f0: 52 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20  R       */ "SQL 
c100: 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d  logic error or m
c110: 69 73 73 69 6e 67 20 64 61 74 61 62 61 73 65 22  issing database"
c120: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c130: 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30  INTERNAL    */ 0
c140: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c150: 50 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20 22  PERM        */ "
c160: 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
c170: 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f  n denied",.    /
c180: 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 20  * SQLITE_ABORT  
c190: 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61 63       */ "callbac
c1a0: 6b 20 72 65 71 75 65 73 74 65 64 20 71 75 65 72  k requested quer
c1b0: 79 20 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f 2a  y abort",.    /*
c1c0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20 20   SQLITE_BUSY    
c1d0: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
c1e0: 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20   is locked",.   
c1f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   /* SQLITE_LOCKE
c200: 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  D      */ "datab
c210: 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63  ase table is loc
c220: 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ked",.    /* SQL
c230: 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20  ITE_NOMEM       
c240: 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  */ "out of memor
c250: 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  y",.    /* SQLIT
c260: 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f  E_READONLY    */
c270: 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69   "attempt to wri
c280: 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61  te a readonly da
c290: 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20  tabase",.    /* 
c2a0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
c2b0: 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70 74     */ "interrupt
c2c0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c2d0: 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20 2a  TE_IOERR       *
c2e0: 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f  / "disk I/O erro
c2f0: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
c300: 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a 2f  E_CORRUPT     */
c310: 20 22 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   "database disk 
c320: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
c330: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c340: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a  TE_NOTFOUND    *
c350: 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61  / "unknown opera
c360: 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51  tion",.    /* SQ
c370: 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20  LITE_FULL       
c380: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f 72   */ "database or
c390: 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a   disk is full",.
c3a0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41      /* SQLITE_CA
c3b0: 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e  NTOPEN    */ "un
c3c0: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
c3d0: 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20 20  abase file",.   
c3e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f   /* SQLITE_PROTO
c3f0: 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69  COL    */ "locki
c400: 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20  ng protocol",.  
c410: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54    /* SQLITE_EMPT
c420: 59 20 20 20 20 20 20 20 2a 2f 20 22 74 61 62 6c  Y       */ "tabl
c430: 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61  e contains no da
c440: 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ta",.    /* SQLI
c450: 54 45 5f 53 43 48 45 4d 41 20 20 20 20 20 20 2a  TE_SCHEMA      *
c460: 2f 20 22 64 61 74 61 62 61 73 65 20 73 63 68 65  / "database sche
c470: 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64 22 2c  ma has changed",
c480: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54  .    /* SQLITE_T
c490: 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f 20 22 73  OOBIG      */ "s
c4a0: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f  tring or blob to
c4b0: 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53  o big",.    /* S
c4c0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c4d0: 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74    */ "constraint
c4e0: 20 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a   failed",.    /*
c4f0: 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48   SQLITE_MISMATCH
c500: 20 20 20 20 2a 2f 20 22 64 61 74 61 74 79 70 65      */ "datatype
c510: 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20 20 20   mismatch",.    
c520: 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  /* SQLITE_MISUSE
c530: 20 20 20 20 20 20 2a 2f 20 22 6c 69 62 72 61 72        */ "librar
c540: 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64  y routine called
c550: 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65   out of sequence
c560: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c570: 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20  _NOLFS       */ 
c580: 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70  "large file supp
c590: 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65 64 22  ort is disabled"
c5a0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c5b0: 41 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20 22  AUTH        */ "
c5c0: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65  authorization de
c5d0: 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  nied",.    /* SQ
c5e0: 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20  LITE_FORMAT     
c5f0: 20 2a 2f 20 22 61 75 78 69 6c 69 61 72 79 20 64   */ "auxiliary d
c600: 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20 65  atabase format e
c610: 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rror",.    /* SQ
c620: 4c 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20 20  LITE_RANGE      
c630: 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c   */ "bind or col
c640: 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66  umn index out of
c650: 20 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20   range",.    /* 
c660: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20 20  SQLITE_NOTADB   
c670: 20 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20 65     */ "file is e
c680: 6e 63 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e  ncrypted or is n
c690: 6f 74 20 61 20 64 61 74 61 62 61 73 65 22 2c 0a  ot a database",.
c6a0: 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61    };.  const cha
c6b0: 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f  r *zErr = "unkno
c6c0: 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73 77 69  wn error";.  swi
c6d0: 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63  tch( rc ){.    c
c6e0: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
c6f0: 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20 20  _ROLLBACK: {.   
c700: 20 20 20 7a 45 72 72 20 3d 20 22 61 62 6f 72 74     zErr = "abort
c710: 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43 4b   due to ROLLBACK
c720: 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";.      break;.
c730: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
c740: 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 26 3d  t: {.      rc &=
c750: 20 30 78 66 66 3b 0a 20 20 20 20 20 20 69 66 28   0xff;.      if(
c760: 20 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20 26   ALWAYS(rc>=0) &
c770: 26 20 72 63 3c 41 72 72 61 79 53 69 7a 65 28 61  & rc<ArraySize(a
c780: 4d 73 67 29 20 26 26 20 61 4d 73 67 5b 72 63 5d  Msg) && aMsg[rc]
c790: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  !=0 ){.        z
c7a0: 45 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a  Err = aMsg[rc];.
c7b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
c7c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
c7d0: 20 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a   return zErr;.}.
c7e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
c7f0: 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  ine implements a
c800: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74   busy callback t
c810: 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20 74  hat sleeps and t
c820: 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e  ries.** again un
c830: 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76 61  til a timeout va
c840: 6c 75 65 20 69 73 20 72 65 61 63 68 65 64 2e 20  lue is reached. 
c850: 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61 6c   The timeout val
c860: 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65  ue is.** an inte
c870: 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  ger number of mi
c880: 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73 65  lliseconds passe
c890: 64 20 69 6e 20 61 73 20 74 68 65 20 66 69 72 73  d in as the firs
c8a0: 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  t.** argument..*
c8b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
c8c0: 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61  iteDefaultBusyCa
c8d0: 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70  llback(. void *p
c8e0: 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
c8f0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
c900: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74  nnection */. int
c910: 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20 20   count          
c920: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c930: 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68  of times table h
c940: 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a  as been busy */.
c950: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
c960: 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f 55 53 4c  _WIN || HAVE_USL
c970: 45 45 50 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  EEP.  static con
c980: 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d  st u8 delays[] =
c990: 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c  .     { 1, 2, 5,
c9a0: 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c   10, 15, 20, 25,
c9b0: 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20   25,  25,  50,  
c9c0: 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61  50, 100 };.  sta
c9d0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74  tic const u8 tot
c9e0: 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30  als[] =.     { 0
c9f0: 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20  , 1, 3,  8, 18, 
ca00: 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c  33, 53, 78, 103,
ca10: 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d   128, 178, 228 }
ca20: 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41  ;.# define NDELA
ca30: 59 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c 61  Y ArraySize(dela
ca40: 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ys).  sqlite3 *d
ca50: 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70  b = (sqlite3 *)p
ca60: 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75  tr;.  int timeou
ca70: 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d 65  t = db->busyTime
ca80: 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79  out;.  int delay
ca90: 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73 65  , prior;..  asse
caa0: 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a  rt( count>=0 );.
cab0: 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44    if( count < ND
cac0: 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c 61  ELAY ){.    dela
cad0: 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74  y = delays[count
cae0: 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74  ];.    prior = t
caf0: 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20  otals[count];.  
cb00: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61 79  }else{.    delay
cb10: 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59   = delays[NDELAY
cb20: 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  -1];.    prior =
cb30: 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31   totals[NDELAY-1
cb40: 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74  ] + delay*(count
cb50: 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20  -(NDELAY-1));.  
cb60: 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b 20  }.  if( prior + 
cb70: 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74 20  delay > timeout 
cb80: 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 74  ){.    delay = t
cb90: 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a  imeout - prior;.
cba0: 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d 30      if( delay<=0
cbb0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
cbc0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
cbd0: 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61  p(db->pVfs, dela
cbe0: 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  y*1000);.  retur
cbf0: 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  n 1;.#else.  sql
cc00: 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69  ite3 *db = (sqli
cc10: 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74  te3 *)ptr;.  int
cc20: 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73 71 6c   timeout = ((sql
cc30: 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75 73  ite3 *)ptr)->bus
cc40: 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20  yTimeout;.  if( 
cc50: 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e  (count+1)*1000 >
cc60: 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20   timeout ){.    
cc70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
cc80: 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64  sqlite3OsSleep(d
cc90: 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30 30  b->pVfs, 1000000
cca0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  );.  return 1;.#
ccb0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  endif.}../*.** I
ccc0: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
ccd0: 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a  busy handler..**
cce0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ccf0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
cd00: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69  an operation fai
cd10: 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63 6b 2e  led with a lock.
cd20: 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74  .** If this rout
cd30: 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ine returns non-
cd40: 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
cd50: 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20 69  s retried.  If i
cd60: 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c 20  t.** returns 0, 
cd70: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 62  the operation ab
cd80: 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51 4c  orts with an SQL
cd90: 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a  ITE_BUSY error..
cda0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
cdb0: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
cdc0: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 29 7b  BusyHandler *p){
cdd0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
cde0: 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c 7c 20   NEVER(p==0) || 
cdf0: 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20 70  p->xFunc==0 || p
ce00: 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75  ->nBusy<0 ) retu
ce10: 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d 3e  rn 0;.  rc = p->
ce20: 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70  xFunc(p->pArg, p
ce30: 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66 28 20  ->nBusy);.  if( 
ce40: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  rc==0 ){.    p->
ce50: 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65  nBusy = -1;.  }e
ce60: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73  lse{.    p->nBus
ce70: 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  y++;.  }.  retur
ce80: 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n rc; .}../*.** 
ce90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
cea0: 73 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  s the busy callb
ceb0: 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74  ack for an Sqlit
cec0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
ced0: 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62  e.** given callb
cee0: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ack function wit
cef0: 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75  h the given argu
cf00: 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
cf10: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
cf20: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
cf30: 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29  ,.  int (*xBusy)
cf40: 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76  (void*,int),.  v
cf50: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66  oid *pArg.){.#if
cf60: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
cf70: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
cf80: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
cf90: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
cfa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
cfb0: 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
cfc0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
cfd0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
cfe0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
cff0: 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73  ler.xFunc = xBus
d000: 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  y;.  db->busyHan
d010: 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67  dler.pArg = pArg
d020: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
d030: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
d040: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
d050: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
d060: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
d070: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
d080: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
d090: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d0a0: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
d0b0: 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BACK./*.** This 
d0c0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
d0d0: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
d0e0: 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65  ck for an Sqlite
d0f0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65   database to the
d100: 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  .** given callba
d110: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ck function with
d120: 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d   the given argum
d130: 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73  ent. The progres
d140: 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a  s callback will.
d150: 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76  ** be invoked ev
d160: 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73  ery nOps opcodes
d170: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d180: 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  3_progress_handl
d190: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  er(.  sqlite3 *d
d1a0: 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a  b, .  int nOps,.
d1b0: 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73    int (*xProgres
d1c0: 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f  s)(void*), .  vo
d1d0: 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64  id *pArg.){.#ifd
d1e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d1f0: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
d200: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
d210: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
d220: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
d230: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
d240: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
d250: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
d260: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
d270: 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e  ex);.  if( nOps>
d280: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72  0 ){.    db->xPr
d290: 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72 65  ogress = xProgre
d2a0: 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f  ss;.    db->nPro
d2b0: 67 72 65 73 73 4f 70 73 20 3d 20 28 75 6e 73 69  gressOps = (unsi
d2c0: 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20 20 20 64  gned)nOps;.    d
d2d0: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20  b->pProgressArg 
d2e0: 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b  = pArg;.  }else{
d2f0: 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65  .    db->xProgre
d300: 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  ss = 0;.    db->
d310: 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30  nProgressOps = 0
d320: 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72  ;.    db->pProgr
d330: 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a  essArg = 0;.  }.
d340: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d350: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
d360: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
d370: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d380: 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75  installs a defau
d390: 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  lt busy handler 
d3a0: 74 68 61 74 20 77 61 69 74 73 20 66 6f 72 20 74  that waits for t
d3b0: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  he.** specified 
d3c0: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
d3d0: 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65  econds before re
d3e0: 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e  turning 0..*/.in
d3f0: 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74  t sqlite3_busy_t
d400: 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a  imeout(sqlite3 *
d410: 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 23 69 66  db, int ms){.#if
d420: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d430: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
d440: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
d450: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
d460: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
d470: 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
d480: 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20    if( ms>0 ){.  
d490: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
d4a0: 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74  andler(db, sqlit
d4b0: 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c  eDefaultBusyCall
d4c0: 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29  back, (void*)db)
d4d0: 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69  ;.    db->busyTi
d4e0: 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 7d 65  meout = ms;.  }e
d4f0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
d500: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62  _busy_handler(db
d510: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
d520: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20  .}../*.** Cause 
d540: 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72  any pending oper
d550: 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74  ation to stop at
d560: 20 69 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70   its earliest op
d570: 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f  portunity..*/.vo
d580: 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  id sqlite3_inter
d590: 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62  rupt(sqlite3 *db
d5a0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
d5b0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
d5c0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
d5d0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
d5e0: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
d5f0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
d600: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
d610: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e   }.#endif.  db->
d620: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
d630: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
d640: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
d650: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
d660: 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65  e as sqlite3_cre
d670: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  ate_function(), 
d680: 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69  except.** that i
d690: 74 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  t is designed to
d6a0: 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e   be called by in
d6b0: 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65  ternal code. The
d6c0: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a   difference is.*
d6d0: 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c  * that if a mall
d6e0: 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71  oc() fails in sq
d6f0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
d700: 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f  ction(), an erro
d710: 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74  r code.** is ret
d720: 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61  urned and the ma
d730: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
d740: 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74  cleared. .*/.int
d750: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
d760: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nc(.  sqlite3 *d
d770: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
d780: 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a  *zFunctionName,.
d790: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
d7a0: 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70  t enc,.  void *p
d7b0: 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64  UserData,.  void
d7c0: 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74   (*xSFunc)(sqlit
d7d0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
d7e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
d7f0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
d800: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
d810: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
d820: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
d830: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
d840: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20  te3_context*),. 
d850: 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20   FuncDestructor 
d860: 2a 70 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a  *pDestructor.){.
d870: 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20    FuncDef *p;.  
d880: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74  int nName;.  int
d890: 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20   extraFlags;..  
d8a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d8b0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
d8c0: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a  utex) );.  if( z
d8d0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20  FunctionName==0 
d8e0: 7c 7c 0a 20 20 20 20 20 20 28 78 53 46 75 6e 63  ||.      (xSFunc
d8f0: 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78   && (xFinal || x
d900: 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20  Step)) || .     
d910: 20 28 21 78 53 46 75 6e 63 20 26 26 20 28 78 46   (!xSFunc && (xF
d920: 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29 29  inal && !xStep))
d930: 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 53 46 75   ||.      (!xSFu
d940: 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26  nc && (!xFinal &
d950: 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20  & xStep)) ||.   
d960: 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e     (nArg<-1 || n
d970: 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46  Arg>SQLITE_MAX_F
d980: 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a  UNCTION_ARG) ||.
d990: 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d        (255<(nNam
d9a0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
d9b0: 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  n30( zFunctionNa
d9c0: 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74  me))) ){.    ret
d9d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
d9e0: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 61  E_BKPT;.  }..  a
d9f0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
da00: 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c  NC_CONSTANT==SQL
da10: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
da20: 43 20 29 3b 0a 20 20 65 78 74 72 61 46 6c 61 67  C );.  extraFlag
da30: 73 20 3d 20 65 6e 63 20 26 20 20 53 51 4c 49 54  s = enc &  SQLIT
da40: 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 3b  E_DETERMINISTIC;
da50: 0a 20 20 65 6e 63 20 26 3d 20 28 53 51 4c 49 54  .  enc &= (SQLIT
da60: 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53  E_FUNC_ENCMASK|S
da70: 51 4c 49 54 45 5f 41 4e 59 29 3b 0a 20 20 0a 23  QLITE_ANY);.  .#
da80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
da90: 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66  IT_UTF16.  /* If
daa0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
dab0: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
dac0: 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
dad0: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
dae0: 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
daf0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
db00: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
db10: 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
db20: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
db30: 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
db40: 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
db50: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
db60: 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54  **.  ** If SQLIT
db70: 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66 69  E_ANY is specifi
db80: 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76 65  ed, add three ve
db90: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75  rsions of the fu
dba0: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74  nction.  ** to t
dbb0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20  he hash table.. 
dbc0: 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53   */.  if( enc==S
dbd0: 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20  QLITE_UTF16 ){. 
dbe0: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
dbf0: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
dc00: 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51  else if( enc==SQ
dc10: 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20  LITE_ANY ){.    
dc20: 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  int rc;.    rc =
dc30: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
dc40: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
dc50: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
dc60: 54 45 5f 55 54 46 38 7c 65 78 74 72 61 46 6c 61  TE_UTF8|extraFla
dc70: 67 73 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73  gs,.         pUs
dc80: 65 72 44 61 74 61 2c 20 78 53 46 75 6e 63 2c 20  erData, xSFunc, 
dc90: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70  xStep, xFinal, p
dca0: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
dcb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
dcc0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
dcd0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
dce0: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
dcf0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
dd00: 54 45 5f 55 54 46 31 36 4c 45 7c 65 78 74 72 61  TE_UTF16LE|extra
dd10: 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
dd20: 20 70 55 73 65 72 44 61 74 61 2c 20 78 53 46 75   pUserData, xSFu
dd30: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
dd40: 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b  l, pDestructor);
dd50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
dd60: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
dd70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
dd80: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d  .    }.    enc =
dd90: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b   SQLITE_UTF16BE;
dda0: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63  .  }.#else.  enc
ddb0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
ddc0: 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43  #endif.  .  /* C
ddd0: 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74  heck if an exist
dde0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ing function is 
ddf0: 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e  being overridden
de00: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20   or deleted. If 
de10: 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  so,.  ** and the
de20: 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d  re are active VM
de30: 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53  s, then return S
de40: 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61  QLITE_BUSY. If a
de50: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
de60: 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64  s being overridd
de70: 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74  en/deleted but t
de80: 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69  here are no acti
de90: 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68  ve VMs, allow th
dea0: 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  e.  ** operation
deb0: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74   to continue but
dec0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
ded0: 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  precompiled stat
dee0: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70  ements..  */.  p
def0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
df00: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63  nction(db, zFunc
df10: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  tionName, nName,
df20: 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20   nArg, (u8)enc, 
df30: 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 28  0);.  if( p && (
df40: 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  p->funcFlags & S
df50: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41  QLITE_FUNC_ENCMA
df60: 53 4b 29 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e  SK)==enc && p->n
df70: 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20  Arg==nArg ){.   
df80: 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63   if( db->nVdbeAc
df90: 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71  tive ){.      sq
dfa0: 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
dfb0: 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  g(db, SQLITE_BUS
dfc0: 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61  Y, .        "una
dfd0: 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f  ble to delete/mo
dfe0: 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74 69  dify user-functi
dff0: 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76 65  on due to active
e000: 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20   statements");. 
e010: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
e020: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e030: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
e040: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
e050: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
e060: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
e070: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
e080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
e090: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
e0a0: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63  nction(db, zFunc
e0b0: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  tionName, nName,
e0c0: 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20   nArg, (u8)enc, 
e0d0: 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c  1);.  assert(p |
e0e0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
e0f0: 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  ed);.  if( !p ){
e100: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e110: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
e120: 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72 20   /* If an older 
e130: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 66  version of the f
e140: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20 63  unction with a c
e150: 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74 72 75  onfigured destru
e160: 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65 69  ctor is.  ** bei
e170: 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76 6f  ng replaced invo
e180: 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
e190: 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e  r function here.
e1a0: 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44 65   */.  functionDe
e1b0: 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a 20  stroy(db, p);.. 
e1c0: 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72   if( pDestructor
e1d0: 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63   ){.    pDestruc
e1e0: 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  tor->nRef++;.  }
e1f0: 0a 20 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f  .  p->pDestructo
e200: 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72 3b  r = pDestructor;
e210: 0a 20 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  .  p->funcFlags 
e220: 3d 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  = (p->funcFlags 
e230: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e  & SQLITE_FUNC_EN
e240: 43 4d 41 53 4b 29 20 7c 20 65 78 74 72 61 46 6c  CMASK) | extraFl
e250: 61 67 73 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ags;.  testcase(
e260: 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20   p->funcFlags & 
e270: 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
e280: 53 54 49 43 20 29 3b 0a 20 20 70 2d 3e 78 53 46  STIC );.  p->xSF
e290: 75 6e 63 20 3d 20 78 53 46 75 6e 63 20 3f 20 78  unc = xSFunc ? x
e2a0: 53 46 75 6e 63 20 3a 20 78 53 74 65 70 3b 0a 20  SFunc : xStep;. 
e2b0: 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20   p->xFinalize = 
e2c0: 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73  xFinal;.  p->pUs
e2d0: 65 72 44 61 74 61 20 3d 20 70 55 73 65 72 44 61  erData = pUserDa
e2e0: 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20  ta;.  p->nArg = 
e2f0: 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72 65 74  (u16)nArg;.  ret
e300: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e310: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e  ../*.** Create n
e320: 65 77 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  ew user function
e330: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
e340: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
e350: 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n(.  sqlite3 *db
e360: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e370: 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72  zFunc,.  int nAr
e380: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
e390: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
e3a0: 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65  (*xSFunc)(sqlite
e3b0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
e3c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
e3d0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
e3e0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e3f0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
e400: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
e410: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
e420: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a  e3_context*).){.
e430: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
e440: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
e450: 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e  _v2(db, zFunc, n
e460: 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 53 46  Arg, enc, p, xSF
e470: 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20  unc, xStep,.    
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69  xFinal, 0);.}..i
e4b0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
e4c0: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20  e_function_v2(. 
e4d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
e4e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
e4f0: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
e500: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
e510: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53   *p,.  void (*xS
e520: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
e530: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
e540: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
e550: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
e560: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
e570: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
e580: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
e590: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
e5a0: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64  ontext*),.  void
e5b0: 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69   (*xDestroy)(voi
e5c0: 64 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d *).){.  int rc
e5d0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
e5e0: 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f  .  FuncDestructo
e5f0: 72 20 2a 70 41 72 67 20 3d 20 30 3b 0a 0a 23 69  r *pArg = 0;..#i
e600: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
e610: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
e620: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
e630: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
e640: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e650: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
e660: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
e670: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
e680: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
e690: 28 20 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  ( xDestroy ){.  
e6a0: 20 20 70 41 72 67 20 3d 20 28 46 75 6e 63 44 65    pArg = (FuncDe
e6b0: 73 74 72 75 63 74 6f 72 20 2a 29 73 71 6c 69 74  structor *)sqlit
e6c0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
e6d0: 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63 44 65  b, sizeof(FuncDe
e6e0: 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20  structor));.    
e6f0: 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20  if( !pArg ){.   
e700: 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a     xDestroy(p);.
e710: 20 20 20 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a        goto out;.
e720: 20 20 20 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e      }.    pArg->
e730: 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74  xDestroy = xDest
e740: 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70  roy;.    pArg->p
e750: 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20  UserData = p;.  
e760: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
e770: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
e780: 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Func, nArg, enc,
e790: 20 70 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65   p, xSFunc, xSte
e7a0: 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41 72 67 29  p, xFinal, pArg)
e7b0: 3b 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20  ;.  if( pArg && 
e7c0: 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  pArg->nRef==0 ){
e7d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
e7e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
e7f0: 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20    xDestroy(p);. 
e800: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
e810: 28 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a  (db, pArg);.  }.
e820: 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73 71  . out:.  rc = sq
e830: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
e840: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
e850: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
e860: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
e870: 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
e880: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
e890: 36 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  6.int sqlite3_cr
e8a0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28  eate_function16(
e8b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
e8c0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46    const void *zF
e8d0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69  unctionName,.  i
e8e0: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
e8f0: 54 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64 20  TextRep,.  void 
e900: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46  *p,.  void (*xSF
e910: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
e920: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
e930: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
e940: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
e950: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
e960: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
e970: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
e980: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
e990: 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  ext*).){.  int r
e9a0: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63  c;.  char *zFunc
e9b0: 38 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  8;..#ifdef SQLIT
e9c0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
e9d0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
e9e0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
e9f0: 62 29 20 7c 7c 20 7a 46 75 6e 63 74 69 6f 6e 4e  b) || zFunctionN
ea00: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ame==0 ) return 
ea10: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
ea20: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
ea30: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
ea40: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
ea50: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
ea60: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46  ocFailed );.  zF
ea70: 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55 74  unc8 = sqlite3Ut
ea80: 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63  f16to8(db, zFunc
ea90: 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  tionName, -1, SQ
eaa0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
eab0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
eac0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
ead0: 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65 54  zFunc8, nArg, eT
eae0: 65 78 74 52 65 70 2c 20 70 2c 20 78 53 46 75 6e  extRep, p, xSFun
eaf0: 63 2c 78 53 74 65 70 2c 78 46 69 6e 61 6c 2c 30  c,xStep,xFinal,0
eb00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
eb10: 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a  ee(db, zFunc8);.
eb20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
eb30: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
eb40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
eb50: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
eb60: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
eb70: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
eb80: 65 63 6c 61 72 65 20 74 68 61 74 20 61 20 66 75  eclare that a fu
eb90: 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  nction has been 
eba0: 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20  overloaded by a 
ebb0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
ebc0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63  *.** If the func
ebd0: 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69  tion already exi
ebe0: 73 74 73 20 61 73 20 61 20 72 65 67 75 6c 61 72  sts as a regular
ebf0: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
ec00: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
ec10: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
ec20: 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63 74  p.  If the funct
ec30: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ion does not exi
ec40: 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a  st, then create.
ec50: 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61  ** a new one tha
ec60: 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20  t always throws 
ec70: 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72  a run-time error
ec80: 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76  .  .**.** When v
ec90: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e  irtual tables in
eca0: 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20  tend to provide 
ecb0: 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75  an overloaded fu
ecc0: 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20  nction, they.** 
ecd0: 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73  should call this
ece0: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65   routine to make
ecf0: 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c   sure the global
ed00: 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73   function exists
ed10: 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75  ..** A global fu
ed20: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73  nction must exis
ed30: 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e  t in order for n
ed40: 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74  ame resolution t
ed50: 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72  o work.** proper
ed60: 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
ed70: 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63  e3_overload_func
ed80: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  tion(.  sqlite3 
ed90: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
eda0: 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  r *zName,.  int 
edb0: 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20 6e 4e  nArg.){.  int nN
edc0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
edd0: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
ede0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
edf0: 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  OK;..#ifdef SQLI
ee00: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
ee10: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
ee20: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
ee30: 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20  db) || zName==0 
ee40: 7c 7c 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20  || nArg<-2 ){.  
ee50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ee60: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
ee70: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
ee80: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
ee90: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
eea0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
eeb0: 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  ion(db, zName, n
eec0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
eed0: 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29  TE_UTF8, 0)==0 )
eee0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
eef0: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
ef00: 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51   zName, nArg, SQ
ef10: 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20  LITE_UTF8,.     
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef30: 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33        0, sqlite3
ef40: 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c  InvalidFunction,
ef50: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 0, 0);.  }. 
ef60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
ef70: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
ef80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ef90: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
efa0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
efb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
efc0: 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  MIT_TRACE./*.** 
efd0: 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65  Register a trace
efe0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
eff0: 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
f000: 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
f010: 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20  red trace.** is 
f020: 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a  returned.  .**.*
f030: 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66  * A NULL trace f
f040: 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  unction means th
f050: 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73  at no tracing is
f060: 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
f070: 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20  n-NULL.** trace 
f080: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
f090: 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
f0a0: 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  is invoked at th
f0b0: 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a  e start of each.
f0c0: 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
f0d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
f0e0: 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33  e3_trace(sqlite3
f0f0: 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72   *db, void (*xTr
f100: 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  ace)(void*,const
f110: 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70   char*), void *p
f120: 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  Arg){.  void *pO
f130: 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ld;..#ifdef SQLI
f140: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
f150: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
f160: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
f170: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
f180: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
f190: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
f1a0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
f1b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
f1c0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
f1d0: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72    pOld = db->pTr
f1e0: 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54  aceArg;.  db->xT
f1f0: 72 61 63 65 20 3d 20 78 54 72 61 63 65 3b 0a 20  race = xTrace;. 
f200: 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d   db->pTraceArg =
f210: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
f220: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
f230: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
f240: 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  n pOld;.}./*.** 
f250: 52 65 67 69 73 74 65 72 20 61 20 70 72 6f 66 69  Register a profi
f260: 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  le function.  Th
f270: 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20  e pArg from the 
f280: 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
f290: 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c  tered .** profil
f2a0: 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  e function is re
f2b0: 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
f2c0: 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66  A NULL profile f
f2d0: 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  unction means th
f2e0: 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20  at no profiling 
f2f0: 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20  is executes.  A 
f300: 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66  non-NULL.** prof
f310: 69 6c 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ile is a pointer
f320: 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
f330: 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  hat is invoked a
f340: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
f350: 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20   of.** each SQL 
f360: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69  statement that i
f370: 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  s run..*/.void *
f380: 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28  sqlite3_profile(
f390: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
f3a0: 20 20 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c    void (*xProfil
f3b0: 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
f3c0: 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74  har*,sqlite_uint
f3d0: 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  64),.  void *pAr
f3e0: 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  g.){.  void *pOl
f3f0: 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d;..#ifdef SQLIT
f400: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
f410: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
f420: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
f430: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
f440: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
f450: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
f460: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
f470: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
f480: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
f490: 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f   pOld = db->pPro
f4a0: 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  fileArg;.  db->x
f4b0: 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69  Profile = xProfi
f4c0: 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69  le;.  db->pProfi
f4d0: 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  leArg = pArg;.  
f4e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f4f0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
f500: 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d    return pOld;.}
f510: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
f520: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a  E_OMIT_TRACE */.
f530: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
f540: 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  a function to be
f550: 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20   invoked when a 
f560: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
f570: 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  its..** If the i
f580: 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20  nvoked function 
f590: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
f5a0: 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69  , then the commi
f5b0: 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72  t becomes a.** r
f5c0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64  ollback..*/.void
f5d0: 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74   *sqlite3_commit
f5e0: 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
f5f0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
f600: 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
f610: 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
f620: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
f630: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
f640: 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f  d*),  /* Functio
f650: 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65  n to invoke on e
f660: 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  ach commit */.  
f670: 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
f680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
f690: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
f6a0: 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ction */.){.  vo
f6b0: 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65  id *pOld;..#ifde
f6c0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
f6d0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
f6e0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
f6f0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
f700: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
f710: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
f720: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
f730: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
f740: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
f750: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
f760: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20  b->pCommitArg;. 
f770: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
f780: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
f790: 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ;.  db->pCommitA
f7a0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
f7b0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f7c0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
f7d0: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f  eturn pOld;.}../
f7e0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
f7f0: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
f800: 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
f810: 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65   a row is update
f820: 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f  d,.** inserted o
f830: 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  r deleted using 
f840: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
f850: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
f860: 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74  d *sqlite3_updat
f870: 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  e_hook(.  sqlite
f880: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
f890: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
f8a0: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
f8b0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
f8c0: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
f8d0: 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f  oid*,int,char co
f8e0: 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74  nst *,char const
f8f0: 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29   *,sqlite_int64)
f900: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f920: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
f930: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
f940: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23    void *pRet;..#
f950: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f960: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
f970: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
f980: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
f990: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
f9a0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
f9b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f9c0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
f9d0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
f9e0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
f9f0: 20 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72   = db->pUpdateAr
fa00: 67 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65  g;.  db->xUpdate
fa10: 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
fa20: 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64  back;.  db->pUpd
fa30: 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ateArg = pArg;. 
fa40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
fa50: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
fa60: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
fa70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
fa80: 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
fa90: 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
faa0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
fab0: 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20  on is rolled.** 
fac0: 62 61 63 6b 20 62 79 20 74 68 69 73 20 64 61 74  back by this dat
fad0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
fae0: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
faf0: 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b  e3_rollback_hook
fb00: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
fb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fb20: 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
fb30: 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
fb40: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  e */.  void (*xC
fb50: 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c  allback)(void*),
fb60: 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e   /* Callback fun
fb70: 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
fb80: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
fb90: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
fba0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
fbb0: 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
fbc0: 52 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  Ret;..#ifdef SQL
fbd0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
fbe0: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
fbf0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
fc00: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
fc10: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
fc20: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
fc30: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
fc40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
fc50: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
fc60: 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52  .  pRet = db->pR
fc70: 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62  ollbackArg;.  db
fc80: 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62  ->xRollbackCallb
fc90: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
fca0: 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  .  db->pRollback
fcb0: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
fcc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
fcd0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
fce0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
fcf0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fd00: 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68  MIT_WAL./*.** Th
fd10: 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  e sqlite3_wal_ho
fd20: 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65  ok() callback re
fd30: 67 69 73 74 65 72 65 64 20 62 79 20 73 71 6c 69  gistered by sqli
fd40: 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63  te3_wal_autochec
fd50: 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76  kpoint()..** Inv
fd60: 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  oke sqlite3_wal_
fd70: 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68  checkpoint if th
fd80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  e number of fram
fd90: 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69  es in the log fi
fda0: 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
fdb0: 20 74 68 61 6e 20 73 71 6c 69 74 65 33 2e 70 57   than sqlite3.pW
fdc0: 61 6c 41 72 67 20 63 61 73 74 20 74 6f 20 61 6e  alArg cast to an
fdd0: 20 69 6e 74 65 67 65 72 20 28 74 68 65 20 76 61   integer (the va
fde0: 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62  lue configured b
fdf0: 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65  y.** wal_autoche
fe00: 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a  ckpoint())..*/ .
fe10: 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 44 65  int sqlite3WalDe
fe20: 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69  faultHook(.  voi
fe30: 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 20  d *pClientData, 
fe40: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
fe50: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
fe60: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ,           /* C
fe70: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63  onnection */.  c
fe80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
fe90: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
fea0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d  e */.  int nFram
feb0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
fec0: 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a   Size of WAL */.
fed0: 29 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e  ){.  if( nFrame>
fee0: 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  =SQLITE_PTR_TO_I
fef0: 4e 54 28 70 43 6c 69 65 6e 74 44 61 74 61 29 20  NT(pClientData) 
ff00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
ff10: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
ff20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  );.    sqlite3_w
ff30: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62  al_checkpoint(db
ff40: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , zDb);.    sqli
ff50: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
ff60: 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  oc();.  }.  retu
ff70: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ff80: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
ff90: 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
ffa0: 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e  .** Configure an
ffb0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
ffc0: 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  k() callback to 
ffd0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68  automatically ch
ffe0: 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61  eckpoint.** a da
fff0: 74 61 62 61 73 65 20 61 66 74 65 72 20 63 6f 6d  tabase after com
10000 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
10010 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61  ction if there a
10020 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20  re nFrame or.** 
10030 6d 6f 72 65 20 66 72 61 6d 65 73 20 69 6e 20 74  more frames in t
10040 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73  he log file. Pas
10050 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e  sing zero or a n
10060 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 61 73  egative value as
10070 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70   the.** nFrame p
10080 61 72 61 6d 65 74 65 72 20 64 69 73 61 62 6c 65  arameter disable
10090 73 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63  s automatic chec
100a0 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79  kpoints entirely
100b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
100c0 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20  back registered 
100d0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
100e0 20 72 65 70 6c 61 63 65 73 20 61 6e 79 20 65 78   replaces any ex
100f0 69 73 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a  isting callback.
10100 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20 75 73  ** registered us
10110 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  ing sqlite3_wal_
10120 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65  hook(). Likewise
10130 2c 20 72 65 67 69 73 74 65 72 69 6e 67 20 61 20  , registering a 
10140 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e  callback.** usin
10150 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  g sqlite3_wal_ho
10160 6f 6b 28 29 20 64 69 73 61 62 6c 65 73 20 74 68  ok() disables th
10170 65 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63  e automatic chec
10180 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d  kpoint mechanism
10190 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62  .** configured b
101a0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
101b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
101c0 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
101d0 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nt(sqlite3 *db, 
101e0 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66  int nFrame){.#if
101f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10200 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  WAL.  UNUSED_PAR
10210 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e  AMETER(db);.  UN
10220 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
10230 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 23 69  Frame);.#else.#i
10240 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10250 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
10260 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
10270 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
10280 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
10290 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
102a0 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 30 20  .  if( nFrame>0 
102b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  ){.    sqlite3_w
102c0 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69  al_hook(db, sqli
102d0 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f  te3WalDefaultHoo
102e0 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  k, SQLITE_INT_TO
102f0 5f 50 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20  _PTR(nFrame));. 
10300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
10310 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c  te3_wal_hook(db,
10320 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
10330 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
10340 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
10350 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
10360 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
10370 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72  d each time a tr
10380 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 77 72 69  ansaction is wri
10390 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  tten.** into the
103a0 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67   write-ahead-log
103b0 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
103c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
103d0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77  .void *sqlite3_w
103e0 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  al_hook(.  sqlit
103f0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
10400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
10410 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
10420 20 74 68 69 73 20 64 62 20 68 61 6e 64 6c 65 20   this db handle 
10430 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62  */.  int(*xCallb
10440 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c  ack)(void *, sql
10450 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61  ite3*, const cha
10460 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64  r*, int),.  void
10470 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
10480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
10490 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
104a0 73 73 65 64 20 74 6f 20 78 43 61 6c 6c 62 61 63  ssed to xCallbac
104b0 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  k() */.){.#ifnde
104c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
104d0 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  L.  void *pRet;.
104e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
104f0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
10500 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
10510 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
10520 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
10530 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
10540 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
10550 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
10560 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
10570 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
10580 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b  t = db->pWalArg;
10590 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62  .  db->xWalCallb
105a0 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
105b0 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d  .  db->pWalArg =
105c0 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
105d0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
105e0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
105f0 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20  n pRet;.#else.  
10600 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
10610 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70  .}../*.** Checkp
10620 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44  oint database zD
10630 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
10640 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
10650 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
10660 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
10670 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
10680 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  se handle */.  c
10690 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
106a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
106b0 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68  * Name of attach
106c0 65 64 20 64 61 74 61 62 61 73 65 20 28 6f 72 20  ed database (or 
106d0 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65  NULL) */.  int e
106e0 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Mode,           
106f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
10700 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
10710 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  * value */.  int
10720 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20   *pnLog,        
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10740 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c  OUT: Size of WAL
10750 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73 20 2a   log in frames *
10760 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20  /.  int *pnCkpt 
10770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10780 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61      /* OUT: Tota
10790 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  l number of fram
107a0 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  es checkpointed 
107b0 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  */.){.#ifdef SQL
107c0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72  ITE_OMIT_WAL.  r
107d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
107e0 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
107f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10800 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
10810 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
10820 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41   iDb = SQLITE_MA
10830 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20  X_ATTACHED;  /* 
10840 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e  sqlite3.aDb[] in
10850 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65  dex of db to che
10860 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 23 69 66 64  ckpoint */..#ifd
10870 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10880 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
10890 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
108a0 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74  heckOk(db) ) ret
108b0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
108c0 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 0a  E_BKPT;.#endif..
108d0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
108e0 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
108f0 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e 20 63 61  bles to -1 in ca
10900 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  se an error occu
10910 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c  rs. */.  if( pnL
10920 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31  og ) *pnLog = -1
10930 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70 74 20 29  ;.  if( pnCkpt )
10940 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a   *pnCkpt = -1;..
10950 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
10960 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
10970 49 56 45 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  IVE==0 );.  asse
10980 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
10990 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b  POINT_FULL==1 );
109a0 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
109b0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
109c0 54 41 52 54 3d 3d 32 20 29 3b 0a 20 20 61 73 73  TART==2 );.  ass
109d0 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
109e0 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 3d  KPOINT_TRUNCATE=
109f0 3d 33 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  =3 );.  if( eMod
10a00 65 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  e<SQLITE_CHECKPO
10a10 49 4e 54 5f 50 41 53 53 49 56 45 20 7c 7c 20 65  INT_PASSIVE || e
10a20 4d 6f 64 65 3e 53 51 4c 49 54 45 5f 43 48 45 43  Mode>SQLITE_CHEC
10a30 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 20  KPOINT_TRUNCATE 
10a40 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
10a50 43 45 2d 4f 46 3a 20 52 2d 30 33 39 39 36 2d 31  CE-OF: R-03996-1
10a60 32 30 38 38 20 54 68 65 20 4d 20 70 61 72 61 6d  2088 The M param
10a70 65 74 65 72 20 6d 75 73 74 20 62 65 20 61 20 76  eter must be a v
10a80 61 6c 69 64 20 63 68 65 63 6b 70 6f 69 6e 74 0a  alid checkpoint.
10a90 20 20 20 20 2a 2a 20 6d 6f 64 65 3a 20 2a 2f 0a      ** mode: */.
10aa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10ab0 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20  E_MISUSE;.  }.. 
10ac0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10ad0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
10ae0 0a 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a 44  .  if( zDb && zD
10af0 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44 62 20  b[0] ){.    iDb 
10b00 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  = sqlite3FindDbN
10b10 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  ame(db, zDb);.  
10b20 7d 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b  }.  if( iDb<0 ){
10b30 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
10b40 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
10b50 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
10b60 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  db, SQLITE_ERROR
10b70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62  , "unknown datab
10b80 61 73 65 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a  ase: %s", zDb);.
10b90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d    }else{.    db-
10ba0 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75  >busyHandler.nBu
10bb0 73 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  sy = 0;.    rc =
10bc0 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69   sqlite3Checkpoi
10bd0 6e 74 28 64 62 2c 20 69 44 62 2c 20 65 4d 6f 64  nt(db, iDb, eMod
10be0 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74  e, pnLog, pnCkpt
10bf0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  );.    sqlite3Er
10c00 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d  ror(db, rc);.  }
10c10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
10c20 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
10c30 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10c40 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
10c50 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
10c60 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
10c70 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62  Checkpoint datab
10c80 61 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20  ase zDb. If zDb 
10c90 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74  is NULL, or if t
10ca0 68 65 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f  he buffer zDb po
10cb0 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61  ints.** to conta
10cc0 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  ins a zero-lengt
10cd0 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74  h string, all at
10ce0 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
10cf0 20 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f   are .** checkpo
10d00 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inted..*/.int sq
10d10 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
10d20 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  oint(sqlite3 *db
10d30 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
10d40 62 29 7b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  b){.  /* EVIDENC
10d50 45 2d 4f 46 3a 20 52 2d 34 31 36 31 33 2d 32 30  E-OF: R-41613-20
10d60 35 35 33 20 54 68 65 20 73 71 6c 69 74 65 33 5f  553 The sqlite3_
10d70 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 44  wal_checkpoint(D
10d80 2c 58 29 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ,X) is equivalen
10d90 74 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65  t to.  ** sqlite
10da0 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
10db0 5f 76 32 28 44 2c 58 2c 53 51 4c 49 54 45 5f 43  _v2(D,X,SQLITE_C
10dc0 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
10dd0 45 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20 72 65 74  E,0,0). */.  ret
10de0 75 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  urn sqlite3_wal_
10df0 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62  checkpoint_v2(db
10e00 2c 7a 44 62 2c 53 51 4c 49 54 45 5f 43 48 45 43  ,zDb,SQLITE_CHEC
10e10 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30  KPOINT_PASSIVE,0
10e20 2c 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ,0);.}..#ifndef 
10e30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
10e40 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65 63  /*.** Run a chec
10e50 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62 61  kpoint on databa
10e60 73 65 20 69 44 62 2e 20 54 68 69 73 20 69 73 20  se iDb. This is 
10e70 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61 62  a no-op if datab
10e80 61 73 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f  ase iDb is.** no
10e90 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  t currently open
10ea0 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a   in WAL mode..**
10eb0 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
10ec0 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20  tion is open on 
10ed0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69  the database bei
10ee0 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c  ng checkpointed,
10ef0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
10f00 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
10f10 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20 63  E_LOCKED and a c
10f20 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74  heckpoint is not
10f30 20 61 74 74 65 6d 70 74 65 64 2e 20 49 66 20 0a   attempted. If .
10f40 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
10f50 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67  rs while running
10f60 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c   the checkpoint,
10f70 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
10f80 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74   code is .** ret
10f90 75 72 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c 49  urned (i.e. SQLI
10fa0 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65 72  TE_IOERR). Other
10fb0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
10fc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
10fd0 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
10fe0 64 6c 65 20 64 62 20 73 68 6f 75 6c 64 20 62 65  dle db should be
10ff0 20 68 65 6c 64 20 62 79 20 74 68 65 20 63 61 6c   held by the cal
11000 6c 65 72 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a  ler. The mutex.*
11010 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
11020 68 20 74 68 65 20 73 70 65 63 69 66 69 63 20 62  h the specific b
11030 2d 74 72 65 65 20 62 65 69 6e 67 20 63 68 65 63  -tree being chec
11040 6b 70 6f 69 6e 74 65 64 20 69 73 20 74 61 6b 65  kpointed is take
11050 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e  n by.** this fun
11060 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 65 20  ction while the 
11070 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 72 75  checkpoint is ru
11080 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nning..**.** If 
11090 69 44 62 20 69 73 20 70 61 73 73 65 64 20 53 51  iDb is passed SQ
110a0 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
110b0 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74 74 61  D, then all atta
110c0 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61  ched databases a
110d0 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74  re.** checkpoint
110e0 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
110f0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
11100 74 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d  t is returned im
11110 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e  mediately -.** n
11120 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  o attempt is mad
11130 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20  e to checkpoint 
11140 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 64 61  any remaining da
11150 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50  tabases..**.** P
11160 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 69  arameter eMode i
11170 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  s one of SQLITE_
11180 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
11190 56 45 2c 20 46 55 4c 4c 20 6f 72 20 52 45 53 54  VE, FULL or REST
111a0 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ART..*/.int sqli
111b0 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 73 71  te3Checkpoint(sq
111c0 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
111d0 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69  Db, int eMode, i
111e0 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a  nt *pnLog, int *
111f0 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72  pnCkpt){.  int r
11200 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
11210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
11220 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
11230 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11250 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
11260 65 20 74 68 72 6f 75 67 68 20 61 74 74 61 63 68  e through attach
11270 65 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20  ed dbs */.  int 
11280 62 42 75 73 79 20 3d 20 30 3b 20 20 20 20 20 20  bBusy = 0;      
11290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
112a0 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f 42 55  rue if SQLITE_BU
112b0 53 59 20 68 61 73 20 62 65 65 6e 20 65 6e 63 6f  SY has been enco
112c0 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73  untered */..  as
112d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
112e0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
112f0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
11300 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f   !pnLog || *pnLo
11310 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73 65 72  g==-1 );.  asser
11320 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70  t( !pnCkpt || *p
11330 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20  nCkpt==-1 );..  
11340 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
11350 44 62 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  Db && rc==SQLITE
11360 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  _OK; i++){.    i
11370 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62  f( i==iDb || iDb
11380 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  ==SQLITE_MAX_ATT
11390 41 43 48 45 44 20 29 7b 0a 20 20 20 20 20 20 72  ACHED ){.      r
113a0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
113b0 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61  Checkpoint(db->a
113c0 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65  Db[i].pBt, eMode
113d0 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29  , pnLog, pnCkpt)
113e0 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20  ;.      pnLog = 
113f0 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70 74 20  0;.      pnCkpt 
11400 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72  = 0;.      if( r
11410 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c==SQLITE_BUSY )
11420 7b 0a 20 20 20 20 20 20 20 20 62 42 75 73 79 20  {.        bBusy 
11430 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 1;.        rc 
11440 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
11450 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
11460 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
11470 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42 75 73 79  LITE_OK && bBusy
11480 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ) ? SQLITE_BUSY 
11490 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  : rc;.}.#endif /
114a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  * SQLITE_OMIT_WA
114b0 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  L */../*.** This
114c0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
114d0 73 20 74 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d  s true if main-m
114e0 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20  emory should be 
114f0 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a  used instead of.
11500 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ** a temporary f
11510 69 6c 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e  ile for transien
11520 74 20 70 61 67 65 72 20 66 69 6c 65 73 20 61 6e  t pager files an
11530 64 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  d statement jour
11540 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  nals..** The val
11550 75 65 20 72 65 74 75 72 6e 65 64 20 64 65 70 65  ue returned depe
11560 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  nds on the value
11570 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f   of db->temp_sto
11580 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70  re (runtime.** p
11590 61 72 61 6d 65 74 65 72 29 20 61 6e 64 20 74 68  arameter) and th
115a0 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76  e compile time v
115b0 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 54  alue of SQLITE_T
115c0 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a  EMP_STORE. The.*
115d0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  * following tabl
115e0 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
115f0 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74  relationship bet
11600 77 65 65 6e 20 74 68 65 73 65 20 74 77 6f 20 76  ween these two v
11610 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69  alues.** and thi
11620 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  s functions retu
11630 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  rn value..**.** 
11640 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54    SQLITE_TEMP_ST
11650 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70  ORE     db->temp
11660 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74  _store     Locat
11670 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79  ion of temporary
11680 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d   database.**   -
11690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116a0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
116b0 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ---     --------
116c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116d0 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20  ------.**   0   
116e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116f0 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20    any           
11700 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
11710 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31  return 0).**   1
11720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11730 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
11740 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
11750 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
11760 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
11770 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
11780 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
11790 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a  y    (return 1).
117a0 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20  **   1          
117b0 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
117c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
117d0 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
117e0 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  0).**   2       
117f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11810 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
11820 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 0).**   2    
11830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11840 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
11850 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
11860 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20  eturn 1).**   2 
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11880 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
11890 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
118a0 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20   (return 1).**  
118b0 20 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20   3              
118c0 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20         any      
118d0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
118e0 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
118f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65 6d  /.int sqlite3Tem
11900 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20  pInMemory(const 
11910 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
11920 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
11930 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20  ORE==1.  return 
11940 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  ( db->temp_store
11950 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ==2 );.#endif.#i
11960 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
11970 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20  ORE==2.  return 
11980 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65  ( db->temp_store
11990 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69  !=1 );.#endif.#i
119a0 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
119b0 4f 52 45 3d 3d 33 0a 20 20 55 4e 55 53 45 44 5f  ORE==3.  UNUSED_
119c0 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20  PARAMETER(db);. 
119d0 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
119e0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  f.#if SQLITE_TEM
119f0 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c  P_STORE<1 || SQL
11a00 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33  ITE_TEMP_STORE>3
11a10 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
11a20 54 45 52 28 64 62 29 3b 0a 20 20 72 65 74 75 72  TER(db);.  retur
11a30 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 0;.#endif.}../
11a40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d  *.** Return UTF-
11a50 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73  8 encoded Englis
11a60 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61  h language expla
11a70 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nation of the mo
11a80 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72  st recent.** err
11a90 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  or..*/.const cha
11aa0 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  r *sqlite3_errms
11ab0 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  g(sqlite3 *db){.
11ac0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
11ad0 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20  .  if( !db ){.  
11ae0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
11af0 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f  ErrStr(SQLITE_NO
11b00 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  MEM);.  }.  if( 
11b10 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
11b20 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
11b30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
11b40 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49  lite3ErrStr(SQLI
11b50 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b  TE_MISUSE_BKPT);
11b60 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
11b70 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
11b80 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d  utex);.  if( db-
11b90 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
11ba0 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
11bb0 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f  ErrStr(SQLITE_NO
11bc0 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  MEM);.  }else{. 
11bd0 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62 2d     testcase( db-
11be0 3e 70 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20  >pErr==0 );.    
11bf0 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  z = (char*)sqlit
11c00 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62  e3_value_text(db
11c10 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73 73  ->pErr);.    ass
11c20 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
11c30 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66  Failed );.    if
11c40 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( z==0 ){.      
11c50 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74  z = sqlite3ErrSt
11c60 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a  r(db->errCode);.
11c70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
11c80 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
11c90 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
11ca0 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64  turn z;.}..#ifnd
11cb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
11cc0 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  TF16./*.** Retur
11cd0 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64  n UTF-16 encoded
11ce0 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
11cf0 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  e explanation of
11d00 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
11d10 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f  .** error..*/.co
11d20 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
11d30 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74  3_errmsg16(sqlit
11d40 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69  e3 *db){.  stati
11d50 63 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f  c const u16 outO
11d60 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27  fMem[] = {.    '
11d70 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20  o', 'u', 't', ' 
11d80 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27  ', 'o', 'f', ' '
11d90 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c  , 'm', 'e', 'm',
11da0 20 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c 20   'o', 'r', 'y', 
11db0 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  0.  };.  static 
11dc0 63 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73 65  const u16 misuse
11dd0 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20  [] = {.    'l', 
11de0 27 69 27 2c 20 27 62 27 2c 20 27 72 27 2c 20 27  'i', 'b', 'r', '
11df0 61 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 27 20  a', 'r', 'y', ' 
11e00 27 2c 20 0a 20 20 20 20 27 72 27 2c 20 27 6f 27  ', .    'r', 'o'
11e10 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 69 27 2c  , 'u', 't', 'i',
11e20 20 27 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c 20   'n', 'e', ' ', 
11e30 0a 20 20 20 20 27 63 27 2c 20 27 61 27 2c 20 27  .    'c', 'a', '
11e40 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27 64  l', 'l', 'e', 'd
11e50 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27  ', ' ', .    'o'
11e60 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c  , 'u', 't', ' ',
11e70 20 0a 20 20 20 20 27 6f 27 2c 20 27 66 27 2c 20   .    'o', 'f', 
11e80 27 20 27 2c 20 0a 20 20 20 20 27 73 27 2c 20 27  ' ', .    's', '
11e90 65 27 2c 20 27 71 27 2c 20 27 75 27 2c 20 27 65  e', 'q', 'u', 'e
11ea0 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27 65 27  ', 'n', 'c', 'e'
11eb0 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73  , 0.  };..  cons
11ec0 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28  t void *z;.  if(
11ed0 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
11ee0 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66  rn (void *)outOf
11ef0 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  Mem;.  }.  if( !
11f00 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
11f10 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
11f20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f  {.    return (vo
11f30 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d  id *)misuse;.  }
11f40 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
11f50 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
11f60 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
11f70 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
11f80 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74   z = (void *)out
11f90 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  OfMem;.  }else{.
11fa0 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
11fb0 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d  value_text16(db-
11fc0 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  >pErr);.    if( 
11fd0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  z==0 ){.      sq
11fe0 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
11ff0 67 28 64 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64  g(db, db->errCod
12000 65 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  e, sqlite3ErrStr
12010 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a  (db->errCode));.
12020 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
12030 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64  3_value_text16(d
12040 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a  b->pErr);.    }.
12050 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28      /* A malloc(
12060 29 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65  ) may have faile
12070 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c  d within the cal
12080 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c  l to sqlite3_val
12090 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20  ue_text16().    
120a0 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69  ** above. If thi
120b0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
120c0 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c  hen the db->mall
120d0 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65  ocFailed flag ne
120e0 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
120f0 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
12100 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68  returning. Do th
12110 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73  is directly, ins
12120 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20  tead of via.    
12130 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78 69  ** sqlite3ApiExi
12140 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65  t(), to avoid se
12150 74 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  tting the databa
12160 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20  se handle error 
12170 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  message..    */.
12180 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 43 6c      sqlite3OomCl
12190 65 61 72 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73  ear(db);.  }.  s
121a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
121b0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
121c0 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e   return z;.}.#en
121d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
121e0 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
121f0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f  ** Return the mo
12200 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20  st recent error 
12210 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
12220 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74  y an SQLite rout
12230 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a  ine. If NULL is.
12240 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  ** passed to thi
12250 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61  s function, we a
12260 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29  ssume a malloc()
12270 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73   failed during s
12280 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a  qlite3_open()..*
12290 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72  /.int sqlite3_er
122a0 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64  rcode(sqlite3 *d
122b0 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20  b){.  if( db && 
122c0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
122d0 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
122e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
122f0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
12300 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20  ;.  }.  if( !db 
12310 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
12320 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
12330 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
12340 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d    }.  return db-
12350 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65  >errCode & db->e
12360 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71  rrMask;.}.int sq
12370 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
12380 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a  rrcode(sqlite3 *
12390 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26  db){.  if( db &&
123a0 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
123b0 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
123c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
123d0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
123e0 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62  T;.  }.  if( !db
123f0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
12400 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
12410 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
12420 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62  .  }.  return db
12430 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a  ->errCode;.}../*
12440 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72  .** Return a str
12450 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
12460 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65  es the kind of e
12470 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  rror specified i
12480 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  n the.** argumen
12490 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69  t.  For now, thi
124a0 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74  s simply calls t
124b0 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69  he internal sqli
124c0 74 65 33 45 72 72 53 74 72 28 29 0a 2a 2a 20 66  te3ErrStr().** f
124d0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73  unction..*/.cons
124e0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
124f0 65 72 72 73 74 72 28 69 6e 74 20 72 63 29 7b 0a  errstr(int rc){.
12500 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12510 45 72 72 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f  ErrStr(rc);.}../
12520 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
12530 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  w collating func
12540 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73  tion for databas
12550 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d  e "db".  The nam
12560 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e  e is zName.** an
12570 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69  d the encoding i
12580 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  s enc..*/.static
12590 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61   int createColla
125a0 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a  tion(.  sqlite3*
125b0 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61   db,.  const cha
125c0 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20  r *zName, .  u8 
125d0 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74  enc,.  void* pCt
125e0 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
125f0 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
12600 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
12610 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f  nst void*),.  vo
12620 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  id(*xDel)(void*)
12630 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  .){.  CollSeq *p
12640 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32  Coll;.  int enc2
12650 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73  ;.  .  assert( s
12660 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
12670 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
12680 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  /* If SQLITE_
12690 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69  UTF16 is specifi
126a0 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69  ed as the encodi
126b0 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f  ng type, transfo
126c0 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20  rm this.  ** to 
126d0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54  one of SQLITE_UT
126e0 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f  F16LE or SQLITE_
126f0 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68  UTF16BE using th
12700 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54  e.  ** SQLITE_UT
12710 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e  F16NATIVE macro.
12720 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
12730 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e   not used intern
12740 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63  ally..  */.  enc
12750 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63  2 = enc;.  testc
12760 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54  ase( enc2==SQLIT
12770 45 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73  E_UTF16 );.  tes
12780 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c  tcase( enc2==SQL
12790 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
127a0 44 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d  D );.  if( enc2=
127b0 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c  =SQLITE_UTF16 ||
127c0 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
127d0 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20  F16_ALIGNED ){. 
127e0 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45     enc2 = SQLITE
127f0 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
12800 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c  }.  if( enc2<SQL
12810 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32  ITE_UTF8 || enc2
12820 3e 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  >SQLITE_UTF16BE 
12830 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12840 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
12850 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
12860 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69  k if this call i
12870 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65  s removing or re
12880 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74  placing an exist
12890 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20  ing collation . 
128a0 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66   ** sequence. If
128b0 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61   so, and there a
128c0 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72  re active VMs, r
128d0 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74  eturn busy. If t
128e0 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f  here.  ** are no
128f0 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76   active VMs, inv
12900 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d  alidate any pre-
12910 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
12920 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  nts..  */.  pCol
12930 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
12940 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65  ollSeq(db, (u8)e
12950 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  nc2, zName, 0);.
12960 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70    if( pColl && p
12970 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20  Coll->xCmp ){.  
12980 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41    if( db->nVdbeA
12990 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73  ctive ){.      s
129a0 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
129b0 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  sg(db, SQLITE_BU
129c0 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
129d0 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
129e0 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  odify collation 
129f0 73 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20  sequence due to 
12a00 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
12a10 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  s");.      retur
12a20 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
12a30 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12a40 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
12a50 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20  atements(db);.. 
12a60 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69     /* If collati
12a70 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
12a80 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 64 69  l was created di
12a90 72 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c  rectly by a call
12aa0 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
12ab0 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
12ac0 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e  ion, and not gen
12ad0 65 72 61 74 65 64 20 62 79 20 73 79 6e 74 68 43  erated by synthC
12ae0 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a  ollSeq(),.    **
12af0 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73   then any copies
12b00 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f   made by synthCo
12b10 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20  llSeq() need to 
12b20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  be invalidated..
12b30 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c      ** Also, col
12b40 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f  lation destructo
12b50 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c  r - CollSeq.xDel
12b60 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61  () - function ma
12b70 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  y need.    ** to
12b80 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20   be called..    
12b90 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f  */ .    if( (pCo
12ba0 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54  ll->enc & ~SQLIT
12bb0 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
12bc0 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20  ==enc2 ){.      
12bd0 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d  CollSeq *aColl =
12be0 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
12bf0 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20  (&db->aCollSeq, 
12c00 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e  zName);.      in
12c10 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
12c20 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
12c30 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
12c40 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  p = &aColl[j];. 
12c50 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e         if( p->en
12c60 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
12c70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
12c80 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ->xDel ){.      
12c90 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d        p->xDel(p-
12ca0 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20  >pUser);.       
12cb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
12cc0 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20  ->xCmp = 0;.    
12cd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12ce0 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c    }.  }..  pColl
12cf0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
12d00 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
12d10 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20  c2, zName, 1);. 
12d20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
12d30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
12d40 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43  MEM;.  pColl->xC
12d50 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20  mp = xCompare;. 
12d60 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20   pColl->pUser = 
12d70 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78  pCtx;.  pColl->x
12d80 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43  Del = xDel;.  pC
12d90 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28  oll->enc = (u8)(
12da0 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51  enc2 | (enc & SQ
12db0 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
12dc0 45 44 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ED));.  sqlite3E
12dd0 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
12de0 4f 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  OK);.  return SQ
12df0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
12e00 2a 2a 20 54 68 69 73 20 61 72 72 61 79 20 64 65  ** This array de
12e10 66 69 6e 65 73 20 68 61 72 64 20 75 70 70 65 72  fines hard upper
12e20 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74   bounds on limit
12e30 20 76 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a   values.  The.**
12e40 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73   initializer mus
12e50 74 20 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e  t be kept in syn
12e60 63 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  c with the SQLIT
12e70 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65  E_LIMIT_*.** #de
12e80 66 69 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33  fines in sqlite3
12e90 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  .h..*/.static co
12ea0 6e 73 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d  nst int aHardLim
12eb0 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54  it[] = {.  SQLIT
12ec0 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20  E_MAX_LENGTH,.  
12ed0 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
12ee0 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  ENGTH,.  SQLITE_
12ef0 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51  MAX_COLUMN,.  SQ
12f00 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
12f10 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  PTH,.  SQLITE_MA
12f20 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
12f30 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  T,.  SQLITE_MAX_
12f40 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54  VDBE_OP,.  SQLIT
12f50 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
12f60 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  RG,.  SQLITE_MAX
12f70 5f 41 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c  _ATTACHED,.  SQL
12f80 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
12f90 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  TERN_LENGTH,.  S
12fa0 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
12fb0 4c 45 5f 4e 55 4d 42 45 52 2c 20 20 20 20 20 20  LE_NUMBER,      
12fc0 2f 2a 20 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d  /* IMP: R-38091-
12fd0 33 32 33 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54  32352 */.  SQLIT
12fe0 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
12ff0 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  PTH,.  SQLITE_MA
13000 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
13010 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ,.};../*.** Make
13020 20 73 75 72 65 20 74 68 65 20 68 61 72 64 20 6c   sure the hard l
13030 69 6d 69 74 73 20 61 72 65 20 73 65 74 20 74 6f  imits are set to
13040 20 72 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75   reasonable valu
13050 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  es.*/.#if SQLITE
13060 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a  _MAX_LENGTH<100.
13070 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
13080 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  AX_LENGTH must b
13090 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23  e at least 100.#
130a0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
130b0 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c  _MAX_SQL_LENGTH<
130c0 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  100.# error SQLI
130d0 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
130e0 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
130f0 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69  st 100.#endif.#i
13100 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  f SQLITE_MAX_SQL
13110 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d  _LENGTH>SQLITE_M
13120 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f  AX_LENGTH.# erro
13130 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  r SQLITE_MAX_SQL
13140 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74  _LENGTH must not
13150 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
13160 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
13170 54 48 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  TH.#endif.#if SQ
13180 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
13190 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72  D_SELECT<2.# err
131a0 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  or SQLITE_MAX_CO
131b0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75  MPOUND_SELECT mu
131c0 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 32  st be at least 2
131d0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
131e0 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34  TE_MAX_VDBE_OP<4
131f0 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
13200 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73  _MAX_VDBE_OP mus
13210 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 34 30  t be at least 40
13220 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
13230 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
13240 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f  ARG<0 || SQLITE_
13250 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
13260 3e 31 30 30 30 0a 23 20 65 72 72 6f 72 20 53 51  >1000.# error SQ
13270 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
13280 4e 5f 41 52 47 20 6d 75 73 74 20 62 65 20 62 65  N_ARG must be be
13290 74 77 65 65 6e 20 30 20 61 6e 64 20 31 30 30 30  tween 0 and 1000
132a0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
132b0 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3c  TE_MAX_ATTACHED<
132c0 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  0 || SQLITE_MAX_
132d0 41 54 54 41 43 48 45 44 3e 31 32 35 0a 23 20 65  ATTACHED>125.# e
132e0 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
132f0 41 54 54 41 43 48 45 44 20 6d 75 73 74 20 62 65  ATTACHED must be
13300 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31   between 0 and 1
13310 32 35 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  25.#endif.#if SQ
13320 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
13330 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23  TTERN_LENGTH<1.#
13340 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
13350 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
13360 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
13370 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a   least 1.#endif.
13380 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
13390 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72  OLUMN>32767.# er
133a0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ror SQLITE_MAX_C
133b0 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65  OLUMN must not e
133c0 78 63 65 65 64 20 33 32 37 36 37 0a 23 65 6e 64  xceed 32767.#end
133d0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
133e0 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 3c  X_TRIGGER_DEPTH<
133f0 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  1.# error SQLITE
13400 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
13410 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
13420 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66  ast 1.#endif.#if
13430 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b   SQLITE_MAX_WORK
13440 45 52 5f 54 48 52 45 41 44 53 3c 30 20 7c 7c 20  ER_THREADS<0 || 
13450 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
13460 52 5f 54 48 52 45 41 44 53 3e 35 30 0a 23 20 65  R_THREADS>50.# e
13470 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
13480 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 6d  WORKER_THREADS m
13490 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30  ust be between 0
134a0 20 61 6e 64 20 35 30 0a 23 65 6e 64 69 66 0a 0a   and 50.#endif..
134b0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
134c0 65 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d  e value of a lim
134d0 69 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20  it.  Report the 
134e0 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66  old value..** If
134f0 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69   an invalid limi
13500 74 20 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c  t index is suppl
13510 69 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a  ied, report -1..
13520 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
13530 65 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70  es but still rep
13540 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75  ort the old valu
13550 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20  e if the.** new 
13560 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
13570 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c  e..**.** A new l
13580 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20  ower limit does 
13590 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74  not shrink exist
135a0 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a  ing constructs..
135b0 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65  ** It merely pre
135c0 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72  vents new constr
135d0 75 63 74 73 20 74 68 61 74 20 65 78 63 65 65 64  ucts that exceed
135e0 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72   the limit.** fr
135f0 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69  om forming..*/.i
13600 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  nt sqlite3_limit
13610 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
13620 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e  t limitId, int n
13630 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20  ewLimit){.  int 
13640 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 23 69 66 64 65  oldLimit;..#ifde
13650 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
13660 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
13670 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
13680 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
13690 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
136a0 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
136b0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65  eturn -1;.  }.#e
136c0 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 56 49 44 45  ndif..  /* EVIDE
136d0 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d  NCE-OF: R-30189-
136e0 35 34 30 39 37 20 46 6f 72 20 65 61 63 68 20 6c  54097 For each l
136f0 69 6d 69 74 20 63 61 74 65 67 6f 72 79 20 53 51  imit category SQ
13700 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a  LITE_LIMIT_NAME.
13710 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20    ** there is a 
13720 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64  hard upper bound
13730 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d   set at compile-
13740 74 69 6d 65 20 62 79 20 61 20 43 20 70 72 65 70  time by a C prep
13750 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61  rocessor.  ** ma
13760 63 72 6f 20 63 61 6c 6c 65 64 20 53 51 4c 49 54  cro called SQLIT
13770 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65  E_MAX_NAME. (The
13780 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68   "_LIMIT_" in th
13790 65 20 6e 61 6d 65 20 69 73 20 63 68 61 6e 67 65  e name is change
137a0 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f  d to.  ** "_MAX_
137b0 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ".).  */.  asser
137c0 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
137d0 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
137e0 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  H]==SQLITE_MAX_L
137f0 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72  ENGTH );.  asser
13800 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
13810 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c  LITE_LIMIT_SQL_L
13820 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ENGTH]==SQLITE_M
13830 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b  AX_SQL_LENGTH );
13840 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
13850 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
13860 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49  IT_COLUMN]==SQLI
13870 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b  TE_MAX_COLUMN );
13880 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
13890 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
138a0 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d  IT_EXPR_DEPTH]==
138b0 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
138c0 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72  DEPTH );.  asser
138d0 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
138e0 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
138f0 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c  UND_SELECT]==SQL
13900 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
13910 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61 73 73 65  _SELECT);.  asse
13920 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
13930 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45  QLITE_LIMIT_VDBE
13940 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  _OP]==SQLITE_MAX
13950 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73  _VDBE_OP );.  as
13960 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
13970 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55  [SQLITE_LIMIT_FU
13980 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c  NCTION_ARG]==SQL
13990 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
139a0 5f 41 52 47 20 29 3b 0a 20 20 61 73 73 65 72 74  _ARG );.  assert
139b0 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
139c0 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48  ITE_LIMIT_ATTACH
139d0 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ED]==SQLITE_MAX_
139e0 41 54 54 41 43 48 45 44 20 29 3b 0a 20 20 61 73  ATTACHED );.  as
139f0 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
13a00 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49  [SQLITE_LIMIT_LI
13a10 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
13a20 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20  H]==.           
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a50 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c      SQLITE_MAX_L
13a60 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
13a70 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
13a80 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
13a90 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45  E_LIMIT_VARIABLE
13aa0 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45  _NUMBER]==SQLITE
13ab0 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
13ac0 4d 42 45 52 29 3b 0a 20 20 61 73 73 65 72 74 28  MBER);.  assert(
13ad0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
13ae0 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
13af0 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  _DEPTH]==SQLITE_
13b00 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
13b10 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
13b20 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
13b30 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
13b40 52 45 41 44 53 5d 3d 3d 53 51 4c 49 54 45 5f 4d  READS]==SQLITE_M
13b50 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
13b60 53 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  S );.  assert( S
13b70 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
13b80 45 52 5f 54 48 52 45 41 44 53 3d 3d 28 53 51 4c  ER_THREADS==(SQL
13b90 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29  ITE_N_LIMIT-1) )
13ba0 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d 69 74 49  ;...  if( limitI
13bb0 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d  d<0 || limitId>=
13bc0 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29  SQLITE_N_LIMIT )
13bd0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
13be0 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20  .  }.  oldLimit 
13bf0 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d  = db->aLimit[lim
13c00 69 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77  itId];.  if( new
13c10 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20 20 20 20  Limit>=0 ){     
13c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13c30 20 49 4d 50 3a 20 52 2d 35 32 34 37 36 2d 32 38   IMP: R-52476-28
13c40 37 33 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  732 */.    if( n
13c50 65 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d  ewLimit>aHardLim
13c60 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20  it[limitId] ){. 
13c70 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
13c80 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74  aHardLimit[limit
13c90 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  Id];  /* IMP: R-
13ca0 35 31 34 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20  51463-25634 */. 
13cb0 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69     }.    db->aLi
13cc0 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e  mit[limitId] = n
13cd0 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72  ewLimit;.  }.  r
13ce0 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20  eturn oldLimit; 
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d00 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33      /* IMP: R-53
13d10 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a  341-35419 */.}..
13d20 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
13d30 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70  ion is used to p
13d40 61 72 73 65 20 62 6f 74 68 20 55 52 49 73 20 61  arse both URIs a
13d50 6e 64 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e  nd non-URI filen
13d60 61 6d 65 73 20 70 61 73 73 65 64 20 62 79 20 74  ames passed by t
13d70 68 65 0a 2a 2a 20 75 73 65 72 20 74 6f 20 41 50  he.** user to AP
13d80 49 20 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69  I functions sqli
13d90 74 65 33 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71  te3_open() or sq
13da0 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c  lite3_open_v2(),
13db0 20 61 6e 64 20 66 6f 72 20 64 61 74 61 62 61 73   and for databas
13dc0 65 0a 2a 2a 20 55 52 49 73 20 73 70 65 63 69 66  e.** URIs specif
13dd0 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 41  ied as part of A
13de0 54 54 41 43 48 20 73 74 61 74 65 6d 65 6e 74 73  TTACH statements
13df0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
13e00 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
13e10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
13e20 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56  he name of the V
13e30 46 53 20 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a  FS to use (or.**
13e40 20 61 20 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69   a NULL to signi
13e50 66 79 20 74 68 65 20 64 65 66 61 75 6c 74 20 56  fy the default V
13e60 46 53 29 20 69 66 20 74 68 65 20 55 52 49 20 64  FS) if the URI d
13e70 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
13e80 61 20 22 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71  a "vfs=xxx".** q
13e90 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 20  uery parameter. 
13ea0 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
13eb0 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ent contains the
13ec0 20 55 52 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49   URI (or non-URI
13ed0 20 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74   filename).** it
13ee0 73 65 6c 66 2e 20 57 68 65 6e 20 74 68 69 73 20  self. When this 
13ef0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
13f00 65 64 20 74 68 65 20 2a 70 46 6c 61 67 73 20 76  ed the *pFlags v
13f10 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 63  ariable should c
13f20 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65  ontain.** the de
13f30 66 61 75 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f  fault flags to o
13f40 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
13f50 20 68 61 6e 64 6c 65 20 77 69 74 68 2e 20 54 68   handle with. Th
13f60 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
13f70 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79  n.** *pFlags may
13f80 20 62 65 20 75 70 64 61 74 65 64 20 62 65 66 6f   be updated befo
13f90 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 66 20  re returning if 
13fa0 74 68 65 20 55 52 49 20 66 69 6c 65 6e 61 6d 65  the URI filename
13fb0 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63   contains .** "c
13fc0 61 63 68 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f  ache=xxx" or "mo
13fd0 64 65 3d 78 78 78 22 20 71 75 65 72 79 20 70 61  de=xxx" query pa
13fe0 72 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  rameters..**.** 
13ff0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
14000 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
14010 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rned. In this ca
14020 73 65 20 2a 70 70 56 66 73 20 69 73 20 73 65 74  se *ppVfs is set
14030 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
14040 74 68 65 20 56 46 53 20 74 68 61 74 20 73 68 6f  the VFS that sho
14050 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20 6f  uld be used to o
14060 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
14070 20 66 69 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69   file. *pzFile i
14080 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e  s set to.** poin
14090 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
140a0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
140b0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  e of the file to
140c0 20 6f 70 65 6e 2e 20 49 74 20 69 73 20 74 68 65   open. It is the
140d0 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c   .** responsibil
140e0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
140f0 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
14100 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65  call sqlite3_fre
14110 65 28 29 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a  e() to release.*
14120 2a 20 74 68 69 73 20 62 75 66 66 65 72 2e 0a 2a  * this buffer..*
14130 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
14140 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 61 6e   occurs, then an
14150 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
14160 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
14170 6e 64 20 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20  nd *pzErrMsg.** 
14180 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f  may be set to po
14190 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
141a0 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e  containing an En
141b0 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
141c0 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65  rror .** message
141d0 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
141e0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
141f0 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
14200 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a  tually release.*
14210 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62 79  * this buffer by
14220 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
14230 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _free()..*/.int 
14240 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28  sqlite3ParseUri(
14250 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
14260 44 65 66 61 75 6c 74 56 66 73 2c 20 20 20 20 20  DefaultVfs,     
14270 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65     /* VFS to use
14280 20 69 66 20 6e 6f 20 22 76 66 73 3d 78 78 78 22   if no "vfs=xxx"
14290 20 71 75 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f   query option */
142a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
142b0 55 72 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  Uri,            
142c0 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e     /* Nul-termin
142d0 61 74 65 64 20 55 52 49 20 74 6f 20 70 61 72 73  ated URI to pars
142e0 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
142f0 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20  int *pFlags,    
14300 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
14310 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58  : SQLITE_OPEN_XX
14320 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c  X flags */.  sql
14330 69 74 65 33 5f 76 66 73 20 2a 2a 70 70 56 66 73  ite3_vfs **ppVfs
14340 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
14350 4f 55 54 3a 20 56 46 53 20 74 6f 20 75 73 65 20  OUT: VFS to use 
14360 2a 2f 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46  */ .  char **pzF
14370 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
14380 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69        /* OUT: Fi
14390 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74  lename component
143a0 20 6f 66 20 55 52 49 20 2a 2f 0a 20 20 63 68 61   of URI */.  cha
143b0 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20  r **pzErrMsg    
143c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
143d0 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61  OUT: Error messa
143e0 67 65 20 28 69 66 20 72 63 21 3d 53 51 4c 49 54  ge (if rc!=SQLIT
143f0 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e  E_OK) */.){.  in
14400 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14410 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
14420 20 66 6c 61 67 73 20 3d 20 2a 70 46 6c 61 67 73   flags = *pFlags
14430 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
14440 7a 56 66 73 20 3d 20 7a 44 65 66 61 75 6c 74 56  zVfs = zDefaultV
14450 66 73 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  fs;.  char *zFil
14460 65 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 69  e;.  char c;.  i
14470 6e 74 20 6e 55 72 69 20 3d 20 73 71 6c 69 74 65  nt nUri = sqlite
14480 33 53 74 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b  3Strlen30(zUri);
14490 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 7a 45  ..  assert( *pzE
144a0 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69  rrMsg==0 );..  i
144b0 66 28 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c  f( ((flags & SQL
144c0 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 20 20  ITE_OPEN_URI)   
144d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50            /* IMP
144e0 3a 20 52 2d 34 38 37 32 35 2d 33 32 32 30 36 20  : R-48725-32206 
144f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  */.            |
14500 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  | sqlite3GlobalC
14510 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 29 20  onfig.bOpenUri) 
14520 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 36 38 39 2d  /* IMP: R-51689-
14530 34 36 35 34 38 20 2a 2f 0a 20 20 20 26 26 20 6e  46548 */.   && n
14540 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70  Uri>=5 && memcmp
14550 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20  (zUri, "file:", 
14560 35 29 3d 3d 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  5)==0 /* IMP: R-
14570 35 37 38 38 34 2d 33 37 34 39 36 20 2a 2f 0a 20  57884-37496 */. 
14580 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f   ){.    char *zO
14590 70 74 3b 0a 20 20 20 20 69 6e 74 20 65 53 74 61  pt;.    int eSta
145a0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
145b0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
145c0 73 74 61 74 65 20 77 68 65 6e 20 70 61 72 73 69  state when parsi
145d0 6e 67 20 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e  ng URI */.    in
145e0 74 20 69 49 6e 3b 20 20 20 20 20 20 20 20 20 20  t iIn;          
145f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14600 6e 70 75 74 20 63 68 61 72 61 63 74 65 72 20 69  nput character i
14610 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ndex */.    int 
14620 69 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20  iOut = 0;       
14630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
14640 70 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e  put character in
14650 64 65 78 20 2a 2f 0a 20 20 20 20 75 36 34 20 6e  dex */.    u64 n
14660 42 79 74 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20  Byte = nUri+2;  
14670 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
14680 73 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c  s of space to al
14690 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f  locate */..    /
146a0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
146b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20  SQLITE_OPEN_URI 
146c0 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 69  flag is set to i
146d0 6e 64 69 63 61 74 65 20 74 6f 20 74 68 65 20 56  ndicate to the V
146e0 46 53 20 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a  FS xOpen .    **
146f0 20 6d 65 74 68 6f 64 20 74 68 61 74 20 74 68 65   method that the
14700 72 65 20 6d 61 79 20 62 65 20 65 78 74 72 61 20  re may be extra 
14710 70 61 72 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f  parameters follo
14720 77 69 6e 67 20 74 68 65 20 66 69 6c 65 2d 6e 61  wing the file-na
14730 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67  me.  */.    flag
14740 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
14750 5f 55 52 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69  _URI;..    for(i
14760 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20  In=0; iIn<nUri; 
14770 69 49 6e 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20  iIn++) nByte += 
14780 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29  (zUri[iIn]=='&')
14790 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71  ;.    zFile = sq
147a0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
147b0 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Byte);.    if( !
147c0 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53  zFile ) return S
147d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20  QLITE_NOMEM;..  
147e0 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66 64 65    iIn = 5;.#ifde
147f0 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55  f SQLITE_ALLOW_U
14800 52 49 5f 41 55 54 48 4f 52 49 54 59 0a 20 20 20  RI_AUTHORITY.   
14810 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72   if( strncmp(zUr
14820 69 2b 35 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d  i+5, "///", 3)==
14830 30 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d  0 ){.      iIn =
14840 20 37 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   7;.      /* The
14850 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69   following condi
14860 74 69 6f 6e 20 63 61 75 73 65 73 20 55 52 49 73  tion causes URIs
14870 20 77 69 74 68 20 66 69 76 65 20 6c 65 61 64 69   with five leadi
14880 6e 67 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a  ng / characters.
14890 20 20 20 20 20 20 2a 2a 20 6c 69 6b 65 20 66 69        ** like fi
148a0 6c 65 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74  le://///host/pat
148b0 68 20 74 6f 20 62 65 20 63 6f 6e 76 65 72 74 65  h to be converte
148c0 64 20 69 6e 74 6f 20 55 4e 43 73 20 6c 69 6b 65  d into UNCs like
148d0 20 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 0a 20 20   //host/path..  
148e0 20 20 20 20 2a 2a 20 54 68 65 20 63 6f 72 72 65      ** The corre
148f0 63 74 20 55 52 49 20 66 6f 72 20 74 68 61 74 20  ct URI for that 
14900 55 4e 43 20 68 61 73 20 6f 6e 6c 79 20 74 77 6f  UNC has only two
14910 20 6f 72 20 66 6f 75 72 20 6c 65 61 64 69 6e 67   or four leading
14920 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20 20   / characters.  
14930 20 20 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f      ** file://ho
14940 73 74 2f 70 61 74 68 20 6f 72 20 66 69 6c 65 3a  st/path or file:
14950 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 20 20  ////host/path.  
14960 42 75 74 20 35 20 6c 65 61 64 69 6e 67 20 73 6c  But 5 leading sl
14970 61 73 68 65 73 20 69 73 20 61 20 0a 20 20 20 20  ashes is a .    
14980 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f    ** common erro
14990 72 2c 20 77 65 20 61 72 65 20 74 6f 6c 64 2c 20  r, we are told, 
149a0 73 6f 20 77 65 20 68 61 6e 64 6c 65 20 69 74 20  so we handle it 
149b0 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  as a special cas
149c0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
149d0 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 37 2c 20  strncmp(zUri+7, 
149e0 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 20  "///", 3)==0 ){ 
149f0 69 49 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c  iIn++; }.    }el
14a00 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  se if( strncmp(z
14a10 55 72 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68  Uri+5, "//localh
14a20 6f 73 74 2f 22 2c 20 31 32 29 3d 3d 30 20 29 7b  ost/", 12)==0 ){
14a30 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 31 36 3b  .      iIn = 16;
14a40 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
14a50 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20   /* Discard the 
14a60 73 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f  scheme and autho
14a70 72 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66  rity segments of
14a80 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20   the URI. */.   
14a90 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f   if( zUri[5]=='/
14aa0 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f  ' && zUri[6]=='/
14ab0 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d  ' ){.      iIn =
14ac0 20 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   7;.      while(
14ad0 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55   zUri[iIn] && zU
14ae0 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69  ri[iIn]!='/' ) i
14af0 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  In++;.      if( 
14b00 69 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d  iIn!=7 && (iIn!=
14b10 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f  16 || memcmp("lo
14b20 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b  calhost", &zUri[
14b30 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20  7], 9)) ){.     
14b40 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73     *pzErrMsg = s
14b50 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
14b60 69 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74 68  invalid uri auth
14b70 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20  ority: %.*s", . 
14b80 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37             iIn-7
14b90 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20  , &zUri[7]);.   
14ba0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14bb0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
14bc0 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
14bd0 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
14be0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
14bf0 20 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61   Copy the filena
14c00 6d 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79  me and any query
14c10 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f   parameters into
14c20 20 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65   the zFile buffe
14c30 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64  r. .    ** Decod
14c40 65 20 25 48 48 20 65 73 63 61 70 65 20 63 6f 64  e %HH escape cod
14c50 65 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79  es along the way
14c60 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
14c70 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   Within this loo
14c80 70 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74 61  p, variable eSta
14c90 74 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  te may be set to
14ca0 20 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65   0, 1 or 2, depe
14cb0 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20  nding.    ** on 
14cc0 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  the parsing cont
14cd0 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a  ext. As follows:
14ce0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
14cf0 20 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65   0: Parsing file
14d00 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20  -name..    **   
14d10 31 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20  1: Parsing name 
14d20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d  section of a nam
14d30 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61  e=value query pa
14d40 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20  rameter..    ** 
14d50 20 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c    2: Parsing val
14d60 75 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20  ue section of a 
14d70 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79  name=value query
14d80 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20   parameter..    
14d90 2a 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20  */.    eState = 
14da0 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63  0;.    while( (c
14db0 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30   = zUri[iIn])!=0
14dc0 20 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20   && c!='#' ){.  
14dd0 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20      iIn++;.     
14de0 20 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20   if( c=='%' .   
14df0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73      && sqlite3Is
14e00 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d  xdigit(zUri[iIn]
14e10 29 20 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  ) .       && sql
14e20 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55 72  ite3Isxdigit(zUr
14e30 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20  i[iIn+1]) .     
14e40 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
14e50 6f 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33  octet = (sqlite3
14e60 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49  HexToInt(zUri[iI
14e70 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20  n++]) << 4);.   
14e80 20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71       octet += sq
14e90 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55  lite3HexToInt(zU
14ea0 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20  ri[iIn++]);..   
14eb0 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 74       assert( oct
14ec0 65 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32  et>=0 && octet<2
14ed0 35 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  56 );.        if
14ee0 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 20 20  ( octet==0 ){.  
14ef0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
14f00 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
14f10 77 68 65 6e 20 22 25 30 30 22 20 61 70 70 65 61  when "%00" appea
14f20 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 55 52  rs within the UR
14f30 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20 20 20  I. In this.     
14f40 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77 65 20       ** case we 
14f50 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74 20  ignore all text 
14f60 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  in the remainder
14f70 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20 6e 61   of the path, na
14f80 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20  me or.          
14f90 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74  ** value current
14fa0 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65 64 2e  ly being parsed.
14fb0 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63   So ignore the c
14fc0 75 72 72 65 6e 74 20 63 68 61 72 61 63 74 65 72  urrent character
14fd0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
14fe0 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20 6e 65  d skip to the ne
14ff0 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22  xt "?", "=" or "
15000 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61  &", as appropria
15010 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  te. */.         
15020 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72   while( (c = zUr
15030 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21  i[iIn])!=0 && c!
15040 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20 20 20  ='#' .          
15050 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d      && (eState!=
15060 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20  0 || c!='?').   
15070 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65             && (e
15080 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d  State!=1 || (c!=
15090 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29 29 0a  '=' && c!='&')).
150a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
150b0 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c 20 63   (eState!=2 || c
150c0 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20 20 20  !='&').         
150d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
150e0 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  iIn++;.         
150f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   }.          con
15100 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
15110 0a 20 20 20 20 20 20 20 20 63 20 3d 20 6f 63 74  .        c = oct
15120 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  et;.      }else 
15130 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 26 26  if( eState==1 &&
15140 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27   (c=='&' || c=='
15150 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  =') ){.        i
15160 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d  f( zFile[iOut-1]
15170 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
15180 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70 74   /* An empty opt
15190 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65  ion name. Ignore
151a0 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74   this option alt
151b0 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20  ogether. */.    
151c0 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72        while( zUr
151d0 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69  i[iIn] && zUri[i
151e0 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a 55 72 69  In]!='#' && zUri
151f0 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69  [iIn-1]!='&' ) i
15200 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  In++;.          
15210 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
15220 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
15230 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20  c=='&' ){.      
15240 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
15250 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
15260 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15270 20 20 20 65 53 74 61 74 65 20 3d 20 32 3b 0a 20     eState = 2;. 
15280 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15290 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65   c = 0;.      }e
152a0 6c 73 65 20 69 66 28 20 28 65 53 74 61 74 65 3d  lse if( (eState=
152b0 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c  =0 && c=='?') ||
152c0 20 28 65 53 74 61 74 65 3d 3d 32 20 26 26 20 63   (eState==2 && c
152d0 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20 20 20 20  =='&') ){.      
152e0 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    c = 0;.       
152f0 20 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20   eState = 1;.   
15300 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65     }.      zFile
15310 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20  [iOut++] = c;.  
15320 20 20 7d 0a 20 20 20 20 69 66 28 20 65 53 74 61    }.    if( eSta
15330 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f  te==1 ) zFile[iO
15340 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut++] = '\0';.  
15350 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
15360 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c  = '\0';.    zFil
15370 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
15380 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
15390 69 66 20 74 68 65 72 65 20 77 65 72 65 20 61 6e  if there were an
153a0 79 20 6f 70 74 69 6f 6e 73 20 73 70 65 63 69 66  y options specif
153b0 69 65 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ied that should 
153c0 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 0a  be interpreted .
153d0 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74      ** here. Opt
153e0 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 69 6e  ions that are in
153f0 74 65 72 70 72 65 74 65 64 20 68 65 72 65 20 69  terpreted here i
15400 6e 63 6c 75 64 65 20 22 76 66 73 22 20 61 6e 64  nclude "vfs" and
15410 20 74 68 6f 73 65 20 74 68 61 74 0a 20 20 20 20   those that.    
15420 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ** correspond to
15430 20 66 6c 61 67 73 20 74 68 61 74 20 6d 61 79 20   flags that may 
15440 62 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  be passed to the
15450 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
15460 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64  ().    ** method
15470 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20  . */.    zOpt = 
15480 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65 33 53 74  &zFile[sqlite3St
15490 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d  rlen30(zFile)+1]
154a0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4f 70  ;.    while( zOp
154b0 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e  t[0] ){.      in
154c0 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65 33  t nOpt = sqlite3
154d0 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a  Strlen30(zOpt);.
154e0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c        char *zVal
154f0 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d   = &zOpt[nOpt+1]
15500 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c  ;.      int nVal
15510 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
15520 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20  30(zVal);..     
15530 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20   if( nOpt==3 && 
15540 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f  memcmp("vfs", zO
15550 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20  pt, 3)==0 ){.   
15560 20 20 20 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c       zVfs = zVal
15570 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15580 20 20 20 20 20 20 20 73 74 72 75 63 74 20 4f 70         struct Op
15590 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20 20  enMode {.       
155a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
155b0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
155c0 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 20  mode;.        } 
155d0 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  *aMode = 0;.    
155e0 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54      char *zModeT
155f0 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ype = 0;.       
15600 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20   int mask = 0;. 
15610 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74         int limit
15620 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 69   = 0;..        i
15630 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65  f( nOpt==5 && me
15640 6d 63 6d 70 28 22 63 61 63 68 65 22 2c 20 7a 4f  mcmp("cache", zO
15650 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20  pt, 5)==0 ){.   
15660 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74         static st
15670 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43  ruct OpenMode aC
15680 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20  acheMode[] = {. 
15690 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 73 68             { "sh
156a0 61 72 65 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f  ared",  SQLITE_O
156b0 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
156c0 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
156d0 20 22 70 72 69 76 61 74 65 22 2c 20 53 51 4c 49   "private", SQLI
156e0 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
156f0 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20  ACHE },.        
15700 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20      { 0, 0 }.   
15710 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20         };..     
15720 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49       mask = SQLI
15730 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
15740 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  CHE|SQLITE_OPEN_
15750 50 52 49 56 41 54 45 43 41 43 48 45 3b 0a 20 20  PRIVATECACHE;.  
15760 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20          aMode = 
15770 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20  aCacheMode;.    
15780 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61        limit = ma
15790 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d  sk;.          zM
157a0 6f 64 65 54 79 70 65 20 3d 20 22 63 61 63 68 65  odeType = "cache
157b0 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ";.        }.   
157c0 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34       if( nOpt==4
157d0 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65   && memcmp("mode
157e0 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29  ", zOpt, 4)==0 )
157f0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
15800 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f  ic struct OpenMo
15810 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d  de aOpenMode[] =
15820 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b   {.            {
15830 20 22 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f   "ro",  SQLITE_O
15840 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a  PEN_READONLY },.
15850 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72              { "r
15860 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  w",  SQLITE_OPEN
15870 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 20 0a 20  _READWRITE }, . 
15880 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77             { "rw
15890 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  c", SQLITE_OPEN_
158a0 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
158b0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d  TE_OPEN_CREATE }
158c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
158d0 22 6d 65 6d 6f 72 79 22 2c 20 53 51 4c 49 54 45  "memory", SQLITE
158e0 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a  _OPEN_MEMORY },.
158f0 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c              { 0,
15900 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d   0 }.          }
15910 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73  ;..          mas
15920 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  k = SQLITE_OPEN_
15930 52 45 41 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54  READONLY | SQLIT
15940 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
15950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15960 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45      | SQLITE_OPE
15970 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54  N_CREATE | SQLIT
15980 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20  E_OPEN_MEMORY;. 
15990 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d           aMode =
159a0 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20   aOpenMode;.    
159b0 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61        limit = ma
159c0 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20 20 20 20  sk & flags;.    
159d0 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20        zModeType 
159e0 3d 20 22 61 63 63 65 73 73 22 3b 0a 20 20 20 20  = "access";.    
159f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
15a00 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20  f( aMode ){.    
15a10 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
15a20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 20         int mode 
15a30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 0;.          f
15a40 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d  or(i=0; aMode[i]
15a50 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  .z; i++){.      
15a60 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
15a70 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a   *z = aMode[i].z
15a80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
15a90 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53  ( nVal==sqlite3S
15aa0 74 72 6c 65 6e 33 30 28 7a 29 20 26 26 20 30 3d  trlen30(z) && 0=
15ab0 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c  =memcmp(zVal, z,
15ac0 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20   nVal) ){.      
15ad0 20 20 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 61          mode = a
15ae0 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20  Mode[i].mode;.  
15af0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
15b00 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
15b10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15b20 20 20 20 20 20 20 20 69 66 28 20 6d 6f 64 65 3d         if( mode=
15b30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
15b40 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
15b50 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e  lite3_mprintf("n
15b60 6f 20 73 75 63 68 20 25 73 20 6d 6f 64 65 3a 20  o such %s mode: 
15b70 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20  %s", zModeType, 
15b80 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  zVal);.         
15b90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
15ba0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20  RROR;.          
15bb0 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69    goto parse_uri
15bc0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20  _out;.          
15bd0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
15be0 28 6d 6f 64 65 20 26 20 7e 53 51 4c 49 54 45 5f  (mode & ~SQLITE_
15bf0 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d  OPEN_MEMORY)>lim
15c00 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  it ){.          
15c10 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
15c20 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
15c30 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77  s mode not allow
15c40 65 64 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20  ed: %s",.       
15c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c70 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c   zModeType, zVal
15c80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
15c90 63 20 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  c = SQLITE_PERM;
15ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
15cb0 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b  o parse_uri_out;
15cc0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
15cd0 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 28         flags = (
15ce0 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c  flags & ~mask) |
15cf0 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d   mode;.        }
15d00 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
15d10 7a 4f 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61  zOpt = &zVal[nVa
15d20 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  l+1];.    }..  }
15d30 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20  else{.    zFile 
15d40 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
15d50 36 34 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20  64(nUri+2);.    
15d60 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74  if( !zFile ) ret
15d70 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
15d80 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 69  ;.    memcpy(zFi
15d90 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b  le, zUri, nUri);
15da0 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d  .    zFile[nUri]
15db0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69   = '\0';.    zFi
15dc0 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30  le[nUri+1] = '\0
15dd0 27 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20  ';.    flags &= 
15de0 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  ~SQLITE_OPEN_URI
15df0 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20  ;.  }..  *ppVfs 
15e00 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
15e10 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20  nd(zVfs);.  if( 
15e20 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20  *ppVfs==0 ){.   
15e30 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
15e40 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f  ite3_mprintf("no
15e50 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20   such vfs: %s", 
15e60 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20 3d 20  zVfs);.    rc = 
15e70 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
15e80 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  }. parse_uri_out
15e90 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
15ea0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
15eb0 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 29  ite3_free(zFile)
15ec0 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b  ;.    zFile = 0;
15ed0 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d  .  }.  *pFlags =
15ee0 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c   flags;.  *pzFil
15ef0 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74  e = zFile;.  ret
15f00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
15f10 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
15f20 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  oes the work of 
15f30 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61  opening a databa
15f40 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a  se on behalf of.
15f50 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
15f60 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70  ) and sqlite3_op
15f70 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74 61  en16(). The data
15f80 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a  base filename "z
15f90 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69  Filename"  .** i
15fa0 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e  s UTF-8 encoded.
15fb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
15fc0 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63  penDatabase(.  c
15fd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
15fe0 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73  name, /* Databas
15ff0 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38  e filename UTF-8
16000 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71   encoded */.  sq
16010 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20  lite3 **ppDb,   
16020 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
16030 75 72 6e 65 64 20 64 61 74 61 62 61 73 65 20 68  urned database h
16040 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67  andle */.  unsig
16050 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  ned int flags,  
16060 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c    /* Operational
16070 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   flags */.  cons
16080 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20  t char *zVfs    
16090 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
160a0 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a  e VFS to use */.
160b0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
160c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
160d0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c       /* Store al
160e0 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65 20 68  located handle h
160f0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ere */.  int rc;
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16110 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
16120 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
16130 20 69 73 54 68 72 65 61 64 73 61 66 65 3b 20 20   isThreadsafe;  
16140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16150 54 72 75 65 20 66 6f 72 20 74 68 72 65 61 64 73  True for threads
16160 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  afe connections 
16170 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e  */.  char *zOpen
16180 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
16190 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
161a0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73   argument to pas
161b0 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29  s to BtreeOpen()
161c0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72   */.  char *zErr
161d0 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Msg = 0;        
161e0 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d        /* Error m
161f0 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71 6c 69  essage from sqli
16200 74 65 33 50 61 72 73 65 55 72 69 28 29 20 2a 2f  te3ParseUri() */
16210 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
16220 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
16230 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29  .  if( ppDb==0 )
16240 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
16250 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
16260 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a  if.  *ppDb = 0;.
16270 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16280 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72  MIT_AUTOINIT.  r
16290 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  c = sqlite3_init
162a0 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20  ialize();.  if( 
162b0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
162c0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c  #endif..  /* Onl
162d0 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65  y allow sensible
162e0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
162f0 20 62 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61   bits in the fla
16300 67 73 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20  gs argument.  . 
16310 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72   ** Throw an err
16320 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65  or if any non-se
16330 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  nse combination 
16340 69 73 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a  is used.  If we.
16350 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63    ** do not bloc
16360 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e  k illegal combin
16370 61 74 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20  ations here, it 
16380 63 6f 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20  could trigger.  
16390 2a 2a 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ** assert() stat
163a0 65 6d 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72  ements in deeper
163b0 20 6c 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62   layers.  Sensib
163c0 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a  le combinations.
163d0 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20    ** are:.  **. 
163e0 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f   **  1:  SQLITE_
163f0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20  OPEN_READONLY.  
16400 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f  **  2:  SQLITE_O
16410 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20  PEN_READWRITE.  
16420 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f  **  6:  SQLITE_O
16430 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
16440 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
16450 54 45 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  TE.  */.  assert
16460 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ( SQLITE_OPEN_RE
16470 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20  ADONLY  == 0x01 
16480 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
16490 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
164a0 54 45 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20  TE == 0x02 );.  
164b0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f  assert( SQLITE_O
164c0 50 45 4e 5f 43 52 45 41 54 45 20 20 20 20 3d 3d  PEN_CREATE    ==
164d0 20 30 78 30 34 20 29 3b 0a 20 20 74 65 73 74 63   0x04 );.  testc
164e0 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
164f0 37 29 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20  7))==0x02 ); /* 
16500 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65  READONLY */.  te
16510 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61  stcase( (1<<(fla
16520 67 73 26 37 29 29 3d 3d 30 78 30 34 20 29 3b 20  gs&7))==0x04 ); 
16530 2f 2a 20 52 45 41 44 57 52 49 54 45 20 2a 2f 0a  /* READWRITE */.
16540 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
16550 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 34 30  (flags&7))==0x40
16560 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45   ); /* READWRITE
16570 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a 20 20 69   | CREATE */.  i
16580 66 28 20 28 28 31 3c 3c 28 66 6c 61 67 73 26 37  f( ((1<<(flags&7
16590 29 29 20 26 20 30 78 34 36 29 3d 3d 30 20 29 7b  )) & 0x46)==0 ){
165a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
165b0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 20  TE_MISUSE_BKPT; 
165c0 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 35 34 39 37   /* IMP: R-65497
165d0 2d 34 34 35 39 34 20 2a 2f 0a 20 20 7d 0a 0a 20  -44594 */.  }.. 
165e0 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
165f0 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
16600 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73  tex==0 ){.    is
16610 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a  Threadsafe = 0;.
16620 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
16630 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
16640 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  NOMUTEX ){.    i
16650 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b  sThreadsafe = 0;
16660 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
16670 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
16680 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20  _FULLMUTEX ){.  
16690 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
166a0 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
166b0 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
166c0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
166d0 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a  fig.bFullMutex;.
166e0 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20    }.  if( flags 
166f0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  & SQLITE_OPEN_PR
16700 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20 20  IVATECACHE ){.  
16710 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
16720 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
16730 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CHE;.  }else if(
16740 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
16750 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65  nfig.sharedCache
16760 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 66  Enabled ){.    f
16770 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
16780 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b  PEN_SHAREDCACHE;
16790 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
167a0 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66  e harmful bits f
167b0 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61  rom the flags pa
167c0 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a  rameter.  **.  *
167d0 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45  * The SQLITE_OPE
167e0 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51  N_NOMUTEX and SQ
167f0 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
16800 54 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20  TEX flags were. 
16810 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69   ** dealt with i
16820 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  n the previous c
16830 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69  ode block.  Besi
16840 64 65 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f  des these, the o
16850 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69  nly.  ** valid i
16860 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73  nput flags for s
16870 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
16880 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   are SQLITE_OPEN
16890 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20  _READONLY,.  ** 
168a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
168b0 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50  WRITE, SQLITE_OP
168c0 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c 49 54  EN_CREATE, SQLIT
168d0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
168e0 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  HE,.  ** SQLITE_
168f0 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
16900 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65 73 65  E, and some rese
16910 72 76 65 64 20 62 69 74 73 2e 20 20 53 69 6c 65  rved bits.  Sile
16920 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f  ntly mask.  ** o
16930 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61  ff all other fla
16940 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73  gs..  */.  flags
16950 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f   &=  ~( SQLITE_O
16960 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
16970 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
16980 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
16990 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20  XCLUSIVE |.     
169a0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
169b0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a  _OPEN_MAIN_DB |.
169c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
169d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
169e0 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  DB | .          
169f0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16a00 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20  _TRANSIENT_DB | 
16a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16a20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
16a30 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  _JOURNAL | .    
16a40 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
16a50 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
16a60 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
16a70 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
16a80 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a  N_SUBJOURNAL | .
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
16aa0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
16ab0 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20  R_JOURNAL |.    
16ac0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
16ad0 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c  E_OPEN_NOMUTEX |
16ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16af0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
16b00 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20  MUTEX |.        
16b10 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
16b20 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 20  EN_WAL.         
16b30 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c      );..  /* All
16b40 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  ocate the sqlite
16b50 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
16b60 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65  */.  db = sqlite
16b70 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
16b80 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a  eof(sqlite3) );.
16b90 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f    if( db==0 ) go
16ba0 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
16bb0 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61 66   if( isThreadsaf
16bc0 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74  e ){.    db->mut
16bd0 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
16be0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
16bf0 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a  TEX_RECURSIVE);.
16c00 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74 65      if( db->mute
16c10 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x==0 ){.      sq
16c20 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a  lite3_free(db);.
16c30 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20        db = 0;.  
16c40 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
16c50 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  out;.    }.  }. 
16c60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
16c70 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
16c80 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d  .  db->errMask =
16c90 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62   0xff;.  db->nDb
16ca0 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69   = 2;.  db->magi
16cb0 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
16cc0 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62  _BUSY;.  db->aDb
16cd0 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
16ce0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  ;..  assert( siz
16cf0 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d  eof(db->aLimit)=
16d00 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d  =sizeof(aHardLim
16d10 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28  it) );.  memcpy(
16d20 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72  db->aLimit, aHar
16d30 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64  dLimit, sizeof(d
16d40 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64  b->aLimit));.  d
16d50 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
16d60 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
16d70 52 45 41 44 53 5d 20 3d 20 53 51 4c 49 54 45 5f  READS] = SQLITE_
16d80 44 45 46 41 55 4c 54 5f 57 4f 52 4b 45 52 5f 54  DEFAULT_WORKER_T
16d90 48 52 45 41 44 53 3b 0a 20 20 64 62 2d 3e 61 75  HREADS;.  db->au
16da0 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
16db0 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20  db->nextAutovac 
16dc0 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d 6d  = -1;.  db->szMm
16dd0 61 70 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  ap = sqlite3Glob
16de0 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b  alConfig.szMmap;
16df0 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  .  db->nextPages
16e00 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e  ize = 0;.  db->n
16e10 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20  MaxSorterMmap = 
16e20 30 78 37 46 46 46 46 46 46 46 3b 0a 20 20 64 62  0x7FFFFFFF;.  db
16e30 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
16e40 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20  E_ShortColNames 
16e50 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54  | SQLITE_EnableT
16e60 72 69 67 67 65 72 20 7c 20 53 51 4c 49 54 45 5f  rigger | SQLITE_
16e70 43 61 63 68 65 53 70 69 6c 6c 0a 23 69 66 20 21  CacheSpill.#if !
16e80 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
16e90 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43  EFAULT_AUTOMATIC
16ea0 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51 4c 49 54  _INDEX) || SQLIT
16eb0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41  E_DEFAULT_AUTOMA
16ec0 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 20 20  TIC_INDEX.      
16ed0 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
16ee0 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65  ITE_AutoIndex.#e
16ef0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
16f00 44 45 46 41 55 4c 54 5f 43 4b 50 54 46 55 4c 4c  DEFAULT_CKPTFULL
16f10 46 53 59 4e 43 0a 20 20 20 20 20 20 20 20 20 20  FSYNC.          
16f20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
16f30 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63 0a 23 65  CkptFullFSync.#e
16f40 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
16f50 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52  DEFAULT_FILE_FOR
16f60 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20 20 20  MAT<4.          
16f70 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
16f80 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a 23 65  LegacyFileFmt.#e
16f90 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
16fa0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45  TE_ENABLE_LOAD_E
16fb0 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20  XTENSION.       
16fc0 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
16fd0 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  TE_LoadExtension
16fe0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
16ff0 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43 55 52  TE_DEFAULT_RECUR
17000 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a 20 20  SIVE_TRIGGERS.  
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
17020 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67   SQLITE_RecTrigg
17030 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ers.#endif.#if d
17040 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
17050 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
17060 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f 44 45  YS) && SQLITE_DE
17070 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
17080 59 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  YS.             
17090 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72      | SQLITE_For
170a0 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a  eignKeys.#endif.
170b0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
170c0 54 45 5f 52 45 56 45 52 53 45 5f 55 4e 4f 52 44  TE_REVERSE_UNORD
170d0 45 52 45 44 5f 53 45 4c 45 43 54 53 29 0a 20 20  ERED_SELECTS).  
170e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
170f0 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f   SQLITE_ReverseO
17100 72 64 65 72 0a 23 65 6e 64 69 66 0a 23 69 66 20  rder.#endif.#if 
17110 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
17120 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
17130 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 20  ELL_CHECK).     
17140 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
17150 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 0a  LITE_CellSizeCk.
17160 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20  #endif.      ;. 
17170 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
17180 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
17190 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
171a0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
171b0 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  E.  sqlite3HashI
171c0 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  nit(&db->aModule
171d0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
171e0 41 64 64 20 74 68 65 20 64 65 66 61 75 6c 74 20  Add the default 
171f0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
17200 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52  ce BINARY. BINAR
17210 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68  Y works for both
17220 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20   UTF-8.  ** and 
17230 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61  UTF-16, so add a
17240 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63   version for eac
17250 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75  h to avoid any u
17260 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20  nnecessary.  ** 
17270 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65  conversions. The
17280 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74   only error that
17290 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20   can occur here 
172a0 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  is a malloc() fa
172b0 69 6c 75 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ilure..  **.  **
172c0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
172d0 35 32 37 38 36 2d 34 34 38 37 38 20 53 51 4c 69  52786-44878 SQLi
172e0 74 65 20 64 65 66 69 6e 65 73 20 74 68 72 65 65  te defines three
172f0 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74   built-in collat
17300 69 6e 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  ing.  ** functio
17310 6e 73 3a 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74  ns:.  */.  creat
17320 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73  eCollation(db, s
17330 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c  qlite3StrBINARY,
17340 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
17350 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
17360 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
17370 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33 53  ion(db, sqlite3S
17380 74 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54 45  trBINARY, SQLITE
17390 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e  _UTF16BE, 0, bin
173a0 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
173b0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
173c0 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49  db, sqlite3StrBI
173d0 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46  NARY, SQLITE_UTF
173e0 31 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  16LE, 0, binColl
173f0 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
17400 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
17410 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45  "NOCASE", SQLITE
17420 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65  _UTF8, 0, nocase
17430 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30  CollatingFunc, 0
17440 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
17450 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22  tion(db, "RTRIM"
17460 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28  , SQLITE_UTF8, (
17470 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c  void*)1, binColl
17480 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  Func, 0);.  if( 
17490 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
174a0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65   ){.    goto ope
174b0 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f  ndb_out;.  }.  /
174c0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
174d0 2d 30 38 33 30 38 2d 31 37 32 32 34 20 54 68 65  -08308-17224 The
174e0 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
174f0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ng function for 
17500 61 6c 6c 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73  all.  ** strings
17510 20 69 73 20 42 49 4e 41 52 59 2e 20 0a 20 20 2a   is BINARY. .  *
17520 2f 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  /.  db->pDfltCol
17530 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
17540 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54  ollSeq(db, SQLIT
17550 45 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33 53  E_UTF8, sqlite3S
17560 74 72 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  trBINARY, 0);.  
17570 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c  assert( db->pDfl
17580 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f  tColl!=0 );..  /
17590 2a 20 50 61 72 73 65 20 74 68 65 20 66 69 6c 65  * Parse the file
175a0 6e 61 6d 65 2f 55 52 49 20 61 72 67 75 6d 65 6e  name/URI argumen
175b0 74 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e  t. */.  db->open
175c0 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
175d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 72   rc = sqlite3Par
175e0 73 65 55 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c  seUri(zVfs, zFil
175f0 65 6e 61 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26  ename, &flags, &
17600 64 62 2d 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e  db->pVfs, &zOpen
17610 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  , &zErrMsg);.  i
17620 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17630 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
17640 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 73  SQLITE_NOMEM ) s
17650 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
17660 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  b);.    sqlite3E
17670 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
17680 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25  rc, zErrMsg ? "%
17690 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29  s" : 0, zErrMsg)
176a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
176b0 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
176c0 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
176d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
176e0 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74   the backend dat
176f0 61 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a  abase driver */.
17700 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
17710 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73  reeOpen(db->pVfs
17720 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62  , zOpen, db, &db
17730 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c  ->aDb[0].pBt, 0,
17740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17750 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
17760 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
17770 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21  N_DB);.  if( rc!
17780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17790 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
177a0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a  _IOERR_NOMEM ){.
177b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
177c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
177d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
177e0 64 62 2c 20 72 63 29 3b 0a 20 20 20 20 67 6f 74  db, rc);.    got
177f0 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
17800 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
17810 45 6e 74 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d  Enter(db->aDb[0]
17820 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62  .pBt);.  db->aDb
17830 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71  [0].pSchema = sq
17840 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64  lite3SchemaGet(d
17850 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  b, db->aDb[0].pB
17860 74 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  t);.  if( !db->m
17870 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 45 4e  allocFailed ) EN
17880 43 28 64 62 29 20 3d 20 53 43 48 45 4d 41 5f 45  C(db) = SCHEMA_E
17890 4e 43 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  NC(db);.  sqlite
178a0 33 42 74 72 65 65 4c 65 61 76 65 28 64 62 2d 3e  3BtreeLeave(db->
178b0 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64  aDb[0].pBt);.  d
178c0 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
178d0 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  a = sqlite3Schem
178e0 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a 20 20  aGet(db, 0);..  
178f0 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73  /* The default s
17900 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20  afety_level for 
17910 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
17920 65 20 69 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72  e is 'full'; for
17930 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64   the temp.  ** d
17940 61 74 61 62 61 73 65 20 69 74 20 69 73 20 27 4e  atabase it is 'N
17950 4f 4e 45 27 2e 20 54 68 69 73 20 6d 61 74 63 68  ONE'. This match
17960 65 73 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  es the pager lay
17970 65 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20  er defaults.  . 
17980 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d   */.  db->aDb[0]
17990 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b  .zName = "main";
179a0 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61  .  db->aDb[0].sa
179b0 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a  fety_level = 3;.
179c0 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61    db->aDb[1].zNa
179d0 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64  me = "temp";.  d
179e0 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79  b->aDb[1].safety
179f0 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64  _level = 1;..  d
17a00 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
17a10 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20  E_MAGIC_OPEN;.  
17a20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
17a30 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
17a40 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
17a50 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  ..  /* Register 
17a60 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e  all built-in fun
17a70 63 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e  ctions, but do n
17a80 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ot attempt to re
17a90 61 64 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  ad the.  ** data
17aa0 62 61 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e  base schema yet.
17ab0 20 54 68 69 73 20 69 73 20 64 65 6c 61 79 65 64   This is delayed
17ac0 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
17ad0 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61   time the databa
17ae0 73 65 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73  se.  ** is acces
17af0 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  sed..  */.  sqli
17b00 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
17b10 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74  ITE_OK);.  sqlit
17b20 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69  e3RegisterBuilti
17b30 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a  nFunctions(db);.
17b40 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d  .  /* Load autom
17b50 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20  atic extensions 
17b60 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61  - extensions tha
17b70 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 67 69  t have been regi
17b80 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e  stered.  ** usin
17b90 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75  g the sqlite3_au
17ba0 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f  tomatic_extensio
17bb0 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20  n() API..  */.  
17bc0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
17bd0 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20  code(db);.  if( 
17be0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17bf0 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f  .    sqlite3Auto
17c00 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64  LoadExtensions(d
17c10 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  b);.    rc = sql
17c20 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
17c30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
17c40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17c50 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
17c60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
17c70 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
17c80 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64 62  E_FTS1.  if( !db
17c90 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
17ca0 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
17cb0 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74   sqlite3Fts1Init
17cc0 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20  (sqlite3*);.    
17cd0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31  rc = sqlite3Fts1
17ce0 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
17cf0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
17d00 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a  ITE_ENABLE_FTS2.
17d10 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
17d20 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
17d30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17d40 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
17d50 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74  e3Fts2Init(sqlit
17d60 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  e3*);.    rc = s
17d70 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 64  qlite3Fts2Init(d
17d80 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
17d90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
17da0 41 42 4c 45 5f 46 54 53 33 20 2f 2a 20 61 75 74  ABLE_FTS3 /* aut
17db0 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 66 69 6e  omatically defin
17dc0 65 64 20 62 79 20 53 51 4c 49 54 45 5f 45 4e 41  ed by SQLITE_ENA
17dd0 42 4c 45 5f 46 54 53 34 20 2a 2f 0a 20 20 69 66  BLE_FTS4 */.  if
17de0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
17df0 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
17e00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
17e10 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74   sqlite3Fts3Init
17e20 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
17e30 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
17e40 45 4e 41 42 4c 45 5f 46 54 53 35 0a 20 20 69 66  ENABLE_FTS5.  if
17e50 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
17e60 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
17e70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
17e80 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 69 74   sqlite3Fts5Init
17e90 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
17ea0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
17eb0 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28  ENABLE_ICU.  if(
17ec0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
17ed0 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
17ee0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
17ef0 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64  sqlite3IcuInit(d
17f00 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
17f10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
17f20 41 42 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28  ABLE_RTREE.  if(
17f30 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
17f40 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
17f50 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  _OK){.    rc = s
17f60 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74 28  qlite3RtreeInit(
17f70 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
17f80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17f90 4e 41 42 4c 45 5f 44 42 53 54 41 54 5f 56 54 41  NABLE_DBSTAT_VTA
17fa0 42 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  B.  if( !db->mal
17fb0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
17fc0 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
17fd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 73   rc = sqlite3Dbs
17fe0 74 61 74 52 65 67 69 73 74 65 72 28 64 62 29 3b  tatRegister(db);
17ff0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
18000 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
18010 45 5f 4a 53 4f 4e 31 0a 20 20 69 66 28 20 21 64  E_JSON1.  if( !d
18020 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18030 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
18040 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
18050 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28 64 62 29  te3Json1Init(db)
18060 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
18070 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41  /* -DSQLITE_DEFA
18080 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
18090 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49  =1 makes EXCLUSI
180a0 56 45 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c  VE the default l
180b0 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65  ocking.  ** mode
180c0 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41  .  -DSQLITE_DEFA
180d0 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
180e0 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74  =0 make NORMAL t
180f0 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  he default locki
18100 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44  ng.  ** mode.  D
18110 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20  oing nothing at 
18120 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e  all also makes N
18130 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c  ORMAL the defaul
18140 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  t..  */.#ifdef S
18150 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
18160 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d  CKING_MODE.  db-
18170 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20  >dfltLockMode = 
18180 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
18190 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73  OCKING_MODE;.  s
181a0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69  qlite3PagerLocki
181b0 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74  ngMode(sqlite3Bt
181c0 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62  reePager(db->aDb
181d0 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20  [0].pBt),.      
181e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181f0 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55      SQLITE_DEFAU
18200 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29  LT_LOCKING_MODE)
18210 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
18220 72 63 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f  rc ) sqlite3Erro
18230 72 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a  r(db, rc);..  /*
18240 20 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b   Enable the look
18250 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62  aside-malloc sub
18260 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75  system */.  setu
18270 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 30  pLookaside(db, 0
18280 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  , sqlite3GlobalC
18290 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64  onfig.szLookasid
182a0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
182b0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
182c0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
182d0 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73  Lookaside);..  s
182e0 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
182f0 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51  heckpoint(db, SQ
18300 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
18310 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29  _AUTOCHECKPOINT)
18320 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20  ;..opendb_out:. 
18330 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 61   if( db ){.    a
18340 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74 65 78  ssert( db->mutex
18350 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61 64 73  !=0 || isThreads
18360 61 66 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  afe==0.         
18370 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62    || sqlite3Glob
18380 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
18390 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  tex==0 );.    sq
183a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
183b0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
183c0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
183d0 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
183e0 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 7c 7c  assert( db!=0 ||
183f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
18400 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  M );.  if( rc==S
18410 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
18420 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
18430 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30  (db);.    db = 0
18440 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
18450 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18460 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
18470 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b  QLITE_MAGIC_SICK
18480 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20  ;.  }.  *ppDb = 
18490 64 62 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  db;.#ifdef SQLIT
184a0 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a  E_ENABLE_SQLLOG.
184b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
184c0 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
184d0 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  g ){.    /* Open
184e0 69 6e 67 20 61 20 64 62 20 68 61 6e 64 6c 65 2e  ing a db handle.
184f0 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65   Fourth paramete
18500 72 20 69 73 20 70 61 73 73 65 64 20 30 2e 20 2a  r is passed 0. *
18510 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67  /.    void *pArg
18520 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
18530 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
18540 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  g;.    sqlite3Gl
18550 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
18560 6f 67 28 70 41 72 67 2c 20 64 62 2c 20 7a 46 69  og(pArg, db, zFi
18570 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  lename, 0);.  }.
18580 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
18590 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ed(SQLITE_HAS_CO
185a0 44 45 43 29 0a 20 20 69 66 28 20 72 63 3d 3d 53  DEC).  if( rc==S
185b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
185c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 48 65 78  const char *zHex
185d0 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 75 72  Key = sqlite3_ur
185e0 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 4f 70 65  i_parameter(zOpe
185f0 6e 2c 20 22 68 65 78 6b 65 79 22 29 3b 0a 20 20  n, "hexkey");.  
18600 20 20 69 66 28 20 7a 48 65 78 4b 65 79 20 26 26    if( zHexKey &&
18610 20 7a 48 65 78 4b 65 79 5b 30 5d 20 29 7b 0a 20   zHexKey[0] ){. 
18620 20 20 20 20 20 75 38 20 69 42 79 74 65 3b 0a 20       u8 iByte;. 
18630 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
18640 20 20 63 68 61 72 20 7a 4b 65 79 5b 34 30 5d 3b    char zKey[40];
18650 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  .      for(i=0, 
18660 69 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f  iByte=0; i<sizeo
18670 66 28 7a 4b 65 79 29 2a 32 20 26 26 20 73 71 6c  f(zKey)*2 && sql
18680 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 48 65  ite3Isxdigit(zHe
18690 78 4b 65 79 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a  xKey[i]); i++){.
186a0 20 20 20 20 20 20 20 20 69 42 79 74 65 20 3d 20          iByte = 
186b0 28 69 42 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c  (iByte<<4) + sql
186c0 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 48 65  ite3HexToInt(zHe
186d0 78 4b 65 79 5b 69 5d 29 3b 0a 20 20 20 20 20 20  xKey[i]);.      
186e0 20 20 69 66 28 20 28 69 26 31 29 21 3d 30 20 29    if( (i&1)!=0 )
186f0 20 7a 4b 65 79 5b 69 2f 32 5d 20 3d 20 69 42 79   zKey[i/2] = iBy
18700 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  te;.      }.    
18710 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32    sqlite3_key_v2
18720 28 64 62 2c 20 30 2c 20 7a 4b 65 79 2c 20 69 2f  (db, 0, zKey, i/
18730 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  2);.    }.  }.#e
18740 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66  ndif.  sqlite3_f
18750 72 65 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 72 65  ree(zOpen);.  re
18760 74 75 72 6e 20 72 63 20 26 20 30 78 66 66 3b 0a  turn rc & 0xff;.
18770 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
18780 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e  new database han
18790 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
187a0 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73  te3_open(.  cons
187b0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
187c0 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a  e, .  sqlite3 **
187d0 70 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72  ppDb .){.  retur
187e0 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a  n openDatabase(z
187f0 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a  Filename, ppDb,.
18800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18810 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
18820 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
18830 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
18840 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
18850 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63  te3_open_v2(.  c
18860 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e  onst char *filen
18870 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61  ame,   /* Databa
18880 73 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46  se filename (UTF
18890 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -8) */.  sqlite3
188a0 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20   **ppDb,        
188b0 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20   /* OUT: SQLite 
188c0 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  db handle */.  i
188d0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
188e0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
188f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
18900 2a 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20  *zVfs        /* 
18910 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75  Name of VFS modu
18920 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a  le to use */.){.
18930 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74    return openDat
18940 61 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20  abase(filename, 
18950 70 70 44 62 2c 20 28 75 6e 73 69 67 6e 65 64 20  ppDb, (unsigned 
18960 69 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66 73 29  int)flags, zVfs)
18970 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
18980 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
18990 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
189a0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
189b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
189c0 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20  open16(.  const 
189d0 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  void *zFilename,
189e0 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70   .  sqlite3 **pp
189f0 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  Db.){.  char con
18a00 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20  st *zFilename8; 
18a10 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65    /* zFilename e
18a20 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20  ncoded in UTF-8 
18a30 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31  instead of UTF-1
18a40 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  6 */.  sqlite3_v
18a50 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
18a60 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51  t rc;..#ifdef SQ
18a70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
18a80 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70 44 62  ARMOR.  if( ppDb
18a90 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
18aa0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
18ab0 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20  .#endif.  *ppDb 
18ac0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
18ad0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
18ae0 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  T.  rc = sqlite3
18af0 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
18b00 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
18b10 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66   rc;.#endif.  if
18b20 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ( zFilename==0 )
18b30 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22 5c 30   zFilename = "\0
18b40 30 30 5c 30 30 30 22 3b 0a 20 20 70 56 61 6c 20  00\000";.  pVal 
18b50 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
18b60 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  w(0);.  sqlite3V
18b70 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
18b80 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
18b90 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
18ba0 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  VE, SQLITE_STATI
18bb0 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38  C);.  zFilename8
18bc0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
18bd0 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45  ext(pVal, SQLITE
18be0 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46  _UTF8);.  if( zF
18bf0 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20  ilename8 ){.    
18c00 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73  rc = openDatabas
18c10 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70  e(zFilename8, pp
18c20 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
18c30 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
18c40 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
18c50 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
18c60 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61 73  EATE, 0);.    as
18c70 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20 72  sert( *ppDb || r
18c80 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
18c90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
18ca0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62 48  QLITE_OK && !DbH
18cb0 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44 62  asProperty(*ppDb
18cc0 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , 0, DB_SchemaLo
18cd0 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20 53  aded) ){.      S
18ce0 43 48 45 4d 41 5f 45 4e 43 28 2a 70 70 44 62 29  CHEMA_ENC(*ppDb)
18cf0 20 3d 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20   = ENC(*ppDb) = 
18d00 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
18d10 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  VE;.    }.  }els
18d20 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
18d30 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
18d40 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
18d50 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72  (pVal);..  retur
18d60 6e 20 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 23  n rc & 0xff;.}.#
18d70 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
18d80 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f  OMIT_UTF16 */../
18d90 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
18da0 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
18db0 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
18dc0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
18dd0 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
18de0 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
18df0 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  ion(.  sqlite3* 
18e00 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
18e10 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74  r *zName, .  int
18e20 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
18e30 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
18e40 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
18e50 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
18e60 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
18e70 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
18e80 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
18e90 6e 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  n_v2(db, zName, 
18ea0 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
18eb0 61 72 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  are, 0);.}../*.*
18ec0 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
18ed0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
18ee0 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
18ef0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
18f00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
18f10 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
18f20 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  _v2(.  sqlite3* 
18f30 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
18f40 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74  r *zName, .  int
18f50 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
18f60 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
18f70 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
18f80 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
18f90 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20  const void*),.  
18fa0 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64  void(*xDel)(void
18fb0 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *).){.  int rc;.
18fc0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18fd0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
18fe0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
18ff0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
19000 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  || zName==0 ) re
19010 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
19020 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
19030 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
19040 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
19050 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
19060 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
19070 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f  .  rc = createCo
19080 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
19090 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78  e, (u8)enc, pCtx
190a0 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c  , xCompare, xDel
190b0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
190c0 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
190d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
190e0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
190f0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
19100 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
19110 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
19120 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
19130 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
19140 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
19150 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
19160 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
19170 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
19180 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a  on16(.  sqlite3*
19190 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f   db, .  const vo
191a0 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74  id *zName,.  int
191b0 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
191c0 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
191d0 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
191e0 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
191f0 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
19200 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
19210 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  E_OK;.  char *zN
19220 61 6d 65 38 3b 0a 0a 23 69 66 64 65 66 20 53 51  ame8;..#ifdef SQ
19230 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
19240 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
19250 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
19260 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d  k(db) || zName==
19270 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
19280 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
19290 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
192a0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
192b0 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
192c0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
192d0 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20  led );.  zName8 
192e0 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f  = sqlite3Utf16to
192f0 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  8(db, zName, -1,
19300 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
19310 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  IVE);.  if( zNam
19320 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63  e8 ){.    rc = c
19330 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
19340 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65  b, zName8, (u8)e
19350 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  nc, pCtx, xCompa
19360 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  re, 0);.    sqli
19370 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
19380 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20  ame8);.  }.  rc 
19390 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
193a0 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
193b0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
193c0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
193d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
193e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
193f0 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
19400 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c   Register a coll
19410 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
19420 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20  actory callback 
19430 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
19440 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
19450 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76  Replace any prev
19460 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64  iously installed
19470 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
19480 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a  nce factory..*/.
19490 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  int sqlite3_coll
194a0 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20  ation_needed(.  
194b0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
194c0 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
194d0 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
194e0 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64  CollNeeded)(void
194f0 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
19500 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68  TextRep,const ch
19510 61 72 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20 53  ar*).){.#ifdef S
19520 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
19530 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
19540 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
19550 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
19560 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
19570 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
19580 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
19590 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
195a0 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d  b->xCollNeeded =
195b0 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20   xCollNeeded;.  
195c0 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
195d0 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f  6 = 0;.  db->pCo
195e0 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43  llNeededArg = pC
195f0 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20  ollNeededArg;.  
19600 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
19610 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
19620 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19630 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
19640 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
19650 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
19660 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
19670 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c  ence factory cal
19680 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64  lback with the d
19690 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
196a0 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e  * db. Replace an
196b0 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73  y previously ins
196c0 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  talled collation
196d0 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
196e0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
196f0 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
19700 65 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20  ed16(.  sqlite3 
19710 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43  *db, .  void *pC
19720 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20  ollNeededArg, . 
19730 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64   void(*xCollNeed
19740 65 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69  ed16)(void*,sqli
19750 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65  te3*,int eTextRe
19760 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  p,const void*).)
19770 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
19780 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
19790 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
197a0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
197b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
197c0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
197d0 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
197e0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
197f0 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f  utex);.  db->xCo
19800 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20  llNeeded = 0;.  
19810 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
19820 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31  6 = xCollNeeded1
19830 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65  6;.  db->pCollNe
19840 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e  ededArg = pCollN
19850 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69  eededArg;.  sqli
19860 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
19870 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
19880 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19890 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
198a0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
198b0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
198c0 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
198d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
198e0 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61  tion is now an a
198f0 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75  nachronism. It u
19900 73 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 74  sed to be used t
19910 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61  o recover from a
19920 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  .** malloc() fai
19930 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74 65  lure, but SQLite
19940 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20 61   now does this a
19950 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f  utomatically..*/
19960 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f  .int sqlite3_glo
19970 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69 64  bal_recover(void
19980 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ){.  return SQLI
19990 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
199a0 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73  ./*.** Test to s
199b0 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ee whether or no
199c0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  t the database c
199d0 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20  onnection is in 
199e0 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f  autocommit.** mo
199f0 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  de.  Return TRUE
19a00 20 69 66 20 69 74 20 69 73 20 61 6e 64 20 46 41   if it is and FA
19a10 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41 75 74  LSE if not.  Aut
19a20 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20  ocommit mode is 
19a30 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c 74  on.** by default
19a40 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73  .  Autocommit is
19a50 20 64 69 73 61 62 6c 65 64 20 62 79 20 61 20 42   disabled by a B
19a60 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 20 61  EGIN statement a
19a70 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20  nd reenabled.** 
19a80 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d  by the next COMM
19a90 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a  IT or ROLLBACK..
19aa0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67  */.int sqlite3_g
19ab0 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71  et_autocommit(sq
19ac0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64  lite3 *db){.#ifd
19ad0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
19ae0 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
19af0 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
19b00 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
19b10 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
19b20 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
19b30 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
19b40 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62  ndif.  return db
19b50 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a  ->autoCommit;.}.
19b60 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
19b70 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
19b80 65 20 73 75 62 73 74 69 74 75 74 65 73 20 66 6f  e substitutes fo
19b90 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49  r constants SQLI
19ba0 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53  TE_CORRUPT,.** S
19bb0 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51  QLITE_MISUSE, SQ
19bc0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53  LITE_CANTOPEN, S
19bd0 51 4c 49 54 45 5f 49 4f 45 52 52 20 61 6e 64 20  QLITE_IOERR and 
19be0 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65  possibly other e
19bf0 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  rror.** constant
19c00 73 2e 20 20 54 68 65 79 20 73 65 72 76 65 20 74  s.  They serve t
19c10 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a  wo purposes:.**.
19c20 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20 61  **   1.  Serve a
19c30 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70  s a convenient p
19c40 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72  lace to set a br
19c50 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65  eakpoint in a de
19c60 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20  bugger.**       
19c70 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20 76  to detect when v
19c80 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e  ersion error con
19c90 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a  ditions occurs..
19ca0 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f  **.**   2.  Invo
19cb0 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ke sqlite3_log()
19cc0 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
19cd0 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61  source code loca
19ce0 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20  tion where.**   
19cf0 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20      a low-level 
19d00 65 72 72 6f 72 20 69 73 20 66 69 72 73 74 20 64  error is first d
19d10 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  etected..*/.int 
19d20 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45 72  sqlite3CorruptEr
19d30 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
19d40 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
19d50 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
19d60 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71  .xLog!=0 );.  sq
19d70 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
19d80 5f 43 4f 52 52 55 50 54 2c 0a 20 20 20 20 20 20  _CORRUPT,.      
19d90 20 20 20 20 20 20 20 20 22 64 61 74 61 62 61 73          "databas
19da0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 61 74 20  e corruption at 
19db0 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
19dc0 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
19dd0 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
19de0 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
19df0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
19e00 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e  TE_CORRUPT;.}.in
19e10 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45  t sqlite3MisuseE
19e20 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
19e30 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
19e40 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
19e50 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
19e60 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
19e70 45 5f 4d 49 53 55 53 45 2c 20 0a 20 20 20 20 20  E_MISUSE, .     
19e80 20 20 20 20 20 20 20 20 20 22 6d 69 73 75 73 65           "misuse
19e90 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b   at line %d of [
19ea0 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20  %.10s]",.       
19eb0 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32         lineno, 2
19ec0 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  0+sqlite3_source
19ed0 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  id());.  return 
19ee0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d  SQLITE_MISUSE;.}
19ef0 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74  .int sqlite3Cant
19f00 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69  openError(int li
19f10 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
19f20 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
19f30 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
19f40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
19f50 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c  SQLITE_CANTOPEN,
19f60 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
19f70 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c  "cannot open fil
19f80 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20  e at line %d of 
19f90 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20  [%.10s]",.      
19fa0 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20          lineno, 
19fb0 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63  20+sqlite3_sourc
19fc0 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e  eid());.  return
19fd0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
19fe0 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
19ff0 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
1a000 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ATED./*.** This 
1a010 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65  is a convenience
1a020 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61   routine that ma
1a030 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 61 6c  kes sure that al
1a040 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  l thread-specifi
1a050 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68  c.** data for th
1a060 69 73 20 74 68 72 65 61 64 20 68 61 73 20 62 65  is thread has be
1a070 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a  en deallocated..
1a080 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20  **.** SQLite no 
1a090 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72 65  longer uses thre
1a0a0 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74 61  ad-specific data
1a0b0 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   so this routine
1a0c0 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d   is now a.** no-
1a0d0 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74 61 69  op.  It is retai
1a0e0 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69 63  ned for historic
1a0f0 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  al compatibility
1a100 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1a110 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  3_thread_cleanup
1a120 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66  (void){.}.#endif
1a130 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d  ../*.** Return m
1a140 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
1a150 61 62 6f 75 74 20 61 20 73 70 65 63 69 66 69 63  about a specific
1a160 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74   column of a dat
1a170 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
1a180 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73  See comment in s
1a190 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74 65  qlite3.h (sqlite
1a1a0 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61 69  .h.in) for detai
1a1b0 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
1a1c0 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
1a1d0 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69  metadata(.  sqli
1a1e0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
1a1f0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
1a200 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a  ction handle */.
1a210 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1a220 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  bName,        /*
1a230 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f   Database name o
1a240 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  r NULL */.  cons
1a250 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61  t char *zTableNa
1a260 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  me,     /* Table
1a270 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   name */.  const
1a280 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61   char *zColumnNa
1a290 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  me,    /* Column
1a2a0 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20   name */.  char 
1a2b0 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79  const **pzDataTy
1a2c0 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54  pe,    /* OUTPUT
1a2d0 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20  : Declared data 
1a2e0 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  type */.  char c
1a2f0 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71  onst **pzCollSeq
1a300 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  ,     /* OUTPUT:
1a310 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
1a320 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  nce name */.  in
1a330 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20  t *pNotNull,    
1a340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1a350 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54  PUT: True if NOT
1a360 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
1a370 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74   exists */.  int
1a380 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20   *pPrimaryKey,  
1a390 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
1a3a0 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75  UT: True if colu
1a3b0 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f  mn part of PK */
1a3c0 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63  .  int *pAutoinc
1a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a3e0 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
1a3f0 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f  f column is auto
1a400 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b  -increment */.){
1a410 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
1a420 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
1a430 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
1a440 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  0;.  Column *pCo
1a450 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  l = 0;.  int iCo
1a460 6c 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  l = 0;.  char co
1a470 6e 73 74 20 2a 7a 44 61 74 61 54 79 70 65 20 3d  nst *zDataType =
1a480 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
1a490 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a   *zCollSeq = 0;.
1a4a0 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20    int notnull = 
1a4b0 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79  0;.  int primary
1a4c0 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61  key = 0;.  int a
1a4d0 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 0a 23 69  utoinc = 0;...#i
1a4e0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1a4f0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1a500 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1a510 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20  yCheckOk(db) || 
1a520 7a 54 61 62 6c 65 4e 61 6d 65 3d 3d 30 20 29 7b  zTableName==0 ){
1a530 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1a540 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1a550 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1a560 20 45 6e 73 75 72 65 20 74 68 65 20 64 61 74 61   Ensure the data
1a570 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20  base schema has 
1a580 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20  been loaded */. 
1a590 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1a5a0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1a5b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1a5c0 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72  nterAll(db);.  r
1a5d0 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28  c = sqlite3Init(
1a5e0 64 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  db, &zErrMsg);. 
1a5f0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1a600 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  rc ){.    goto e
1a610 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  rror_out;.  }.. 
1a620 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74   /* Locate the t
1a630 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e  able in question
1a640 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c   */.  pTab = sql
1a650 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
1a660 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44  , zTableName, zD
1a670 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70  bName);.  if( !p
1a680 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  Tab || pTab->pSe
1a690 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62  lect ){.    pTab
1a6a0 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65   = 0;.    goto e
1a6b0 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  rror_out;.  }.. 
1a6c0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c   /* Find the col
1a6d0 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e  umn for which in
1a6e0 66 6f 20 69 73 20 72 65 71 75 65 73 74 65 64 20  fo is requested 
1a6f0 2a 2f 0a 20 20 69 66 28 20 7a 43 6f 6c 75 6d 6e  */.  if( zColumn
1a700 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
1a710 2a 20 51 75 65 72 79 20 66 6f 72 20 65 78 69 73  * Query for exis
1a720 74 61 6e 63 65 20 6f 66 20 74 61 62 6c 65 20 6f  tance of table o
1a730 6e 6c 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  nly */.  }else{.
1a740 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
1a750 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
1a760 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
1a770 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
1a780 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  ol[iCol];.      
1a790 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
1a7a0 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
1a7b0 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20  e, zColumnName) 
1a7c0 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
1a7d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a7e0 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54      if( iCol==pT
1a7f0 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
1a800 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70    if( HasRowid(p
1a810 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 49  Tab) && sqlite3I
1a820 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61  sRowid(zColumnNa
1a830 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  me) ){.        i
1a840 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  Col = pTab->iPKe
1a850 79 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 20  y;.        pCol 
1a860 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 26 70 54 61  = iCol>=0 ? &pTa
1a870 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 20 3a 20  b->aCol[iCol] : 
1a880 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
1a890 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 30          pTab = 0
1a8a0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
1a8b0 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  rror_out;.      
1a8c0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1a8d0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1a8e0 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65  block stores the
1a8f0 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
1a900 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  n that will be r
1a910 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20  eturned.  ** to 
1a920 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f  the caller in lo
1a930 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44  cal variables zD
1a940 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65  ataType, zCollSe
1a950 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d  q, notnull, prim
1a960 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20  arykey.  ** and 
1a970 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73  autoinc. At this
1a980 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65   point there are
1a990 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69   two possibiliti
1a9a0 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20  es:.  ** .  **  
1a9b0 20 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66     1. The specif
1a9c0 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ied column name 
1a9d0 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64  was rowid", "oid
1a9e0 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a  " or "_rowid_" .
1a9f0 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20    **        and 
1aa00 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c  there is no expl
1aa10 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20  icitly declared 
1aa20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a  IPK column. .  *
1aa30 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68  *.  **     2. Th
1aa40 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61  e table is not a
1aa50 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f   view and the co
1aa60 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69  lumn name identi
1aa70 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20  fied an .  **   
1aa80 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20       explicitly 
1aa90 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e  declared column.
1aaa0 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72   Copy meta infor
1aab0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f  mation from *pCo
1aac0 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70  l..  */ .  if( p
1aad0 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61  Col ){.    zData
1aae0 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  Type = pCol->zTy
1aaf0 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71  pe;.    zCollSeq
1ab00 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a   = pCol->zColl;.
1ab10 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43      notnull = pC
1ab20 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a  ol->notNull!=0;.
1ab30 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20      primarykey  
1ab40 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67  = (pCol->colFlag
1ab50 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d  s & COLFLAG_PRIM
1ab60 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20 61 75 74  KEY)!=0;.    aut
1ab70 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b  oinc = pTab->iPK
1ab80 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61  ey==iCol && (pTa
1ab90 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
1aba0 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21  _Autoincrement)!
1abb0 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
1abc0 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e   zDataType = "IN
1abd0 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d  TEGER";.    prim
1abe0 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a  arykey = 1;.  }.
1abf0 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20    if( !zCollSeq 
1ac00 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20  ){.    zCollSeq 
1ac10 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  = sqlite3StrBINA
1ac20 52 59 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f  RY;.  }..error_o
1ac30 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ut:.  sqlite3Btr
1ac40 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
1ac50 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68  .  /* Whether th
1ac60 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  e function call 
1ac70 73 75 63 63 65 65 64 65 64 20 6f 72 20 66 61 69  succeeded or fai
1ac80 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74  led, set the out
1ac90 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20  put parameters. 
1aca0 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20   ** to whatever 
1acb0 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e  their local coun
1acc0 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e  terparts contain
1acd0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69  . If an error di
1ace0 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68  d occur,.  ** th
1acf0 69 73 20 68 61 73 20 74 68 65 20 65 66 66 65 63  is has the effec
1ad00 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c  t of zeroing all
1ad10 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
1ad20 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rs..  */.  if( p
1ad30 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44  zDataType ) *pzD
1ad40 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54  ataType = zDataT
1ad50 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c  ype;.  if( pzCol
1ad60 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65  lSeq ) *pzCollSe
1ad70 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20  q = zCollSeq;.  
1ad80 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a  if( pNotNull ) *
1ad90 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75  pNotNull = notnu
1ada0 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61  ll;.  if( pPrima
1adb0 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72  ryKey ) *pPrimar
1adc0 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65  yKey = primaryke
1add0 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e  y;.  if( pAutoin
1ade0 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20  c ) *pAutoinc = 
1adf0 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20  autoinc;..  if( 
1ae00 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26  SQLITE_OK==rc &&
1ae10 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71   !pTab ){.    sq
1ae20 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1ae30 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45  zErrMsg);.    zE
1ae40 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  rrMsg = sqlite3M
1ae50 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73  Printf(db, "no s
1ae60 75 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  uch table column
1ae70 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65  : %s.%s", zTable
1ae80 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43  Name,.        zC
1ae90 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  olumnName);.    
1aea0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1aeb0 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  R;.  }.  sqlite3
1aec0 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
1aed0 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25   rc, (zErrMsg?"%
1aee0 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b  s":0), zErrMsg);
1aef0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1af00 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  (db, zErrMsg);. 
1af10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
1af20 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
1af30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1af40 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1af50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1af60 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
1af70 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
1af80 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
1af90 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
1afa0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1afb0 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a  _sleep(int ms){.
1afc0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1afd0 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Vfs;.  int rc;. 
1afe0 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f   pVfs = sqlite3_
1aff0 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69  vfs_find(0);.  i
1b000 66 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74  f( pVfs==0 ) ret
1b010 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  urn 0;..  /* Thi
1b020 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73  s function works
1b030 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   in milliseconds
1b040 2c 20 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c  , but the underl
1b050 79 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a  ying OsSleep() .
1b060 20 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69    ** API uses mi
1b070 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63  croseconds. Henc
1b080 65 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20  e the 1000's..  
1b090 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74  */.  rc = (sqlit
1b0a0 65 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20  e3OsSleep(pVfs, 
1b0b0 31 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a  1000*ms)/1000);.
1b0c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1b0d0 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20  /*.** Enable or 
1b0e0 64 69 73 61 62 6c 65 20 74 68 65 20 65 78 74 65  disable the exte
1b0f0 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65  nded result code
1b100 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1b110 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  3_extended_resul
1b120 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20  t_codes(sqlite3 
1b130 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b  *db, int onoff){
1b140 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1b150 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1b160 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1b170 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1b180 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1b190 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
1b1a0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
1b1b0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1b1c0 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d  tex);.  db->errM
1b1d0 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78  ask = onoff ? 0x
1b1e0 66 66 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b  ffffffff : 0xff;
1b1f0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b200 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1b210 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1b220 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1b230 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65  Invoke the xFile
1b240 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f  Control method o
1b250 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  n a particular d
1b260 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
1b270 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
1b280 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  trol(sqlite3 *db
1b290 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
1b2a0 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76  bName, int op, v
1b2b0 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e  oid *pArg){.  in
1b2c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  t rc = SQLITE_ER
1b2d0 52 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a 70 42  ROR;.  Btree *pB
1b2e0 74 72 65 65 3b 0a 0a 23 69 66 64 65 66 20 53 51  tree;..#ifdef SQ
1b2f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1b300 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1b310 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1b320 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
1b330 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
1b340 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
1b350 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1b360 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42  db->mutex);.  pB
1b370 74 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62  tree = sqlite3Db
1b380 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20  NameToBtree(db, 
1b390 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zDbName);.  if( 
1b3a0 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61  pBtree ){.    Pa
1b3b0 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
1b3c0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
1b3d0 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  d;.    sqlite3Bt
1b3e0 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
1b3f0 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73  ;.    pPager = s
1b400 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
1b410 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73  (pBtree);.    as
1b420 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
1b430 29 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69  );.    fd = sqli
1b440 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61  te3PagerFile(pPa
1b450 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ger);.    assert
1b460 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( fd!=0 );.    i
1b470 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  f( op==SQLITE_FC
1b480 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  NTL_FILE_POINTER
1b490 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69   ){.      *(sqli
1b4a0 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20  te3_file**)pArg 
1b4b0 3d 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d  = fd;.      rc =
1b4c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b4d0 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51  }else if( op==SQ
1b4e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 5f 50  LITE_FCNTL_VFS_P
1b4f0 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20  OINTER ){.      
1b500 2a 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2a 29  *(sqlite3_vfs**)
1b510 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61  pArg = sqlite3Pa
1b520 67 65 72 56 66 73 28 70 50 61 67 65 72 29 3b 0a  gerVfs(pPager);.
1b530 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b540 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E_OK;.    }else 
1b550 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46  if( op==SQLITE_F
1b560 43 4e 54 4c 5f 4a 4f 55 52 4e 41 4c 5f 50 4f 49  CNTL_JOURNAL_POI
1b570 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28  NTER ){.      *(
1b580 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70  sqlite3_file**)p
1b590 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Arg = sqlite3Pag
1b5a0 65 72 4a 72 6e 6c 46 69 6c 65 28 70 50 61 67 65  erJrnlFile(pPage
1b5b0 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  r);.      rc = S
1b5c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1b5d0 6c 73 65 20 69 66 28 20 66 64 2d 3e 70 4d 65 74  lse if( fd->pMet
1b5e0 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 72 63  hods ){.      rc
1b5f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1b600 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20  Control(fd, op, 
1b610 70 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pArg);.    }else
1b620 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1b630 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
1b640 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
1b650 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
1b660 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1b670 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1b680 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1b690 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
1b6a0 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20  nterface to the 
1b6b0 74 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a  testing logic..*
1b6c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65  /.int sqlite3_te
1b6d0 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f  st_control(int o
1b6e0 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72  p, ...){.  int r
1b6f0 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  c = 0;.#ifdef SQ
1b700 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49  LITE_OMIT_BUILTI
1b710 4e 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f  N_TEST.  UNUSED_
1b720 50 41 52 41 4d 45 54 45 52 28 6f 70 29 3b 0a 23  PARAMETER(op);.#
1b730 65 6c 73 65 0a 20 20 76 61 5f 6c 69 73 74 20 61  else.  va_list a
1b740 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  p;.  va_start(ap
1b750 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
1b760 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20   op ){..    /*. 
1b770 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20 63     ** Save the c
1b780 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
1b790 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f  the PRNG..    */
1b7a0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1b7b0 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53  _TESTCTRL_PRNG_S
1b7c0 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  AVE: {.      sql
1b7d0 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61 74  ite3PrngSaveStat
1b7e0 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
1b7f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1b800 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20 74      ** Restore t
1b810 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
1b820 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73 74  PRNG to the last
1b830 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73 69   state saved usi
1b840 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53  ng.    ** PRNG_S
1b850 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53 41  AVE.  If PRNG_SA
1b860 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65 66  VE has never bef
1b870 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ore been called,
1b880 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69   then.    ** thi
1b890 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b 65  s verb acts like
1b8a0 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20   PRNG_RESET..   
1b8b0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1b8c0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
1b8d0 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20  G_RESTORE: {.   
1b8e0 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65     sqlite3PrngRe
1b8f0 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20 20  storeState();.  
1b900 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b910 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1b920 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20 62  Reset the PRNG b
1b930 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e 69  ack to its unini
1b940 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e 20  tialized state. 
1b950 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20   The next call. 
1b960 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
1b970 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69  _randomness() wi
1b980 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50 52  ll reseed the PR
1b990 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  NG using a singl
1b9a0 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  e call.    ** to
1b9b0 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73   the xRandomness
1b9c0 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 64   method of the d
1b9d0 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20 20  efault VFS..    
1b9e0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1b9f0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
1ba00 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20  _RESET: {.      
1ba10 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
1ba20 73 73 28 30 2c 30 29 3b 0a 20 20 20 20 20 20 62  ss(0,0);.      b
1ba30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1ba40 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1ba50 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1ba60 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73 69  (BITVEC_TEST, si
1ba70 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20 20  ze, program).   
1ba80 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61   **.    ** Run a
1ba90 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61 20   test against a 
1baa0 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f 66  Bitvec object of
1bab0 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f 67   size.  The prog
1bac0 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20 20  ram argument.   
1bad0 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20   ** is an array 
1bae0 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61 74  of integers that
1baf0 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65 73   defines the tes
1bb00 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e  t.  Return -1 on
1bb10 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79   a.    ** memory
1bb20 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
1bb30 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c  r, 0 on success,
1bb40 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72   or non-zero for
1bb50 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a   an error..    *
1bb60 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74 65  * See the sqlite
1bb70 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65  3BitvecBuiltinTe
1bb80 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  st() for additio
1bb90 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
1bba0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1bbb0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1bbc0 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a  _BITVEC_TEST: {.
1bbd0 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76        int sz = v
1bbe0 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
1bbf0 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f 67        int *aProg
1bc00 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1bc10 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t*);.      rc = 
1bc20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69  sqlite3BitvecBui
1bc30 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50 72  ltinTest(sz, aPr
1bc40 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  og);.      break
1bc50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1bc60 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1bc70 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 46 41 55  test_control(FAU
1bc80 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20 78 43 61 6c  LT_INSTALL, xCal
1bc90 6c 62 61 63 6b 29 0a 20 20 20 20 2a 2a 0a 20 20  lback).    **.  
1bca0 20 20 2a 2a 20 41 72 72 61 6e 67 65 20 74 6f 20    ** Arrange to 
1bcb0 69 6e 76 6f 6b 65 20 78 43 61 6c 6c 62 61 63 6b  invoke xCallback
1bcc0 28 29 20 77 68 65 6e 65 76 65 72 20 73 71 6c 69  () whenever sqli
1bcd0 74 65 33 46 61 75 6c 74 53 69 6d 28 29 20 69 73  te3FaultSim() is
1bce0 20 63 61 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a 20   called,.    ** 
1bcf0 69 66 20 78 43 61 6c 6c 62 61 63 6b 20 69 73 20  if xCallback is 
1bd00 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a  not NULL..    **
1bd10 0a 20 20 20 20 2a 2a 20 41 73 20 61 20 74 65 73  .    ** As a tes
1bd20 74 20 6f 66 20 74 68 65 20 66 61 75 6c 74 20 73  t of the fault s
1bd30 69 6d 75 6c 61 74 6f 72 20 6d 65 63 68 61 6e 69  imulator mechani
1bd40 73 6d 20 69 74 73 65 6c 66 2c 20 73 71 6c 69 74  sm itself, sqlit
1bd50 65 33 46 61 75 6c 74 53 69 6d 28 30 29 0a 20 20  e3FaultSim(0).  
1bd60 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 69    ** is called i
1bd70 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
1bd80 20 69 6e 73 74 61 6c 6c 69 6e 67 20 74 68 65 20   installing the 
1bd90 6e 65 77 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64  new callback and
1bda0 20 74 68 65 20 72 65 74 75 72 6e 0a 20 20 20 20   the return.    
1bdb0 2a 2a 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 71  ** value from sq
1bdc0 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29  lite3FaultSim(0)
1bdd0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65 74   becomes the ret
1bde0 75 72 6e 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  urn from.    ** 
1bdf0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1be00 74 72 6f 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  trol()..    */. 
1be10 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1be20 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e  ESTCTRL_FAULT_IN
1be30 53 54 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 2f  STALL: {.      /
1be40 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20  * MSVC is picky 
1be50 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75  about pulling fu
1be60 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20  nc ptrs from va 
1be70 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  lists..      ** 
1be80 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d  http://support.m
1be90 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f  icrosoft.com/kb/
1bea0 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73  47961.      ** s
1beb0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1bec0 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b  ig.xTestCallback
1bed0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1bee0 74 28 2a 29 28 69 6e 74 29 29 3b 0a 20 20 20 20  t(*)(int));.    
1bef0 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64    */.      typed
1bf00 65 66 20 69 6e 74 28 2a 54 45 53 54 43 41 4c 4c  ef int(*TESTCALL
1bf10 42 41 43 4b 46 55 4e 43 5f 74 29 28 69 6e 74 29  BACKFUNC_t)(int)
1bf20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
1bf30 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73  lobalConfig.xTes
1bf40 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61  tCallback = va_a
1bf50 72 67 28 61 70 2c 20 54 45 53 54 43 41 4c 4c 42  rg(ap, TESTCALLB
1bf60 41 43 4b 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20  ACKFUNC_t);.    
1bf70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 61    rc = sqlite3Fa
1bf80 75 6c 74 53 69 6d 28 30 29 3b 0a 20 20 20 20 20  ultSim(0);.     
1bf90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1bfa0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
1bfb0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1bfc0 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43  ol(BENIGN_MALLOC
1bfd0 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20  _HOOKS, xBegin, 
1bfe0 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20  xEnd).    **.   
1bff0 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f   ** Register hoo
1c000 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e  ks to call to in
1c010 64 69 63 61 74 65 20 77 68 69 63 68 20 6d 61 6c  dicate which mal
1c020 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20 0a  loc() failures .
1c030 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69 67      ** are benig
1c040 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
1c050 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1c060 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43  RL_BENIGN_MALLOC
1c070 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20  _HOOKS: {.      
1c080 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 76  typedef void (*v
1c090 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f  oid_function)(vo
1c0a0 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f  id);.      void_
1c0b0 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e  function xBenign
1c0c0 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69  Begin;.      voi
1c0d0 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69  d_function xBeni
1c0e0 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42 65  gnEnd;.      xBe
1c0f0 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61  nignBegin = va_a
1c100 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63  rg(ap, void_func
1c110 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42 65  tion);.      xBe
1c120 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67  nignEnd = va_arg
1c130 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69  (ap, void_functi
1c140 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  on);.      sqlit
1c150 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f  e3BenignMallocHo
1c160 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69 6e  oks(xBenignBegin
1c170 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20  , xBenignEnd);. 
1c180 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c190 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1c1a0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1c1b0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1c1c0 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42  STCTRL_PENDING_B
1c1d0 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  YTE, unsigned in
1c1e0 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t X).    **.    
1c1f0 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44 49  ** Set the PENDI
1c200 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65 20 76  NG byte to the v
1c210 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67 75  alue in the argu
1c220 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20  ment, if X>0..  
1c230 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61    ** Make no cha
1c240 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20 52  nges if X==0.  R
1c250 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
1c260 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20 62  of the pending b
1c270 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69 74  yte.    ** as it
1c280 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72 65   existing before
1c290 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
1c2a0 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a  s called..    **
1c2b0 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e  .    ** IMPORTAN
1c2c0 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65  T:  Changing the
1c2d0 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66 72   PENDING byte fr
1c2e0 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20 72 65  om 0x40000000 re
1c2f0 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20  sults in.    ** 
1c300 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
1c310 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
1c320 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67 20  rmat.  Changing 
1c330 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
1c340 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e  .    ** while an
1c350 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  y database conne
1c360 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65  ction is open re
1c370 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69 6e  sults in undefin
1c380 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65  ed and.    ** de
1c390 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61 76 69  leterious behavi
1c3a0 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  or..    */.    c
1c3b0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1c3c0 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45  TRL_PENDING_BYTE
1c3d0 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 50  : {.      rc = P
1c3e0 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66  ENDING_BYTE;.#if
1c3f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c400 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20 20  _WSD.      {.   
1c410 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e       unsigned in
1c420 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61 72  t newVal = va_ar
1c430 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69  g(ap, unsigned i
1c440 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nt);.        if(
1c450 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74 65   newVal ) sqlite
1c460 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e  3PendingByte = n
1c470 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23  ewVal;.      }.#
1c480 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
1c490 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1c4a0 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
1c4b0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1c4c0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
1c4d0 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20 20  SERT, int X).   
1c4e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
1c4f0 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20  action provides 
1c500 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  a run-time test 
1c510 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f  to see whether o
1c520 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73  r not.    ** ass
1c530 65 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c 65  ert() was enable
1c540 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1c550 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65  e.  If X is true
1c560 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20 20   and assert().  
1c570 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c    ** is enabled,
1c580 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
1c590 20 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e 20   value is true. 
1c5a0 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e   If X is true an
1c5b0 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28  d.    ** assert(
1c5c0 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  ) is disabled, t
1c5d0 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
1c5e0 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20 49  alue is zero.  I
1c5f0 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66 61  f X is.    ** fa
1c600 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29  lse and assert()
1c610 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
1c620 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e 20  n the assertion 
1c630 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20 20  fires and the.  
1c640 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62 6f    ** process abo
1c650 72 74 73 2e 20 20 49 66 20 58 20 69 73 20 66 61  rts.  If X is fa
1c660 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29  lse and assert()
1c670 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68   is disabled, th
1c680 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  en the.    ** re
1c690 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65  turn value is ze
1c6a0 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ro..    */.    c
1c6b0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1c6c0 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20  TRL_ASSERT: {.  
1c6d0 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74      volatile int
1c6e0 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73   x = 0;.      as
1c6f0 73 65 72 74 28 20 2f 2a 73 69 64 65 2d 65 66 66  sert( /*side-eff
1c700 65 63 74 73 2d 6f 6b 2a 2f 20 28 78 20 3d 20 76  ects-ok*/ (x = v
1c710 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29 21 3d  a_arg(ap,int))!=
1c720 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
1c730 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  x;.      break;.
1c740 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20      }...    /*. 
1c750 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
1c760 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1c770 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
1c780 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a  YS, int X).    *
1c790 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63  *.    ** This ac
1c7a0 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20  tion provides a 
1c7b0 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f  run-time test to
1c7c0 20 73 65 65 20 68 6f 77 20 74 68 65 20 41 4c 57   see how the ALW
1c7d0 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e  AYS and.    ** N
1c7e0 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65 72 65  EVER macros were
1c7f0 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d 70   defined at comp
1c800 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a  ile-time..    **
1c810 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 74 75  .    ** The retu
1c820 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c 57 41  rn value is ALWA
1c830 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a  YS(X).  .    **.
1c840 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d      ** The recom
1c850 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73 20 58  mended test is X
1c860 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72 65 74  ==2.  If the ret
1c870 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32 2c 20  urn value is 2, 
1c880 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  that means.    *
1c890 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e  * ALWAYS() and N
1c8a0 45 56 45 52 28 29 20 61 72 65 20 62 6f 74 68 20  EVER() are both 
1c8b0 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75  no-op pass-throu
1c8c0 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69 63 68  gh macros, which
1c8d0 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   is the.    ** d
1c8e0 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 2e 20  efault setting. 
1c8f0 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
1c900 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65 6e 20  alue is 1, then 
1c910 41 4c 57 41 59 53 28 29 20 69 73 20 65 69 74 68  ALWAYS() is eith
1c920 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d 63  er.    ** hard-c
1c930 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f 72 20  oded to true or 
1c940 65 6c 73 65 20 69 74 20 61 73 73 65 72 74 73 20  else it asserts 
1c950 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20  if its argument 
1c960 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a  is false..    **
1c970 20 54 68 65 20 66 69 72 73 74 20 62 65 68 61 76   The first behav
1c980 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65 64 20  ior (hard-coded 
1c990 74 6f 20 74 72 75 65 29 20 69 73 20 74 68 65 20  to true) is the 
1c9a0 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53  case if.    ** S
1c9b0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1c9c0 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61 74  SSERT shows that
1c9d0 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73   assert() is dis
1c9e0 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 73 65  abled and the se
1c9f0 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68 61  cond.    ** beha
1ca00 76 69 6f 72 20 28 61 73 73 65 72 74 20 69 66 20  vior (assert if 
1ca10 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
1ca20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61 6c 73  ALWAYS() is fals
1ca30 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20 69  e) is the case i
1ca40 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  f.    ** SQLITE_
1ca50 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20  TESTCTRL_ASSERT 
1ca60 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65 72  shows that asser
1ca70 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  t() is enabled..
1ca80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1ca90 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  e run-time test 
1caa0 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74 20  procedure might 
1cab0 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c  look something l
1cac0 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a  ike this:.    **
1cad0 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28 20 73  .    **    if( s
1cae0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1caf0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1cb00 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d  TRL_ALWAYS, 2)==
1cb10 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  2 ){.    **     
1cb20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61 6e 64   // ALWAYS() and
1cb30 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e 6f 2d   NEVER() are no-
1cb40 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20  op pass-through 
1cb50 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20  macros.    **   
1cb60 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
1cb70 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1cb80 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1cb90 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a 20 20  ASSERT, 1) ){.  
1cba0 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
1cbb0 41 59 53 28 78 29 20 61 73 73 65 72 74 73 20 74  AYS(x) asserts t
1cbc0 68 61 74 20 78 20 69 73 20 74 72 75 65 2e 20 4e  hat x is true. N
1cbd0 45 56 45 52 28 78 29 20 61 73 73 65 72 74 73 20  EVER(x) asserts 
1cbe0 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  x is false..    
1cbf0 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  **    }else{.   
1cc00 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41   **      // ALWA
1cc10 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74  YS(x) is a const
1cc20 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28 78 29  ant 1.  NEVER(x)
1cc30 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 30   is a constant 0
1cc40 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20  ..    **    }.  
1cc50 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1cc60 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
1cc70 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  WAYS: {.      in
1cc80 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  t x = va_arg(ap,
1cc90 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  int);.      rc =
1cca0 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20 20 20   ALWAYS(x);.    
1ccb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1ccc0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
1ccd0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1cce0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1ccf0 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 29 3b  CTRL_BYTEORDER);
1cd00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1cd10 68 65 20 69 6e 74 65 67 65 72 20 72 65 74 75 72  he integer retur
1cd20 6e 65 64 20 72 65 76 65 61 6c 73 20 74 68 65 20  ned reveals the 
1cd30 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74 68  byte-order of th
1cd40 65 20 63 6f 6d 70 75 74 65 72 20 6f 6e 20 77 68  e computer on wh
1cd50 69 63 68 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74  ich.    ** SQLit
1cd60 65 20 69 73 20 72 75 6e 6e 69 6e 67 3a 0a 20 20  e is running:.  
1cd70 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1cd80 20 20 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69    1     big-endi
1cd90 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65  an,    determine
1cda0 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20  d at run-time.  
1cdb0 20 20 2a 2a 20 20 20 20 20 20 31 30 20 20 20 20    **      10    
1cdc0 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20   little-endian, 
1cdd0 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75  determined at ru
1cde0 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 34  n-time.    **  4
1cdf0 33 32 31 30 31 20 20 20 20 20 62 69 67 2d 65 6e  32101     big-en
1ce00 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69  dian,    determi
1ce10 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ned at compile-t
1ce20 69 6d 65 0a 20 20 20 20 2a 2a 20 20 31 32 33 34  ime.    **  1234
1ce30 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e  10     little-en
1ce40 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64  dian, determined
1ce50 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1ce60 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 63 61 73  .    */ .    cas
1ce70 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1ce80 4c 5f 42 59 54 45 4f 52 44 45 52 3a 20 7b 0a 20  L_BYTEORDER: {. 
1ce90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cea0 5f 42 59 54 45 4f 52 44 45 52 2a 31 30 30 20 2b  _BYTEORDER*100 +
1ceb0 20 53 51 4c 49 54 45 5f 4c 49 54 54 4c 45 45 4e   SQLITE_LITTLEEN
1cec0 44 49 41 4e 2a 31 30 20 2b 20 53 51 4c 49 54 45  DIAN*10 + SQLITE
1ced0 5f 42 49 47 45 4e 44 49 41 4e 3b 0a 20 20 20 20  _BIGENDIAN;.    
1cee0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1cef0 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
1cf00 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1cf10 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45  LITE_TESTCTRL_RE
1cf20 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20 2a  SERVE, sqlite3 *
1cf30 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a  db, int N).    *
1cf40 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65  *.    ** Set the
1cf50 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20 74   nReserve size t
1cf60 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  o N for the main
1cf70 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68 65   database on the
1cf80 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
1cf90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a   connection db..
1cfa0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1cfb0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1cfc0 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20 20  RESERVE: {.     
1cfd0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
1cfe0 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
1cff0 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78  3*);.      int x
1d000 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
1d010 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d020 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1d030 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73  >mutex);.      s
1d040 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
1d050 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30  geSize(db->aDb[0
1d060 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b  ].pBt, 0, x, 0);
1d070 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
1d080 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1d090 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65  utex);.      bre
1d0a0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1d0b0 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1d0c0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1d0d0 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
1d0e0 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a  TIONS, sqlite3 *
1d0f0 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a  db, int N).    *
1d100 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20  *.    ** Enable 
1d110 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72 69 6f  or disable vario
1d120 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  us optimizations
1d130 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
1d140 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20 20  poses.  The .   
1d150 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20 69   ** argument N i
1d160 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f  s a bitmask of o
1d170 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20  ptimizations to 
1d180 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46 6f  be disabled.  Fo
1d190 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20  r normal.    ** 
1d1a0 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75  operation N shou
1d1b0 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 69 64  ld be 0.  The id
1d1c0 65 61 20 69 73 20 74 68 61 74 20 61 20 74 65 73  ea is that a tes
1d1d0 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20  t program (like 
1d1e0 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c  the.    ** SQL L
1d1f0 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c 54  ogic Test or SLT
1d200 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63 61   test module) ca
1d210 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20 53  n run the same S
1d220 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  QL multiple time
1d230 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76 61  s.    ** with va
1d240 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69  rious optimizati
1d250 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f 20  ons disabled to 
1d260 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
1d270 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20 20  same answer.    
1d280 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ** is obtained i
1d290 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20 20  n every case..  
1d2a0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1d2b0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
1d2c0 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20  TIMIZATIONS: {. 
1d2d0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
1d2e0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
1d2f0 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64  lite3*);.      d
1d300 62 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d 20  b->dbOptFlags = 
1d310 28 75 31 36 29 28 76 61 5f 61 72 67 28 61 70 2c  (u16)(va_arg(ap,
1d320 20 69 6e 74 29 20 26 20 30 78 66 66 66 66 29 3b   int) & 0xffff);
1d330 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d340 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
1d350 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20  TE_N_KEYWORD.   
1d360 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
1d370 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1d380 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f  TESTCTRL_ISKEYWO
1d390 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  RD, const char *
1d3a0 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20  zWord).    **.  
1d3b0 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69 73    ** If zWord is
1d3c0 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f 67   a keyword recog
1d3d0 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70 61 72  nized by the par
1d3e0 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ser, then return
1d3f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62   the.    ** numb
1d400 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20  er of keywords. 
1d410 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73 20   Or if zWord is 
1d420 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20 72  not a keyword, r
1d430 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20  eturn 0..    ** 
1d440 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73  .    ** This tes
1d450 74 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e 6c  t feature is onl
1d460 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  y available in t
1d470 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20  he amalgamation 
1d480 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68 65  since.    ** the
1d490 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
1d4a0 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 64  D macro is not d
1d4b0 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66  efined in this f
1d4c0 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20 20  ile if SQLite.  
1d4d0 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75 73    ** is built us
1d4e0 69 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f 75  ing separate sou
1d4f0 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a  rce files..    *
1d500 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1d510 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59  E_TESTCTRL_ISKEY
1d520 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f  WORD: {.      co
1d530 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 20  nst char *zWord 
1d540 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e  = va_arg(ap, con
1d550 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  st char*);.     
1d560 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
1d570 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b  Strlen30(zWord);
1d580 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 71 6c  .      rc = (sql
1d590 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28  ite3KeywordCode(
1d5a0 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d  (u8*)zWord, n)!=
1d5b0 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45 5f  TK_ID) ? SQLITE_
1d5c0 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20  N_KEYWORD : 0;. 
1d5d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d5e0 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f  }.#endif ..    /
1d5f0 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
1d600 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1d610 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41  STCTRL_SCRATCHMA
1d620 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c  LLOC, sz, &pNew,
1d630 20 70 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a   pFree);.    **.
1d640 20 20 20 20 2a 2a 20 50 61 73 73 20 70 46 72 65      ** Pass pFre
1d650 65 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 53 63  e into sqlite3Sc
1d660 72 61 74 63 68 46 72 65 65 28 29 2e 20 0a 20 20  ratchFree(). .  
1d670 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68 65    ** If sz>0 the
1d680 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 73 63 72  n allocate a scr
1d690 61 74 63 68 20 62 75 66 66 65 72 20 69 6e 74 6f  atch buffer into
1d6a0 20 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a   pNew.  .    */.
1d6b0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1d6c0 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48  TESTCTRL_SCRATCH
1d6d0 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20  MALLOC: {.      
1d6e0 76 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70  void *pFree, **p
1d6f0 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20  pNew;.      int 
1d700 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 76  sz;.      sz = v
1d710 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
1d720 20 20 20 20 20 20 70 70 4e 65 77 20 3d 20 76 61        ppNew = va
1d730 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29  _arg(ap, void**)
1d740 3b 0a 20 20 20 20 20 20 70 46 72 65 65 20 3d 20  ;.      pFree = 
1d750 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
1d760 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 20  );.      if( sz 
1d770 29 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69 74  ) *ppNew = sqlit
1d780 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28  e3ScratchMalloc(
1d790 73 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sz);.      sqlit
1d7a0 65 33 53 63 72 61 74 63 68 46 72 65 65 28 70 46  e3ScratchFree(pF
1d7b0 72 65 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ree);.      brea
1d7c0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1d7d0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1d7e0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1d7f0 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d  ESTCTRL_LOCALTIM
1d800 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f  E_FAULT, int ono
1d810 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ff);.    **.    
1d820 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
1d830 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72  onoff is non-zer
1d840 6f 2c 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65  o, configure the
1d850 20 77 72 61 70 70 65 72 73 20 73 6f 20 74 68 61   wrappers so tha
1d860 74 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62  t all.    ** sub
1d870 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
1d880 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e 64   localtime() and
1d890 20 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e 20   variants fail. 
1d8a0 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f  If onoff is zero
1d8b0 2c 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68  ,.    ** undo th
1d8c0 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20  is setting..    
1d8d0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1d8e0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41  TE_TESTCTRL_LOCA
1d8f0 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20  LTIME_FAULT: {. 
1d900 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1d910 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74  alConfig.bLocalt
1d920 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61 72  imeFault = va_ar
1d930 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
1d940 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1d950 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
1d960 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1d970 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45  LITE_TESTCTRL_NE
1d980 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 69 6e 74  VER_CORRUPT, int
1d990 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1d9a0 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61 20   Set or clear a 
1d9b0 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63 61  flag that indica
1d9c0 74 65 73 20 74 68 61 74 20 74 68 65 20 64 61 74  tes that the dat
1d9d0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 61 6c  abase file is al
1d9e0 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20 20 2a  ways well-.    *
1d9f0 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e 65 76  * formed and nev
1da00 65 72 20 63 6f 72 72 75 70 74 2e 20 20 54 68 69  er corrupt.  Thi
1da10 73 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20  s flag is clear 
1da20 62 79 20 64 65 66 61 75 6c 74 2c 20 69 6e 64 69  by default, indi
1da30 63 61 74 69 6e 67 20 74 68 61 74 0a 20 20 20 20  cating that.    
1da40 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1da50 73 20 6d 69 67 68 74 20 68 61 76 65 20 61 72 62  s might have arb
1da60 69 74 72 61 72 79 20 63 6f 72 72 75 70 74 69 6f  itrary corruptio
1da70 6e 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65 20  n.  Setting the 
1da80 66 6c 61 67 20 64 75 72 69 6e 67 0a 20 20 20 20  flag during.    
1da90 2a 2a 20 74 65 73 74 69 6e 67 20 63 61 75 73 65  ** testing cause
1daa0 73 20 63 65 72 74 61 69 6e 20 61 73 73 65 72 74  s certain assert
1dab0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  () statements in
1dac0 20 74 68 65 20 63 6f 64 65 20 74 6f 20 62 65 20   the code to be 
1dad0 61 63 74 69 76 61 74 65 64 0a 20 20 20 20 2a 2a  activated.    **
1dae0 20 74 68 61 74 20 64 65 6d 6f 6e 73 74 72 61 74   that demonstrat
1daf0 20 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20 77   invariants on w
1db00 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
1db10 61 73 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a  ase files..    *
1db20 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1db30 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52  E_TESTCTRL_NEVER
1db40 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20 20 20  _CORRUPT: {.    
1db50 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1db60 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f 72 72 75  onfig.neverCorru
1db70 70 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  pt = va_arg(ap, 
1db80 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
1db90 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f  k;.    }...    /
1dba0 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1dbb0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1dbc0 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f  TESTCTRL_VDBE_CO
1dbd0 56 45 52 41 47 45 2c 20 78 43 61 6c 6c 62 61 63  VERAGE, xCallbac
1dbe0 6b 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a 0a  k, ptr);.    **.
1dbf0 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 56      ** Set the V
1dc00 44 42 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c  DBE coverage cal
1dc10 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74  lback function t
1dc20 6f 20 78 43 61 6c 6c 62 61 63 6b 20 77 69 74 68  o xCallback with
1dc30 20 63 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2a   context .    **
1dc40 20 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20 20   pointer ptr..  
1dc50 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1dc60 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44  LITE_TESTCTRL_VD
1dc70 42 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a 23  BE_COVERAGE: {.#
1dc80 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
1dc90 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20  E_COVERAGE.     
1dca0 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a   typedef void (*
1dcb0 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29  branch_callback)
1dcc0 28 76 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c 75 38  (void*,int,u8,u8
1dcd0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1dce0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64  GlobalConfig.xVd
1dcf0 62 65 42 72 61 6e 63 68 20 3d 20 76 61 5f 61 72  beBranch = va_ar
1dd00 67 28 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c  g(ap,branch_call
1dd10 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  back);.      sql
1dd20 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1dd30 2e 70 56 64 62 65 42 72 61 6e 63 68 41 72 67 20  .pVdbeBranchArg 
1dd40 3d 20 76 61 5f 61 72 67 28 61 70 2c 76 6f 69 64  = va_arg(ap,void
1dd50 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  *);.#endif.     
1dd60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1dd70 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1dd80 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1dd90 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52  ITE_TESTCTRL_SOR
1dda0 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d  TER_MMAP, db, nM
1ddb0 61 78 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65  ax); */.    case
1ddc0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1ddd0 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a  _SORTER_MMAP: {.
1dde0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1ddf0 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
1de00 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
1de10 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d  db->nMaxSorterMm
1de20 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
1de30 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
1de40 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1de50 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1de60 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1de70 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 29 3b  ESTCTRL_ISINIT);
1de80 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
1de90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1dea0 69 66 20 53 51 4c 69 74 65 20 68 61 73 20 62 65  if SQLite has be
1deb0 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  en initialized a
1dec0 6e 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  nd SQLITE_ERROR 
1ded0 69 66 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20  if.    ** not.. 
1dee0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1def0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
1df00 53 49 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20 69  SINIT: {.      i
1df10 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
1df20 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30  Config.isInit==0
1df30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45   ) rc = SQLITE_E
1df40 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
1df50 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1df60 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1df70 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1df80 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c  STCTRL_IMPOSTER,
1df90 20 64 62 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f   db, dbName, onO
1dfa0 66 66 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 2a  ff, tnum);.    *
1dfb0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65  *.    ** This te
1dfc0 73 74 20 63 6f 6e 74 72 6f 6c 20 69 73 20 75 73  st control is us
1dfd0 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 6d 70  ed to create imp
1dfe0 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20 22  oster tables.  "
1dff0 64 62 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72  db" is a pointer
1e000 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64  .    ** to the d
1e010 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1e020 6f 6e 2e 20 20 64 62 4e 61 6d 65 20 69 73 20 74  on.  dbName is t
1e030 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
1e040 20 28 65 78 3a 20 22 6d 61 69 6e 22 20 6f 72 0a   (ex: "main" or.
1e050 20 20 20 20 2a 2a 20 22 74 65 6d 70 22 29 20 77      ** "temp") w
1e060 68 69 63 68 20 77 69 6c 6c 20 72 65 63 65 69 76  hich will receiv
1e070 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72 2e 20  e the imposter. 
1e080 20 22 6f 6e 4f 66 66 22 20 74 75 72 6e 73 20 69   "onOff" turns i
1e090 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 0a  mposter mode on.
1e0a0 20 20 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20      ** or off.  
1e0b0 22 74 6e 75 6d 22 20 69 73 20 74 68 65 20 72 6f  "tnum" is the ro
1e0c0 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
1e0d0 2d 74 72 65 65 20 74 6f 20 77 68 69 63 68 20 74  -tree to which t
1e0e0 68 65 20 69 6d 70 6f 73 74 65 72 0a 20 20 20 20  he imposter.    
1e0f0 2a 2a 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  ** table should 
1e100 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 2a 2a 0a  connect..    **.
1e110 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 69 6d      ** Enable im
1e120 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 6c 79  poster mode only
1e130 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
1e140 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1e150 6e 20 70 61 72 73 65 64 2e 20 20 54 68 65 6e 0a  n parsed.  Then.
1e160 20 20 20 20 2a 2a 20 72 75 6e 20 61 20 73 69 6e      ** run a sin
1e170 67 6c 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  gle CREATE TABLE
1e180 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 63 6f   statement to co
1e190 6e 73 74 72 75 63 74 20 74 68 65 20 69 6d 70 6f  nstruct the impo
1e1a0 73 74 65 72 20 74 61 62 6c 65 20 69 6e 0a 20 20  ster table in.  
1e1b0 20 20 2a 2a 20 74 68 65 20 70 61 72 73 65 64 20    ** the parsed 
1e1c0 73 63 68 65 6d 61 2e 20 20 54 68 65 6e 20 74 75  schema.  Then tu
1e1d0 72 6e 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65  rn imposter mode
1e1e0 20 62 61 63 6b 20 6f 66 66 20 61 67 61 69 6e 2e   back off again.
1e1f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1e200 66 20 6f 6e 4f 66 66 3d 3d 30 20 61 6e 64 20 74  f onOff==0 and t
1e210 6e 75 6d 3e 30 20 74 68 65 6e 20 72 65 73 65 74  num>0 then reset
1e220 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
1e230 61 6c 6c 20 64 61 74 61 62 61 73 65 73 2c 20 63  all databases, c
1e240 61 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  ausing.    ** th
1e250 65 20 73 63 68 65 6d 61 20 74 6f 20 62 65 20 72  e schema to be r
1e260 65 70 61 72 73 65 64 20 74 68 65 20 6e 65 78 74  eparsed the next
1e270 20 74 69 6d 65 20 69 74 20 69 73 20 6e 65 65 64   time it is need
1e280 65 64 2e 20 20 54 68 69 73 20 68 61 73 20 74 68  ed.  This has th
1e290 65 0a 20 20 20 20 2a 2a 20 65 66 66 65 63 74 20  e.    ** effect 
1e2a0 6f 66 20 65 72 61 73 69 6e 67 20 61 6c 6c 20 69  of erasing all i
1e2b0 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 0a  mposter tables..
1e2c0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1e2d0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e2e0 49 4d 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20  IMPOSTER: {.    
1e2f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1e300 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1e310 65 33 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e3*);.      sqli
1e320 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1e330 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
1e340 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d    db->init.iDb =
1e350 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
1e360 6d 65 28 64 62 2c 20 76 61 5f 61 72 67 28 61 70  me(db, va_arg(ap
1e370 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a  ,const char*));.
1e380 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62        db->init.b
1e390 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69  usy = db->init.i
1e3a0 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 3d 20 76  mposterTable = v
1e3b0 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
1e3c0 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65       db->init.ne
1e3d0 77 54 6e 75 6d 20 3d 20 76 61 5f 61 72 67 28 61  wTnum = va_arg(a
1e3e0 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  p,int);.      if
1e3f0 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
1e400 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e  =0 && db->init.n
1e410 65 77 54 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20  ewTnum>0 ){.    
1e420 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
1e430 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e  AllSchemasOfConn
1e440 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20  ection(db);.    
1e450 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1e460 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1e470 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
1e480 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1e490 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23  .  va_end(ap);.#
1e4a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1e4b0 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53  OMIT_BUILTIN_TES
1e4c0 54 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  T */.  return rc
1e4d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1e4e0 69 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75  is a utility rou
1e4f0 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20  tine, useful to 
1e500 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
1e510 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73  ons, that checks
1e520 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20  .** to see if a 
1e530 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 61  database file wa
1e540 73 20 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e  s a URI that con
1e550 74 61 69 6e 65 64 20 61 20 73 70 65 63 69 66 69  tained a specifi
1e560 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61  c query .** para
1e570 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f  meter, and if so
1e580 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c   obtains the val
1e590 75 65 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  ue of the query 
1e5a0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
1e5b0 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
1e5c0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
1e5d0 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20  ilename pointer 
1e5e0 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20  passed into the 
1e5f0 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f  xOpen().** metho
1e600 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65  d of a VFS imple
1e610 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
1e620 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20  zParam argument 
1e630 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
1e640 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61  he.** query para
1e650 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20  meter we seek.  
1e660 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1e670 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  urns the value o
1e680 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20  f the zParam.** 
1e690 70 61 72 61 6d 65 74 65 72 20 69 66 20 69 74 20  parameter if it 
1e6a0 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65 20  exists.  If the 
1e6b0 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e  parameter does n
1e6c0 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 72  ot exist, this r
1e6d0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
1e6e0 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
1e6f0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
1e700 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72  *sqlite3_uri_par
1e710 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61  ameter(const cha
1e720 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f  r *zFilename, co
1e730 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
1e740 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  ){.  if( zFilena
1e750 6d 65 3d 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d  me==0 || zParam=
1e760 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1e770 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
1e780 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
1e790 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
1e7a0 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65  while( zFilename
1e7b0 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78  [0] ){.    int x
1e7c0 20 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e   = strcmp(zFilen
1e7d0 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20  ame, zParam);.  
1e7e0 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
1e7f0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1e800 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
1e810 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65     if( x==0 ) re
1e820 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
1e830 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d      zFilename +=
1e840 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1e850 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b  (zFilename) + 1;
1e860 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1e870 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1e880 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
1e890 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72   for a query par
1e8a0 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ameter..*/.int s
1e8b0 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
1e8c0 61 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  an(const char *z
1e8d0 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20  Filename, const 
1e8e0 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e  char *zParam, in
1e8f0 74 20 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73  t bDflt){.  cons
1e900 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  t char *z = sqli
1e910 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
1e920 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  r(zFilename, zPa
1e930 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20  ram);.  bDflt = 
1e940 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75  bDflt!=0;.  retu
1e950 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65  rn z ? sqlite3Ge
1e960 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c  tBoolean(z, bDfl
1e970 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f  t) : bDflt;.}../
1e980 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34  *.** Return a 64
1e990 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
1e9a0 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20 70  ue for a query p
1e9b0 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c  arameter..*/.sql
1e9c0 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74  ite3_int64 sqlit
1e9d0 65 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20  e3_uri_int64(.  
1e9e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1e9f0 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c  ename,    /* Fil
1ea00 65 6e 61 6d 65 20 61 73 20 70 61 73 73 65 64 20  ename as passed 
1ea10 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f  to xOpen */.  co
1ea20 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
1ea30 2c 20 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70  ,       /* URI p
1ea40 61 72 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20  arameter sought 
1ea50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
1ea60 36 34 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f  64 bDflt       /
1ea70 2a 20 72 65 74 75 72 6e 20 69 66 20 70 61 72 61  * return if para
1ea80 6d 65 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67  meter is missing
1ea90 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
1eaa0 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
1eab0 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a  _uri_parameter(z
1eac0 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d  Filename, zParam
1ead0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  );.  sqlite3_int
1eae0 36 34 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26  64 v;.  if( z &&
1eaf0 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78   sqlite3DecOrHex
1eb00 54 6f 49 36 34 28 7a 2c 20 26 76 29 3d 3d 53 51  ToI64(z, &v)==SQ
1eb10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62  LITE_OK ){.    b
1eb20 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20  Dflt = v;.  }.  
1eb30 72 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a  return bDflt;.}.
1eb40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1eb50 65 20 42 74 72 65 65 20 70 6f 69 6e 74 65 72 20  e Btree pointer 
1eb60 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a 44  identified by zD
1eb70 62 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e  bName.  Return N
1eb80 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
1eb90 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69  ..*/.Btree *sqli
1eba0 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65  te3DbNameToBtree
1ebb0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
1ebc0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
1ebd0 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  e){.  int i;.  f
1ebe0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
1ebf0 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
1ec00 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 0a   db->aDb[i].pBt.
1ec10 20 20 20 20 20 26 26 20 28 7a 44 62 4e 61 6d 65       && (zDbName
1ec20 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
1ec30 72 49 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 64  rICmp(zDbName, d
1ec40 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29  b->aDb[i].zName)
1ec50 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0).    ){.    
1ec60 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 44 62    return db->aDb
1ec70 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 7d 0a 20  [i].pBt;.    }. 
1ec80 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1ec90 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1eca0 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74  he filename of t
1ecb0 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f  he database asso
1ecc0 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
1ecd0 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
1ece0 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  tion..*/.const c
1ecf0 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f  har *sqlite3_db_
1ed00 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 33  filename(sqlite3
1ed10 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
1ed20 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74   *zDbName){.  Bt
1ed30 72 65 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66  ree *pBt;.#ifdef
1ed40 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1ed50 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1ed60 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1ed70 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
1ed80 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
1ed90 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
1eda0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
1edb0 69 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74  if.  pBt = sqlit
1edc0 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28  e3DbNameToBtree(
1edd0 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  db, zDbName);.  
1ede0 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c  return pBt ? sql
1edf0 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
1ee00 6e 61 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d  name(pBt) : 0;.}
1ee10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  ../*.** Return 1
1ee20 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20   if database is 
1ee30 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69  read-only or 0 i
1ee40 66 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 52  f read/write.  R
1ee50 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e  eturn -1 if.** n
1ee60 6f 20 73 75 63 68 20 64 61 74 61 62 61 73 65 20  o such database 
1ee70 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  exists..*/.int s
1ee80 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e  qlite3_db_readon
1ee90 6c 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ly(sqlite3 *db, 
1eea0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
1eeb0 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  ame){.  Btree *p
1eec0 42 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  Bt;.#ifdef SQLIT
1eed0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1eee0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1eef0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1ef00 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
1ef10 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1ef20 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  PT;.    return -
1ef30 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  1;.  }.#endif.  
1ef40 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  pBt = sqlite3DbN
1ef50 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
1ef60 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  DbName);.  retur
1ef70 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42  n pBt ? sqlite3B
1ef80 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 70  treeIsReadonly(p
1ef90 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a 0a 23 69 66  Bt) : -1;.}..#if
1efa0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1efb0 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a  E_SNAPSHOT./*.**
1efc0 20 4f 62 74 61 69 6e 20 61 20 73 6e 61 70 73 68   Obtain a snapsh
1efd0 6f 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68  ot handle for th
1efe0 65 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 64 61  e snapshot of da
1eff0 74 61 62 61 73 65 20 7a 44 62 20 63 75 72 72 65  tabase zDb curre
1f000 6e 74 6c 79 20 0a 2a 2a 20 62 65 69 6e 67 20 72  ntly .** being r
1f010 65 61 64 20 62 79 20 68 61 6e 64 6c 65 20 64 62  ead by handle db
1f020 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f030 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 0a 20  _snapshot_get(. 
1f040 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
1f050 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1f060 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  ,.  sqlite3_snap
1f070 73 68 6f 74 20 2a 2a 70 70 53 6e 61 70 73 68 6f  shot **ppSnapsho
1f080 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t.){.  int rc = 
1f090 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69  SQLITE_ERROR;.#i
1f0a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f0b0 54 5f 57 41 4c 0a 20 20 69 6e 74 20 69 44 62 3b  T_WAL.  int iDb;
1f0c0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1f0d0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1f0e0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1f0f0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1f100 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1f110 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
1f120 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  T;.  }.#endif.  
1f130 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1f140 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1f150 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
1f160 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
1f170 44 62 29 3b 0a 20 20 69 66 28 20 69 44 62 3d 3d  Db);.  if( iDb==
1f180 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20  0 || iDb>1 ){.  
1f190 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
1f1a0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
1f1b0 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  .    if( 0==sqli
1f1c0 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
1f1d0 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
1f1e0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1f1f0 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c  eBeginTrans(pBt,
1f200 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1f210 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f220 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1f230 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f  ite3PagerSnapsho
1f240 74 47 65 74 28 73 71 6c 69 74 65 33 42 74 72 65  tGet(sqlite3Btre
1f250 65 50 61 67 65 72 28 70 42 74 29 2c 20 70 70 53  ePager(pBt), ppS
1f260 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20  napshot);.      
1f270 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  }.    }.  }..  s
1f280 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1f290 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23  ve(db->mutex);.#
1f2a0 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54  endif   /* SQLIT
1f2b0 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20  E_OMIT_WAL */.  
1f2c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f2d0 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d  .** Open a read-
1f2e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f2f0 68 65 20 73 6e 61 70 73 68 6f 74 20 69 64 65 6e  he snapshot iden
1f300 64 69 66 69 65 64 20 62 79 20 70 53 6e 61 70 73  dified by pSnaps
1f310 68 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  hot..*/.int sqli
1f320 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65  te3_snapshot_ope
1f330 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n(.  sqlite3 *db
1f340 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
1f350 2a 7a 44 62 2c 20 0a 20 20 73 71 6c 69 74 65 33  *zDb, .  sqlite3
1f360 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70  _snapshot *pSnap
1f370 73 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63  shot.){.  int rc
1f380 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1f390 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f3a0 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66  OMIT_WAL..#ifdef
1f3b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1f3c0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1f3d0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1f3e0 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
1f3f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1f400 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
1f410 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
1f420 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
1f430 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
1f440 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20  ->autoCommit==0 
1f450 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 0a  ){.    int iDb;.
1f460 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
1f470 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
1f480 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69 44  zDb);.    if( iD
1f490 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b  b==0 || iDb>1 ){
1f4a0 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
1f4b0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  t = db->aDb[iDb]
1f4c0 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
1f4d0 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 49  0==sqlite3BtreeI
1f4e0 73 49 6e 52 65 61 64 54 72 61 6e 73 28 70 42 74  sInReadTrans(pBt
1f4f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1f500 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e  = sqlite3PagerSn
1f510 61 70 73 68 6f 74 4f 70 65 6e 28 73 71 6c 69 74  apshotOpen(sqlit
1f520 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
1f530 29 2c 20 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20  ), pSnapshot);. 
1f540 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1f550 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f560 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f570 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
1f580 73 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  s(pBt, 0);.     
1f590 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1f5a0 72 53 6e 61 70 73 68 6f 74 4f 70 65 6e 28 73 71  rSnapshotOpen(sq
1f5b0 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
1f5c0 70 42 74 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  pBt), 0);.      
1f5d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1f5e0 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
1f5f0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1f600 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 20  >mutex);.#endif 
1f610 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    /* SQLITE_OMIT
1f620 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e  _WAL */.  return
1f630 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   rc;.}../*.** Fr
1f640 65 65 20 61 20 73 6e 61 70 73 68 6f 74 20 68 61  ee a snapshot ha
1f650 6e 64 6c 65 20 6f 62 74 61 69 6e 65 64 20 66 72  ndle obtained fr
1f660 6f 6d 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  om sqlite3_snaps
1f670 68 6f 74 5f 67 65 74 28 29 2e 0a 2a 2f 0a 76 6f  hot_get()..*/.vo
1f680 69 64 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  id sqlite3_snaps
1f690 68 6f 74 5f 66 72 65 65 28 73 71 6c 69 74 65 33  hot_free(sqlite3
1f6a0 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70  _snapshot *pSnap
1f6b0 73 68 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  shot){.  sqlite3
1f6c0 5f 66 72 65 65 28 70 53 6e 61 70 73 68 6f 74 29  _free(pSnapshot)
1f6d0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
1f6e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50  LITE_ENABLE_SNAP
1f6f0 53 48 4f 54 20 2a 2f 0a                          SHOT */.