/ Hex Artifact Content
Login

Artifact d88cf6d3a281c983f4e00a9fbe8be011504e5d98f06237639b3f546da57d197b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64  u.h".#endif.#ifd
0320: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0330: 5f 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74  _JSON1.int sqlit
0340: 65 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69  e3Json1Init(sqli
0350: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69  te3*);.#endif.#i
0360: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
0370: 4c 45 5f 46 54 53 35 0a 69 6e 74 20 73 71 6c 69  LE_FTS5.int sqli
0380: 74 65 33 46 74 73 35 49 6e 69 74 28 73 71 6c 69  te3Fts5Init(sqli
0390: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  te3*);.#endif..#
03a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d  ifndef SQLITE_AM
03b0: 41 4c 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d  ALGAMATION./* IM
03c0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
03d0: 20 52 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54   R-46656-45156 T
03e0: 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69  he sqlite3_versi
03f0: 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73  on[] string cons
0400: 74 61 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  tant.** contains
0410: 20 74 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c   the text of SQL
0420: 49 54 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72  ITE_VERSION macr
0430: 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  o. .*/.const cha
0440: 72 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  r sqlite3_versio
0450: 6e 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52  n[] = SQLITE_VER
0460: 53 49 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  SION;.#endif../*
0470: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0480: 4f 46 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37  OF: R-53536-4257
0490: 35 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  5 The sqlite3_li
04a0: 62 76 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74  bversion() funct
04b0: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61  ion returns.** a
04c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
04d0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  to the sqlite3_v
04e0: 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20  ersion[] string 
04f0: 63 6f 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f  constant. .*/.co
0500: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0510: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69  3_libversion(voi
0520: 64 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  d){ return sqlit
0530: 65 33 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f  e3_version; }../
0540: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
0550: 2d 4f 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33  -OF: R-63124-393
0560: 30 30 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73  00 The sqlite3_s
0570: 6f 75 72 63 65 69 64 28 29 20 66 75 6e 63 74 69  ourceid() functi
0580: 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20  on returns a.** 
0590: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
05a0: 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f  ing constant who
05b0: 73 65 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  se value is the 
05c0: 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53  same as the.** S
05d0: 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20  QLITE_SOURCE_ID 
05e0: 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d  C preprocessor m
05f0: 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20  acro. .*/.const 
0600: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f  char *sqlite3_so
0610: 75 72 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65  urceid(void){ re
0620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52  turn SQLITE_SOUR
0630: 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  CE_ID; }../* IMP
0640: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0650: 52 2d 33 35 32 31 30 2d 36 33 35 30 38 20 54 68  R-35210-63508 Th
0660: 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  e sqlite3_libver
0670: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75  sion_number() fu
0680: 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  nction.** return
0690: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75  s an integer equ
06a0: 61 6c 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52  al to SQLITE_VER
06b0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a  SION_NUMBER..*/.
06c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  int sqlite3_libv
06d0: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f  ersion_number(vo
06e0: 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  id){ return SQLI
06f0: 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
0700: 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  R; }../* IMPLEME
0710: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30  NTATION-OF: R-20
0720: 37 39 30 2d 31 34 30 32 35 20 54 68 65 20 73 71  790-14025 The sq
0730: 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65  lite3_threadsafe
0740: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
0750: 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61  rns.** zero if a
0760: 6e 64 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74  nd only if SQLit
0770: 65 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77  e was compiled w
0780: 69 74 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64  ith mutexing cod
0790: 65 20 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f  e omitted due to
07a0: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54  .** the SQLITE_T
07b0: 48 52 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c  HREADSAFE compil
07c0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65  e-time option be
07d0: 69 6e 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f  ing set to 0..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72  .int sqlite3_thr
07f0: 65 61 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72  eadsafe(void){ r
0800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52  eturn SQLITE_THR
0810: 45 41 44 53 41 46 45 3b 20 7d 0a 0a 2f 2a 0a 2a  EADSAFE; }../*.*
0820: 2a 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * When compiling
0830: 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72   the test fixtur
0840: 65 20 6f 72 20 77 69 74 68 20 64 65 62 75 67 67  e or with debugg
0850: 69 6e 67 20 65 6e 61 62 6c 65 64 20 28 6f 6e 20  ing enabled (on 
0860: 57 69 6e 33 32 29 2c 0a 2a 2a 20 74 68 69 73 20  Win32),.** this 
0870: 76 61 72 69 61 62 6c 65 20 62 65 69 6e 67 20 73  variable being s
0880: 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 77  et to non-zero w
0890: 69 6c 6c 20 63 61 75 73 65 20 4f 53 54 52 41 43  ill cause OSTRAC
08a0: 45 20 6d 61 63 72 6f 73 20 74 6f 20 65 6d 69 74  E macros to emit
08b0: 0a 2a 2a 20 65 78 74 72 61 20 64 69 61 67 6e 6f  .** extra diagno
08c0: 73 74 69 63 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  stic information
08d0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
08e0: 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
08f0: 0a 23 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  .# ifndef SQLITE
0900: 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 0a  _DEBUG_OS_TRACE.
0910: 23 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  #   define SQLIT
0920: 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45  E_DEBUG_OS_TRACE
0930: 20 30 0a 23 20 65 6e 64 69 66 0a 20 20 69 6e 74   0.# endif.  int
0940: 20 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 20   sqlite3OSTrace 
0950: 3d 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f  = SQLITE_DEBUG_O
0960: 53 5f 54 52 41 43 45 3b 0a 23 65 6e 64 69 66 0a  S_TRACE;.#endif.
0970: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0980: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
0990: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
09a0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
09b0: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E)./*.** If the 
09c0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
09d0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  on pointer is no
09e0: 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a 2a 2a  t NULL and if.**
09f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
0a00: 4f 54 52 41 43 45 20 69 73 20 65 6e 61 62 6c 65  OTRACE is enable
0a10: 64 2c 20 74 68 65 6e 20 6d 65 73 73 61 67 65 73  d, then messages
0a20: 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20 49   describing.** I
0a30: 2f 4f 20 61 63 74 69 76 65 20 61 72 65 20 77 72  /O active are wr
0a40: 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68 69 73  itten using this
0a50: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 73   function.  Thes
0a60: 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20 61 72  e messages.** ar
0a70: 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 64  e intended for d
0a80: 65 62 75 67 67 69 6e 67 20 61 63 74 69 76 69 74  ebugging activit
0a90: 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53 51 4c 49 54  y only..*/.SQLIT
0aa0: 45 5f 41 50 49 20 76 6f 69 64 20 28 53 51 4c 49  E_API void (SQLI
0ab0: 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74 65  TE_CDECL *sqlite
0ac0: 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20  3IoTrace)(const 
0ad0: 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b  char*, ...) = 0;
0ae0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
0af0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0b00: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
0b10: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
0b20: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  ng which is the.
0b30: 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  ** name of a dir
0b40: 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61  ectory, then tha
0b50: 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  t directory will
0b60: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
0b70: 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66  e.** temporary f
0b80: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  iles..**.** See 
0b90: 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41  also the "PRAGMA
0ba0: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
0bb0: 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61  ctory" SQL comma
0bc0: 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nd..*/.char *sql
0bd0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
0be0: 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ory = 0;../*.** 
0bf0: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0c00: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0c10: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0c20: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0c30: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0c40: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0c50: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0c60: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0c70: 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62 61  re.** all databa
0c80: 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66 69  se files specifi
0c90: 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ed with a relati
0ca0: 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a 0a  ve pathname..**.
0cb0: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  ** See also the 
0cc0: 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f  "PRAGMA data_sto
0cd0: 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53 51  re_directory" SQ
0ce0: 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68  L command..*/.ch
0cf0: 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74 61  ar *sqlite3_data
0d00: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  _directory = 0;.
0d10: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0d20: 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a 2a  e SQLite.  .**.*
0d30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0d40: 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ust be called to
0d50: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
0d60: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
0d70: 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20 6d  n,.** VFS, and m
0d80: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73 20  utex subsystems 
0d90: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61  prior to doing a
0da0: 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b 20  ny serious work 
0db0: 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e 20  with.** SQLite. 
0dc0: 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73 20   But as long as 
0dd0: 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70 69  you do not compi
0de0: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f  le with SQLITE_O
0df0: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a 20  MIT_AUTOINIT.** 
0e00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
0e10: 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74 6f  l be called auto
0e20: 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65 79  matically by key
0e30: 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20 61   routines such a
0e40: 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  s.** sqlite3_ope
0e50: 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  n().  .**.** Thi
0e60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
0e70: 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20 69  o-op except on i
0e80: 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63 61  ts very first ca
0e90: 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63 65  ll for the proce
0ea0: 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74 68  ss,.** or for th
0eb0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66 74  e first call aft
0ec0: 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
0ed0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a 2a  ite3_shutdown..*
0ee0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
0ef0: 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74 68  hread to call th
0f00: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
0f10: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
0f20: 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65 74  on to.** complet
0f30: 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71 75  ion.  If subsequ
0f40: 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c 6c  ent threads call
0f50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
0f60: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  fore the first.*
0f70: 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69 6e  * thread has fin
0f80: 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69 61  ished the initia
0f90: 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73  lization process
0fa0: 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73 65  , then the subse
0fb0: 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64 73  quent.** threads
0fc0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fd0: 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  l the first thre
0fe0: 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74 68  ad finishes with
0ff0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1000: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
1010: 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67 68  irst thread migh
1020: 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  t call this rout
1030: 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79 2e  ine recursively.
1040: 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20 63    Recursive.** c
1050: 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75  alls to this rou
1060: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tine should not 
1070: 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73 65  block, of course
1080: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
1090: 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  .** initializati
10a0: 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c 64  on process would
10b0: 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65 2e   never complete.
10c0: 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65 20  .**.** Let X be 
10d0: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  the first thread
10e0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 72   to enter this r
10f0: 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20 62  outine.  Let Y b
1100: 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  e some other.** 
1110: 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77 68  thread.  Then wh
1120: 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ile the initial 
1130: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  invocation of th
1140: 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58 20  is routine by X 
1150: 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74 65  is.** incomplete
1160: 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65 64  , it is required
1170: 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   that:.**.**    
1180: 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69 73  *  Calls to this
1190: 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59 20   routine from Y 
11a0: 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69 6c  must block until
11b0: 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74 0a   the outer-most.
11c0: 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62 79  **       call by
11d0: 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a 2a   X completes..**
11e0: 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72 73  .**    *  Recurs
11f0: 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68 69  ive calls to thi
1200: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
1210: 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20 69  hread X return i
1220: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
1230: 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f 63      without bloc
1240: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
1250: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1260: 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f 4c  void){.  MUTEX_L
1270: 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
1280: 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20  tex *pMaster; ) 
1290: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
12a0: 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a  n static mutex *
12b0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1300: 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69 6e  _EXTRA_INIT.  in
1310: 74 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20  t bRunExtraInit 
1320: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
1340: 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  tra initializati
1350: 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6e  on needed */.#en
1360: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1370: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63  TE_OMIT_WSD.  rc
1380: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
1390: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
13a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13b0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
13c0: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
13d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 6f 6c  .  /* If the fol
13e0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20  lowing assert() 
13f0: 66 61 69 6c 73 20 6f 6e 20 73 6f 6d 65 20 6f 62  fails on some ob
1400: 73 63 75 72 65 20 70 72 6f 63 65 73 73 6f 72 2f  scure processor/
1410: 63 6f 6d 70 69 6c 65 72 0a 20 20 2a 2a 20 63 6f  compiler.  ** co
1420: 6d 62 69 6e 61 74 69 6f 6e 2c 20 74 68 65 20 77  mbination, the w
1430: 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 74 6f  ork-around is to
1440: 20 73 65 74 20 74 68 65 20 63 6f 72 72 65 63 74   set the correct
1450: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 73 69   pointer.  ** si
1460: 7a 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ze at compile-ti
1470: 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  me using -DSQLIT
1480: 45 5f 50 54 52 53 49 5a 45 3d 6e 20 63 6f 6d 70  E_PTRSIZE=n comp
1490: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
14a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  */.  assert( SQL
14b0: 49 54 45 5f 50 54 52 53 49 5a 45 3d 3d 73 69 7a  ITE_PTRSIZE==siz
14c0: 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 0a 20  eof(char*) );.. 
14d0: 20 2f 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73   /* If SQLite is
14e0: 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c 65 74   already complet
14f0: 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  ely initialized,
1500: 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 0a   then this call.
1510: 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
1520: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 73 68 6f  initialize() sho
1530: 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20  uld be a no-op. 
1540: 20 42 75 74 20 74 68 65 20 69 6e 69 74 69 61 6c   But the initial
1550: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d 75 73  ization.  ** mus
1560: 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e 20 20  t be complete.  
1570: 53 6f 20 69 73 49 6e 69 74 20 6d 75 73 74 20 6e  So isInit must n
1580: 6f 74 20 62 65 20 73 65 74 20 75 6e 74 69 6c 20  ot be set until 
1590: 74 68 65 20 76 65 72 79 20 65 6e 64 0a 20 20 2a  the very end.  *
15a0: 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * of this routin
15b0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  e..  */.  if( sq
15c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15d0: 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72  g.isInit ) retur
15e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
15f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
1600: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
1610: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   is initialized.
1620: 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 0a    If unable to .
1630: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
1640: 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  the mutex subsys
1650: 74 65 6d 2c 20 72 65 74 75 72 6e 20 65 61 72 6c  tem, return earl
1660: 79 20 77 69 74 68 20 74 68 65 20 65 72 72 6f 72  y with the error
1670: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 79  ..  ** If the sy
1680: 73 74 65 6d 20 69 73 20 73 6f 20 73 69 63 6b 20  stem is so sick 
1690: 74 68 61 74 20 77 65 20 61 72 65 20 75 6e 61 62  that we are unab
16a0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  le to allocate a
16b0: 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20 74 68 65   mutex,.  ** the
16c0: 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 53  re is not much S
16d0: 51 4c 69 74 65 20 69 73 20 67 6f 69 6e 67 20 74  QLite is going t
16e0: 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 2e  o be able to do.
16f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d  .  **.  ** The m
1700: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 20 6d  utex subsystem m
1710: 75 73 74 20 74 61 6b 65 20 63 61 72 65 20 6f 66  ust take care of
1720: 20 73 65 72 69 61 6c 69 7a 69 6e 67 20 69 74 73   serializing its
1730: 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69 74 69 61   own.  ** initia
1740: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  lization..  */. 
1750: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 75 74   rc = sqlite3Mut
1760: 65 78 49 6e 69 74 28 29 3b 0a 20 20 69 66 28 20  exInit();.  if( 
1770: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1780: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1790: 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20 73 79   the malloc() sy
17a0: 73 74 65 6d 20 61 6e 64 20 74 68 65 20 72 65 63  stem and the rec
17b0: 75 72 73 69 76 65 20 70 49 6e 69 74 4d 75 74 65  ursive pInitMute
17c0: 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a 20 54 68  x mutex..  ** Th
17d0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  is operation is 
17e0: 70 72 6f 74 65 63 74 65 64 20 62 79 20 74 68 65  protected by the
17f0: 20 53 54 41 54 49 43 5f 4d 41 53 54 45 52 20 6d   STATIC_MASTER m
1800: 75 74 65 78 2e 20 20 4e 6f 74 65 20 74 68 61 74  utex.  Note that
1810: 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c 6c 6f 63  .  ** MutexAlloc
1820: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  () is called for
1830: 20 61 20 73 74 61 74 69 63 20 6d 75 74 65 78 20   a static mutex 
1840: 70 72 69 6f 72 20 74 6f 20 69 6e 69 74 69 61 6c  prior to initial
1850: 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6d  izing the.  ** m
1860: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20  alloc subsystem 
1870: 2d 20 74 68 69 73 20 69 6d 70 6c 69 65 73 20 74  - this implies t
1880: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
1890: 6f 6e 20 6f 66 20 61 20 73 74 61 74 69 63 0a 20  on of a static. 
18a0: 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74 20 6e   ** mutex must n
18b0: 6f 74 20 72 65 71 75 69 72 65 20 73 75 70 70 6f  ot require suppo
18c0: 72 74 20 66 72 6f 6d 20 74 68 65 20 6d 61 6c 6c  rt from the mall
18d0: 6f 63 20 73 75 62 73 79 73 74 65 6d 2e 0a 20 20  oc subsystem..  
18e0: 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  */.  MUTEX_LOGIC
18f0: 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69  ( pMaster = sqli
1900: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
1910: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1920: 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73  C_MASTER); ).  s
1930: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1940: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
1950: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1960: 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d  ig.isMutexInit =
1970: 20 31 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   1;.  if( !sqlit
1980: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1990: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
19a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
19b0: 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a 20 20 7d  allocInit();.  }
19c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
19e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
19f0: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 31  isMallocInit = 1
1a00: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
1a10: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1a20: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1a30: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1a40: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
1a50: 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 73  x =.           s
1a60: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1a70: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
1a80: 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20 20  CURSIVE);.      
1a90: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1aa0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
1ab0: 65 78 20 26 26 20 21 73 71 6c 69 74 65 33 47 6c  ex && !sqlite3Gl
1ac0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1ad0: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
1ae0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1af0: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
1b00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1b10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  {.    sqlite3Glo
1b30: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
1b40: 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20  itMutex++;.  }. 
1b50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1b60: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a  eave(pMaster);..
1b70: 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f    /* If rc is no
1b80: 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74  t SQLITE_OK at t
1b90: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
1ba0: 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f  either the mallo
1bb0: 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d  c.  ** subsystem
1bc0: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e   could not be in
1bd0: 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65  itialized or the
1be0: 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74   system failed t
1bf0: 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20  o allocate.  ** 
1c00: 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d  the pInitMutex m
1c10: 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20  utex. Return an 
1c20: 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20  error in either 
1c30: 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  case.  */.  if( 
1c40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c50: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1c60: 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65    }..  /* Do the
1c70: 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69   rest of the ini
1c80: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65  tialization unde
1c90: 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  r the recursive 
1ca0: 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68  mutex so.  ** th
1cb0: 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62  at we will be ab
1cc0: 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63  le to handle rec
1cd0: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74  ursive calls int
1ce0: 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69  o.  ** sqlite3_i
1cf0: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68  nitialize().  Th
1d00: 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1d10: 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20  s normally come 
1d20: 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c  through.  ** sql
1d30: 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77  ite3_os_init() w
1d40: 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73  hen it invokes s
1d50: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1d60: 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72  ter(), but other
1d70: 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20  .  ** recursive 
1d80: 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f  calls might also
1d90: 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20   be possible..  
1da0: 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
1db0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31  TATION-OF: R-001
1dc0: 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20  40-37445 SQLite 
1dd0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
1de0: 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20  rializes calls. 
1df0: 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74   ** to the xInit
1e00: 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20   method, so the 
1e10: 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65  xInit method nee
1e20: 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73  d not be threads
1e30: 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  afe..  **.  ** T
1e40: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74  he following mut
1e50: 65 78 20 69 73 20 77 68 61 74 20 73 65 72 69 61  ex is what seria
1e60: 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20  lizes access to 
1e70: 74 68 65 20 61 70 70 64 65 66 20 70 63 61 63 68  the appdef pcach
1e80: 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74  e xInit.  ** met
1e90: 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74  hods.  The sqlit
1ea0: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
1eb0: 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73  s.xInit() all is
1ec0: 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65   embedded in the
1ed0: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
1ee0: 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69  lite3PcacheIniti
1ef0: 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  alize()..  */.  
1f00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1f10: 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ter(sqlite3Globa
1f20: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
1f30: 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ex);.  if( sqlit
1f40: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1f50: 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69  sInit==0 && sqli
1f60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f70: 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b  inProgress==0 ){
1f80: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
1f90: 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72  alConfig.inProgr
1fa0: 65 73 73 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  ess = 1;.#ifdef 
1fb0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
1fc0: 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20 20 20 20 20  LLOG.    {.     
1fd0: 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c   extern void sql
1fe0: 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c 6f 67  ite3_init_sqllog
1ff0: 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 73 71  (void);.      sq
2000: 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c 6f  lite3_init_sqllo
2010: 67 28 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  g();.    }.#endi
2020: 66 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71  f.    memset(&sq
2030: 6c 69 74 65 33 42 75 69 6c 74 69 6e 46 75 6e 63  lite3BuiltinFunc
2040: 74 69 6f 6e 73 2c 20 30 2c 20 73 69 7a 65 6f 66  tions, 0, sizeof
2050: 28 73 71 6c 69 74 65 33 42 75 69 6c 74 69 6e 46  (sqlite3BuiltinF
2060: 75 6e 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20  unctions));.    
2070: 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 42  sqlite3RegisterB
2080: 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28  uiltinFunctions(
2090: 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
20a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
20b0: 73 50 43 61 63 68 65 49 6e 69 74 3d 3d 30 20 29  sPCacheInit==0 )
20c0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20d0: 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61  ite3PcacheInitia
20e0: 6c 69 7a 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20  lize();.    }.  
20f0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2100: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
2110: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2120: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2130: 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  1;.      rc = sq
2140: 6c 69 74 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20  lite3OsInit();. 
2150: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2160: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2170: 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63 68      sqlite3PCach
2180: 65 42 75 66 66 65 72 53 65 74 75 70 28 20 73 71  eBufferSetup( sq
2190: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
21a0: 67 2e 70 50 61 67 65 2c 20 0a 20 20 20 20 20 20  g.pPage, .      
21b0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
21c0: 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20  lConfig.szPage, 
21d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
21e0: 66 69 67 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20  fig.nPage);.    
21f0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2200: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 31  onfig.isInit = 1
2210: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2220: 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 20 20 20  EXTRA_INIT.     
2230: 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20 3d   bRunExtraInit =
2240: 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d   1;.#endif.    }
2250: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2260: 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72  alConfig.inProgr
2270: 65 73 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  ess = 0;.  }.  s
2280: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
2290: 76 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ve(sqlite3Global
22a0: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
22b0: 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63  x);..  /* Go bac
22c0: 6b 20 75 6e 64 65 72 20 74 68 65 20 73 74 61 74  k under the stat
22d0: 69 63 20 6d 75 74 65 78 20 61 6e 64 20 63 6c 65  ic mutex and cle
22e0: 61 6e 20 75 70 20 74 68 65 20 72 65 63 75 72 73  an up the recurs
22f0: 69 76 65 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74  ive.  ** mutex t
2300: 6f 20 70 72 65 76 65 6e 74 20 61 20 72 65 73 6f  o prevent a reso
2310: 75 72 63 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a  urce leak..  */.
2320: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2330: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
2340: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2350: 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75  onfig.nRefInitMu
2360: 74 65 78 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c  tex--;.  if( sql
2370: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2380: 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d  .nRefInitMutex<=
2390: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
23a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
23b0: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
23c0: 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ex==0 );.    sql
23d0: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
23e0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
23f0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b  fig.pInitMutex);
2400: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2410: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
2420: 74 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  tex = 0;.  }.  s
2430: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
2440: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20  ve(pMaster);..  
2450: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
2460: 20 69 73 20 6a 75 73 74 20 61 20 73 61 6e 69 74   is just a sanit
2470: 79 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  y check to make 
2480: 73 75 72 65 20 53 51 4c 69 74 65 20 68 61 73 0a  sure SQLite has.
2490: 20 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c    ** been compil
24a0: 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49  ed correctly.  I
24b0: 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
24c0: 6f 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 2c  o run this code,
24d0: 20 62 75 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e   but.  ** we don
24e0: 27 74 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 69  't want to run i
24f0: 74 20 74 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20  t too often and 
2500: 73 6f 61 6b 20 75 70 20 43 50 55 20 63 79 63 6c  soak up CPU cycl
2510: 65 73 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72  es for no.  ** r
2520: 65 61 73 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75  eason.  So we ru
2530: 6e 20 69 74 20 6f 6e 63 65 20 64 75 72 69 6e 67  n it once during
2540: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e   initialization.
2550: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  .  */.#ifndef ND
2560: 45 42 55 47 0a 23 69 66 6e 64 65 66 20 53 51 4c  EBUG.#ifndef SQL
2570: 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
2580: 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69  G_POINT.  /* Thi
2590: 73 20 73 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64  s section of cod
25a0: 65 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74  e's only "output
25b0: 22 20 69 73 20 76 69 61 20 61 73 73 65 72 74 28  " is via assert(
25c0: 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f  ) statements. */
25d0: 0a 20 20 69 66 20 28 20 72 63 3d 3d 53 51 4c 49  .  if ( rc==SQLI
25e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34  TE_OK ){.    u64
25f0: 20 78 20 3d 20 28 28 28 75 36 34 29 31 29 3c 3c   x = (((u64)1)<<
2600: 36 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c  63)-1;.    doubl
2610: 65 20 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e y;.    assert(
2620: 73 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20  sizeof(x)==8);. 
2630: 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66     assert(sizeof
2640: 28 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b  (x)==sizeof(y));
2650: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 79 2c 20  .    memcpy(&y, 
2660: 26 78 2c 20 38 29 3b 0a 20 20 20 20 61 73 73 65  &x, 8);.    asse
2670: 72 74 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  rt( sqlite3IsNaN
2680: 28 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  (y) );.  }.#endi
2690: 66 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  f.#endif..  /* D
26a0: 6f 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69  o extra initiali
26b0: 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 72 65 71  zation steps req
26c0: 75 65 73 74 65 64 20 62 79 20 74 68 65 20 53 51  uested by the SQ
26d0: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
26e0: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d    ** compile-tim
26f0: 65 20 6f 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  e option..  */.#
2700: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54  ifdef SQLITE_EXT
2710: 52 41 5f 49 4e 49 54 0a 20 20 69 66 28 20 62 52  RA_INIT.  if( bR
2720: 75 6e 45 78 74 72 61 49 6e 69 74 20 29 7b 0a 20  unExtraInit ){. 
2730: 20 20 20 69 6e 74 20 53 51 4c 49 54 45 5f 45 58     int SQLITE_EX
2740: 54 52 41 5f 49 4e 49 54 28 63 6f 6e 73 74 20 63  TRA_INIT(const c
2750: 68 61 72 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  har*);.    rc = 
2760: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2770: 54 28 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  T(0);.  }.#endif
2780: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2790: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65  ../*.** Undo the
27a0: 20 65 66 66 65 63 74 73 20 6f 66 20 73 71 6c 69   effects of sqli
27b0: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
27c0: 2e 20 20 4d 75 73 74 20 6e 6f 74 20 62 65 20 63  .  Must not be c
27d0: 61 6c 6c 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74  alled while.** t
27e0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
27f0: 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f  ding database co
2800: 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d  nnections or mem
2810: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ory allocations 
2820: 6f 72 0a 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20  or.** while any 
2830: 70 61 72 74 20 6f 66 20 53 51 4c 69 74 65 20 69  part of SQLite i
2840: 73 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75  s otherwise in u
2850: 73 65 20 69 6e 20 61 6e 79 20 74 68 72 65 61 64  se in any thread
2860: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
2870: 6e 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  ne is not thread
2880: 73 61 66 65 2e 20 20 42 75 74 20 69 74 20 69 73  safe.  But it is
2890: 20 73 61 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20   safe to invoke 
28a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
28b0: 6f 6e 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69  on when SQLite i
28c0: 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20 64  s already shut d
28d0: 6f 77 6e 2e 20 20 49 66 20 53 51 4c 69 74 65 20  own.  If SQLite 
28e0: 69 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20  is already shut 
28f0: 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69  down.** when thi
2900: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
2910: 6f 6b 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  oked, then this 
2920: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72  routine is a har
2930: 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  mless no-op..*/.
2940: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74  int sqlite3_shut
2950: 64 6f 77 6e 28 76 6f 69 64 29 7b 0a 23 69 66 64  down(void){.#ifd
2960: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2970: 53 44 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  SD.  int rc = sq
2980: 6c 69 74 65 33 5f 77 73 64 5f 69 6e 69 74 28 34  lite3_wsd_init(4
2990: 30 39 36 2c 20 32 34 29 3b 0a 20 20 69 66 28 20  096, 24);.  if( 
29a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
29c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
29d0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
29e0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a  onfig.isInit ){.
29f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58  #ifdef SQLITE_EX
2a00: 54 52 41 5f 53 48 55 54 44 4f 57 4e 0a 20 20 20  TRA_SHUTDOWN.   
2a10: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 45 58 54   void SQLITE_EXT
2a20: 52 41 5f 53 48 55 54 44 4f 57 4e 28 76 6f 69 64  RA_SHUTDOWN(void
2a30: 29 3b 0a 20 20 20 20 53 51 4c 49 54 45 5f 45 58  );.    SQLITE_EX
2a40: 54 52 41 5f 53 48 55 54 44 4f 57 4e 28 29 3b 0a  TRA_SHUTDOWN();.
2a50: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
2a60: 65 33 5f 6f 73 5f 65 6e 64 28 29 3b 0a 20 20 20  e3_os_end();.   
2a70: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 5f 61   sqlite3_reset_a
2a80: 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28 29 3b  uto_extension();
2a90: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2aa0: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
2ab0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
2ac0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2ad0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20  ig.isPCacheInit 
2ae0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
2af0: 61 63 68 65 53 68 75 74 64 6f 77 6e 28 29 3b 0a  acheShutdown();.
2b00: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2b10: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
2b20: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
2b30: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2b40: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
2b50: 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Init ){.    sqli
2b60: 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a  te3MallocEnd();.
2b70: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2b80: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
2b90: 49 6e 69 74 20 3d 20 30 3b 0a 0a 23 69 66 6e 64  Init = 0;..#ifnd
2ba0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2bb0: 48 55 54 44 4f 57 4e 5f 44 49 52 45 43 54 4f 52  HUTDOWN_DIRECTOR
2bc0: 49 45 53 0a 20 20 20 20 2f 2a 20 54 68 65 20 68  IES.    /* The h
2bd0: 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 68 61  eap subsystem ha
2be0: 73 20 6e 6f 77 20 62 65 65 6e 20 73 68 75 74 64  s now been shutd
2bf0: 6f 77 6e 20 61 6e 64 20 74 68 65 73 65 20 76 61  own and these va
2c00: 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65  lues are suppose
2c10: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 4e  d.    ** to be N
2c20: 55 4c 4c 20 6f 72 20 70 6f 69 6e 74 20 74 6f 20  ULL or point to 
2c30: 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20  memory that was 
2c40: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2c50: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 0a  lite3_malloc(),.
2c60: 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f 75      ** which wou
2c70: 6c 64 20 72 65 6c 79 20 6f 6e 20 74 68 61 74 20  ld rely on that 
2c80: 68 65 61 70 20 73 75 62 73 79 73 74 65 6d 3b 20  heap subsystem; 
2c90: 74 68 65 72 65 66 6f 72 65 2c 20 6d 61 6b 65 20  therefore, make 
2ca0: 73 75 72 65 20 74 68 65 73 65 0a 20 20 20 20 2a  sure these.    *
2cb0: 2a 20 76 61 6c 75 65 73 20 63 61 6e 6e 6f 74 20  * values cannot 
2cc0: 72 65 66 65 72 20 74 6f 20 68 65 61 70 20 6d 65  refer to heap me
2cd0: 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20 6a 75  mory that was ju
2ce0: 73 74 20 69 6e 76 61 6c 69 64 61 74 65 64 20 77  st invalidated w
2cf0: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 68  hen the.    ** h
2d00: 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 77 61  eap subsystem wa
2d10: 73 20 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69  s shutdown.  Thi
2d20: 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 69  s is only done i
2d30: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61  f the current ca
2d40: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 69  ll to.    ** thi
2d50: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 75 6c  s function resul
2d60: 74 65 64 20 69 6e 20 74 68 65 20 68 65 61 70 20  ted in the heap 
2d70: 73 75 62 73 79 73 74 65 6d 20 61 63 74 75 61 6c  subsystem actual
2d80: 6c 79 20 62 65 69 6e 67 20 73 68 75 74 64 6f 77  ly being shutdow
2d90: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  n..    */.    sq
2da0: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
2db0: 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20 73 71  tory = 0;.    sq
2dc0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
2dd0: 74 6f 72 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66  tory = 0;.#endif
2de0: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2df0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2e00: 73 4d 75 74 65 78 49 6e 69 74 20 29 7b 0a 20 20  sMutexInit ){.  
2e10: 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 45 6e    sqlite3MutexEn
2e20: 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d();.    sqlite3
2e30: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
2e40: 75 74 65 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20  utexInit = 0;.  
2e50: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
2e60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2e70: 54 68 69 73 20 41 50 49 20 61 6c 6c 6f 77 73 20  This API allows 
2e80: 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20  applications to 
2e90: 6d 6f 64 69 66 79 20 74 68 65 20 67 6c 6f 62 61  modify the globa
2ea0: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  l configuration 
2eb0: 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  of.** the SQLite
2ec0: 20 6c 69 62 72 61 72 79 20 61 74 20 72 75 6e 2d   library at run-
2ed0: 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  time..**.** This
2ee0: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
2ef0: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
2f00: 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
2f10: 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20   outstanding.** 
2f20: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2f30: 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61  ions or memory a
2f40: 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 69  llocations.  Thi
2f50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
2f60: 0a 2a 2a 20 74 68 72 65 61 64 73 61 66 65 2e 20  .** threadsafe. 
2f70: 20 46 61 69 6c 75 72 65 20 74 6f 20 68 65 65 64   Failure to heed
2f80: 20 74 68 65 73 65 20 77 61 72 6e 69 6e 67 73 20   these warnings 
2f90: 63 61 6e 20 6c 65 61 64 20 74 6f 20 75 6e 70 72  can lead to unpr
2fa0: 65 64 69 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68  edictable.** beh
2fb0: 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  avior..*/.int sq
2fc0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74  lite3_config(int
2fd0: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
2fe0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
2ff0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
3000: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e    /* sqlite3_con
3010: 66 69 67 28 29 20 73 68 61 6c 6c 20 72 65 74 75  fig() shall retu
3020: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
3030: 20 69 66 20 69 74 20 69 73 20 69 6e 76 6f 6b 65   if it is invoke
3040: 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65  d while.  ** the
3050: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
3060: 69 73 20 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20  is in use. */.  
3070: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
3080: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29  lConfig.isInit )
3090: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
30a0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76  ISUSE_BKPT;..  v
30b0: 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
30c0: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
30d0: 0a 0a 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 63  ..    /* Mutex c
30e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
30f0: 69 6f 6e 73 20 61 72 65 20 6f 6e 6c 79 20 61 76  ions are only av
3100: 61 69 6c 61 62 6c 65 20 69 6e 20 61 20 74 68 72  ailable in a thr
3110: 65 61 64 73 61 66 65 0a 20 20 20 20 2a 2a 20 63  eadsafe.    ** c
3120: 6f 6d 70 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 23  ompile..    */.#
3130: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3140: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
3150: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
3160: 46 45 3e 30 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  FE>0  /* IMP: R-
3170: 35 34 34 36 36 2d 34 36 37 35 36 20 2a 2f 0a 20  54466-46756 */. 
3180: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3190: 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45  ONFIG_SINGLETHRE
31a0: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  AD: {.      /* E
31b0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 32  VIDENCE-OF: R-02
31c0: 37 34 38 2d 31 39 30 39 36 20 54 68 69 73 20 6f  748-19096 This o
31d0: 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 74  ption sets the t
31e0: 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f  hreading mode to
31f0: 0a 20 20 20 20 20 20 2a 2a 20 53 69 6e 67 6c 65  .      ** Single
3200: 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20  -thread. */.    
3210: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3220: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
3230: 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c   = 0;  /* Disabl
3240: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65 20  e mutex on core 
3250: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3260: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
3270: 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a  llMutex = 0;  /*
3280: 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20 6f   Disable mutex o
3290: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  n connections */
32a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
32b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
32c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48  efined(SQLITE_TH
32d0: 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c  READSAFE) && SQL
32e0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
32f0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 30 35 32 30   /* IMP: R-20520
3300: 2d 35 34 30 38 36 20 2a 2f 0a 20 20 20 20 63 61  -54086 */.    ca
3310: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3320: 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a  _MULTITHREAD: {.
3330: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3340: 45 2d 4f 46 3a 20 52 2d 31 34 33 37 34 2d 34 32  E-OF: R-14374-42
3350: 34 36 38 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  468 This option 
3360: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
3370: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3380: 20 2a 2a 20 4d 75 6c 74 69 2d 74 68 72 65 61 64   ** Multi-thread
3390: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
33a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
33b0: 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20  CoreMutex = 1;  
33c0: 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20  /* Enable mutex 
33d0: 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20  on core */.     
33e0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
33f0: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
3400: 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65  = 0;  /* Disable
3410: 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63   mutex on connec
3420: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62  tions */.      b
3430: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
3440: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
3450: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
3460: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
3470: 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a  ADSAFE>0 /* IMP:
3480: 20 52 2d 35 39 35 39 33 2d 32 31 38 31 30 20 2a   R-59593-21810 *
3490: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
34a0: 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49  E_CONFIG_SERIALI
34b0: 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ZED: {.      /* 
34c0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
34d0: 31 32 32 30 2d 35 31 38 30 30 20 54 68 69 73 20  1220-51800 This 
34e0: 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  option sets the 
34f0: 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20 74  threading mode t
3500: 6f 0a 20 20 20 20 20 20 2a 2a 20 53 65 72 69 61  o.      ** Seria
3510: 6c 69 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  lized. */.      
3520: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3530: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d  fig.bCoreMutex =
3540: 20 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d   1;  /* Enable m
3550: 75 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a  utex on core */.
3560: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3570: 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
3580: 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e  utex = 1;  /* En
3590: 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f  able mutex on co
35a0: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  nnections */.   
35b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
35c0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
35d0: 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ed(SQLITE_THREAD
35e0: 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f  SAFE) && SQLITE_
35f0: 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a 20  THREADSAFE>0 /* 
3600: 49 4d 50 3a 20 52 2d 36 33 36 36 36 2d 34 38 37  IMP: R-63666-487
3610: 35 35 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  55 */.    case S
3620: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54  QLITE_CONFIG_MUT
3630: 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53  EX: {.      /* S
3640: 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e  pecify an altern
3650: 61 74 69 76 65 20 6d 75 74 65 78 20 69 6d 70 6c  ative mutex impl
3660: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
3670: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3680: 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20  lConfig.mutex = 
3690: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
36a0: 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64  te3_mutex_method
36b0: 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  s*);.      break
36c0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
36d0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
36e0: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
36f0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
3700: 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 31  FE>0 /* IMP: R-1
3710: 34 34 35 30 2d 33 37 35 39 37 20 2a 2f 0a 20 20  4450-37597 */.  
3720: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3730: 4e 46 49 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b  NFIG_GETMUTEX: {
3740: 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65  .      /* Retrie
3750: 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  ve the current m
3760: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
3770: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61  ion */.      *va
3780: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3790: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29  _mutex_methods*)
37a0: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
37b0: 43 6f 6e 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20  Config.mutex;.  
37c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
37d0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
37e0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
37f0: 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20  MALLOC: {.      
3800: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
3810: 52 2d 35 35 35 39 34 2d 32 31 30 33 30 20 54 68  R-55594-21030 Th
3820: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3830: 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61  MALLOC option ta
3840: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
3850: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
3860: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
3870: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
3880: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
3890: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
38a0: 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20  hods structure. 
38b0: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 73 70 65  The argument spe
38c0: 63 69 66 69 65 73 20 61 6c 74 65 72 6e 61 74 69  cifies alternati
38d0: 76 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 2d  ve.      ** low-
38e0: 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c  level memory all
38f0: 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73  ocation routines
3900: 20 74 6f 20 62 65 20 75 73 65 64 20 69 6e 20 70   to be used in p
3910: 6c 61 63 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f  lace of the memo
3920: 72 79 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  ry.      ** allo
3930: 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  cation routines 
3940: 62 75 69 6c 74 20 69 6e 74 6f 20 53 51 4c 69 74  built into SQLit
3950: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e. */.      sqli
3960: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3970: 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  m = *va_arg(ap, 
3980: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3990: 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ods*);.      bre
39a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
39b0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
39c0: 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  _GETMALLOC: {.  
39d0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
39e0: 4f 46 3a 20 52 2d 35 31 32 31 33 2d 34 36 34 31  OF: R-51213-4641
39f0: 34 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  4 The SQLITE_CON
3a00: 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 20 6f 70  FIG_GETMALLOC op
3a10: 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20  tion takes a.   
3a20: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67     ** single arg
3a30: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61  ument which is a
3a40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
3a50: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 0a 20  nstance of the. 
3a60: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
3a70: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75  mem_methods stru
3a80: 63 74 75 72 65 2e 20 54 68 65 20 73 71 6c 69 74  cture. The sqlit
3a90: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73  e3_mem_methods s
3aa0: 74 72 75 63 74 75 72 65 20 69 73 0a 20 20 20 20  tructure is.    
3ab0: 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
3ac0: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
3ad0: 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 61 6c  efined memory al
3ae0: 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65  location routine
3af0: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  s. */.      if( 
3b00: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3b10: 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30  fig.m.xMalloc==0
3b20: 20 29 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74   ) sqlite3MemSet
3b30: 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20  Default();.     
3b40: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
3b50: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
3b60: 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  *) = sqlite3Glob
3b70: 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20  alConfig.m;.    
3b80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3b90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3ba0: 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a  ONFIG_MEMSTATUS:
3bb0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3bc0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 32 37 35  ENCE-OF: R-61275
3bd0: 2d 33 35 31 35 37 20 54 68 65 20 53 51 4c 49 54  -35157 The SQLIT
3be0: 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54  E_CONFIG_MEMSTAT
3bf0: 55 53 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a  US option takes.
3c00: 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
3c10: 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 79 70 65  argument of type
3c20: 20 69 6e 74 2c 20 69 6e 74 65 72 70 72 65 74 65   int, interprete
3c30: 64 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 2c 20  d as a boolean, 
3c40: 77 68 69 63 68 20 65 6e 61 62 6c 65 73 0a 20 20  which enables.  
3c50: 20 20 20 20 2a 2a 20 6f 72 20 64 69 73 61 62 6c      ** or disabl
3c60: 65 73 20 74 68 65 20 63 6f 6c 6c 65 63 74 69 6f  es the collectio
3c70: 6e 20 6f 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  n of memory allo
3c80: 63 61 74 69 6f 6e 20 73 74 61 74 69 73 74 69 63  cation statistic
3c90: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  s. */.      sqli
3ca0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3cb0: 62 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72  bMemstat = va_ar
3cc0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3cd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3ce0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3cf0: 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b  ONFIG_SCRATCH: {
3d00: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
3d10: 43 45 2d 4f 46 3a 20 52 2d 30 38 34 30 34 2d 36  CE-OF: R-08404-6
3d20: 30 38 38 37 20 54 68 65 72 65 20 61 72 65 20 74  0887 There are t
3d30: 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74  hree arguments t
3d40: 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  o.      ** SQLIT
3d50: 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43 48  E_CONFIG_SCRATCH
3d60: 3a 20 41 20 70 6f 69 6e 74 65 72 20 61 6e 20 38  : A pointer an 8
3d70: 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d 65  -byte aligned me
3d80: 6d 6f 72 79 20 62 75 66 66 65 72 20 66 72 6f 6d  mory buffer from
3d90: 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 63 68 20  .      ** which 
3da0: 74 68 65 20 73 63 72 61 74 63 68 20 61 6c 6c 6f  the scratch allo
3db0: 63 61 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20  cations will be 
3dc0: 64 72 61 77 6e 2c 20 74 68 65 20 73 69 7a 65 20  drawn, the size 
3dd0: 6f 66 20 65 61 63 68 20 73 63 72 61 74 63 68 0a  of each scratch.
3de0: 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
3df0: 69 6f 6e 20 28 73 7a 29 2c 20 61 6e 64 20 74 68  ion (sz), and th
3e00: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
3e10: 20 6f 66 20 73 63 72 61 74 63 68 20 61 6c 6c 6f   of scratch allo
3e20: 63 61 74 69 6f 6e 73 20 28 4e 29 2e 20 2a 2f 0a  cations (N). */.
3e30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3e40: 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72 61 74  balConfig.pScrat
3e50: 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ch = va_arg(ap, 
3e60: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
3e70: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3e80: 67 2e 73 7a 53 63 72 61 74 63 68 20 3d 20 76 61  g.szScratch = va
3e90: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
3ea0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3eb0: 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63  alConfig.nScratc
3ec0: 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  h = va_arg(ap, i
3ed0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3ee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3ef0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
3f00: 41 47 45 43 41 43 48 45 3a 20 7b 0a 20 20 20 20  AGECACHE: {.    
3f10: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3f20: 3a 20 52 2d 31 38 37 36 31 2d 33 36 36 30 31 20  : R-18761-36601 
3f30: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
3f40: 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
3f50: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     ** SQLITE_CON
3f60: 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 41  FIG_PAGECACHE: A
3f70: 20 70 6f 69 6e 74 65 72 20 74 6f 20 38 2d 62 79   pointer to 8-by
3f80: 74 65 20 61 6c 69 67 6e 65 64 20 6d 65 6d 6f 72  te aligned memor
3f90: 79 20 28 70 4d 65 6d 29 2c 0a 20 20 20 20 20 20  y (pMem),.      
3fa0: 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 65  ** the size of e
3fb0: 61 63 68 20 70 61 67 65 20 63 61 63 68 65 20 6c  ach page cache l
3fc0: 69 6e 65 20 28 73 7a 29 2c 20 61 6e 64 20 74 68  ine (sz), and th
3fd0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  e number of cach
3fe0: 65 20 6c 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a  e lines.      **
3ff0: 20 28 4e 29 2e 20 2a 2f 0a 20 20 20 20 20 20 73   (N). */.      s
4000: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4010: 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f 61 72  ig.pPage = va_ar
4020: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
4030: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4040: 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d  lConfig.szPage =
4050: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4060: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4070: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67  lobalConfig.nPag
4080: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
4090: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
40a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
40b0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
40c0: 43 41 43 48 45 5f 48 44 52 53 5a 3a 20 7b 0a 20  CACHE_HDRSZ: {. 
40d0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
40e0: 2d 4f 46 3a 20 52 2d 33 39 31 30 30 2d 32 37 33  -OF: R-39100-273
40f0: 31 37 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  17 The SQLITE_CO
4100: 4e 46 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53  NFIG_PCACHE_HDRS
4110: 5a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a 20  Z option takes. 
4120: 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65       ** a single
4130: 20 70 61 72 61 6d 65 74 65 72 20 77 68 69 63 68   parameter which
4140: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4150: 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20   an integer and 
4160: 77 72 69 74 65 73 20 69 6e 74 6f 0a 20 20 20 20  writes into.    
4170: 20 20 2a 2a 20 74 68 61 74 20 69 6e 74 65 67 65    ** that intege
4180: 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  r the number of 
4190: 65 78 74 72 61 20 62 79 74 65 73 20 70 65 72 20  extra bytes per 
41a0: 70 61 67 65 20 72 65 71 75 69 72 65 64 20 66 6f  page required fo
41b0: 72 20 65 61 63 68 20 70 61 67 65 0a 20 20 20 20  r each page.    
41c0: 20 20 2a 2a 20 69 6e 20 53 51 4c 49 54 45 5f 43    ** in SQLITE_C
41d0: 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 2e  ONFIG_PAGECACHE.
41e0: 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72   */.      *va_ar
41f0: 67 28 61 70 2c 20 69 6e 74 2a 29 20 3d 20 0a 20  g(ap, int*) = . 
4200: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4210: 48 65 61 64 65 72 53 69 7a 65 42 74 72 65 65 28  HeaderSizeBtree(
4220: 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ) +.          sq
4230: 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 50  lite3HeaderSizeP
4240: 63 61 63 68 65 28 29 20 2b 0a 20 20 20 20 20 20  cache() +.      
4250: 20 20 20 20 73 71 6c 69 74 65 33 48 65 61 64 65      sqlite3Heade
4260: 72 53 69 7a 65 50 63 61 63 68 65 31 28 29 3b 0a  rSizePcache1();.
4270: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4280: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
4290: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48  ITE_CONFIG_PCACH
42a0: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  E: {.      /* no
42b0: 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  -op */.      bre
42c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
42d0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
42e0: 5f 47 45 54 50 43 41 43 48 45 3a 20 7b 0a 20 20  _GETPCACHE: {.  
42f0: 20 20 20 20 2f 2a 20 6e 6f 77 20 61 6e 20 65 72      /* now an er
4300: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ror */.      rc 
4310: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
4320: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4330: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
4340: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48  ITE_CONFIG_PCACH
4350: 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  E2: {.      /* E
4360: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33  VIDENCE-OF: R-63
4370: 33 32 35 2d 34 38 33 37 38 20 54 68 65 20 53 51  325-48378 The SQ
4380: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43  LITE_CONFIG_PCAC
4390: 48 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73  HE2 option takes
43a0: 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
43b0: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
43c0: 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  h is a pointer t
43d0: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 70 63 61  o an sqlite3_pca
43e0: 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20  che_methods2.   
43f0: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 54 68     ** object. Th
4400: 69 73 20 6f 62 6a 65 63 74 20 73 70 65 63 69 66  is object specif
4410: 69 65 73 20 74 68 65 20 69 6e 74 65 72 66 61 63  ies the interfac
4420: 65 20 74 6f 20 61 20 63 75 73 74 6f 6d 20 70 61  e to a custom pa
4430: 67 65 20 63 61 63 68 65 0a 20 20 20 20 20 20 2a  ge cache.      *
4440: 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
4450: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
4460: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
4470: 63 61 63 68 65 32 20 3d 20 2a 76 61 5f 61 72 67  cache2 = *va_arg
4480: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61  (ap, sqlite3_pca
4490: 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29 3b 0a  che_methods2*);.
44a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
44b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
44c0: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41  TE_CONFIG_GETPCA
44d0: 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CHE2: {.      /*
44e0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
44f0: 32 32 30 33 35 2d 34 36 31 38 32 20 54 68 65 20  22035-46182 The 
4500: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
4510: 54 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20  TPCACHE2 option 
4520: 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a  takes a.      **
4530: 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
4540: 20 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e   which is a poin
4550: 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
4560: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
4570: 32 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63  2.      ** objec
4580: 74 2e 20 53 51 4c 69 74 65 20 63 6f 70 69 65 73  t. SQLite copies
4590: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
45a0: 70 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c 65  page cache imple
45b0: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 6f 0a 20  mentation into. 
45c0: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 62 6a       ** that obj
45d0: 65 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ect. */.      if
45e0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
45f0: 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 2e 78 49  onfig.pcache2.xI
4600: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nit==0 ){.      
4610: 20 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 53    sqlite3PCacheS
4620: 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20  etDefault();.   
4630: 20 20 20 7d 0a 20 20 20 20 20 20 2a 76 61 5f 61     }.      *va_a
4640: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70  rg(ap, sqlite3_p
4650: 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29  cache_methods2*)
4660: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
4670: 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 3b 0a  Config.pcache2;.
4680: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4690: 20 7d 0a 0a 2f 2a 20 45 56 49 44 45 4e 43 45 2d   }../* EVIDENCE-
46a0: 4f 46 3a 20 52 2d 30 36 36 32 36 2d 31 32 39 31  OF: R-06626-1291
46b0: 31 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  1 The SQLITE_CON
46c0: 46 49 47 5f 48 45 41 50 20 6f 70 74 69 6f 6e 20  FIG_HEAP option 
46d0: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  is only.** avail
46e0: 61 62 6c 65 20 69 66 20 53 51 4c 69 74 65 20 69  able if SQLite i
46f0: 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  s compiled with 
4700: 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 45 4e  either SQLITE_EN
4710: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20 6f 72 0a  ABLE_MEMSYS3 or.
4720: 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ** SQLITE_ENABLE
4730: 5f 4d 45 4d 53 59 53 35 20 61 6e 64 20 72 65 74  _MEMSYS5 and ret
4740: 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 52 52 4f  urns SQLITE_ERRO
4750: 52 20 69 66 20 69 6e 76 6f 6b 65 64 20 6f 74 68  R if invoked oth
4760: 65 72 77 69 73 65 2e 20 2a 2f 0a 23 69 66 20 64  erwise. */.#if d
4770: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
4780: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c  ABLE_MEMSYS3) ||
4790: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
47a0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a  ENABLE_MEMSYS5).
47b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
47c0: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20  CONFIG_HEAP: {. 
47d0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
47e0: 2d 4f 46 3a 20 52 2d 31 39 38 35 34 2d 34 32 31  -OF: R-19854-421
47f0: 32 36 20 54 68 65 72 65 20 61 72 65 20 74 68 72  26 There are thr
4800: 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  ee arguments to.
4810: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
4820: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 41 6e 20  CONFIG_HEAP: An 
4830: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 70  8-byte aligned p
4840: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6d 65  ointer to the me
4850: 6d 6f 72 79 2c 20 74 68 65 0a 20 20 20 20 20 20  mory, the.      
4860: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  ** number of byt
4870: 65 73 20 69 6e 20 74 68 65 20 6d 65 6d 6f 72 79  es in the memory
4880: 20 62 75 66 66 65 72 2c 20 61 6e 64 20 74 68 65   buffer, and the
4890: 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 63 61 74   minimum allocat
48a0: 69 6f 6e 20 73 69 7a 65 2e 0a 20 20 20 20 20 20  ion size..      
48b0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
48c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
48d0: 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
48e0: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
48f0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4900: 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67  g.nHeap = va_arg
4910: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4920: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4930: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f  nfig.mnReq = va_
4940: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20  arg(ap, int);.. 
4950: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
4960: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52  GlobalConfig.mnR
4970: 65 71 3c 31 20 29 7b 0a 20 20 20 20 20 20 20 20  eq<1 ){.        
4980: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4990: 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20  fig.mnReq = 1;. 
49a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
49b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
49c0: 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29  ig.mnReq>(1<<12)
49d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63   ){.        /* c
49e0: 61 70 20 6d 69 6e 20 72 65 71 75 65 73 74 20 73  ap min request s
49f0: 69 7a 65 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20  ize at 2^12 */. 
4a00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
4a10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71  obalConfig.mnReq
4a20: 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20   = (1<<12);.    
4a30: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73    }..      if( s
4a40: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4a50: 69 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20  ig.pHeap==0 ){. 
4a60: 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
4a70: 43 45 2d 4f 46 3a 20 52 2d 34 39 39 32 30 2d 36  CE-OF: R-49920-6
4a80: 30 31 38 39 20 49 66 20 74 68 65 20 66 69 72 73  0189 If the firs
4a90: 74 20 70 6f 69 6e 74 65 72 20 28 74 68 65 20 6d  t pointer (the m
4aa0: 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 29 0a 20  emory pointer). 
4ab0: 20 20 20 20 20 20 20 2a 2a 20 69 73 20 4e 55 4c         ** is NUL
4ac0: 4c 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 72  L, then SQLite r
4ad0: 65 76 65 72 74 73 20 74 6f 20 75 73 69 6e 67 20  everts to using 
4ae0: 69 74 73 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f  its default memo
4af0: 72 79 20 61 6c 6c 6f 63 61 74 6f 72 0a 20 20 20  ry allocator.   
4b00: 20 20 20 20 20 2a 2a 20 28 74 68 65 20 73 79 73       ** (the sys
4b10: 74 65 6d 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70  tem malloc() imp
4b20: 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 2c 20 75 6e  lementation), un
4b30: 64 6f 69 6e 67 20 61 6e 79 20 70 72 69 6f 72 20  doing any prior 
4b40: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 0a 20 20  invocation of.  
4b50: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
4b60: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2e 0a 20  CONFIG_MALLOC.. 
4b70: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
4b80: 20 20 2a 2a 20 53 65 74 74 69 6e 67 20 73 71 6c    ** Setting sql
4b90: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4ba0: 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 20  .m to all zeros 
4bb0: 77 69 6c 6c 20 63 61 75 73 65 20 6d 61 6c 6c 6f  will cause mallo
4bc0: 63 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  c to.        ** 
4bd0: 72 65 76 65 72 74 20 74 6f 20 69 74 73 20 64 65  revert to its de
4be0: 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61  fault implementa
4bf0: 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65  tion when sqlite
4c00: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69  3_initialize() i
4c10: 73 20 72 75 6e 0a 20 20 20 20 20 20 20 20 2a 2f  s run.        */
4c20: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
4c30: 26 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  &sqlite3GlobalCo
4c40: 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f  nfig.m, 0, sizeo
4c50: 66 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  f(sqlite3GlobalC
4c60: 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20  onfig.m));.     
4c70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4c80: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4c90: 52 2d 36 31 30 30 36 2d 30 38 39 31 38 20 49 66  R-61006-08918 If
4ca0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e   the memory poin
4cb0: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ter is not NULL 
4cc0: 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  then the.       
4cd0: 20 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20   ** alternative 
4ce0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72  memory allocator
4cf0: 20 69 73 20 65 6e 67 61 67 65 64 20 74 6f 20 68   is engaged to h
4d00: 61 6e 64 6c 65 20 61 6c 6c 20 6f 66 20 53 51 4c  andle all of SQL
4d10: 69 74 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ites.        ** 
4d20: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
4d30: 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a 23 69 66 64  n needs. */.#ifd
4d40: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4d50: 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20 20  _MEMSYS3.       
4d60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4d70: 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65  nfig.m = *sqlite
4d80: 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28 29  3MemGetMemsys3()
4d90: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
4da0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
4db0: 4d 53 59 53 35 0a 20 20 20 20 20 20 20 20 73 71  MSYS5.        sq
4dc0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4dd0: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
4de0: 6d 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23  mGetMemsys5();.#
4df0: 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
4e00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4e10: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
4e20: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4e30: 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20  LOOKASIDE: {.   
4e40: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4e50: 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69  Config.szLookasi
4e60: 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  de = va_arg(ap, 
4e70: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4e80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4e90: 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f  nLookaside = va_
4ea0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
4eb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4ec0: 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 52 65 63  .    .    /* Rec
4ed0: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
4ee0: 20 74 68 65 20 6c 6f 67 67 65 72 20 66 75 6e 63   the logger func
4ef0: 74 69 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72  tion and its fir
4f00: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20  st argument..   
4f10: 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20   ** The default 
4f20: 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e  is NULL.  Loggin
4f30: 67 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 66  g is disabled if
4f40: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f   the function po
4f50: 69 6e 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20  inter is.    ** 
4f60: 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  NULL..    */.   
4f70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4f80: 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20  FIG_LOG: {.     
4f90: 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b   /* MSVC is pick
4fa0: 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20  y about pulling 
4fb0: 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76  func ptrs from v
4fc0: 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a  a lists..      *
4fd0: 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74  * http://support
4fe0: 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b  .microsoft.com/k
4ff0: 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a  b/47961.      **
5000: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5010: 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61  nfig.xLog = va_a
5020: 72 67 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76  rg(ap, void(*)(v
5030: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63  oid*,int,const c
5040: 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f  har*));.      */
5050: 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76  .      typedef v
5060: 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28  oid(*LOGFUNC_t)(
5070: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
5080: 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71  char*);.      sq
5090: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
50a0: 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28  g.xLog = va_arg(
50b0: 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a  ap, LOGFUNC_t);.
50c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
50d0: 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72  balConfig.pLogAr
50e0: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  g = va_arg(ap, v
50f0: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  oid*);.      bre
5100: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
5110: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5120: 2d 35 35 35 34 38 2d 33 33 38 31 37 20 54 68 65  -55548-33817 The
5130: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 73 65   compile-time se
5140: 74 74 69 6e 67 20 66 6f 72 20 55 52 49 20 66 69  tting for URI fi
5150: 6c 65 6e 61 6d 65 73 0a 20 20 20 20 2a 2a 20 63  lenames.    ** c
5160: 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 74  an be changed at
5170: 20 73 74 61 72 74 2d 74 69 6d 65 20 75 73 69 6e   start-time usin
5180: 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c  g the.    ** sql
5190: 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
51a0: 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 31 29  TE_CONFIG_URI,1)
51b0: 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   or.    ** sqlit
51c0: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
51d0: 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 30 29 20 63  _CONFIG_URI,0) c
51e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 61 6c  onfiguration cal
51f0: 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ls..    */.    c
5200: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
5210: 47 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 2f  G_URI: {.      /
5220: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5230: 2d 32 35 34 35 31 2d 36 31 31 32 35 20 54 68 65  -25451-61125 The
5240: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55   SQLITE_CONFIG_U
5250: 52 49 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  RI option takes 
5260: 61 20 73 69 6e 67 6c 65 0a 20 20 20 20 20 20 2a  a single.      *
5270: 2a 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 79  * argument of ty
5280: 70 65 20 69 6e 74 2e 20 49 66 20 6e 6f 6e 2d 7a  pe int. If non-z
5290: 65 72 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61  ero, then URI ha
52a0: 6e 64 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c  ndling is global
52b0: 6c 79 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62  ly.      ** enab
52c0: 6c 65 64 2e 20 49 66 20 74 68 65 20 70 61 72 61  led. If the para
52d0: 6d 65 74 65 72 20 69 73 20 7a 65 72 6f 2c 20 74  meter is zero, t
52e0: 68 65 6e 20 55 52 49 20 68 61 6e 64 6c 69 6e 67  hen URI handling
52f0: 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a 20 20 20   is globally.   
5300: 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 64 2e 20     ** disabled. 
5310: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
5320: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70  GlobalConfig.bOp
5330: 65 6e 55 72 69 20 3d 20 76 61 5f 61 72 67 28 61  enUri = va_arg(a
5340: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
5350: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
5360: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
5370: 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44  FIG_COVERING_IND
5380: 45 58 5f 53 43 41 4e 3a 20 7b 0a 20 20 20 20 20  EX_SCAN: {.     
5390: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
53a0: 20 52 2d 33 36 35 39 32 2d 30 32 37 37 32 20 54   R-36592-02772 T
53b0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
53c0: 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f  _COVERING_INDEX_
53d0: 53 43 41 4e 0a 20 20 20 20 20 20 2a 2a 20 6f 70  SCAN.      ** op
53e0: 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e  tion takes a sin
53f0: 67 6c 65 20 69 6e 74 65 67 65 72 20 61 72 67 75  gle integer argu
5400: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 69 6e  ment which is in
5410: 74 65 72 70 72 65 74 65 64 20 61 73 20 61 0a 20  terpreted as a. 
5420: 20 20 20 20 20 2a 2a 20 62 6f 6f 6c 65 61 6e 20       ** boolean 
5430: 69 6e 20 6f 72 64 65 72 20 74 6f 20 65 6e 61 62  in order to enab
5440: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
5450: 65 20 75 73 65 20 6f 66 20 63 6f 76 65 72 69 6e  e use of coverin
5460: 67 20 69 6e 64 69 63 65 73 20 66 6f 72 0a 20 20  g indices for.  
5470: 20 20 20 20 2a 2a 20 66 75 6c 6c 20 74 61 62 6c      ** full tabl
5480: 65 20 73 63 61 6e 73 20 69 6e 20 74 68 65 20 71  e scans in the q
5490: 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 2e 20  uery optimizer. 
54a0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
54b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73  GlobalConfig.bUs
54c0: 65 43 69 73 20 3d 20 76 61 5f 61 72 67 28 61 70  eCis = va_arg(ap
54d0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
54e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  eak;.    }..#ifd
54f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5500: 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65  _SQLLOG.    case
5510: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
5520: 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74  QLLOG: {.      t
5530: 79 70 65 64 65 66 20 76 6f 69 64 28 2a 53 51 4c  ypedef void(*SQL
5540: 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a  LOGFUNC_t)(void*
5550: 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73  , sqlite3*, cons
5560: 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20  t char*, int);. 
5570: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
5580: 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
5590: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 53 51   = va_arg(ap, SQ
55a0: 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20  LLOGFUNC_t);.   
55b0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
55c0: 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
55d0: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  g = va_arg(ap, v
55e0: 6f 69 64 20 2a 29 3b 0a 20 20 20 20 20 20 62 72  oid *);.      br
55f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5600: 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  f..    case SQLI
5610: 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53  TE_CONFIG_MMAP_S
5620: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  IZE: {.      /* 
5630: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
5640: 38 30 36 33 2d 33 38 32 35 38 20 53 51 4c 49 54  8063-38258 SQLIT
5650: 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49  E_CONFIG_MMAP_SI
5660: 5a 45 20 74 61 6b 65 73 20 74 77 6f 20 36 34 2d  ZE takes two 64-
5670: 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74  bit.      ** int
5680: 65 67 65 72 20 28 73 71 6c 69 74 65 33 5f 69 6e  eger (sqlite3_in
5690: 74 36 34 29 20 76 61 6c 75 65 73 20 74 68 61 74  t64) values that
56a0: 20 61 72 65 20 74 68 65 20 64 65 66 61 75 6c 74   are the default
56b0: 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d 69 74   mmap size limit
56c0: 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20 64  .      ** (the d
56d0: 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 20 66  efault setting f
56e0: 6f 72 20 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73  or PRAGMA mmap_s
56f0: 69 7a 65 29 20 61 6e 64 20 74 68 65 20 6d 61 78  ize) and the max
5700: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 0a 20 20 20  imum allowed.   
5710: 20 20 20 2a 2a 20 6d 6d 61 70 20 73 69 7a 65 20     ** mmap size 
5720: 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20  limit. */.      
5730: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
5740: 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Mmap = va_arg(ap
5750: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  , sqlite3_int64)
5760: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
5770: 69 6e 74 36 34 20 6d 78 4d 6d 61 70 20 3d 20 76  int64 mxMmap = v
5780: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
5790: 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20 20 20  3_int64);.      
57a0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
57b0: 52 2d 35 33 33 36 37 2d 34 33 31 39 30 20 49 66  R-53367-43190 If
57c0: 20 65 69 74 68 65 72 20 61 72 67 75 6d 65 6e 74   either argument
57d0: 20 74 6f 20 74 68 69 73 20 6f 70 74 69 6f 6e 20   to this option 
57e0: 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e 65 67 61  is.      ** nega
57f0: 74 69 76 65 2c 20 74 68 65 6e 20 74 68 61 74 20  tive, then that 
5800: 61 72 67 75 6d 65 6e 74 20 69 73 20 63 68 61 6e  argument is chan
5810: 67 65 64 20 74 6f 20 69 74 73 20 63 6f 6d 70 69  ged to its compi
5820: 6c 65 2d 74 69 6d 65 20 64 65 66 61 75 6c 74 2e  le-time default.
5830: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
5840: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
5850: 52 2d 33 34 39 39 33 2d 34 35 30 33 31 20 54 68  R-34993-45031 Th
5860: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
5870: 64 20 6d 6d 61 70 20 73 69 7a 65 20 77 69 6c 6c  d mmap size will
5880: 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 73 69 6c   be.      ** sil
5890: 65 6e 74 6c 79 20 74 72 75 6e 63 61 74 65 64 20  ently truncated 
58a0: 69 66 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20  if necessary so 
58b0: 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
58c0: 20 65 78 63 65 65 64 20 74 68 65 0a 20 20 20 20   exceed the.    
58d0: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d    ** compile-tim
58e0: 65 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73  e maximum mmap s
58f0: 69 7a 65 20 73 65 74 20 62 79 20 74 68 65 20 53  ize set by the S
5900: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
5910: 49 5a 45 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d  IZE.      ** com
5920: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
5930: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
5940: 20 69 66 28 20 6d 78 4d 6d 61 70 3c 30 20 7c 7c   if( mxMmap<0 ||
5950: 20 6d 78 4d 6d 61 70 3e 53 51 4c 49 54 45 5f 4d   mxMmap>SQLITE_M
5960: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 20 29 7b 0a  AX_MMAP_SIZE ){.
5970: 20 20 20 20 20 20 20 20 6d 78 4d 6d 61 70 20 3d          mxMmap =
5980: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
5990: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _SIZE;.      }. 
59a0: 20 20 20 20 20 69 66 28 20 73 7a 4d 6d 61 70 3c       if( szMmap<
59b0: 30 20 29 20 73 7a 4d 6d 61 70 20 3d 20 53 51 4c  0 ) szMmap = SQL
59c0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50  ITE_DEFAULT_MMAP
59d0: 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 66 28  _SIZE;.      if(
59e0: 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d 61 70 29 20   szMmap>mxMmap) 
59f0: 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b  szMmap = mxMmap;
5a00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
5a10: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
5a20: 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  p = mxMmap;.    
5a30: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5a40: 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 20 3d 20 73  onfig.szMmap = s
5a50: 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 62 72 65  zMmap;.      bre
5a60: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 53  ak;.    }..#if S
5a70: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 26 26 20  QLITE_OS_WIN && 
5a80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
5a90: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29 20 2f 2a 20  IN32_MALLOC) /* 
5aa0: 49 4d 50 3a 20 52 2d 30 34 37 38 30 2d 35 35 38  IMP: R-04780-558
5ab0: 31 35 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  15 */.    case S
5ac0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e  QLITE_CONFIG_WIN
5ad0: 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b 0a 20  32_HEAPSIZE: {. 
5ae0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5af0: 2d 4f 46 3a 20 52 2d 33 34 39 32 36 2d 30 33 33  -OF: R-34926-033
5b00: 36 30 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  60 SQLITE_CONFIG
5b10: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 20  _WIN32_HEAPSIZE 
5b20: 74 61 6b 65 73 20 61 20 33 32 2d 62 69 74 0a 20  takes a 32-bit. 
5b30: 20 20 20 20 20 2a 2a 20 75 6e 73 69 67 6e 65 64       ** unsigned
5b40: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 74   integer value t
5b50: 68 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68  hat specifies th
5b60: 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f  e maximum size o
5b70: 66 20 74 68 65 20 63 72 65 61 74 65 64 0a 20 20  f the created.  
5b80: 20 20 20 20 2a 2a 20 68 65 61 70 2e 20 2a 2f 0a      ** heap. */.
5b90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5ba0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20  balConfig.nHeap 
5bb0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
5bc0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5bd0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
5be0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5bf0: 4e 46 49 47 5f 50 4d 41 53 5a 3a 20 7b 0a 20 20  NFIG_PMASZ: {.  
5c00: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
5c10: 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d 61 20 3d 20  lConfig.szPma = 
5c20: 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67  va_arg(ap, unsig
5c30: 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ned int);.      
5c40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
5c50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5c60: 4e 46 49 47 5f 53 54 4d 54 4a 52 4e 4c 5f 53 50  NFIG_STMTJRNL_SP
5c70: 49 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ILL: {.      sql
5c80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5c90: 2e 6e 53 74 6d 74 53 70 69 6c 6c 20 3d 20 76 61  .nStmtSpill = va
5ca0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
5cb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5cc0: 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  }..    default: 
5cd0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
5ce0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
5cf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5d00: 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
5d10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5d20: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65  /*.** Set up the
5d30: 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65   lookaside buffe
5d40: 72 73 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  rs for a databas
5d50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
5d60: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
5d70: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a  K on success.  .
5d80: 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20  ** If lookaside 
5d90: 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
5da0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
5db0: 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  _BUSY..**.** The
5dc0: 20 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73   sz parameter is
5dd0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
5de0: 79 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f  ytes in each loo
5df0: 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20  kaside slot..** 
5e00: 54 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65  The cnt paramete
5e10: 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  r is the number 
5e20: 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53  of slots.  If pS
5e30: 74 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65  tart is NULL the
5e40: 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68  .** space for th
5e50: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  e lookaside memo
5e60: 72 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ry is obtained f
5e70: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
5e80: 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61  oc()..** If pSta
5e90: 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  rt is not NULL t
5ea0: 68 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74  hen it is sz*cnt
5eb0: 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
5ec0: 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74   to use for.** t
5ed0: 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  he lookaside mem
5ee0: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
5ef0: 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64  nt setupLookasid
5f00: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76  e(sqlite3 *db, v
5f10: 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73  oid *pBuf, int s
5f20: 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 23 69 66  z, int cnt){.#if
5f30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5f40: 5f 4c 4f 4f 4b 41 53 49 44 45 0a 20 20 76 6f 69  _LOOKASIDE.  voi
5f50: 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28  d *pStart;.  if(
5f60: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
5f70: 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Out ){.    retur
5f80: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
5f90: 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79   }.  /* Free any
5fa0: 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73   existing lookas
5fb0: 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20 74  ide buffer for t
5fc0: 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72  his handle befor
5fd0: 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e  e.  ** allocatin
5fe0: 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77  g a new one so w
5ff0: 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20  e don't have to 
6000: 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a  have space for .
6010: 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65    ** both at the
6020: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f   same time..  */
6030: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
6040: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
6050: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
6060: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
6070: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
6080: 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  /* The size of a
6090: 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20   lookaside slot 
60a0: 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38  after ROUNDDOWN8
60b0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72   needs to be lar
60c0: 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20  ger.  ** than a 
60d0: 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73  pointer to be us
60e0: 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20  eful..  */.  sz 
60f0: 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29  = ROUNDDOWN8(sz)
6100: 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30  ;  /* IMP: R-330
6110: 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66  38-09382 */.  if
6120: 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  ( sz<=(int)sizeo
6130: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
6140: 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66  ) ) sz = 0;.  if
6150: 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20  ( cnt<0 ) cnt = 
6160: 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c  0;.  if( sz==0 |
6170: 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  | cnt==0 ){.    
6180: 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61  sz = 0;.    pSta
6190: 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  rt = 0;.  }else 
61a0: 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20  if( pBuf==0 ){. 
61b0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
61c0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
61d0: 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69     pStart = sqli
61e0: 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e  te3Malloc( sz*cn
61f0: 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  t );  /* IMP: R-
6200: 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20  61949-35727 */. 
6210: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
6220: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
6230: 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63 6e   if( pStart ) cn
6240: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
6250: 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a  cSize(pStart)/sz
6260: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
6270: 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20  Start = pBuf;.  
6280: 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  }.  db->lookasid
6290: 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61 72  e.pStart = pStar
62a0: 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  t;.  db->lookasi
62b0: 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20  de.pFree = 0;.  
62c0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a  db->lookaside.sz
62d0: 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66   = (u16)sz;.  if
62e0: 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
62f0: 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61  int i;.    Looka
6300: 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20  sideSlot *p;.   
6310: 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69   assert( sz > (i
6320: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
6330: 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20  ideSlot*) );.   
6340: 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53   p = (LookasideS
6350: 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20  lot*)pStart;.   
6360: 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e   for(i=cnt-1; i>
6370: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; i--){.      
6380: 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c  p->pNext = db->l
6390: 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a  ookaside.pFree;.
63a0: 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73        db->lookas
63b0: 69 64 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20  ide.pFree = p;. 
63c0: 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73       p = (Lookas
63d0: 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29  ideSlot*)&((u8*)
63e0: 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20  p)[sz];.    }.  
63f0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6400: 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62  pEnd = p;.    db
6410: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73  ->lookaside.bDis
6420: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
6430: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c  ->lookaside.bMal
6440: 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20  loced = pBuf==0 
6450: 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ?1:0;.  }else{. 
6460: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
6470: 2e 70 53 74 61 72 74 20 3d 20 64 62 3b 0a 20 20  .pStart = db;.  
6480: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6490: 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20 64  pEnd = db;.    d
64a0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
64b0: 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 64  sable = 1;.    d
64c0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
64d0: 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  lloced = 0;.  }.
64e0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
64f0: 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 20  _OMIT_LOOKASIDE 
6500: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  */.  return SQLI
6510: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6520: 52 65 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78  Return the mutex
6530: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6540: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
6550: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74  ection..*/.sqlit
6560: 65 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65  e3_mutex *sqlite
6570: 33 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74  3_db_mutex(sqlit
6580: 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20  e3 *db){.#ifdef 
6590: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
65a0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
65b0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
65c0: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
65d0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
65e0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
65f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
6600: 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d  f.  return db->m
6610: 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  utex;.}../*.** F
6620: 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d  ree up as much m
6630: 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20  emory as we can 
6640: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64  from the given d
6650: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
6660: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
6670: 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
6680: 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20  _memory(sqlite3 
6690: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  *db){.  int i;..
66a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
66b0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
66c0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
66d0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
66e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
66f0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
6700: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
6710: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
6720: 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
6730: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
6740: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
6750: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
6760: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
6770: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
6780: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
6790: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
67a0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
67b0: 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
67c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 72   sqlite3PagerShr
67d0: 69 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ink(pPager);.   
67e0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
67f0: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
6800: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
6810: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
6820: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
6830: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6840: 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 69 72 74  * Flush any dirt
6850: 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
6860: 61 67 65 72 2d 63 61 63 68 65 20 66 6f 72 20 61  ager-cache for a
6870: 6e 79 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ny attached data
6880: 62 61 73 65 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e  base.** to disk.
6890: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
68a0: 64 62 5f 63 61 63 68 65 66 6c 75 73 68 28 73 71  db_cacheflush(sq
68b0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
68c0: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t i;.  int rc = 
68d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
68e0: 20 62 53 65 65 6e 42 75 73 79 20 3d 20 30 3b 0a   bSeenBusy = 0;.
68f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6900: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
6910: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
6920: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
6930: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
6940: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
6950: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
6960: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
6970: 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  tex);.  sqlite3B
6980: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
6990: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
69a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
69b0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
69c0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
69d0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
69e0: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73      if( pBt && s
69f0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
6a00: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20  rans(pBt) ){.   
6a10: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
6a20: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
6a30: 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  ager(pBt);.     
6a40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6a50: 65 72 46 6c 75 73 68 28 70 50 61 67 65 72 29 3b  erFlush(pPager);
6a60: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
6a70: 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
6a80: 20 20 20 20 20 20 62 53 65 65 6e 42 75 73 79 20        bSeenBusy 
6a90: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 1;.        rc 
6aa0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
6ab0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6ac0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
6ad0: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
6ae0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6af0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
6b00: 65 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49  eturn ((rc==SQLI
6b10: 54 45 5f 4f 4b 20 26 26 20 62 53 65 65 6e 42 75  TE_OK && bSeenBu
6b20: 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  sy) ? SQLITE_BUS
6b30: 59 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Y : rc);.}../*.*
6b40: 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  * Configuration 
6b50: 73 65 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20  settings for an 
6b60: 69 6e 64 69 76 69 64 75 61 6c 20 64 61 74 61 62  individual datab
6b70: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
6b80: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
6b90: 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20  _config(sqlite3 
6ba0: 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e  *db, int op, ...
6bb0: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
6bc0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f  .  int rc;.  va_
6bd0: 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20  start(ap, op);. 
6be0: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
6bf0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
6c00: 42 43 4f 4e 46 49 47 5f 4d 41 49 4e 44 42 4e 41  BCONFIG_MAINDBNA
6c10: 4d 45 3a 20 7b 0a 20 20 20 20 20 20 64 62 2d 3e  ME: {.      db->
6c20: 61 44 62 5b 30 5d 2e 7a 44 62 53 4e 61 6d 65 20  aDb[0].zDbSName 
6c30: 3d 20 76 61 5f 61 72 67 28 61 70 2c 63 68 61 72  = va_arg(ap,char
6c40: 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  *);.      rc = S
6c50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
6c60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6c70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
6c80: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
6c90: 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
6ca0: 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Buf = va_arg(ap,
6cb0: 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a   void*); /* IMP:
6cc0: 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a   R-26835-10964 *
6cd0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  /.      int sz =
6ce0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
6cf0: 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  ;       /* IMP: 
6d00: 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f  R-47871-25994 */
6d10: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
6d20: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
6d30: 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ;      /* IMP: R
6d40: 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a  -04460-53386 */.
6d50: 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75 70        rc = setup
6d60: 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42  Lookaside(db, pB
6d70: 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20  uf, sz, cnt);.  
6d80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6d90: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
6da0: 5f 44 42 43 4f 4e 46 49 47 5f 46 55 4c 4c 5f 45  _DBCONFIG_FULL_E
6db0: 51 50 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  QP: {.      int 
6dc0: 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61  onoff = va_arg(a
6dd0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
6de0: 6e 74 20 2a 70 52 65 73 20 3d 20 76 61 5f 61 72  nt *pRes = va_ar
6df0: 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20  g(ap, int*);.   
6e00: 20 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29     if( onoff>0 )
6e10: 7b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 62 46  {.        db->bF
6e20: 75 6c 6c 45 51 50 20 3d 20 31 3b 0a 20 20 20 20  ullEQP = 1;.    
6e30: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66    }else if( onof
6e40: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
6e50: 64 62 2d 3e 62 46 75 6c 6c 45 51 50 20 3d 20 30  db->bFullEQP = 0
6e60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6e70: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
6e80: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
6e90: 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  db);.      if( p
6ea0: 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  Res ){.        *
6eb0: 70 52 65 73 20 3d 20 64 62 2d 3e 62 46 75 6c 6c  pRes = db->bFull
6ec0: 45 51 50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQP;.      }.   
6ed0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
6ee0: 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
6ef0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
6f00: 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69  t: {.      stati
6f10: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
6f20: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 3b  .        int op;
6f30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63        /* The opc
6f40: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  ode */.        u
6f50: 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 4d  32 mask;    /* M
6f60: 61 73 6b 20 6f 66 20 74 68 65 20 62 69 74 20 69  ask of the bit i
6f70: 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73 20  n sqlite3.flags 
6f80: 74 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a 2f 0a  to set/clear */.
6f90: 20 20 20 20 20 20 7d 20 61 46 6c 61 67 4f 70 5b        } aFlagOp[
6fa0: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20  ] = {.        { 
6fb0: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
6fc0: 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20 20 20  ENABLE_FKEY,    
6fd0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 46 6f         SQLITE_Fo
6fe0: 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d 2c 0a  reignKeys    },.
6ff0: 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45          { SQLITE
7000: 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
7010: 5f 54 52 49 47 47 45 52 2c 20 20 20 20 20 20 20  _TRIGGER,       
7020: 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72   SQLITE_EnableTr
7030: 69 67 67 65 72 20 20 7d 2c 0a 20 20 20 20 20 20  igger  },.      
7040: 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e    { SQLITE_DBCON
7050: 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f  FIG_ENABLE_FTS3_
7060: 54 4f 4b 45 4e 49 5a 45 52 2c 20 53 51 4c 49 54  TOKENIZER, SQLIT
7070: 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a 65 72 20  E_Fts3Tokenizer 
7080: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
7090: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
70a0: 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  ABLE_LOAD_EXTENS
70b0: 49 4f 4e 2c 20 53 51 4c 49 54 45 5f 4c 6f 61 64  ION, SQLITE_Load
70c0: 45 78 74 65 6e 73 69 6f 6e 20 20 7d 2c 0a 20 20  Extension  },.  
70d0: 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44        { SQLITE_D
70e0: 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54 5f  BCONFIG_NO_CKPT_
70f0: 4f 4e 5f 43 4c 4f 53 45 2c 20 20 20 20 20 20 53  ON_CLOSE,      S
7100: 51 4c 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43 6c  QLITE_NoCkptOnCl
7110: 6f 73 65 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b  ose  },.      };
7120: 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20  .      unsigned 
7130: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20  int i;.      rc 
7140: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
7150: 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d  /* IMP: R-42790-
7160: 32 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66  23372 */.      f
7170: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
7180: 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b  ize(aFlagOp); i+
7190: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
71a0: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f  aFlagOp[i].op==o
71b0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  p ){.          i
71c0: 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72  nt onoff = va_ar
71d0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
71e0: 20 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20        int *pRes 
71f0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
7200: 2a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  *);.          in
7210: 74 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d  t oldFlags = db-
7220: 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20  >flags;.        
7230: 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b    if( onoff>0 ){
7240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
7250: 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f  >flags |= aFlagO
7260: 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20  p[i].mask;.     
7270: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f       }else if( o
7280: 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  noff==0 ){.     
7290: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
72a0: 20 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e   &= ~aFlagOp[i].
72b0: 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  mask;.          
72c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
72d0: 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c  oldFlags!=db->fl
72e0: 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ags ){.         
72f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
7300: 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
7310: 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
7320: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
7330: 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20  ( pRes ){.      
7340: 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64        *pRes = (d
7350: 62 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67  b->flags & aFlag
7360: 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a  Op[i].mask)!=0;.
7370: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7380: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
7390: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
73a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
73b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
73c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
73d0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
73e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
73f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
7400: 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a   if the buffer z
7410: 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e  [0..n-1] contain
7420: 73 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f  s all spaces..*/
7430: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53  .static int allS
7440: 70 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72  paces(const char
7450: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77   *z, int n){.  w
7460: 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e  hile( n>0 && z[n
7470: 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b  -1]==' ' ){ n--;
7480: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30   }.  return n==0
7490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
74a0: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  is the default c
74b0: 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
74c0: 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22  n named "BINARY"
74d0: 20 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73   which is always
74e0: 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a  .** available..*
74f0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46  *.** If the padF
7500: 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20  lag argument is 
7510: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70  not NULL then sp
7520: 61 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74  ace padding at t
7530: 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72  he end.** of str
7540: 69 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e  ings is ignored.
7550: 20 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74    This implement
7560: 73 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c  s the RTRIM coll
7570: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
7580: 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63   int binCollFunc
7590: 28 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61  (.  void *padFla
75a0: 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g,.  int nKey1, 
75b0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
75c0: 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20  1,.  int nKey2, 
75d0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
75e0: 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e  2.){.  int rc, n
75f0: 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b  ;.  n = nKey1<nK
7600: 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b  ey2 ? nKey1 : nK
7610: 65 79 32 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  ey2;.  /* EVIDEN
7620: 43 45 2d 4f 46 3a 20 52 2d 36 35 30 33 33 2d 32  CE-OF: R-65033-2
7630: 38 34 34 39 20 54 68 65 20 62 75 69 6c 74 2d 69  8449 The built-i
7640: 6e 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69  n BINARY collati
7650: 6f 6e 20 63 6f 6d 70 61 72 65 73 0a 20 20 2a 2a  on compares.  **
7660: 20 73 74 72 69 6e 67 73 20 62 79 74 65 20 62 79   strings byte by
7670: 20 62 79 74 65 20 75 73 69 6e 67 20 74 68 65 20   byte using the 
7680: 6d 65 6d 63 6d 70 28 29 20 66 75 6e 63 74 69 6f  memcmp() functio
7690: 6e 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64  n from the stand
76a0: 61 72 64 20 43 0a 20 20 2a 2a 20 6c 69 62 72 61  ard C.  ** libra
76b0: 72 79 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6d 65  ry. */.  rc = me
76c0: 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79  mcmp(pKey1, pKey
76d0: 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d  2, n);.  if( rc=
76e0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61  =0 ){.    if( pa
76f0: 64 46 6c 61 67 0a 20 20 20 20 20 26 26 20 61 6c  dFlag.     && al
7700: 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29  lSpaces(((char*)
7710: 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d  pKey1)+n, nKey1-
7720: 6e 29 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70  n).     && allSp
7730: 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65  aces(((char*)pKe
7740: 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a  y2)+n, nKey2-n).
7750: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
7760: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
7770: 31 36 32 34 2d 32 34 37 33 37 20 52 54 52 49 4d  1624-24737 RTRIM
7780: 20 69 73 20 6c 69 6b 65 20 42 49 4e 41 52 59 20   is like BINARY 
7790: 65 78 63 65 70 74 20 74 68 61 74 20 65 78 74 72  except that extr
77a0: 61 0a 20 20 20 20 20 20 2a 2a 20 73 70 61 63 65  a.      ** space
77b0: 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
77c0: 65 69 74 68 65 72 20 73 74 72 69 6e 67 20 64 6f  either string do
77d0: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
77e0: 72 65 73 75 6c 74 2e 20 49 6e 20 6f 74 68 65 72  result. In other
77f0: 0a 20 20 20 20 20 20 2a 2a 20 77 6f 72 64 73 2c  .      ** words,
7800: 20 73 74 72 69 6e 67 73 20 77 69 6c 6c 20 63 6f   strings will co
7810: 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 6f  mpare equal to o
7820: 6e 65 20 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f  ne another as lo
7830: 6e 67 20 61 73 20 74 68 65 79 0a 20 20 20 20 20  ng as they.     
7840: 20 2a 2a 20 64 69 66 66 65 72 20 6f 6e 6c 79 20   ** differ only 
7850: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
7860: 20 73 70 61 63 65 73 20 61 74 20 74 68 65 20 65   spaces at the e
7870: 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
7880: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
7890: 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32   = nKey1 - nKey2
78a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
78b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
78c0: 2a 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d  * Another built-
78d0: 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  in collating seq
78e0: 75 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a  uence: NOCASE. .
78f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61  **.** This colla
7900: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  ting sequence is
7910: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
7920: 75 73 65 64 20 66 6f 72 20 22 63 61 73 65 20 69  used for "case i
7930: 6e 64 65 70 65 6e 64 65 6e 74 0a 2a 2a 20 63 6f  ndependent.** co
7940: 6d 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74  mparison". SQLit
7950: 65 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66  e's knowledge of
7960: 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72   upper and lower
7970: 20 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74   case equivalent
7980: 73 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c  s.** extends onl
7990: 79 20 74 6f 20 74 68 65 20 32 36 20 63 68 61 72  y to the 26 char
79a0: 61 63 74 65 72 73 20 75 73 65 64 20 69 6e 20 74  acters used in t
79b0: 68 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  he English langu
79c0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68  age..**.** At th
79d0: 65 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69  e moment there i
79e0: 73 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69  s only a UTF-8 i
79f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
7a00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63  /.static int noc
7a10: 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63  aseCollatingFunc
7a20: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
7a30: 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  d,.  int nKey1, 
7a40: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
7a50: 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20  1,.  int nKey2, 
7a60: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
7a70: 32 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73  2.){.  int r = s
7a80: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a  qlite3StrNICmp(.
7a90: 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61        (const cha
7aa0: 72 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73  r *)pKey1, (cons
7ab0: 74 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20  t char *)pKey2, 
7ac0: 28 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b  (nKey1<nKey2)?nK
7ad0: 65 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e  ey1:nKey2);.  UN
7ae0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
7af0: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30  otUsed);.  if( 0
7b00: 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e  ==r ){.    r = n
7b10: 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a  Key1-nKey2;.  }.
7b20: 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f    return r;.}../
7b30: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
7b40: 52 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73  ROWID of the mos
7b50: 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a  t recent insert.
7b60: 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  */.sqlite_int64 
7b70: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
7b80: 65 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65  ert_rowid(sqlite
7b90: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
7ba0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
7bb0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
7bc0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
7bd0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
7be0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
7bf0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
7c00: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
7c10: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61  .  return db->la
7c20: 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  stRowid;.}../*.*
7c30: 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
7c40: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
7c50: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
7c60: 65 72 74 5f 72 6f 77 69 64 28 29 20 41 50 49 20  ert_rowid() API 
7c70: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
7c80: 64 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 6c 61  d sqlite3_set_la
7c90: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
7ca0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 73 71 6c  sqlite3 *db, sql
7cb0: 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69  ite3_int64 iRowi
7cc0: 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d){.#ifdef SQLIT
7cd0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
7ce0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
7cf0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
7d00: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
7d10: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
7d20: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
7d30: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
7d40: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
7d50: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
7d60: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 69  b->lastRowid = i
7d70: 52 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33  Rowid;.  sqlite3
7d80: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
7d90: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >mutex);.}../*.*
7da0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
7db0: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69  ber of changes i
7dc0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
7dd0: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
7de0: 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74  3_exec()..*/.int
7df0: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
7e00: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23  (sqlite3 *db){.#
7e10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
7e20: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
7e30: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
7e40: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
7e50: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
7e60: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
7e70: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7e80: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
7e90: 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a   db->nChange;.}.
7ea0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
7eb0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e  e number of chan
7ec0: 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 64 61  ges since the da
7ed0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61  tabase handle wa
7ee0: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  s opened..*/.int
7ef0: 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63   sqlite3_total_c
7f00: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
7f10: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
7f20: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
7f30: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
7f40: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
7f50: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
7f60: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
7f70: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
7f80: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
7f90: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61  return db->nTota
7fa0: 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  lChange;.}../*.*
7fb0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e  * Close all open
7fc0: 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69   savepoints. Thi
7fd0: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20  s function only 
7fe0: 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c  manipulates fiel
7ff0: 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ds of the.** dat
8000: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a  abase handle obj
8010: 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  ect, it does not
8020: 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70   close any savep
8030: 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62  oints that may b
8040: 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65  e open.** at the
8050: 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65   b-tree/pager le
8060: 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  vel..*/.void sql
8070: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
8080: 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
8090: 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70  {.  while( db->p
80a0: 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
80b0: 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70   Savepoint *pTmp
80c0: 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
80d0: 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65  t;.    db->pSave
80e0: 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e  point = pTmp->pN
80f0: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
8100: 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29  DbFree(db, pTmp)
8110: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76  ;.  }.  db->nSav
8120: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62  epoint = 0;.  db
8130: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
8140: 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61  ;.  db->isTransa
8150: 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
8160: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   0;.}../*.** Inv
8170: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
8180: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f  or function asso
8190: 63 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63  ciated with Func
81a0: 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45  Def p, if any. E
81b0: 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69  xcept,.** if thi
81c0: 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  s is not the las
81d0: 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75  t copy of the fu
81e0: 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69  nction, do not i
81f0: 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70  nvoke it. Multip
8200: 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20  le.** copies of 
8210: 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f  a single functio
8220: 6e 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68  n are created wh
8230: 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69  en create_functi
8240: 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a  on() is called.*
8250: 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e  * with SQLITE_AN
8260: 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  Y as the encodin
8270: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
8280: 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f  d functionDestro
8290: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46  y(sqlite3 *db, F
82a0: 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75  uncDef *p){.  Fu
82b0: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44  ncDestructor *pD
82c0: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 75  estructor = p->u
82d0: 2e 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20  .pDestructor;.  
82e0: 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20  if( pDestructor 
82f0: 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74  ){.    pDestruct
8300: 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  or->nRef--;.    
8310: 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d  if( pDestructor-
8320: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
8330: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78    pDestructor->x
8340: 44 65 73 74 72 6f 79 28 70 44 65 73 74 72 75 63  Destroy(pDestruc
8350: 74 6f 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b  tor->pUserData);
8360: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
8370: 46 72 65 65 28 64 62 2c 20 70 44 65 73 74 72 75  Free(db, pDestru
8380: 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ctor);.    }.  }
8390: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e  .}../*.** Discon
83a0: 6e 65 63 74 20 61 6c 6c 20 73 71 6c 69 74 65 33  nect all sqlite3
83b0: 5f 76 74 61 62 20 6f 62 6a 65 63 74 73 20 74 68  _vtab objects th
83c0: 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 64 61 74  at belong to dat
83d0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
83e0: 0a 2a 2a 20 64 62 2e 20 54 68 69 73 20 69 73 20  .** db. This is 
83f0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 64 62 20 69  called when db i
8400: 73 20 62 65 69 6e 67 20 63 6c 6f 73 65 64 2e 0a  s being closed..
8410: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
8420: 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62  isconnectAllVtab
8430: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23  (sqlite3 *db){.#
8440: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8450: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
8460: 20 20 69 6e 74 20 69 3b 0a 20 20 48 61 73 68 45    int i;.  HashE
8470: 6c 65 6d 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  lem *p;.  sqlite
8480: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
8490: 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  b);.  for(i=0; i
84a0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
84b0: 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68      Schema *pSch
84c0: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  ema = db->aDb[i]
84d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66  .pSchema;.    if
84e0: 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63  ( db->aDb[i].pSc
84f0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 66 6f  hema ){.      fo
8500: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
8510: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  rst(&pSchema->tb
8520: 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  lHash); p; p=sql
8530: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
8540: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
8550: 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20 2a 29  pTab = (Table *)
8560: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
8570: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  );.        if( I
8580: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
8590: 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63   sqlite3VtabDisc
85a0: 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61 62 29  onnect(db, pTab)
85b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
85c0: 20 20 7d 0a 20 20 66 6f 72 28 70 3d 73 71 6c 69    }.  for(p=sqli
85d0: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
85e0: 3e 61 4d 6f 64 75 6c 65 29 3b 20 70 3b 20 70 3d  >aModule); p; p=
85f0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
8600: 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a  )){.    Module *
8610: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a  pMod = (Module *
8620: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
8630: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64  p);.    if( pMod
8640: 2d 3e 70 45 70 6f 54 61 62 20 29 7b 0a 20 20 20  ->pEpoTab ){.   
8650: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 44 69     sqlite3VtabDi
8660: 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 4d 6f  sconnect(db, pMo
8670: 64 2d 3e 70 45 70 6f 54 61 62 29 3b 0a 20 20 20  d->pEpoTab);.   
8680: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
8690: 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64  VtabUnlockList(d
86a0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  b);.  sqlite3Btr
86b0: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
86c0: 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
86d0: 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 23 65  ARAMETER(db);.#e
86e0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
86f0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 64 61 74  turn TRUE if dat
8700: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
8710: 20 64 62 20 68 61 73 20 75 6e 66 69 6e 61 6c 69   db has unfinali
8720: 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20  zed prepared.** 
8730: 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e  statements or un
8740: 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33  finished sqlite3
8750: 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 2e  _backup objects.
8760: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74    .*/.static int
8770: 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73   connectionIsBus
8780: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  y(sqlite3 *db){.
8790: 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72    int j;.  asser
87a0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
87b0: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
87c0: 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56   );.  if( db->pV
87d0: 64 62 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  dbe ) return 1;.
87e0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d    for(j=0; j<db-
87f0: 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nDb; j++){.    
8800: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
8810: 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[j].pBt;.   
8820: 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c 69   if( pBt && sqli
8830: 74 65 33 42 74 72 65 65 49 73 49 6e 42 61 63 6b  te3BtreeIsInBack
8840: 75 70 28 70 42 74 29 20 29 20 72 65 74 75 72 6e  up(pBt) ) return
8850: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
8860: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
8870: 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 53  se an existing S
8880: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a  QLite database.*
8890: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
88a0: 69 74 65 33 43 6c 6f 73 65 28 73 71 6c 69 74 65  ite3Close(sqlite
88b0: 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f 72 63 65  3 *db, int force
88c0: 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66 28 20 21  Zombie){.  if( !
88d0: 64 62 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  db ){.    /* EVI
88e0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 32 35  DENCE-OF: R-6325
88f0: 37 2d 31 31 37 34 30 20 43 61 6c 6c 69 6e 67 20  7-11740 Calling 
8900: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20  sqlite3_close() 
8910: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
8920: 33 5f 63 6c 6f 73 65 5f 76 32 28 29 20 77 69 74  3_close_v2() wit
8930: 68 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  h a NULL pointer
8940: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 68   argument is a h
8950: 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 2a  armless no-op. *
8960: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
8970: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
8980: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
8990: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
89a0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
89b0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
89c0: 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  PT;.  }.  sqlite
89d0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
89e0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
89f0: 64 62 2d 3e 6d 54 72 61 63 65 20 26 20 53 51 4c  db->mTrace & SQL
8a00: 49 54 45 5f 54 52 41 43 45 5f 43 4c 4f 53 45 20  ITE_TRACE_CLOSE 
8a10: 29 7b 0a 20 20 20 20 64 62 2d 3e 78 54 72 61 63  ){.    db->xTrac
8a20: 65 28 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43  e(SQLITE_TRACE_C
8a30: 4c 4f 53 45 2c 20 64 62 2d 3e 70 54 72 61 63 65  LOSE, db->pTrace
8a40: 41 72 67 2c 20 64 62 2c 20 30 29 3b 0a 20 20 7d  Arg, db, 0);.  }
8a50: 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69  ..  /* Force xDi
8a60: 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f  sconnect calls o
8a70: 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61  n all virtual ta
8a80: 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e  bles */.  discon
8a90: 6e 65 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b  nectAllVtab(db);
8aa0: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e  ..  /* If a tran
8ab0: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c  saction is open,
8ac0: 20 74 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41   the disconnectA
8ad0: 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62  llVtab() call ab
8ae0: 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f  ove.  ** will no
8af0: 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68  t have called th
8b00: 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20  e xDisconnect() 
8b10: 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69  method on any vi
8b20: 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65  rtual.  ** table
8b30: 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54  s in the db->aVT
8b40: 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68  rans[] array. Th
8b50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
8b60: 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28  te3VtabRollback(
8b70: 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c  ).  ** call will
8b80: 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20   do so. We need 
8b90: 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72  to do this befor
8ba0: 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20  e the check for 
8bb0: 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20  active.  ** SQL 
8bc0: 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77  statements below
8bd0: 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65  , as the v-table
8be0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
8bf0: 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20  may be storing. 
8c00: 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65   ** some prepare
8c10: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74  d statements int
8c20: 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ernally..  */.  
8c30: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
8c40: 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c  ack(db);..  /* L
8c50: 65 67 61 63 79 20 62 65 68 61 76 69 6f 72 20 28  egacy behavior (
8c60: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20  sqlite3_close() 
8c70: 62 65 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20  behavior) is to 
8c80: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49  return.  ** SQLI
8c90: 54 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 63  TE_BUSY if the c
8ca0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f  onnection can no
8cb0: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
8cc0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
8cd0: 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65  if( !forceZombie
8ce0: 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73   && connectionIs
8cf0: 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20  Busy(db) ){.    
8d00: 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
8d10: 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  Msg(db, SQLITE_B
8d20: 55 53 59 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  USY, "unable to 
8d30: 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66  close due to unf
8d40: 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20 20 20 20  inalized ".     
8d50: 20 20 22 73 74 61 74 65 6d 65 6e 74 73 20 6f 72    "statements or
8d60: 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61 63 6b   unfinished back
8d70: 75 70 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ups");.    sqlit
8d80: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
8d90: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72  b->mutex);.    r
8da0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
8db0: 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  Y;.  }..#ifdef S
8dc0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
8dd0: 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LOG.  if( sqlite
8de0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
8df0: 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20  qllog ){.    /* 
8e00: 43 6c 6f 73 69 6e 67 20 74 68 65 20 68 61 6e 64  Closing the hand
8e10: 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d  le. Fourth param
8e20: 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74  eter is passed t
8e30: 68 65 20 76 61 6c 75 65 20 32 2e 20 2a 2f 0a 20  he value 2. */. 
8e40: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
8e50: 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 73  Config.xSqllog(s
8e60: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
8e70: 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 64  ig.pSqllogArg, d
8e80: 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d 0a 23 65  b, 0, 2);.  }.#e
8e90: 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  ndif..  /* Conve
8ea0: 72 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  rt the connectio
8eb0: 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20  n into a zombie 
8ec0: 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69  and then close i
8ed0: 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61  t..  */.  db->ma
8ee0: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
8ef0: 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c  IC_ZOMBIE;.  sql
8f00: 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e  ite3LeaveMutexAn
8f10: 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29  dCloseZombie(db)
8f20: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
8f30: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
8f40: 77 6f 20 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e  wo variations on
8f50: 20 74 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65   the public inte
8f60: 72 66 61 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e  rface for closin
8f70: 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
8f80: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20  connection. The 
8f90: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20  sqlite3_close() 
8fa0: 76 65 72 73 69 6f 6e 20 72 65 74 75 72 6e 73 20  version returns 
8fb0: 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a  SQLITE_BUSY and.
8fc0: 2a 2a 20 6c 65 61 76 65 73 20 74 68 65 20 63 6f  ** leaves the co
8fd0: 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20  nnection option 
8fe0: 69 66 20 74 68 65 72 65 20 61 72 65 20 75 6e 66  if there are unf
8ff0: 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65  inalized prepare
9000: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  d.** statements 
9010: 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71  or unfinished sq
9020: 6c 69 74 65 33 5f 62 61 63 6b 75 70 73 2e 20 20  lite3_backups.  
9030: 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  The sqlite3_clos
9040: 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f  e_v2().** versio
9050: 6e 20 66 6f 72 63 65 73 20 74 68 65 20 63 6f 6e  n forces the con
9060: 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d  nection to becom
9070: 65 20 61 20 7a 6f 6d 62 69 65 20 69 66 20 74 68  e a zombie if th
9080: 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f  ere are.** unclo
9090: 73 65 64 20 72 65 73 6f 75 72 63 65 73 2c 20 61  sed resources, a
90a0: 6e 64 20 61 72 72 61 6e 67 65 73 20 66 6f 72 20  nd arranges for 
90b0: 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65  deallocation whe
90c0: 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72  n the last.** pr
90d0: 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74 20  epare statement 
90e0: 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  or sqlite3_backu
90f0: 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74  p closes..*/.int
9100: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73   sqlite3_close(s
9110: 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74  qlite3 *db){ ret
9120: 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  urn sqlite3Close
9130: 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71  (db,0); }.int sq
9140: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73  lite3_close_v2(s
9150: 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74  qlite3 *db){ ret
9160: 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  urn sqlite3Close
9170: 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a  (db,1); }.../*.*
9180: 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d 75 74 65  * Close the mute
9190: 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 63 6f  x on database co
91a0: 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a  nnection db..**.
91b0: 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  ** Furthermore, 
91c0: 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  if database conn
91d0: 65 63 74 69 6f 6e 20 64 62 20 69 73 20 61 20 7a  ection db is a z
91e0: 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e 67 20 74  ombie (meaning t
91f0: 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 68 61 73  hat there.** has
9200: 20 62 65 65 6e 20 61 20 70 72 69 6f 72 20 63 61   been a prior ca
9210: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c  ll to sqlite3_cl
9220: 6f 73 65 28 64 62 29 20 6f 72 20 73 71 6c 69 74  ose(db) or sqlit
9230: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29 29  e3_close_v2(db))
9240: 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79 20 73 71   and.** every sq
9250: 6c 69 74 65 33 5f 73 74 6d 74 20 68 61 73 20 6e  lite3_stmt has n
9260: 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  ow been finalize
9270: 64 20 61 6e 64 20 65 76 65 72 79 20 73 71 6c 69  d and every sqli
9280: 74 65 33 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a  te3_backup has.*
9290: 2a 20 66 69 6e 69 73 68 65 64 2c 20 74 68 65 6e  * finished, then
92a0: 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72   free all resour
92b0: 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
92c0: 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e  ite3LeaveMutexAn
92d0: 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c  dCloseZombie(sql
92e0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73  ite3 *db){.  Has
92f0: 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20 20  hElem *i;       
9300: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9310: 48 61 73 68 20 74 61 62 6c 65 20 69 74 65 72 61  Hash table itera
9320: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a  tor */.  int j;.
9330: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
9340: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 73  re outstanding s
9350: 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 72 20 73  qlite3_stmt or s
9360: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62  qlite3_backup ob
9370: 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66  jects.  ** or if
9380: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
9390: 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
93a0: 20 63 6c 6f 73 65 64 20 62 79 20 73 71 6c 69 74   closed by sqlit
93b0: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20  e3_close_v2(),. 
93c0: 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20 6c 65   ** then just le
93d0: 61 76 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e  ave the mutex an
93e0: 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
93f0: 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d   if( db->magic!=
9400: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d  SQLITE_MAGIC_ZOM
9410: 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f  BIE || connectio
9420: 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20  nIsBusy(db) ){. 
9430: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
9440: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
9450: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
9460: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
9470: 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
9480: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
9490: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
94a0: 65 63 74 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20  ection has.  ** 
94b0: 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71 6c 69 74  closed all sqlit
94c0: 65 33 5f 73 74 6d 74 20 61 6e 64 20 73 71 6c 69  e3_stmt and sqli
94d0: 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63  te3_backup objec
94e0: 74 73 20 61 6e 64 20 68 61 73 20 62 65 65 6e 0a  ts and has been.
94f0: 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 73    ** passed to s
9500: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65  qlite3_close (me
9510: 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20 69 73  aning that it is
9520: 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65   a zombie).  The
9530: 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20  refore,.  ** go 
9540: 61 68 65 61 64 20 61 6e 64 20 66 72 65 65 20 61  ahead and free a
9550: 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20  ll resources..  
9560: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72  */..  /* If a tr
9570: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
9580: 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  n, roll it back.
9590: 20 54 68 69 73 20 61 6c 73 6f 20 65 6e 73 75 72   This also ensur
95a0: 65 73 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20  es that if.  ** 
95b0: 61 6e 79 20 64 61 74 61 62 61 73 65 20 73 63 68  any database sch
95c0: 65 6d 61 73 20 68 61 76 65 20 62 65 65 6e 20 6d  emas have been m
95d0: 6f 64 69 66 69 65 64 20 62 79 20 61 6e 20 75 6e  odified by an un
95e0: 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61  committed transa
95f0: 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68 65 79 20  ction.  ** they 
9600: 61 72 65 20 72 65 73 65 74 2e 20 41 6e 64 20 74  are reset. And t
9610: 68 61 74 20 74 68 65 20 72 65 71 75 69 72 65 64  hat the required
9620: 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
9630: 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65 0a 20 20   held to make.  
9640: 2a 2a 20 74 68 65 20 70 61 67 65 72 20 72 6f 6c  ** the pager rol
9650: 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61  lback and schema
9660: 20 72 65 73 65 74 20 61 6e 20 61 74 6f 6d 69 63   reset an atomic
9670: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20   operation. */. 
9680: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
9690: 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
96a0: 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61  K);..  /* Free a
96b0: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53  ny outstanding S
96c0: 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75  avepoint structu
96d0: 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  res. */.  sqlite
96e0: 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
96f0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  (db);..  /* Clos
9700: 65 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63  e all database c
9710: 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
9720: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e  for(j=0; j<db->n
9730: 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; j++){.    st
9740: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
9750: 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20  db->aDb[j];.    
9760: 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a  if( pDb->pBt ){.
9770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
9780: 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74  eeClose(pDb->pBt
9790: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42  );.      pDb->pB
97a0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
97b0: 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20   j!=1 ){.       
97c0: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20   pDb->pSchema = 
97d0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
97e0: 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20  .  }.  /* Clear 
97f0: 74 68 65 20 54 45 4d 50 20 73 63 68 65 6d 61 20  the TEMP schema 
9800: 73 65 70 61 72 61 74 65 6c 79 20 61 6e 64 20 6c  separately and l
9810: 61 73 74 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ast */.  if( db-
9820: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
9830: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63  ){.    sqlite3Sc
9840: 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44  hemaClear(db->aD
9850: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20  b[1].pSchema);. 
9860: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
9870: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
9880: 0a 20 20 2f 2a 20 46 72 65 65 20 75 70 20 74 68  .  /* Free up th
9890: 65 20 61 72 72 61 79 20 6f 66 20 61 75 78 69 6c  e array of auxil
98a0: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 2a  iary databases *
98b0: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61  /.  sqlite3Colla
98c0: 70 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79  pseDatabaseArray
98d0: 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20  (db);.  assert( 
98e0: 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20  db->nDb<=2 );.  
98f0: 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d  assert( db->aDb=
9900: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
9910: 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65  ;..  /* Tell the
9920: 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e   code in notify.
9930: 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65  c that the conne
9940: 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  ction no longer 
9950: 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c  holds any.  ** l
9960: 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f  ocks and does no
9970: 74 20 72 65 71 75 69 72 65 20 61 6e 79 20 66 75  t require any fu
9980: 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  rther unlock-not
9990: 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
99a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e   */.  sqlite3Con
99b0: 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62  nectionClosed(db
99c0: 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  );..  for(i=sqli
99d0: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
99e0: 3e 61 46 75 6e 63 29 3b 20 69 3b 20 69 3d 73 71  >aFunc); i; i=sq
99f0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
9a00: 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70  {.    FuncDef *p
9a10: 4e 65 78 74 2c 20 2a 70 3b 0a 20 20 20 20 70 20  Next, *p;.    p 
9a20: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
9a30: 28 69 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  (i);.    do{.   
9a40: 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72     functionDestr
9a50: 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  oy(db, p);.     
9a60: 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78   pNext = p->pNex
9a70: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
9a80: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20  DbFree(db, p);. 
9a90: 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a       p = pNext;.
9aa0: 20 20 20 20 7d 77 68 69 6c 65 28 20 70 20 29 3b      }while( p );
9ab0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
9ac0: 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 46 75  shClear(&db->aFu
9ad0: 6e 63 29 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c  nc);.  for(i=sql
9ae0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
9af0: 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20  ->aCollSeq); i; 
9b00: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
9b10: 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65  (i)){.    CollSe
9b20: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
9b30: 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68  Seq *)sqliteHash
9b40: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20  Data(i);.    /* 
9b50: 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72  Invoke any destr
9b60: 75 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65  uctors registere
9b70: 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20  d for collation 
9b80: 73 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61  sequence user da
9b90: 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a  ta. */.    for(j
9ba0: 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
9bb0: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a       if( pColl[j
9bc0: 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ].xDel ){.      
9bd0: 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28    pColl[j].xDel(
9be0: 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b  pColl[j].pUser);
9bf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9c00: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9c10: 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, pColl);.  }
9c20: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
9c30: 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ear(&db->aCollSe
9c40: 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  q);.#ifndef SQLI
9c50: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
9c60: 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c  ABLE.  for(i=sql
9c70: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
9c80: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69  ->aModule); i; i
9c90: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
9ca0: 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20  i)){.    Module 
9cb0: 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20  *pMod = (Module 
9cc0: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
9cd0: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f  (i);.    if( pMo
9ce0: 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20  d->xDestroy ){. 
9cf0: 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74       pMod->xDest
9d00: 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b  roy(pMod->pAux);
9d10: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9d20: 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54  e3VtabEponymousT
9d30: 61 62 6c 65 43 6c 65 61 72 28 64 62 2c 20 70 4d  ableClear(db, pM
9d40: 6f 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  od);.    sqlite3
9d50: 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29  DbFree(db, pMod)
9d60: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
9d70: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d  ashClear(&db->aM
9d80: 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
9d90: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
9da0: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 20 2f  b, SQLITE_OK); /
9db0: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e  * Deallocates an
9dc0: 79 20 63 61 63 68 65 64 20 65 72 72 6f 72 20 73  y cached error s
9dd0: 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73 71 6c  trings. */.  sql
9de0: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 64 62  ite3ValueFree(db
9df0: 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c 69 74  ->pErr);.  sqlit
9e00: 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e  e3CloseExtension
9e10: 73 28 64 62 29 3b 0a 23 69 66 20 53 51 4c 49 54  s(db);.#if SQLIT
9e20: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
9e30: 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f  ATION.  sqlite3_
9e40: 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41  free(db->auth.zA
9e50: 75 74 68 55 73 65 72 29 3b 0a 20 20 73 71 6c 69  uthUser);.  sqli
9e60: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74  te3_free(db->aut
9e70: 68 2e 7a 41 75 74 68 50 57 29 3b 0a 23 65 6e 64  h.zAuthPW);.#end
9e80: 69 66 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  if..  db->magic 
9e90: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45  = SQLITE_MAGIC_E
9ea0: 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  RROR;..  /* The 
9eb0: 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63  temp-database sc
9ec0: 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65  hema is allocate
9ed0: 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72  d differently fr
9ee0: 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63 68  om the other sch
9ef0: 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73  ema.  ** objects
9f00: 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61   (using sqliteMa
9f10: 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c  lloc() directly,
9f20: 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69   instead of sqli
9f30: 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 29  te3BtreeSchema()
9f40: 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65  )..  ** So it ne
9f50: 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
9f60: 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20  here. Todo: Why 
9f70: 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d  not roll the tem
9f80: 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20  p schema into.  
9f90: 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69  ** the same sqli
9fa0: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68  teMalloc() as th
9fb0: 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63  e one that alloc
9fc0: 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ates the databas
9fd0: 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  e .  ** structur
9fe0: 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e?.  */.  sqlite
9ff0: 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e  3DbFree(db, db->
a000: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
a010: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a020: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
a030: 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  );.  db->magic =
a040: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c   SQLITE_MAGIC_CL
a050: 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f  OSED;.  sqlite3_
a060: 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d  mutex_free(db->m
a070: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
a080: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
a090: 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46 61  Out==0 );  /* Fa
a0a0: 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69  ils on a lookasi
a0b0: 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 2a  de memory leak *
a0c0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  /.  if( db->look
a0d0: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
a0e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
a0f0: 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ree(db->lookasid
a100: 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  e.pStart);.  }. 
a110: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
a120: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
a130: 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73  back all databas
a140: 65 20 66 69 6c 65 73 2e 20 20 49 66 20 74 72 69  e files.  If tri
a150: 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c  pCode is not SQL
a160: 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20  ITE_OK, then.** 
a170: 61 6e 79 20 77 72 69 74 65 20 63 75 72 73 6f 72  any write cursor
a180: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
a190: 64 20 28 22 74 72 69 70 70 65 64 22 20 2d 20 61  d ("tripped" - a
a1a0: 73 20 69 6e 20 22 74 72 69 70 70 69 6e 67 20 61  s in "tripping a
a1b0: 20 63 69 72 63 75 69 74 0a 2a 2a 20 62 72 65 61   circuit.** brea
a1c0: 6b 65 72 22 29 20 61 6e 64 20 6d 61 64 65 20 74  ker") and made t
a1d0: 6f 20 72 65 74 75 72 6e 20 74 72 69 70 43 6f 64  o return tripCod
a1e0: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
a1f0: 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a 20 61 74  ny further.** at
a200: 74 65 6d 70 74 73 20 74 6f 20 75 73 65 20 74 68  tempts to use th
a210: 61 74 20 63 75 72 73 6f 72 2e 20 20 52 65 61 64  at cursor.  Read
a220: 20 63 75 72 73 6f 72 73 20 72 65 6d 61 69 6e 20   cursors remain 
a230: 6f 70 65 6e 20 61 6e 64 20 76 61 6c 69 64 0a 2a  open and valid.*
a240: 2a 20 62 75 74 20 61 72 65 20 22 73 61 76 65 64  * but are "saved
a250: 22 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 61  " in case the ta
a260: 62 6c 65 20 70 61 67 65 73 20 61 72 65 20 6d 6f  ble pages are mo
a270: 76 65 64 20 61 72 6f 75 6e 64 2e 0a 2a 2f 0a 76  ved around..*/.v
a280: 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62  oid sqlite3Rollb
a290: 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  ackAll(sqlite3 *
a2a0: 64 62 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  db, int tripCode
a2b0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
a2c0: 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20  t inTrans = 0;. 
a2d0: 20 69 6e 74 20 73 63 68 65 6d 61 43 68 61 6e 67   int schemaChang
a2e0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
a2f0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
a300: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
a310: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
a320: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f  gnMalloc();..  /
a330: 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d 74  * Obtain all b-t
a340: 72 65 65 20 6d 75 74 65 78 65 73 20 62 65 66 6f  ree mutexes befo
a350: 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63 61  re making any ca
a360: 6c 6c 73 20 74 6f 20 42 74 72 65 65 52 6f 6c 6c  lls to BtreeRoll
a370: 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54 68  back(). .  ** Th
a380: 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  is is important 
a390: 69 6e 20 63 61 73 65 20 74 68 65 20 74 72 61 6e  in case the tran
a3a0: 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 20 72 6f  saction being ro
a3b0: 6c 6c 65 64 20 62 61 63 6b 20 68 61 73 0a 20 20  lled back has.  
a3c0: 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20  ** modified the 
a3d0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
a3e0: 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 6d   If the b-tree m
a3f0: 75 74 65 78 65 73 20 61 72 65 20 6e 6f 74 20 74  utexes are not t
a400: 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c 20  aken.  ** here, 
a410: 74 68 65 6e 20 61 6e 6f 74 68 65 72 20 73 68 61  then another sha
a420: 72 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65 63  red-cache connec
a430: 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61 6b  tion might sneak
a440: 20 69 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a   in between.  **
a450: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 6f   the database ro
a460: 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d  llback and schem
a470: 61 20 72 65 73 65 74 2c 20 77 68 69 63 68 20 63  a reset, which c
a480: 61 6e 20 63 61 75 73 65 20 66 61 6c 73 65 0a 20  an cause false. 
a490: 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 72   ** corruption r
a4a0: 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20 63  eports in some c
a4b0: 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c 69  ases.  */.  sqli
a4c0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
a4d0: 28 64 62 29 3b 0a 20 20 73 63 68 65 6d 61 43 68  (db);.  schemaCh
a4e0: 61 6e 67 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ange = (db->flag
a4f0: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72  s & SQLITE_Inter
a500: 6e 43 68 61 6e 67 65 73 29 21 3d 30 20 26 26 20  nChanges)!=0 && 
a510: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
a520: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
a530: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
a540: 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62     Btree *p = db
a550: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
a560: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
a570: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
a580: 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b  eIsInTrans(p) ){
a590: 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73  .        inTrans
a5a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
a5b0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
a5c0: 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69 70  Rollback(p, trip
a5d0: 43 6f 64 65 2c 20 21 73 63 68 65 6d 61 43 68 61  Code, !schemaCha
a5e0: 6e 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nge);.    }.  }.
a5f0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c    sqlite3VtabRol
a600: 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c  lback(db);.  sql
a610: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
a620: 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 28 64  loc();..  if( (d
a630: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
a640: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21 3d  InternChanges)!=
a650: 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75  0 && db->init.bu
a660: 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  sy==0 ){.    sql
a670: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
a680: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
a690: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  ;.    sqlite3Res
a6a0: 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f  etAllSchemasOfCo
a6b0: 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20  nnection(db);.  
a6c0: 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
a6d0: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20  LeaveAll(db);.. 
a6e0: 20 2f 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64   /* Any deferred
a6f0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
a700: 61 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20  ations have now 
a710: 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a  been resolved. *
a720: 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65  /.  db->nDeferre
a730: 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d  dCons = 0;.  db-
a740: 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
a750: 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61  s = 0;.  db->fla
a760: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65  gs &= ~SQLITE_De
a770: 66 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66  ferFKs;..  /* If
a780: 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f   one has been co
a790: 6e 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65  nfigured, invoke
a7a0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f   the rollback-ho
a7b0: 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ok callback */. 
a7c0: 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61   if( db->xRollba
a7d0: 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69  ckCallback && (i
a7e0: 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61  nTrans || !db->a
a7f0: 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20  utoCommit) ){.  
a800: 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43    db->xRollbackC
a810: 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c  allback(db->pRol
a820: 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d  lbackArg);.  }.}
a830: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
a840: 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 63   static string c
a850: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61  ontaining the na
a860: 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  me corresponding
a870: 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 63 6f   to the error co
a880: 64 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  de.** specified 
a890: 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  in the argument.
a8a0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
a8b0: 53 51 4c 49 54 45 5f 4e 45 45 44 5f 45 52 52 5f  SQLITE_NEED_ERR_
a8c0: 4e 41 4d 45 29 0a 63 6f 6e 73 74 20 63 68 61 72  NAME).const char
a8d0: 20 2a 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65   *sqlite3ErrName
a8e0: 28 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73  (int rc){.  cons
a8f0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
a900: 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 72 69 67  0;.  int i, orig
a910: 52 63 20 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69  Rc = rc;.  for(i
a920: 3d 30 3b 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65  =0; i<2 && zName
a930: 3d 3d 30 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20  ==0; i++, rc &= 
a940: 30 78 66 66 29 7b 0a 20 20 20 20 73 77 69 74 63  0xff){.    switc
a950: 68 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 63  h( rc ){.      c
a960: 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20  ase SQLITE_OK:  
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
a980: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f  Name = "SQLITE_O
a990: 4b 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  K";             
a9a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a9b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f  case SQLITE_ERRO
a9c0: 52 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R:              
a9d0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a9e0: 45 52 52 4f 52 22 3b 20 20 20 20 20 20 20 20 20  ERROR";         
a9f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
aa00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
aa10: 45 52 4e 41 4c 3a 20 20 20 20 20 20 20 20 20 20  ERNAL:          
aa20: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
aa30: 5f 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20 20 20  _INTERNAL";     
aa40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aa50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45    case SQLITE_PE
aa60: 52 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  RM:             
aa70: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
aa80: 45 5f 50 45 52 4d 22 3b 20 20 20 20 20 20 20 20  E_PERM";        
aa90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
aaa0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
aab0: 42 4f 52 54 3a 20 20 20 20 20 20 20 20 20 20 20  BORT:           
aac0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
aad0: 54 45 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20  TE_ABORT";      
aae0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
aaf0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ab00: 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20  ABORT_ROLLBACK: 
ab10: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ab20: 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
ab30: 43 4b 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  CK";    break;. 
ab40: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ab50: 5f 42 55 53 59 3a 20 20 20 20 20 20 20 20 20 20  _BUSY:          
ab60: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ab70: 4c 49 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20  LITE_BUSY";     
ab80: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
ab90: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
aba0: 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 3a  E_BUSY_RECOVERY:
abb0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
abc0: 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56  QLITE_BUSY_RECOV
abd0: 45 52 59 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ERY";     break;
abe0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
abf0: 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54  TE_BUSY_SNAPSHOT
ac00: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
ac10: 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50  SQLITE_BUSY_SNAP
ac20: 53 48 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b  SHOT";     break
ac30: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ac40: 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20  ITE_LOCKED:     
ac50: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ac60: 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b  "SQLITE_LOCKED";
ac70: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
ac80: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ac90: 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
aca0: 45 44 43 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d  EDCACHE: zName =
acb0: 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f   "SQLITE_LOCKED_
acc0: 53 48 41 52 45 44 43 41 43 48 45 22 3b 62 72 65  SHAREDCACHE";bre
acd0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ace0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20  QLITE_NOMEM:    
acf0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
ad00: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22  = "SQLITE_NOMEM"
ad10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
ad20: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ad30: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a  SQLITE_READONLY:
ad40: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
ad50: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
ad60: 4e 4c 59 22 3b 20 20 20 20 20 20 20 20 20 20 62  NLY";          b
ad70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ad80: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
ad90: 5f 52 45 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d  _RECOVERY:  zNam
ada0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
adb0: 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20  ONLY_RECOVERY"; 
adc0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
add0: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
ade0: 59 5f 43 41 4e 54 4c 4f 43 4b 3a 20 20 7a 4e 61  Y_CANTLOCK:  zNa
adf0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
ae00: 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 22 3b  DONLY_CANTLOCK";
ae10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ae20: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
ae30: 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e  LY_ROLLBACK:  zN
ae40: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
ae50: 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22  ADONLY_ROLLBACK"
ae60: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
ae70: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
ae80: 4e 4c 59 5f 44 42 4d 4f 56 45 44 3a 20 20 20 7a  NLY_DBMOVED:   z
ae90: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
aea0: 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 22  EADONLY_DBMOVED"
aeb0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
aec0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
aed0: 52 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20  RRUPT:          
aee0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
aef0: 49 4e 54 45 52 52 55 50 54 22 3b 20 20 20 20 20  INTERRUPT";     
af00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
af10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
af20: 52 52 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR:             
af30: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
af40: 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20 20 20  _IOERR";        
af50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
af60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
af70: 45 52 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20  ERR_READ:       
af80: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
af90: 45 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b 20 20  E_IOERR_READ";  
afa0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
afb0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
afc0: 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a  OERR_SHORT_READ:
afd0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
afe0: 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
aff0: 45 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  EAD";  break;.  
b000: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b010: 49 4f 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20  IOERR_WRITE:    
b020: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b030: 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22  ITE_IOERR_WRITE"
b040: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
b050: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b060: 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20 20  _IOERR_FSYNC:   
b070: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b080: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
b090: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
b0a0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b0b0: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
b0c0: 43 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  C:    zName = "S
b0d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
b0e0: 46 53 59 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b  FSYNC";   break;
b0f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b100: 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
b110: 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  E:     zName = "
b120: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
b130: 4e 43 41 54 45 22 3b 20 20 20 20 62 72 65 61 6b  NCATE";    break
b140: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b150: 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a  ITE_IOERR_FSTAT:
b160: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b170: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  "SQLITE_IOERR_FS
b180: 54 41 54 22 3b 20 20 20 20 20 20 20 62 72 65 61  TAT";       brea
b190: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b1a0: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
b1b0: 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  K:       zName =
b1c0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55   "SQLITE_IOERR_U
b1d0: 4e 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65  NLOCK";      bre
b1e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b1f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
b200: 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  CK:       zName 
b210: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b220: 52 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72  RDLOCK";      br
b230: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b240: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
b250: 45 54 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  ETE:       zName
b260: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b270: 5f 44 45 4c 45 54 45 22 3b 20 20 20 20 20 20 62  _DELETE";      b
b280: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b290: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
b2a0: 4d 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  MEM:        zNam
b2b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b2c0: 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20  R_NOMEM";       
b2d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b2e0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  e SQLITE_IOERR_A
b2f0: 43 43 45 53 53 3a 20 20 20 20 20 20 20 7a 4e 61  CCESS:       zNa
b300: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b310: 52 52 5f 41 43 43 45 53 53 22 3b 20 20 20 20 20  RR_ACCESS";     
b320: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b330: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b340: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
b350: 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K:.             
b360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b370: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b380: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
b390: 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65  SERVEDLOCK"; bre
b3a0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b3b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
b3c0: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
b3d0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b3e0: 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20 20 62 72  LOCK";        br
b3f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b400: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
b410: 53 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  SE:        zName
b420: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b430: 5f 43 4c 4f 53 45 22 3b 20 20 20 20 20 20 20 62  _CLOSE";       b
b440: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b450: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
b460: 52 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d  R_CLOSE:    zNam
b470: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b480: 52 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20  R_DIR_CLOSE";   
b490: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b4a0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
b4b0: 48 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61  HMOPEN:      zNa
b4c0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b4d0: 52 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20  RR_SHMOPEN";    
b4e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b4f0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b500: 53 48 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e  SHMSIZE:      zN
b510: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b520: 45 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20  ERR_SHMSIZE";   
b530: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b540: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b550: 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a  _SHMLOCK:      z
b560: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b570: 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20  OERR_SHMLOCK";  
b580: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b590: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b5a0: 52 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20 20 20  R_SHMMAP:       
b5b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b5c0: 49 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20  IOERR_SHMMAP";  
b5d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b5e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b5f0: 52 52 5f 53 45 45 4b 3a 20 20 20 20 20 20 20 20  RR_SEEK:        
b600: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b610: 5f 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20 20  _IOERR_SEEK";   
b620: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b630: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b640: 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
b650: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
b660: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
b670: 4f 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20  OENT";break;.   
b680: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b690: 4f 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20  OERR_MMAP:      
b6a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b6b0: 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20  TE_IOERR_MMAP"; 
b6c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b6d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b6e0: 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
b6f0: 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  H:  zName = "SQL
b700: 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
b710: 50 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20  PPATH"; break;. 
b720: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b730: 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a  _IOERR_CONVPATH:
b740: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b750: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50  LITE_IOERR_CONVP
b760: 41 54 48 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  ATH";    break;.
b770: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b780: 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 20 20  E_CORRUPT:      
b790: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b7a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20  QLITE_CORRUPT"; 
b7b0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b7c0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b7d0: 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3a  TE_CORRUPT_VTAB:
b7e0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b7f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
b800: 54 41 42 22 3b 20 20 20 20 20 20 62 72 65 61 6b  TAB";      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 4e 4f 54 46 4f 55 4e 44 3a 20 20 20  ITE_NOTFOUND:   
b830: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b840: 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  "SQLITE_NOTFOUND
b850: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          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 46 55 4c 4c 3a 20 20 20 20 20 20  LITE_FULL:      
b880: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b890: 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20   "SQLITE_FULL"; 
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
b8b0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b8c0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20  QLITE_CANTOPEN: 
b8d0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b8e0: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
b8f0: 45 4e 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  EN";          br
b900: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b910: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
b920: 4e 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65  NOTEMPDIR: zName
b930: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
b940: 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62  PEN_NOTEMPDIR";b
b950: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b960: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
b970: 5f 49 53 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d  _ISDIR:     zNam
b980: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
b990: 4f 50 45 4e 5f 49 53 44 49 52 22 3b 20 20 20 20  OPEN_ISDIR";    
b9a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b9b0: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
b9c0: 4e 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61  N_FULLPATH:  zNa
b9d0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
b9e0: 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b  TOPEN_FULLPATH";
b9f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ba00: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
ba10: 45 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e  EN_CONVPATH:  zN
ba20: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
ba30: 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22  NTOPEN_CONVPATH"
ba40: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
ba50: 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  ase SQLITE_PROTO
ba60: 43 4f 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a  COL:           z
ba70: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50  Name = "SQLITE_P
ba80: 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20  ROTOCOL";       
ba90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
baa0: 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54  case SQLITE_EMPT
bab0: 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:              
bac0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bad0: 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20 20 20  EMPTY";         
bae0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
baf0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48   case SQLITE_SCH
bb00: 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20 20  EMA:            
bb10: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bb20: 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20 20 20  _SCHEMA";       
bb30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bb40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f    case SQLITE_TO
bb50: 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20 20 20  OBIG:           
bb60: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bb70: 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20 20  E_TOOBIG";      
bb80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bb90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
bba0: 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20  ONSTRAINT:      
bbb0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bbc0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20  TE_CONSTRAINT"; 
bbd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bbe0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bbf0: 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55  CONSTRAINT_UNIQU
bc00: 45 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  E:  zName = "SQL
bc10: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55  ITE_CONSTRAINT_U
bc20: 4e 49 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20  NIQUE"; break;. 
bc30: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bc40: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47  _CONSTRAINT_TRIG
bc50: 47 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  GER: zName = "SQ
bc60: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
bc70: 54 52 49 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a  TRIGGER";break;.
bc80: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bc90: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
bca0: 45 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20  EIGNKEY:.       
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcc0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bcd0: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
bce0: 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b  INT_FOREIGNKEY";
bcf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bd00: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
bd10: 54 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20  TRAINT_CHECK:   
bd20: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bd30: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b  CONSTRAINT_CHECK
bd40: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
bd50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
bd60: 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
bd70: 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY:.            
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd90: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bda0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
bdb0: 52 49 4d 41 52 59 4b 45 59 22 3b 20 20 20 62 72  RIMARYKEY";   br
bdc0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bdd0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
bde0: 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65  T_NOTNULL: zName
bdf0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
be00: 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62  RAINT_NOTNULL";b
be10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
be20: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
be30: 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20  NT_COMMITHOOK:. 
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
be60: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
be70: 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54  ONSTRAINT_COMMIT
be80: 48 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a  HOOK";   break;.
be90: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bea0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41  E_CONSTRAINT_VTA
beb0: 42 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  B:    zName = "S
bec0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
bed0: 5f 56 54 41 42 22 3b 20 20 20 62 72 65 61 6b 3b  _VTAB";   break;
bee0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bef0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55  TE_CONSTRAINT_FU
bf00: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20  NCTION:.        
bf10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf20: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bf30: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
bf40: 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20  NT_FUNCTION";   
bf50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bf60: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
bf70: 52 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20 20 7a  RAINT_ROWID:   z
bf80: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
bf90: 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 22  ONSTRAINT_ROWID"
bfa0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
bfb0: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d  case SQLITE_MISM
bfc0: 41 54 43 48 3a 20 20 20 20 20 20 20 20 20 20 20  ATCH:           
bfd0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bfe0: 4d 49 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20  MISMATCH";      
bff0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c000: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53   case SQLITE_MIS
c010: 55 53 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  USE:            
c020: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c030: 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20 20 20  _MISUSE";       
c040: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c050: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
c060: 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20 20 20  LFS:            
c070: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c080: 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20  E_NOLFS";       
c090: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c0a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
c0b0: 55 54 48 3a 20 20 20 20 20 20 20 20 20 20 20 20  UTH:            
c0c0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c0d0: 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20  TE_AUTH";       
c0e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c0f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c100: 46 4f 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20  FORMAT:         
c110: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c120: 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20  ITE_FORMAT";    
c130: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c140: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c150: 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 20 20 20  _RANGE:         
c160: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c170: 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20  LITE_RANGE";    
c180: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c190: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c1a0: 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 20 20  E_NOTADB:       
c1b0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c1c0: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20  QLITE_NOTADB";  
c1d0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c1e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c1f0: 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 20  TE_ROW:         
c200: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c210: 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20  SQLITE_ROW";    
c220: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
c230: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c240: 49 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20  ITE_NOTICE:     
c250: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c260: 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b  "SQLITE_NOTICE";
c270: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
c280: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c290: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
c2a0: 56 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d  VER_WAL: zName =
c2b0: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f   "SQLITE_NOTICE_
c2c0: 52 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65  RECOVER_WAL";bre
c2d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c2e0: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
c2f0: 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20  OVER_ROLLBACK:. 
c300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
c320: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
c330: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
c340: 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  LLBACK"; break;.
c350: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c360: 45 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20 20 20  E_WARNING:      
c370: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c380: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20  QLITE_WARNING"; 
c390: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c3a0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c3b0: 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49  TE_WARNING_AUTOI
c3c0: 4e 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  NDEX:  zName = "
c3d0: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
c3e0: 55 54 4f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  UTOINDEX"; break
c3f0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c400: 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20  ITE_DONE:       
c410: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c420: 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20  "SQLITE_DONE";  
c430: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
c440: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
c450: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
c460: 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a     static char z
c470: 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c  Buf[50];.    sql
c480: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
c490: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
c4a0: 2c 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57  , "SQLITE_UNKNOW
c4b0: 4e 28 25 64 29 22 2c 20 6f 72 69 67 52 63 29 3b  N(%d)", origRc);
c4c0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75  .    zName = zBu
c4d0: 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  f;.  }.  return 
c4e0: 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  zName;.}.#endif.
c4f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
c500: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68  static string th
c510: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
c520: 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73   kind of error s
c530: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a  pecified in the.
c540: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
c550: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
c560: 74 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63  te3ErrStr(int rc
c570: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
c580: 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d  t char* const aM
c590: 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  sg[] = {.    /* 
c5a0: 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20  SQLITE_OK       
c5b0: 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72     */ "not an er
c5c0: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
c5d0: 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20  ITE_ERROR       
c5e0: 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72  */ "SQL logic er
c5f0: 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64  ror or missing d
c600: 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a  atabase",.    /*
c610: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
c620: 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a      */ 0,.    /*
c630: 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20 20 20   SQLITE_PERM    
c640: 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73 20 70      */ "access p
c650: 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64  ermission denied
c660: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c670: 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a 2f 20  _ABORT       */ 
c680: 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73  "callback reques
c690: 74 65 64 20 71 75 65 72 79 20 61 62 6f 72 74 22  ted query abort"
c6a0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c6b0: 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f 20 22  BUSY        */ "
c6c0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
c6d0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c6e0: 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a  TE_LOCKED      *
c6f0: 2f 20 22 64 61 74 61 62 61 73 65 20 74 61 62 6c  / "database tabl
c700: 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20  e is locked",.  
c710: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45    /* SQLITE_NOME
c720: 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75 74 20  M       */ "out 
c730: 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20  of memory",.    
c740: 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  /* SQLITE_READON
c750: 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65 6d 70  LY    */ "attemp
c760: 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65 61  t to write a rea
c770: 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22 2c  donly database",
c780: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
c790: 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20 22 69  NTERRUPT   */ "i
c7a0: 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20 20 20  nterrupted",.   
c7b0: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   /* SQLITE_IOERR
c7c0: 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73 6b 20         */ "disk 
c7d0: 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20 20  I/O error",.    
c7e0: 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  /* SQLITE_CORRUP
c7f0: 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61  T     */ "databa
c800: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
c810: 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20   malformed",.   
c820: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   /* SQLITE_NOTFO
c830: 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f  UND    */ "unkno
c840: 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a 20  wn operation",. 
c850: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c     /* SQLITE_FUL
c860: 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74  L        */ "dat
c870: 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73  abase or disk is
c880: 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53   full",.    /* S
c890: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20  QLITE_CANTOPEN  
c8a0: 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20    */ "unable to 
c8b0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
c8c0: 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  le",.    /* SQLI
c8d0: 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a  TE_PROTOCOL    *
c8e0: 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  / "locking proto
c8f0: 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  col",.    /* SQL
c900: 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20 20 20  ITE_EMPTY       
c910: 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74 61 69  */ "table contai
c920: 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20  ns no data",.   
c930: 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48 45 4d   /* SQLITE_SCHEM
c940: 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  A      */ "datab
c950: 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63  ase schema has c
c960: 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20  hanged",.    /* 
c970: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20 20  SQLITE_TOOBIG   
c980: 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72     */ "string or
c990: 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a   blob too big",.
c9a0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f      /* SQLITE_CO
c9b0: 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f  NSTRAINT  */ "co
c9c0: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
c9d0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c9e0: 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22  MISMATCH    */ "
c9f0: 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63  datatype mismatc
ca00: 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  h",.    /* SQLIT
ca10: 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f  E_MISUSE      */
ca20: 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e   "library routin
ca30: 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20  e called out of 
ca40: 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f  sequence",.    /
ca50: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20  * SQLITE_NOLFS  
ca60: 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66       */ "large f
ca70: 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20 64  ile support is d
ca80: 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a  isabled",.    /*
ca90: 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20   SQLITE_AUTH    
caa0: 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a      */ "authoriz
cab0: 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20  ation denied",. 
cac0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52     /* SQLITE_FOR
cad0: 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61 75 78  MAT      */ "aux
cae0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
caf0: 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20  format error",. 
cb00: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e     /* SQLITE_RAN
cb10: 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62 69 6e  GE       */ "bin
cb20: 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65  d or column inde
cb30: 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c  x out of range",
cb40: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
cb50: 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66  OTADB      */ "f
cb60: 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74 65 64  ile is encrypted
cb70: 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74   or is not a dat
cb80: 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 63  abase",.  };.  c
cb90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
cba0: 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72  = "unknown error
cbb0: 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63 20  ";.  switch( rc 
cbc0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
cbd0: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
cbe0: 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20  K: {.      zErr 
cbf0: 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74 6f 20  = "abort due to 
cc00: 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
cc10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
cc20: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
cc30: 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b 0a 20     rc &= 0xff;. 
cc40: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
cc50: 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41 72 72  rc>=0) && rc<Arr
cc60: 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26 26 20  aySize(aMsg) && 
cc70: 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20  aMsg[rc]!=0 ){. 
cc80: 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 61 4d         zErr = aM
cc90: 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20 7d 0a  sg[rc];.      }.
cca0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ccb0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
ccc0: 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  zErr;.}../*.** T
ccd0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
cce0: 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61  ements a busy ca
ccf0: 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65  llback that slee
cd00: 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20  ps and tries.** 
cd10: 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69  again until a ti
cd20: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72  meout value is r
cd30: 65 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d  eached.  The tim
cd40: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a  eout value is.**
cd50: 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
cd60: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
cd70: 64 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20  ds passed in as 
cd80: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
cd90: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
cda0: 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75   int sqliteDefau
cdb0: 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a  ltBusyCallback(.
cdc0: 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20   void *ptr,     
cdd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
cde0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
cdf0: 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20   */. int count  
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ce10: 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
ce20: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
ce30: 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53  busy */.){.#if S
ce40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20  QLITE_OS_WIN || 
ce50: 48 41 56 45 5f 55 53 4c 45 45 50 0a 20 20 73 74  HAVE_USLEEP.  st
ce60: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 64 65  atic const u8 de
ce70: 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20  lays[] =.     { 
ce80: 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c  1, 2, 5, 10, 15,
ce90: 20 32 30 2c 20 32 35 2c 20 32 35 2c 20 20 32 35   20, 25, 25,  25
cea0: 2c 20 20 35 30 2c 20 20 35 30 2c 20 31 30 30 20  ,  50,  50, 100 
ceb0: 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
cec0: 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a  t u8 totals[] =.
ced0: 20 20 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20       { 0, 1, 3, 
cee0: 20 38 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c 20   8, 18, 33, 53, 
cef0: 37 38 2c 20 31 30 33 2c 20 31 32 38 2c 20 31 37  78, 103, 128, 17
cf00: 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65 66 69  8, 228 };.# defi
cf10: 6e 65 20 4e 44 45 4c 41 59 20 41 72 72 61 79 53  ne NDELAY ArrayS
cf20: 69 7a 65 28 64 65 6c 61 79 73 29 0a 20 20 73 71  ize(delays).  sq
cf30: 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c  lite3 *db = (sql
cf40: 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e  ite3 *)ptr;.  in
cf50: 74 20 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d 3e  t timeout = db->
cf60: 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69  busyTimeout;.  i
cf70: 6e 74 20 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b  nt delay, prior;
cf80: 0a 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e  ..  assert( coun
cf90: 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f  t>=0 );.  if( co
cfa0: 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a  unt < NDELAY ){.
cfb0: 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61      delay = dela
cfc0: 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70  ys[count];.    p
cfd0: 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f  rior = totals[co
cfe0: 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  unt];.  }else{. 
cff0: 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79     delay = delay
d000: 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20  s[NDELAY-1];.   
d010: 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b   prior = totals[
d020: 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61  NDELAY-1] + dela
d030: 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59  y*(count-(NDELAY
d040: 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  -1));.  }.  if( 
d050: 70 72 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20  prior + delay > 
d060: 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 64  timeout ){.    d
d070: 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74 20 2d  elay = timeout -
d080: 20 70 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20   prior;.    if( 
d090: 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74 75 72  delay<=0 ) retur
d0a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
d0b0: 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56  e3OsSleep(db->pV
d0c0: 66 73 2c 20 64 65 6c 61 79 2a 31 30 30 30 29 3b  fs, delay*1000);
d0d0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c  .  return 1;.#el
d0e0: 73 65 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  se.  sqlite3 *db
d0f0: 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74   = (sqlite3 *)pt
d100: 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74  r;.  int timeout
d110: 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29 70   = ((sqlite3 *)p
d120: 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74  tr)->busyTimeout
d130: 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e 74 2b 31  ;.  if( (count+1
d140: 29 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f 75 74  )*1000 > timeout
d150: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
d160: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
d170: 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c  sSleep(db->pVfs,
d180: 20 31 30 30 30 30 30 30 29 3b 0a 20 20 72 65 74   1000000);.  ret
d190: 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 1;.#endif.}.
d1a0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
d1b0: 65 20 67 69 76 65 6e 20 62 75 73 79 20 68 61 6e  e given busy han
d1c0: 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dler..**.** This
d1d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
d1e0: 65 64 20 77 68 65 6e 20 61 6e 20 6f 70 65 72 61  ed when an opera
d1f0: 74 69 6f 6e 20 66 61 69 6c 65 64 20 77 69 74 68  tion failed with
d200: 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74   a lock..** If t
d210: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
d220: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
d230: 65 20 6c 6f 63 6b 20 69 73 20 72 65 74 72 69 65  e lock is retrie
d240: 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72 65 74  d.  If it.** ret
d250: 75 72 6e 73 20 30 2c 20 74 68 65 20 6f 70 65 72  urns 0, the oper
d260: 61 74 69 6f 6e 20 61 62 6f 72 74 73 20 77 69 74  ation aborts wit
d270: 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  h an SQLITE_BUSY
d280: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73   error..*/.int s
d290: 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
d2a0: 48 61 6e 64 6c 65 72 28 42 75 73 79 48 61 6e 64  Handler(BusyHand
d2b0: 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ler *p){.  int r
d2c0: 63 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  c;.  if( NEVER(p
d2d0: 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46 75 6e 63  ==0) || p->xFunc
d2e0: 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c  ==0 || p->nBusy<
d2f0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
d300: 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63 28 70 2d  rc = p->xFunc(p-
d310: 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29  >pArg, p->nBusy)
d320: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
d330: 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d 20  .    p->nBusy = 
d340: 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
d350: 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d   p->nBusy++;.  }
d360: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d  .  return rc; .}
d370: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
d380: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 62 75  tine sets the bu
d390: 73 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  sy callback for 
d3a0: 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61  an Sqlite databa
d3b0: 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76  se to the.** giv
d3c0: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  en callback func
d3d0: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69  tion with the gi
d3e0: 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ven argument..*/
d3f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73  .int sqlite3_bus
d400: 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c  y_handler(.  sql
d410: 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20  ite3 *db,.  int 
d420: 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c 69  (*xBusy)(void*,i
d430: 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  nt),.  void *pAr
d440: 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  g.){.#ifdef SQLI
d450: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
d460: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
d470: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
d480: 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
d490: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
d4a0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
d4b0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
d4c0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
d4d0: 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e  busyHandler.xFun
d4e0: 63 20 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d  c = xBusy;.  db-
d4f0: 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72  >busyHandler.pAr
d500: 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e  g = pArg;.  db->
d510: 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73  busyHandler.nBus
d520: 79 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73  y = 0;.  db->bus
d530: 79 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20  yTimeout = 0;.  
d540: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
d550: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
d560: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d570: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
d580: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
d590: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a  ESS_CALLBACK./*.
d5a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d5b0: 73 65 74 73 20 74 68 65 20 70 72 6f 67 72 65 73  sets the progres
d5c0: 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  s callback for a
d5d0: 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73  n Sqlite databas
d5e0: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65  e to the.** give
d5f0: 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  n callback funct
d600: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76  ion with the giv
d610: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  en argument. The
d620: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
d630: 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e  ck will.** be in
d640: 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73  voked every nOps
d650: 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69   opcodes..*/.voi
d660: 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65  d sqlite3_progre
d670: 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  ss_handler(.  sq
d680: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e  lite3 *db, .  in
d690: 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a  t nOps,.  int (*
d6a0: 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a  xProgress)(void*
d6b0: 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  ), .  void *pArg
d6c0: 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
d6d0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
d6e0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
d6f0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
d700: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
d710: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
d720: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
d730: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
d740: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d750: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
d760: 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20  f( nOps>0 ){.   
d770: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d   db->xProgress =
d780: 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20   xProgress;.    
d790: 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73  db->nProgressOps
d7a0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 6e 4f 70   = (unsigned)nOp
d7b0: 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67  s;.    db->pProg
d7c0: 72 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a  ressArg = pArg;.
d7d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d    }else{.    db-
d7e0: 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  >xProgress = 0;.
d7f0: 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73      db->nProgres
d800: 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62  sOps = 0;.    db
d810: 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d  ->pProgressArg =
d820: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
d830: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
d840: 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64  ->mutex);.}.#end
d850: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
d860: 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73  routine installs
d870: 20 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20   a default busy 
d880: 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69  handler that wai
d890: 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70  ts for the.** sp
d8a0: 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f  ecified number o
d8b0: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62  f milliseconds b
d8c0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
d8d0: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
d8e0: 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73  3_busy_timeout(s
d8f0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
d900: 6d 73 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ms){.#ifdef SQLI
d910: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
d920: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
d930: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
d940: 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
d950: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
d960: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6d 73  .#endif.  if( ms
d970: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
d980: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64  3_busy_handler(d
d990: 62 2c 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74  b, sqliteDefault
d9a0: 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76  BusyCallback, (v
d9b0: 6f 69 64 2a 29 64 62 29 3b 0a 20 20 20 20 64 62  oid*)db);.    db
d9c0: 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20  ->busyTimeout = 
d9d0: 6d 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ms;.  }else{.   
d9e0: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
d9f0: 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b  ndler(db, 0, 0);
da00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
da10: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
da20: 2a 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64  * Cause any pend
da30: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  ing operation to
da40: 20 73 74 6f 70 20 61 74 20 69 74 73 20 65 61 72   stop at its ear
da50: 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74  liest opportunit
da60: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
da70: 65 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c  e3_interrupt(sql
da80: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65  ite3 *db){.#ifde
da90: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
daa0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
dab0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
dac0: 65 63 6b 4f 6b 28 64 62 29 20 26 26 20 28 64 62  eckOk(db) && (db
dad0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 67 69 63  ==0 || db->magic
dae0: 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a  !=SQLITE_MAGIC_Z
daf0: 4f 4d 42 49 45 29 20 29 7b 0a 20 20 20 20 28 76  OMBIE) ){.    (v
db00: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
db10: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
db20: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rn;.  }.#endif. 
db30: 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
db40: 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f  upted = 1;.}.../
db50: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
db60: 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74 68  on is exactly th
db70: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
db80: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
db90: 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74  n(), except.** t
dba0: 68 61 74 20 69 74 20 69 73 20 64 65 73 69 67 6e  hat it is design
dbb0: 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
dbc0: 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65  by internal code
dbd0: 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  . The difference
dbe0: 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66 20 61   is.** that if a
dbf0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20   malloc() fails 
dc00: 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  in sqlite3_creat
dc10: 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e  e_function(), an
dc20: 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69   error code.** i
dc30: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
dc40: 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  he mallocFailed 
dc50: 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a  flag cleared. .*
dc60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 72 65  /.int sqlite3Cre
dc70: 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ateFunc(.  sqlit
dc80: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
dc90: 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e  char *zFunctionN
dca0: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  ame,.  int nArg,
dcb0: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
dcc0: 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a 20  id *pUserData,. 
dcd0: 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28   void (*xSFunc)(
dce0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
dcf0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
dd00: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
dd10: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
dd20: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
dd30: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
dd40: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
dd50: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
dd60: 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72 75  *),.  FuncDestru
dd70: 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f  ctor *pDestructo
dd80: 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a  r.){.  FuncDef *
dd90: 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  p;.  int nName;.
dda0: 20 20 69 6e 74 20 65 78 74 72 61 46 6c 61 67 73    int extraFlags
ddb0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
ddc0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
ddd0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
dde0: 69 66 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  if( zFunctionNam
ddf0: 65 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28 78  e==0 ||.      (x
de00: 53 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c  SFunc && (xFinal
de10: 20 7c 7c 20 78 53 74 65 70 29 29 20 7c 7c 20 0a   || xStep)) || .
de20: 20 20 20 20 20 20 28 21 78 53 46 75 6e 63 20 26        (!xSFunc &
de30: 26 20 28 78 46 69 6e 61 6c 20 26 26 20 21 78 53  & (xFinal && !xS
de40: 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28  tep)) ||.      (
de50: 21 78 53 46 75 6e 63 20 26 26 20 28 21 78 46 69  !xSFunc && (!xFi
de60: 6e 61 6c 20 26 26 20 78 53 74 65 70 29 29 20 7c  nal && xStep)) |
de70: 7c 0a 20 20 20 20 20 20 28 6e 41 72 67 3c 2d 31  |.      (nArg<-1
de80: 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f   || nArg>SQLITE_
de90: 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
dea0: 29 20 7c 7c 0a 20 20 20 20 20 20 28 32 35 35 3c  ) ||.      (255<
deb0: 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  (nName = sqlite3
dec0: 53 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74  Strlen30( zFunct
ded0: 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b 0a 20 20  ionName))) ){.  
dee0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
def0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
df00: 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
df10: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54  TE_FUNC_CONSTANT
df20: 3d 3d 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  ==SQLITE_DETERMI
df30: 4e 49 53 54 49 43 20 29 3b 0a 20 20 65 78 74 72  NISTIC );.  extr
df40: 61 46 6c 61 67 73 20 3d 20 65 6e 63 20 26 20 20  aFlags = enc &  
df50: 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
df60: 53 54 49 43 3b 0a 20 20 65 6e 63 20 26 3d 20 28  STIC;.  enc &= (
df70: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d  SQLITE_FUNC_ENCM
df80: 41 53 4b 7c 53 51 4c 49 54 45 5f 41 4e 59 29 3b  ASK|SQLITE_ANY);
df90: 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .  .#ifndef SQLI
dfa0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
dfb0: 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46  /* If SQLITE_UTF
dfc0: 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20  16 is specified 
dfd0: 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  as the encoding 
dfe0: 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20  type, transform 
dff0: 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65  this.  ** to one
e000: 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   of SQLITE_UTF16
e010: 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46  LE or SQLITE_UTF
e020: 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20  16BE using the. 
e030: 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36   ** SQLITE_UTF16
e040: 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51  NATIVE macro. SQ
e050: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f  LITE_UTF16 is no
e060: 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  t used internall
e070: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  y..  **.  ** If 
e080: 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20 73 70  SQLITE_ANY is sp
e090: 65 63 69 66 69 65 64 2c 20 61 64 64 20 74 68 72  ecified, add thr
e0a0: 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  ee versions of t
e0b0: 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  he function.  **
e0c0: 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62   to the hash tab
e0d0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
e0e0: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
e0f0: 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53 51   ){.    enc = SQ
e100: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
e110: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 6e  ;.  }else if( en
e120: 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b  c==SQLITE_ANY ){
e130: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
e140: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
e150: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
e160: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  ctionName, nArg,
e170: 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 65 78 74   SQLITE_UTF8|ext
e180: 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  raFlags,.       
e190: 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 53 46    pUserData, xSF
e1a0: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
e1b0: 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  al, pDestructor)
e1c0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
e1d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e1e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
e1f0: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
e200: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  ctionName, nArg,
e210: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 7c   SQLITE_UTF16LE|
e220: 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20 20 20  extraFlags,.    
e230: 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c        pUserData,
e240: 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20   xSFunc, xStep, 
e250: 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63  xFinal, pDestruc
e260: 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tor);.    }.    
e270: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e280: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
e290: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
e2a0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
e2b0: 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  16BE;.  }.#else.
e2c0: 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55    enc = SQLITE_U
e2d0: 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20  TF8;.#endif.  . 
e2e0: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 20   /* Check if an 
e2f0: 65 78 69 73 74 69 6e 67 20 66 75 6e 63 74 69 6f  existing functio
e300: 6e 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72  n is being overr
e310: 69 64 64 65 6e 20 6f 72 20 64 65 6c 65 74 65 64  idden or deleted
e320: 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e  . If so,.  ** an
e330: 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  d there are acti
e340: 76 65 20 56 4d 73 2c 20 74 68 65 6e 20 72 65 74  ve VMs, then ret
e350: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
e360: 20 49 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a 20   If a function. 
e370: 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f 76 65   ** is being ove
e380: 72 72 69 64 64 65 6e 2f 64 65 6c 65 74 65 64 20  rridden/deleted 
e390: 62 75 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f  but there are no
e3a0: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 61 6c 6c   active VMs, all
e3b0: 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72  ow the.  ** oper
e3c0: 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75  ation to continu
e3d0: 65 20 62 75 74 20 69 6e 76 61 6c 69 64 61 74 65  e but invalidate
e3e0: 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65 64   all precompiled
e3f0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
e400: 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46  /.  p = sqlite3F
e410: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
e420: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
e430: 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30 29  Arg, (u8)enc, 0)
e440: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 28 70 2d  ;.  if( p && (p-
e450: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
e460: 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b  ITE_FUNC_ENCMASK
e470: 29 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72  )==enc && p->nAr
e480: 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69  g==nArg ){.    i
e490: 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  f( db->nVdbeActi
e4a0: 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ve ){.      sqli
e4b0: 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
e4c0: 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c  db, SQLITE_BUSY,
e4d0: 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c   .        "unabl
e4e0: 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69  e to delete/modi
e4f0: 66 79 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e  fy user-function
e500: 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73   due to active s
e510: 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20  tatements");.   
e520: 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
e530: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
e540: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e550: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65  ITE_BUSY;.    }e
e560: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
e570: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
e580: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
e590: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d      }.  }..  p =
e5a0: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
e5b0: 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69  tion(db, zFuncti
e5c0: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75  onName, nArg, (u
e5d0: 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73  8)enc, 1);.  ass
e5e0: 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c  ert(p || db->mal
e5f0: 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66  locFailed);.  if
e600: 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ( !p ){.    retu
e610: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
e620: 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
e630: 49 66 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73  If an older vers
e640: 69 6f 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ion of the funct
e650: 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69  ion with a confi
e660: 67 75 72 65 64 20 64 65 73 74 72 75 63 74 6f 72  gured destructor
e670: 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72   is.  ** being r
e680: 65 70 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74  eplaced invoke t
e690: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75  he destructor fu
e6a0: 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a  nction here. */.
e6b0: 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f    functionDestro
e6c0: 79 28 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28  y(db, p);..  if(
e6d0: 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a   pDestructor ){.
e6e0: 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d      pDestructor-
e6f0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70  >nRef++;.  }.  p
e700: 2d 3e 75 2e 70 44 65 73 74 72 75 63 74 6f 72 20  ->u.pDestructor 
e710: 3d 20 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20  = pDestructor;. 
e720: 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20   p->funcFlags = 
e730: 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  (p->funcFlags & 
e740: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d  SQLITE_FUNC_ENCM
e750: 41 53 4b 29 20 7c 20 65 78 74 72 61 46 6c 61 67  ASK) | extraFlag
e760: 73 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  s;.  testcase( p
e770: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
e780: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
e790: 49 43 20 29 3b 0a 20 20 70 2d 3e 78 53 46 75 6e  IC );.  p->xSFun
e7a0: 63 20 3d 20 78 53 46 75 6e 63 20 3f 20 78 53 46  c = xSFunc ? xSF
e7b0: 75 6e 63 20 3a 20 78 53 74 65 70 3b 0a 20 20 70  unc : xStep;.  p
e7c0: 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46  ->xFinalize = xF
e7d0: 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72  inal;.  p->pUser
e7e0: 44 61 74 61 20 3d 20 70 55 73 65 72 44 61 74 61  Data = pUserData
e7f0: 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75  ;.  p->nArg = (u
e800: 31 36 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72  16)nArg;.  retur
e810: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e820: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77  /*.** Create new
e830: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e   user functions.
e840: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
e850: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
e860: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
e870: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
e880: 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  unc,.  int nArg,
e890: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
e8a0: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
e8b0: 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  xSFunc)(sqlite3_
e8c0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
e8d0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
e8e0: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
e8f0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
e900: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
e910: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
e920: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
e930: 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20  _context*).){.  
e940: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63  return sqlite3_c
e950: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
e960: 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72  2(db, zFunc, nAr
e970: 67 2c 20 65 6e 63 2c 20 70 2c 20 78 53 46 75 6e  g, enc, p, xSFun
e980: 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20 20 20  c, xStep,.      
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78 46                xF
e9b0: 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74  inal, 0);.}..int
e9c0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
e9d0: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73  function_v2(.  s
e9e0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
e9f0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
ea00: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
ea10: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
ea20: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75  p,.  void (*xSFu
ea30: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
ea40: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
ea50: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
ea60: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
ea70: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
ea80: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
ea90: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
eaa0: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
eab0: 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28  text*),.  void (
eac0: 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20  *xDestroy)(void 
ead0: 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *).){.  int rc =
eae0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
eaf0: 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20   FuncDestructor 
eb00: 2a 70 41 72 67 20 3d 20 30 3b 0a 0a 23 69 66 64  *pArg = 0;..#ifd
eb10: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
eb20: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
eb30: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
eb40: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
eb50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
eb60: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
eb70: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
eb80: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
eb90: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
eba0: 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20  xDestroy ){.    
ebb0: 70 41 72 67 20 3d 20 28 46 75 6e 63 44 65 73 74  pArg = (FuncDest
ebc0: 72 75 63 74 6f 72 20 2a 29 73 71 6c 69 74 65 33  ructor *)sqlite3
ebd0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
ebe0: 20 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73 74   sizeof(FuncDest
ebf0: 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69 66  ructor));.    if
ec00: 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20 20  ( !pArg ){.     
ec10: 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20   xDestroy(p);.  
ec20: 20 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20      goto out;.  
ec30: 20 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e 78 44    }.    pArg->xD
ec40: 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f  estroy = xDestro
ec50: 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55 73  y;.    pArg->pUs
ec60: 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a  erData = p;.  }.
ec70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
ec80: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
ec90: 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70  nc, nArg, enc, p
eca0: 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c  , xSFunc, xStep,
ecb0: 20 78 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a   xFinal, pArg);.
ecc0: 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41    if( pArg && pA
ecd0: 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  rg->nRef==0 ){. 
ece0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
ecf0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
ed00: 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20  xDestroy(p);.   
ed10: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
ed20: 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20  b, pArg);.  }.. 
ed30: 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69  out:.  rc = sqli
ed40: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
ed50: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
ed60: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
ed70: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
ed80: 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
ed90: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
eda0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
edb0: 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20  te_function16(. 
edc0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
edd0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e  const void *zFun
ede0: 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74  ctionName,.  int
edf0: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65   nArg,.  int eTe
ee00: 78 74 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70  xtRep,.  void *p
ee10: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75 6e  ,.  void (*xSFun
ee20: 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  c)(sqlite3_conte
ee30: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
ee40: 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64  value**),.  void
ee50: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
ee60: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
ee70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c  qlite3_value**),
ee80: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
ee90: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
eea0: 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  t*).){.  int rc;
eeb0: 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b  .  char *zFunc8;
eec0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
eed0: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
eee0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
eef0: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
ef00: 20 7c 7c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d   || zFunctionNam
ef10: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
ef20: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
ef30: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
ef40: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
ef50: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
ef60: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
ef70: 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e  Failed );.  zFun
ef80: 63 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31  c8 = sqlite3Utf1
ef90: 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74 69  6to8(db, zFuncti
efa0: 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49  onName, -1, SQLI
efb0: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
efc0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43  .  rc = sqlite3C
efd0: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
efe0: 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65 54 65 78  unc8, nArg, eTex
eff0: 74 52 65 70 2c 20 70 2c 20 78 53 46 75 6e 63 2c  tRep, p, xSFunc,
f000: 78 53 74 65 70 2c 78 46 69 6e 61 6c 2c 30 29 3b  xStep,xFinal,0);
f010: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
f020: 28 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20  (db, zFunc8);.  
f030: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
f040: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
f050: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f060: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f070: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
f080: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  ndif.../*.** Dec
f090: 6c 61 72 65 20 74 68 61 74 20 61 20 66 75 6e 63  lare that a func
f0a0: 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76  tion has been ov
f0b0: 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20 76 69  erloaded by a vi
f0c0: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
f0d0: 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  ** If the functi
f0e0: 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  on already exist
f0f0: 73 20 61 73 20 61 20 72 65 67 75 6c 61 72 20 67  s as a regular g
f100: 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20  lobal function, 
f110: 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
f120: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
f130: 20 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f    If the functio
f140: 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
f150: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a  , then create.**
f160: 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61 74 20   a new one that 
f170: 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20 61 20  always throws a 
f180: 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20  run-time error. 
f190: 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72   .**.** When vir
f1a0: 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 74 65  tual tables inte
f1b0: 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  nd to provide an
f1c0: 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63   overloaded func
f1d0: 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68  tion, they.** sh
f1e0: 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72  ould call this r
f1f0: 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73  outine to make s
f200: 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 66  ure the global f
f210: 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a  unction exists..
f220: 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ** A global func
f230: 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73 74 20  tion must exist 
f240: 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d  in order for nam
f250: 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20  e resolution to 
f260: 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79  work.** properly
f270: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f280: 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69  _overload_functi
f290: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  on(.  sqlite3 *d
f2a0: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
f2b0: 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41  *zName,.  int nA
f2c0: 72 67 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rg.){.  int rc =
f2d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66   SQLITE_OK;..#if
f2e0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
f2f0: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
f300: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
f310: 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a  CheckOk(db) || z
f320: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 6e 41 72 67 3c  Name==0 || nArg<
f330: 2d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  -2 ){.    return
f340: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
f350: 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
f360: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f370: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
f380: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
f390: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
f3a0: 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  zName, nArg, SQL
f3b0: 49 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20  ITE_UTF8, 0)==0 
f3c0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
f3d0: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
f3e0: 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  , zName, nArg, S
f3f0: 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20  QLITE_UTF8,.    
f400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f410: 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65         0, sqlite
f420: 33 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e  3InvalidFunction
f430: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 0, 0);.  }.
f440: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
f450: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
f460: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
f470: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
f480: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f490: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f4a0: 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  OMIT_TRACE./*.**
f4b0: 20 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63   Register a trac
f4c0: 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  e function.  The
f4d0: 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70   pArg from the p
f4e0: 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74  reviously regist
f4f0: 65 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73  ered trace.** is
f500: 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a   returned.  .**.
f510: 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20  ** A NULL trace 
f520: 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74  function means t
f530: 68 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69  hat no tracing i
f540: 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e  s executes.  A n
f550: 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65  on-NULL.** trace
f560: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
f570: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74   a function that
f580: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74   is invoked at t
f590: 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68  he start of each
f5a0: 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  .** SQL statemen
f5b0: 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  t..*/.#ifndef SQ
f5c0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
f5d0: 41 54 45 44 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ATED.void *sqlit
f5e0: 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33  e3_trace(sqlite3
f5f0: 20 2a 64 62 2c 20 76 6f 69 64 28 2a 78 54 72 61   *db, void(*xTra
f600: 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  ce)(void*,const 
f610: 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41  char*), void *pA
f620: 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  rg){.  void *pOl
f630: 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d;..#ifdef SQLIT
f640: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
f650: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
f660: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
f670: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
f680: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
f690: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
f6a0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
f6b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
f6c0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
f6d0: 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61   pOld = db->pTra
f6e0: 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 6d 54 72  ceArg;.  db->mTr
f6f0: 61 63 65 20 3d 20 78 54 72 61 63 65 20 3f 20 53  ace = xTrace ? S
f700: 51 4c 49 54 45 5f 54 52 41 43 45 5f 4c 45 47 41  QLITE_TRACE_LEGA
f710: 43 59 20 3a 20 30 3b 0a 20 20 64 62 2d 3e 78 54  CY : 0;.  db->xT
f720: 72 61 63 65 20 3d 20 28 69 6e 74 28 2a 29 28 75  race = (int(*)(u
f730: 33 32 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76  32,void*,void*,v
f740: 6f 69 64 2a 29 29 78 54 72 61 63 65 3b 0a 20 20  oid*))xTrace;.  
f750: 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20  db->pTraceArg = 
f760: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
f770: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
f780: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
f790: 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20   pOld;.}.#endif 
f7a0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
f7b0: 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a 2f 2a  EPRECATED */../*
f7c0: 20 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63   Register a trac
f7d0: 65 20 63 61 6c 6c 62 61 63 6b 20 75 73 69 6e 67  e callback using
f7e0: 20 74 68 65 20 76 65 72 73 69 6f 6e 2d 32 20 69   the version-2 i
f7f0: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74  nterface..*/.int
f800: 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f 76   sqlite3_trace_v
f810: 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  2(.  sqlite3 *db
f820: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 2f 2a 20 54 72 61 63 65 20 74 68 69 73 20 63 6f  /* Trace this co
f850: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e  nnection */.  un
f860: 73 69 67 6e 65 64 20 6d 54 72 61 63 65 2c 20 20  signed mTrace,  
f870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f880: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
f890: 20 6f 66 20 65 76 65 6e 74 73 20 74 6f 20 62 65   of events to be
f8a0: 20 74 72 61 63 65 64 20 2a 2f 0a 20 20 69 6e 74   traced */.  int
f8b0: 28 2a 78 54 72 61 63 65 29 28 75 6e 73 69 67 6e  (*xTrace)(unsign
f8c0: 65 64 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 76  ed,void*,void*,v
f8d0: 6f 69 64 2a 29 2c 20 20 2f 2a 20 43 61 6c 6c 62  oid*),  /* Callb
f8e0: 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20 2a 2f  ack to invoke */
f8f0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f920: 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 23   Context */.){.#
f930: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f940: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
f950: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
f960: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
f970: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f980: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
f990: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
f9a0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
f9b0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
f9c0: 66 28 20 6d 54 72 61 63 65 3d 3d 30 20 29 20 78  f( mTrace==0 ) x
f9d0: 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 69 66 28  Trace = 0;.  if(
f9e0: 20 78 54 72 61 63 65 3d 3d 30 20 29 20 6d 54 72   xTrace==0 ) mTr
f9f0: 61 63 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6d  ace = 0;.  db->m
fa00: 54 72 61 63 65 20 3d 20 6d 54 72 61 63 65 3b 0a  Trace = mTrace;.
fa10: 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78    db->xTrace = x
fa20: 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72  Trace;.  db->pTr
fa30: 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  aceArg = 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 53 51 4c 49 54 45  .  return SQLITE
fa70: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
fa80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
fa90: 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 52 65 67  ECATED./*.** Reg
faa0: 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20  ister a profile 
fab0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70  function.  The p
fac0: 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65  Arg from the pre
fad0: 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
fae0: 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66  ed .** profile f
faf0: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72  unction is retur
fb00: 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e  ned.  .**.** A N
fb10: 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  ULL profile func
fb20: 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20  tion means that 
fb30: 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20  no profiling is 
fb40: 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e  executes.  A non
fb50: 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65  -NULL.** profile
fb60: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
fb70: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74   a function that
fb80: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74   is invoked at t
fb90: 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
fba0: 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61  .** each SQL sta
fbb0: 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72  tement that is r
fbc0: 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  un..*/.void *sql
fbd0: 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20  ite3_profile(.  
fbe0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
fbf0: 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28  oid (*xProfile)(
fc00: 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
fc10: 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29  *,sqlite_uint64)
fc20: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29  ,.  void *pArg.)
fc30: 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
fc40: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
fc50: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
fc60: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
fc70: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
fc80: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
fc90: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
fca0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
fcb0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
fcc0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
fcd0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f  db->mutex);.  pO
fce0: 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c  ld = db->pProfil
fcf0: 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f  eArg;.  db->xPro
fd00: 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b  file = xProfile;
fd10: 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41  .  db->pProfileA
fd20: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
fd30: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
fd40: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
fd50: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65  eturn pOld;.}.#e
fd60: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
fd70: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 20 2a  MIT_DEPRECATED *
fd80: 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  /.#endif /* SQLI
fd90: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f  TE_OMIT_TRACE */
fda0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
fdb0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62   a function to b
fdc0: 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61  e invoked when a
fdd0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
fde0: 6d 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20  mits..** If the 
fdf0: 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e  invoked function
fe00: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
fe10: 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d  o, then the comm
fe20: 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20  it becomes a.** 
fe30: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69  rollback..*/.voi
fe40: 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69  d *sqlite3_commi
fe50: 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  t_hook(.  sqlite
fe60: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
fe70: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
fe80: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
fe90: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
fea0: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
feb0: 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69  id*),  /* Functi
fec0: 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20  on to invoke on 
fed0: 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20  each commit */. 
fee0: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
fef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
ff00: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
ff10: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
ff20: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64  oid *pOld;..#ifd
ff30: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
ff40: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
ff50: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
ff60: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
ff70: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
ff80: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
ff90: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
ffa0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
ffb0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
ffc0: 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20  utex);.  pOld = 
ffd0: 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a  db->pCommitArg;.
ffe0: 20 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c    db->xCommitCal
fff0: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
10000 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74  k;.  db->pCommit
10010 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
10020 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
10030 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
10040 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a  return pOld;.}..
10050 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
10060 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
10070 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
10080 65 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74  e a row is updat
10090 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20  ed,.** inserted 
100a0 6f 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  or deleted using
100b0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
100c0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
100d0 69 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61  id *sqlite3_upda
100e0 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  te_hook(.  sqlit
100f0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
10100 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
10110 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
10120 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f  database */.  vo
10130 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  id (*xCallback)(
10140 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63  void*,int,char c
10150 6f 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73  onst *,char cons
10160 74 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34  t *,sqlite_int64
10170 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  ),.  void *pArg 
10180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10190 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * Argument to th
101a0 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b  e function */.){
101b0 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a  .  void *pRet;..
101c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
101d0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
101e0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
101f0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
10200 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
10210 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
10220 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
10230 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
10240 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
10250 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
10260 74 20 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41  t = db->pUpdateA
10270 72 67 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74  rg;.  db->xUpdat
10280 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  eCallback = xCal
10290 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70  lback;.  db->pUp
102a0 64 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  dateArg = pArg;.
102b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
102c0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
102d0 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
102e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
102f0 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
10300 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
10310 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74   time a transact
10320 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a  ion is rolled.**
10330 20 62 61 63 6b 20 62 79 20 74 68 69 73 20 64 61   back by this da
10340 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
10350 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
10360 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f  te3_rollback_hoo
10370 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
10380 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
10390 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
103a0 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  k to this databa
103b0 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  se */.  void (*x
103c0 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29  Callback)(void*)
103d0 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75  , /* Callback fu
103e0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  nction */.  void
103f0 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
10400 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
10410 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
10420 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  n */.){.  void *
10430 70 52 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51  pRet;..#ifdef SQ
10440 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
10450 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
10460 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
10470 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
10480 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
10490 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
104a0 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
104b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
104c0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
104d0 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
104e0 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64  RollbackArg;.  d
104f0 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c  b->xRollbackCall
10500 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
10510 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63  ;.  db->pRollbac
10520 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  kArg = pArg;.  s
10530 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
10540 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
10550 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
10560 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10570 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
10580 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  HOOK./*.** Regis
10590 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
105a0 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
105b0 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20  h time a row is 
105c0 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65  updated,.** inse
105d0 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  rted or deleted 
105e0 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62  using this datab
105f0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
10600 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
10610 5f 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 28  _preupdate_hook(
10620 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
10630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10640 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
10650 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
10660 20 2a 2f 0a 20 20 76 6f 69 64 28 2a 78 43 61 6c   */.  void(*xCal
10670 6c 62 61 63 6b 29 28 20 20 20 20 20 20 20 20 20  lback)(         
10680 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63  /* Callback func
10690 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 76 6f 69 64  tion */.    void
106a0 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 2c 63  *,sqlite3*,int,c
106b0 68 61 72 20 63 6f 6e 73 74 2a 2c 63 68 61 72 20  har const*,char 
106c0 63 6f 6e 73 74 2a 2c 73 71 6c 69 74 65 33 5f 69  const*,sqlite3_i
106d0 6e 74 36 34 2c 73 71 6c 69 74 65 33 5f 69 6e 74  nt64,sqlite3_int
106e0 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  64),.  void *pAr
106f0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
10700 20 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c 62 61   /* First callba
10710 63 6b 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ck argument */.)
10720 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  {.  void *pRet;.
10730 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10740 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
10750 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
10760 50 72 65 55 70 64 61 74 65 41 72 67 3b 0a 20 20  PreUpdateArg;.  
10770 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61  db->xPreUpdateCa
10780 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
10790 63 6b 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70  ck;.  db->pPreUp
107a0 64 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  dateArg = pArg;.
107b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
107c0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
107d0 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
107e0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
107f0 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50  ITE_ENABLE_PREUP
10800 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69  DATE_HOOK */..#i
10810 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10820 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20  T_WAL./*.** The 
10830 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
10840 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69  () callback regi
10850 73 74 65 72 65 64 20 62 79 20 73 71 6c 69 74 65  stered by sqlite
10860 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
10870 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b  oint()..** Invok
10880 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  e sqlite3_wal_ch
10890 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20  eckpoint if the 
108a0 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73  number of frames
108b0 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   in the log file
108c0 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
108d0 68 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c  han sqlite3.pWal
108e0 41 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69  Arg cast to an i
108f0 6e 74 65 67 65 72 20 28 74 68 65 20 76 61 6c 75  nteger (the valu
10900 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a  e configured by.
10910 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  ** wal_autocheck
10920 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e  point())..*/ .in
10930 74 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61  t sqlite3WalDefa
10940 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20  ultHook(.  void 
10950 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20  *pClientData,   
10960 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f    /* Argument */
10970 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
10980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
10990 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  nection */.  con
109a0 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
109b0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
109c0 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20  */.  int nFrame 
109d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
109e0 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b  ize of WAL */.){
109f0 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53  .  if( nFrame>=S
10a00 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
10a10 28 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b  (pClientData) ){
10a20 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
10a30 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
10a40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
10a50 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  _checkpoint(db, 
10a60 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  zDb);.    sqlite
10a70 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
10a80 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
10a90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
10aa0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
10ab0 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
10ac0 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73  * Configure an s
10ad0 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
10ae0 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75  ) callback to au
10af0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63  tomatically chec
10b00 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61  kpoint.** a data
10b10 62 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69  base after commi
10b20 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
10b30 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  ion if there are
10b40 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f   nFrame or.** mo
10b50 72 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65  re frames in the
10b60 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69   log file. Passi
10b70 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67  ng zero or a neg
10b80 61 74 69 76 65 20 76 61 6c 75 65 20 61 73 20 74  ative value as t
10b90 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72  he.** nFrame par
10ba0 61 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73 20  ameter disables 
10bb0 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70  automatic checkp
10bc0 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a  oints entirely..
10bd0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  **.** The callba
10be0 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79  ck registered by
10bf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
10c00 65 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73  eplaces any exis
10c10 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  ting callback.**
10c20 20 72 65 67 69 73 74 65 72 65 64 20 75 73 69 6e   registered usin
10c30 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  g sqlite3_wal_ho
10c40 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20  ok(). Likewise, 
10c50 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 63 61  registering a ca
10c60 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  llback.** using 
10c70 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
10c80 28 29 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  () disables the 
10c90 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70  automatic checkp
10ca0 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a  oint mechanism.*
10cb0 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20  * configured by 
10cc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
10cd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61  /.int sqlite3_wa
10ce0 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
10cf0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
10d00 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65  t nFrame){.#ifde
10d10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
10d20 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  L.  UNUSED_PARAM
10d30 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53  ETER(db);.  UNUS
10d40 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72  ED_PARAMETER(nFr
10d50 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 23 69 66 64  ame);.#else.#ifd
10d60 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
10d70 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
10d80 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
10d90 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74  heckOk(db) ) ret
10da0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
10db0 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
10dc0 20 69 66 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b   if( nFrame>0 ){
10dd0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
10de0 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65  _hook(db, sqlite
10df0 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c  3WalDefaultHook,
10e00 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
10e10 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d  TR(nFrame));.  }
10e20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
10e30 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30  3_wal_hook(db, 0
10e40 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
10e50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10e60 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
10e70 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
10e80 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
10e90 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e  each time a tran
10ea0 73 61 63 74 69 6f 6e 20 69 73 20 77 72 69 74 74  saction is writt
10eb0 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77  en.** into the w
10ec0 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62  rite-ahead-log b
10ed0 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
10ee0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
10ef0 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c  oid *sqlite3_wal
10f00 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
10f10 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
10f20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
10f30 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
10f40 68 69 73 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f  his db handle */
10f50 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63  .  int(*xCallbac
10f60 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74  k)(void *, sqlit
10f70 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  e3*, const char*
10f80 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  , int),.  void *
10f90 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
10fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
10fb0 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
10fc0 65 64 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28  ed to xCallback(
10fd0 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  ) */.){.#ifndef 
10fe0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
10ff0 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 23 69    void *pRet;.#i
11000 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
11010 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
11020 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
11030 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
11040 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
11050 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
11060 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
11070 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
11080 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
11090 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
110a0 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20  = db->pWalArg;. 
110b0 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63   db->xWalCallbac
110c0 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
110d0 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70   db->pWalArg = p
110e0 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
110f0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
11100 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
11110 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65  pRet;.#else.  re
11120 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  turn 0;.#endif.}
11130 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69  ../*.** Checkpoi
11140 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e  nt database zDb.
11150 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
11160 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
11170 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  2(.  sqlite3 *db
11180 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11190 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
111a0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e   handle */.  con
111b0 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
111c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
111d0 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68 65 64  Name of attached
111e0 20 64 61 74 61 62 61 73 65 20 28 6f 72 20 4e 55   database (or NU
111f0 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f  LL) */.  int eMo
11200 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
11210 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
11220 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20  TE_CHECKPOINT_* 
11230 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  value */.  int *
11240 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20 20 20  pnLog,          
11250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
11260 54 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c  T: Size of WAL l
11270 6f 67 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a  og in frames */.
11280 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20    int *pnCkpt   
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112a0 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20    /* OUT: Total 
112b0 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73  number of frames
112c0 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f   checkpointed */
112d0 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
112e0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74  E_OMIT_WAL.  ret
112f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
11300 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 20 20  else.  int rc;  
11310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11320 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
11330 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
11340 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  Db = SQLITE_MAX_
11350 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20 73 71  ATTACHED;  /* sq
11360 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65  lite3.aDb[] inde
11370 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65 63 6b  x of db to check
11380 70 6f 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66  point */..#ifdef
11390 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
113a0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
113b0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
113c0 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
113d0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
113e0 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  BKPT;.#endif..  
113f0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
11400 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
11410 65 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65  es to -1 in case
11420 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
11430 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67  . */.  if( pnLog
11440 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a   ) *pnLog = -1;.
11450 20 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a    if( pnCkpt ) *
11460 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20  pnCkpt = -1;..  
11470 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
11480 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
11490 45 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  E==0 );.  assert
114a0 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
114b0 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20  INT_FULL==1 );. 
114c0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
114d0 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41  CHECKPOINT_RESTA
114e0 52 54 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72  RT==2 );.  asser
114f0 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
11500 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 3d 3d 33  OINT_TRUNCATE==3
11510 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c   );.  if( eMode<
11520 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
11530 54 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f  T_PASSIVE || eMo
11540 64 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  de>SQLITE_CHECKP
11550 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45 20 29 7b  OINT_TRUNCATE ){
11560 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
11570 2d 4f 46 3a 20 52 2d 30 33 39 39 36 2d 31 32 30  -OF: R-03996-120
11580 38 38 20 54 68 65 20 4d 20 70 61 72 61 6d 65 74  88 The M paramet
11590 65 72 20 6d 75 73 74 20 62 65 20 61 20 76 61 6c  er must be a val
115a0 69 64 20 63 68 65 63 6b 70 6f 69 6e 74 0a 20 20  id checkpoint.  
115b0 20 20 2a 2a 20 6d 6f 64 65 3a 20 2a 2f 0a 20 20    ** mode: */.  
115c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
115d0 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73  MISUSE;.  }..  s
115e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
115f0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
11600 20 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62 5b   if( zDb && zDb[
11610 30 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20  0] ){.    iDb = 
11620 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
11630 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a  e(db, zDb);.  }.
11640 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20    if( iDb<0 ){. 
11650 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
11660 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
11670 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
11680 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  , SQLITE_ERROR, 
11690 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73  "unknown databas
116a0 65 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20  e: %s", zDb);.  
116b0 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 62  }else{.    db->b
116c0 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79  usyHandler.nBusy
116d0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
116e0 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74  qlite3Checkpoint
116f0 28 64 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c  (db, iDb, eMode,
11700 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b   pnLog, pnCkpt);
11710 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
11720 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  r(db, rc);.  }. 
11730 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
11740 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 0a 20  Exit(db, rc);.. 
11750 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
11760 20 6e 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   no active state
11770 6d 65 6e 74 73 2c 20 63 6c 65 61 72 20 74 68 65  ments, clear the
11780 20 69 6e 74 65 72 72 75 70 74 20 66 6c 61 67 20   interrupt flag 
11790 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69  at this.  ** poi
117a0 6e 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  nt.  */.  if( db
117b0 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3d 3d 30  ->nVdbeActive==0
117c0 20 29 7b 0a 20 20 20 20 64 62 2d 3e 75 31 2e 69   ){.    db->u1.i
117d0 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20 30  sInterrupted = 0
117e0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
117f0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
11800 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
11810 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
11820 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e  ./*.** Checkpoin
11830 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20  t database zDb. 
11840 49 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20  If zDb is NULL, 
11850 6f 72 20 69 66 20 74 68 65 20 62 75 66 66 65 72  or if the buffer
11860 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74   zDb points.** t
11870 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72  o contains a zer
11880 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c  o-length string,
11890 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
118a0 74 61 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20  tabases are .** 
118b0 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f  checkpointed..*/
118c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c  .int sqlite3_wal
118d0 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69  _checkpoint(sqli
118e0 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
118f0 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 2f 2a 20  har *zDb){.  /* 
11900 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
11910 31 36 31 33 2d 32 30 35 35 33 20 54 68 65 20 73  1613-20553 The s
11920 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
11930 70 6f 69 6e 74 28 44 2c 58 29 20 69 73 20 65 71  point(D,X) is eq
11940 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 2a 2a  uivalent to.  **
11950 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
11960 63 6b 70 6f 69 6e 74 5f 76 32 28 44 2c 58 2c 53  ckpoint_v2(D,X,S
11970 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
11980 5f 50 41 53 53 49 56 45 2c 30 2c 30 29 2e 20 2a  _PASSIVE,0,0). *
11990 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  /.  return sqlit
119a0 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
119b0 74 5f 76 32 28 64 62 2c 7a 44 62 2c 53 51 4c 49  t_v2(db,zDb,SQLI
119c0 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
119d0 53 53 49 56 45 2c 30 2c 30 29 3b 0a 7d 0a 0a 23  SSIVE,0,0);.}..#
119e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
119f0 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e  IT_WAL./*.** Run
11a00 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e   a checkpoint on
11a10 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 54   database iDb. T
11a20 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
11a30 66 20 64 61 74 61 62 61 73 65 20 69 44 62 20 69  f database iDb i
11a40 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74  s.** not current
11a50 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d  ly open in WAL m
11a60 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ode..**.** If a 
11a70 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
11a80 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
11a90 61 73 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70  ase being checkp
11aa0 6f 69 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a  ointed, this .**
11ab0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
11ac0 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  s SQLITE_LOCKED 
11ad0 61 6e 64 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  and a checkpoint
11ae0 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
11af0 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72  d. If .** an err
11b00 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
11b10 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 68 65 63  running the chec
11b20 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74  kpoint, an SQLit
11b30 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
11b40 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 28 69 2e  .** returned (i.
11b50 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  e. SQLITE_IOERR)
11b60 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c  . Otherwise, SQL
11b70 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68  ITE_OK..**.** Th
11b80 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62  e mutex on datab
11b90 61 73 65 20 68 61 6e 64 6c 65 20 64 62 20 73 68  ase handle db sh
11ba0 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 62 79 20  ould be held by 
11bb0 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 20  the caller. The 
11bc0 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61  mutex.** associa
11bd0 74 65 64 20 77 69 74 68 20 74 68 65 20 73 70 65  ted with the spe
11be0 63 69 66 69 63 20 62 2d 74 72 65 65 20 62 65 69  cific b-tree bei
11bf0 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  ng checkpointed 
11c00 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74  is taken by.** t
11c10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 68 69  his function whi
11c20 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  le the checkpoin
11c30 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a  t is running..**
11c40 0a 2a 2a 20 49 66 20 69 44 62 20 69 73 20 70 61  .** If iDb is pa
11c50 73 73 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ssed SQLITE_MAX_
11c60 41 54 54 41 43 48 45 44 2c 20 74 68 65 6e 20 61  ATTACHED, then a
11c70 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
11c80 62 61 73 65 73 20 61 72 65 0a 2a 2a 20 63 68 65  bases are.** che
11c90 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e  ckpointed. If an
11ca0 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
11cb0 74 65 72 65 64 20 69 74 20 69 73 20 72 65 74 75  tered it is retu
11cc0 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  rned immediately
11cd0 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74   -.** no attempt
11ce0 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63   is made to chec
11cf0 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61 69  kpoint any remai
11d00 6e 69 6e 67 20 64 61 74 61 62 61 73 65 73 2e 0a  ning databases..
11d10 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
11d20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66 20  eMode is one of 
11d30 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
11d40 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c 20  T_PASSIVE, FULL 
11d50 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a 2f 0a 69  or RESTART..*/.i
11d60 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70  nt sqlite3Checkp
11d70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  oint(sqlite3 *db
11d80 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 65  , int iDb, int e
11d90 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67  Mode, int *pnLog
11da0 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29 7b 0a  , int *pnCkpt){.
11db0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11dc0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
11dd0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
11de0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
11df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e00 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
11e10 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
11e20 20 61 74 74 61 63 68 65 64 20 64 62 73 20 2a 2f   attached dbs */
11e30 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d 20 30  .  int bBusy = 0
11e40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11e50 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 53 51     /* True if SQ
11e60 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20 62 65  LITE_BUSY has be
11e70 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a  en encountered *
11e80 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
11e90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11ea0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
11eb0 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67 20 7c  assert( !pnLog |
11ec0 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a  | *pnLog==-1 );.
11ed0 20 20 61 73 73 65 72 74 28 20 21 70 6e 43 6b 70    assert( !pnCkp
11ee0 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31  t || *pnCkpt==-1
11ef0 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   );..  for(i=0; 
11f00 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72 63 3d  i<db->nDb && rc=
11f10 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
11f20 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 44 62  {.    if( i==iDb
11f30 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54 45 5f   || iDb==SQLITE_
11f40 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 7b 0a  MAX_ATTACHED ){.
11f50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11f60 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f 69 6e  e3BtreeCheckpoin
11f70 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  t(db->aDb[i].pBt
11f80 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20  , eMode, pnLog, 
11f90 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20 20 70  pnCkpt);.      p
11fa0 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  nLog = 0;.      
11fb0 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20  pnCkpt = 0;.    
11fc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11fd0 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
11fe0 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20 20 20   bBusy = 1;.    
11ff0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12000 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
12010 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
12020 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  (rc==SQLITE_OK &
12030 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c 49 54  & bBusy) ? SQLIT
12040 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d 0a 23  E_BUSY : rc;.}.#
12050 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
12060 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
12070 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
12080 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66   returns true if
12090 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f   main-memory sho
120a0 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e 73 74  uld be used inst
120b0 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70  ead of.** a temp
120c0 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72 20 74  orary file for t
120d0 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72 20 66  ransient pager f
120e0 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65 6d 65  iles and stateme
120f0 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  nt journals..** 
12100 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
12110 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  ed depends on th
12120 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 74  e value of db->t
12130 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e 74 69  emp_store (runti
12140 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 29  me.** parameter)
12150 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
12160 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20 53   time value of S
12170 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
12180 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  . The.** followi
12190 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62  ng table describ
121a0 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73  es the relations
121b0 68 69 70 20 62 65 74 77 65 65 6e 20 74 68 65 73  hip between thes
121c0 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20  e two values.** 
121d0 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
121e0 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e  ns return value.
121f0 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f  .**.**   SQLITE_
12200 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20 20 64  TEMP_STORE     d
12210 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20 20  b->temp_store   
12220 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65    Location of te
12230 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
12240 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
12250 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
12260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
12270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
12290 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
122a0 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20           any    
122b0 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
122c0 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
122d0 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20  .**   1         
122e0 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
122f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
12300 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
12310 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20   0).**   1      
12320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12340 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
12350 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20 20 20  urn 1).**   1   
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12370 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
12380 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
12390 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32  return 0).**   2
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123b0 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
123c0 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
123d0 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
123e0 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
123f0 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
12400 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
12410 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a  y    (return 1).
12420 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
12430 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
12440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
12450 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
12460 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20 20 20  1).**   3       
12470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
12480 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
12490 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
124a0 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rn 1).*/.int sql
124b0 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
124c0 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 20 2a  (const sqlite3 *
124d0 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  db){.#if SQLITE_
124e0 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20  TEMP_STORE==1.  
124f0 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d  return ( db->tem
12500 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a 23 65  p_store==2 );.#e
12510 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
12520 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20  TEMP_STORE==2.  
12530 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d  return ( db->tem
12540 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a 23 65  p_store!=1 );.#e
12550 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
12560 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20  TEMP_STORE==3.  
12570 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
12580 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  (db);.  return 1
12590 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
125a0 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31  ITE_TEMP_STORE<1
125b0 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f   || SQLITE_TEMP_
125c0 53 54 4f 52 45 3e 33 0a 20 20 55 4e 55 53 45 44  STORE>3.  UNUSED
125d0 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
125e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64    return 0;.#end
125f0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
12600 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  rn UTF-8 encoded
12610 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
12620 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  e explanation of
12630 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
12640 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f  .** error..*/.co
12650 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
12660 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65 33  3_errmsg(sqlite3
12670 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63   *db){.  const c
12680 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64  har *z;.  if( !d
12690 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
126a0 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
126b0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29  LITE_NOMEM_BKPT)
126c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
126d0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
126e0 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
126f0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
12700 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d  3ErrStr(SQLITE_M
12710 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d  ISUSE_BKPT);.  }
12720 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12730 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
12740 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
12750 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
12760 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53   z = sqlite3ErrS
12770 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  tr(SQLITE_NOMEM_
12780 42 4b 50 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  BKPT);.  }else{.
12790 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64 62      testcase( db
127a0 2d 3e 70 45 72 72 3d 3d 30 20 29 3b 0a 20 20 20  ->pErr==0 );.   
127b0 20 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69   z = (char*)sqli
127c0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64  te3_value_text(d
127d0 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73  b->pErr);.    as
127e0 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
127f0 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69  cFailed );.    i
12800 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( z==0 ){.     
12810 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53   z = sqlite3ErrS
12820 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b  tr(db->errCode);
12830 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
12840 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
12850 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
12860 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e  eturn z;.}..#ifn
12870 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12880 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75  UTF16./*.** Retu
12890 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65  rn UTF-16 encode
128a0 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  d English langua
128b0 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ge explanation o
128c0 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
128d0 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63  t.** error..*/.c
128e0 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
128f0 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69  e3_errmsg16(sqli
12900 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74  te3 *db){.  stat
12910 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74  ic const u16 out
12920 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20  OfMem[] = {.    
12930 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27  'o', 'u', 't', '
12940 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20   ', 'o', 'f', ' 
12950 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27  ', 'm', 'e', 'm'
12960 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c  , 'o', 'r', 'y',
12970 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63   0.  };.  static
12980 20 63 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73   const u16 misus
12990 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c  e[] = {.    'l',
129a0 20 27 69 27 2c 20 27 62 27 2c 20 27 72 27 2c 20   'i', 'b', 'r', 
129b0 27 61 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 27  'a', 'r', 'y', '
129c0 20 27 2c 20 0a 20 20 20 20 27 72 27 2c 20 27 6f   ', .    'r', 'o
129d0 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 69 27  ', 'u', 't', 'i'
129e0 2c 20 27 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c  , 'n', 'e', ' ',
129f0 20 0a 20 20 20 20 27 63 27 2c 20 27 61 27 2c 20   .    'c', 'a', 
12a00 27 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27  'l', 'l', 'e', '
12a10 64 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f  d', ' ', .    'o
12a20 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27  ', 'u', 't', ' '
12a30 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 66 27 2c  , .    'o', 'f',
12a40 20 27 20 27 2c 20 0a 20 20 20 20 27 73 27 2c 20   ' ', .    's', 
12a50 27 65 27 2c 20 27 71 27 2c 20 27 75 27 2c 20 27  'e', 'q', 'u', '
12a60 65 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27 65  e', 'n', 'c', 'e
12a70 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e  ', 0.  };..  con
12a80 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66  st void *z;.  if
12a90 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
12aa0 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f  urn (void *)outO
12ab0 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  fMem;.  }.  if( 
12ac0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
12ad0 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
12ae0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76  ){.    return (v
12af0 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20  oid *)misuse;.  
12b00 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
12b10 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
12b20 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  x);.  if( db->ma
12b30 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
12b40 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75    z = (void *)ou
12b50 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b  tOfMem;.  }else{
12b60 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
12b70 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62  _value_text16(db
12b80 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28  ->pErr);.    if(
12b90 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73   z==0 ){.      s
12ba0 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
12bb0 73 67 28 64 62 2c 20 64 62 2d 3e 65 72 72 43 6f  sg(db, db->errCo
12bc0 64 65 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  de, sqlite3ErrSt
12bd0 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 29 3b  r(db->errCode));
12be0 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
12bf0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
12c00 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d  db->pErr);.    }
12c10 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  .    /* A malloc
12c20 28 29 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c  () may have fail
12c30 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61  ed within the ca
12c40 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61  ll to sqlite3_va
12c50 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20  lue_text16().   
12c60 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68   ** above. If th
12c70 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
12c80 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c  then the db->mal
12c90 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e  locFailed flag n
12ca0 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62  eeds to.    ** b
12cb0 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65  e cleared before
12cc0 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74   returning. Do t
12cd0 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e  his directly, in
12ce0 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20  stead of via.   
12cf0 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78   ** sqlite3ApiEx
12d00 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73  it(), to avoid s
12d10 65 74 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  etting the datab
12d20 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72  ase handle error
12d30 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f   message..    */
12d40 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 43  .    sqlite3OomC
12d50 6c 65 61 72 28 64 62 29 3b 0a 20 20 7d 0a 20 20  lear(db);.  }.  
12d60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
12d70 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
12d80 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65    return z;.}.#e
12d90 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
12da0 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
12db0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
12dc0 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72  ost recent error
12dd0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
12de0 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75  by an SQLite rou
12df0 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73  tine. If NULL is
12e00 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68  .** passed to th
12e10 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20  is function, we 
12e20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28  assume a malloc(
12e30 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20  ) failed during 
12e40 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a  sqlite3_open()..
12e50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  */.int sqlite3_e
12e60 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a  rrcode(sqlite3 *
12e70 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26  db){.  if( db &&
12e80 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
12e90 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
12ea0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
12eb0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
12ec0 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62  T;.  }.  if( !db
12ed0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
12ee0 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
12ef0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
12f00 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
12f10 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 26  rn db->errCode &
12f20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
12f30 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65  int sqlite3_exte
12f40 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 73 71 6c  nded_errcode(sql
12f50 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28  ite3 *db){.  if(
12f60 20 64 62 20 26 26 20 21 73 71 6c 69 74 65 33 53   db && !sqlite3S
12f70 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
12f80 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
12f90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
12fa0 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  SE_BKPT;.  }.  i
12fb0 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61  f( !db || db->ma
12fc0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
12fd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12fe0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
12ff0 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72    return db->err
13000 43 6f 64 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  Code;.}.int sqli
13010 74 65 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f  te3_system_errno
13020 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
13030 20 72 65 74 75 72 6e 20 64 62 20 3f 20 64 62 2d   return db ? db-
13040 3e 69 53 79 73 45 72 72 6e 6f 20 3a 20 30 3b 0a  >iSysErrno : 0;.
13050 7d 20 20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }  ../*.** Retur
13060 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  n a string that 
13070 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b 69  describes the ki
13080 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63  nd of error spec
13090 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  ified in the.** 
130a0 61 72 67 75 6d 65 6e 74 2e 20 20 46 6f 72 20 6e  argument.  For n
130b0 6f 77 2c 20 74 68 69 73 20 73 69 6d 70 6c 79 20  ow, this simply 
130c0 63 61 6c 6c 73 20 74 68 65 20 69 6e 74 65 72 6e  calls the intern
130d0 61 6c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  al sqlite3ErrStr
130e0 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ().** function..
130f0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
13100 71 6c 69 74 65 33 5f 65 72 72 73 74 72 28 69 6e  qlite3_errstr(in
13110 74 20 72 63 29 7b 0a 20 20 72 65 74 75 72 6e 20  t rc){.  return 
13120 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
13130 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
13140 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  te a new collati
13150 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ng function for 
13160 64 61 74 61 62 61 73 65 20 22 64 62 22 2e 20 20  database "db".  
13170 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d  The name is zNam
13180 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63  e.** and the enc
13190 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f  oding is enc..*/
131a0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61  .static int crea
131b0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73  teCollation(.  s
131c0 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f  qlite3* db,.  co
131d0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
131e0 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20 20 76 6f   .  u8 enc,.  vo
131f0 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
13200 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
13210 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
13220 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
13230 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29  ),.  void(*xDel)
13240 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c  (void*).){.  Col
13250 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69  lSeq *pColl;.  i
13260 6e 74 20 65 6e 63 32 3b 0a 20 20 0a 20 20 61 73  nt enc2;.  .  as
13270 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
13280 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
13290 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
132a0 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
132b0 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65  specified as the
132c0 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20   encoding type, 
132d0 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20  transform this. 
132e0 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51   ** to one of SQ
132f0 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20  LITE_UTF16LE or 
13300 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75  SQLITE_UTF16BE u
13310 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51  sing the.  ** SQ
13320 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
13330 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55   macro. SQLITE_U
13340 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64  TF16 is not used
13350 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
13360 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a  /.  enc2 = enc;.
13370 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32    testcase( enc2
13380 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29  ==SQLITE_UTF16 )
13390 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e  ;.  testcase( en
133a0 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
133b0 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66  _ALIGNED );.  if
133c0 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  ( enc2==SQLITE_U
133d0 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51  TF16 || enc2==SQ
133e0 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
133f0 45 44 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d  ED ){.    enc2 =
13400 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
13410 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65  IVE;.  }.  if( e
13420 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20  nc2<SQLITE_UTF8 
13430 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55  || enc2>SQLITE_U
13440 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65  TF16BE ){.    re
13450 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
13460 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  SE_BKPT;.  }..  
13470 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
13480 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e   call is removin
13490 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61  g or replacing a
134a0 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61  n existing colla
134b0 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65  tion .  ** seque
134c0 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20  nce. If so, and 
134d0 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
134e0 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73   VMs, return bus
134f0 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a  y. If there.  **
13500 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56   are no active V
13510 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61  Ms, invalidate a
13520 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20  ny pre-compiled 
13530 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
13540 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
13550 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
13560 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d  , (u8)enc2, zNam
13570 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f  e, 0);.  if( pCo
13580 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll && pColl->xCm
13590 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  p ){.    if( db-
135a0 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a  >nVdbeActive ){.
135b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
135c0 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
135d0 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20  LITE_BUSY, .    
135e0 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64      "unable to d
135f0 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c  elete/modify col
13600 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
13610 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74  due to active st
13620 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20  atements");.    
13630 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13640 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BUSY;.    }.    
13650 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
13660 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
13670 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  db);..    /* If 
13680 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
13690 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65  ce pColl was cre
136a0 61 74 65 64 20 64 69 72 65 63 74 6c 79 20 62 79  ated directly by
136b0 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a   a call to.    *
136c0 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  * sqlite3_create
136d0 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20  _collation, and 
136e0 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62 79  not generated by
136f0 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c   synthCollSeq(),
13700 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79  .    ** then any
13710 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20   copies made by 
13720 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e  synthCollSeq() n
13730 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69  eed to be invali
13740 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c  dated..    ** Al
13750 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65  so, collation de
13760 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53  structor - CollS
13770 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63  eq.xDel() - func
13780 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20  tion may need.  
13790 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65    ** to be calle
137a0 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69  d..    */ .    i
137b0 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26  f( (pColl->enc &
137c0 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41   ~SQLITE_UTF16_A
137d0 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b  LIGNED)==enc2 ){
137e0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
137f0 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48  aColl = sqlite3H
13800 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f  ashFind(&db->aCo
13810 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 29 3b 0a 20  llSeq, zName);. 
13820 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
13830 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
13840 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
13850 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c  llSeq *p = &aCol
13860 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
13870 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  ( p->enc==pColl-
13880 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  >enc ){.        
13890 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b    if( p->xDel ){
138a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
138b0 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a  xDel(p->pUser);.
138c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
138d0 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20        p->xCmp = 
138e0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
138f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
13900 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
13910 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
13920 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
13930 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  , 1);.  if( pCol
13940 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
13950 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
13960 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d  .  pColl->xCmp =
13970 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f   xCompare;.  pCo
13980 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78  ll->pUser = pCtx
13990 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20  ;.  pColl->xDel 
139a0 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d  = xDel;.  pColl-
139b0 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32  >enc = (u8)(enc2
139c0 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45   | (enc & SQLITE
139d0 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29  _UTF16_ALIGNED))
139e0 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ;.  sqlite3Error
139f0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
13a00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13a10 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
13a20 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e 65  his array define
13a30 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75  s hard upper bou
13a40 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c  nds on limit val
13a50 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69  ues.  The.** ini
13a60 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65  tializer must be
13a70 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69   kept in sync wi
13a80 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49  th the SQLITE_LI
13a90 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65  MIT_*.** #define
13aa0 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a  s in sqlite3.h..
13ab0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
13ac0 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d  int aHardLimit[]
13ad0 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41   = {.  SQLITE_MA
13ae0 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  X_LENGTH,.  SQLI
13af0 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
13b00 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
13b10 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45  COLUMN,.  SQLITE
13b20 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c  _MAX_EXPR_DEPTH,
13b30 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  .  SQLITE_MAX_CO
13b40 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20  MPOUND_SELECT,. 
13b50 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
13b60 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  _OP,.  SQLITE_MA
13b70 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a  X_FUNCTION_ARG,.
13b80 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54    SQLITE_MAX_ATT
13b90 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f  ACHED,.  SQLITE_
13ba0 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
13bb0 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
13bc0 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
13bd0 55 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a 20 49  UMBER,      /* I
13be0 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33 32 33 35  MP: R-38091-3235
13bf0 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d 41  2 */.  SQLITE_MA
13c00 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c  X_TRIGGER_DEPTH,
13c10 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  .  SQLITE_MAX_WO
13c20 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d 3b  RKER_THREADS,.};
13c30 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
13c40 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74  e the hard limit
13c50 73 20 61 72 65 20 73 65 74 20 74 6f 20 72 65 61  s are set to rea
13c60 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a  sonable values.*
13c70 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
13c80 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72  _LENGTH<100.# er
13c90 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ror SQLITE_MAX_L
13ca0 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
13cb0 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69   least 100.#endi
13cc0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
13cd0 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a  _SQL_LENGTH<100.
13ce0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
13cf0 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75  AX_SQL_LENGTH mu
13d00 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
13d10 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
13d20 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
13d30 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  GTH>SQLITE_MAX_L
13d40 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51  ENGTH.# error SQ
13d50 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
13d60 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  GTH must not be 
13d70 67 72 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c  greater than SQL
13d80 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23  ITE_MAX_LENGTH.#
13d90 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
13da0 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
13db0 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53  LECT<2.# error S
13dc0 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
13dd0 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62  ND_SELECT must b
13de0 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e  e at least 2.#en
13df0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
13e00 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20  AX_VDBE_OP<40.# 
13e10 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
13e20 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65  _VDBE_OP must be
13e30 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e   at least 40.#en
13e40 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
13e50 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c  AX_FUNCTION_ARG<
13e60 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  0 || SQLITE_MAX_
13e70 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 32 37  FUNCTION_ARG>127
13e80 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
13e90 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
13ea0 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
13eb0 20 30 20 61 6e 64 20 31 32 37 0a 23 65 6e 64 69   0 and 127.#endi
13ec0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
13ed0 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53  _ATTACHED<0 || S
13ee0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
13ef0 45 44 3e 31 32 35 0a 23 20 65 72 72 6f 72 20 53  ED>125.# error S
13f00 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
13f10 45 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  ED must be betwe
13f20 65 6e 20 30 20 61 6e 64 20 31 32 35 0a 23 65 6e  en 0 and 125.#en
13f30 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
13f40 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
13f50 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72  LENGTH<1.# error
13f60 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
13f70 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
13f80 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
13f90 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   1.#endif.#if SQ
13fa0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e  LITE_MAX_COLUMN>
13fb0 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51  32767.# error SQ
13fc0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20  LITE_MAX_COLUMN 
13fd0 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20  must not exceed 
13fe0 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66  32767.#endif.#if
13ff0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47   SQLITE_MAX_TRIG
14000 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72  GER_DEPTH<1.# er
14010 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54  ror SQLITE_MAX_T
14020 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73  RIGGER_DEPTH mus
14030 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a  t be at least 1.
14040 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
14050 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
14060 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49 54 45  EADS<0 || SQLITE
14070 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
14080 41 44 53 3e 35 30 0a 23 20 65 72 72 6f 72 20 53  ADS>50.# error S
14090 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
140a0 5f 54 48 52 45 41 44 53 20 6d 75 73 74 20 62 65  _THREADS must be
140b0 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 35   between 0 and 5
140c0 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
140d0 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
140e0 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20 52  e of a limit.  R
140f0 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61  eport the old va
14100 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  lue..** If an in
14110 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64 65  valid limit inde
14120 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 72  x is supplied, r
14130 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b  eport -1..** Mak
14140 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75 74  e no changes but
14150 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74 68   still report th
14160 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20 74  e old value if t
14170 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20  he.** new limit 
14180 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  is negative..**.
14190 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c  ** A new lower l
141a0 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73 68  imit does not sh
141b0 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63 6f  rink existing co
141c0 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20  nstructs..** It 
141d0 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73 20  merely prevents 
141e0 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20 74  new constructs t
141f0 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20 6c  hat exceed the l
14200 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72  imit.** from for
14210 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ming..*/.int sql
14220 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74  ite3_limit(sqlit
14230 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69  e3 *db, int limi
14240 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69  tId, int newLimi
14250 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d  t){.  int oldLim
14260 69 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  it;..#ifdef SQLI
14270 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
14280 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
14290 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
142a0 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
142b0 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
142c0 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
142d0 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  -1;.  }.#endif..
142e0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
142f0 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20  : R-30189-54097 
14300 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63  For each limit c
14310 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c  ategory SQLITE_L
14320 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74  IMIT_NAME.  ** t
14330 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20 75  here is a hard u
14340 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61  pper bound set a
14350 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62  t compile-time b
14360 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73 73  y a C preprocess
14370 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61  or.  ** macro ca
14380 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lled SQLITE_MAX_
14390 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d  NAME. (The "_LIM
143a0 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  IT_" in the name
143b0 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20   is changed to. 
143c0 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20   ** "_MAX_".).  
143d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  */.  assert( aHa
143e0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
143f0 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51  IMIT_LENGTH]==SQ
14400 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
14410 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
14420 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
14430 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d  IMIT_SQL_LENGTH]
14440 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  ==SQLITE_MAX_SQL
14450 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
14460 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
14470 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
14480 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  UMN]==SQLITE_MAX
14490 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73  _COLUMN );.  ass
144a0 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
144b0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
144c0 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45  R_DEPTH]==SQLITE
144d0 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20  _MAX_EXPR_DEPTH 
144e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
144f0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
14500 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
14510 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LECT]==SQLITE_MA
14520 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
14530 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  T);.  assert( aH
14540 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
14550 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d  LIMIT_VDBE_OP]==
14560 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
14570 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OP );.  assert( 
14580 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
14590 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
145a0 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  _ARG]==SQLITE_MA
145b0 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29  X_FUNCTION_ARG )
145c0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
145d0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
145e0 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53  MIT_ATTACHED]==S
145f0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
14600 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
14610 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
14620 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
14630 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20  TERN_LENGTH]==. 
14640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
14670 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
14680 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a  TTERN_LENGTH );.
14690 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
146a0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
146b0 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
146c0 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56  R]==SQLITE_MAX_V
146d0 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b  ARIABLE_NUMBER);
146e0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
146f0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
14700 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
14710 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  ]==SQLITE_MAX_TR
14720 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20  IGGER_DEPTH );. 
14730 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
14740 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
14750 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d  _WORKER_THREADS]
14760 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  ==SQLITE_MAX_WOR
14770 4b 45 52 5f 54 48 52 45 41 44 53 20 29 3b 0a 20  KER_THREADS );. 
14780 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
14790 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
147a0 45 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f  EADS==(SQLITE_N_
147b0 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20  LIMIT-1) );...  
147c0 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c  if( limitId<0 ||
147d0 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45   limitId>=SQLITE
147e0 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  _N_LIMIT ){.    
147f0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
14800 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e   oldLimit = db->
14810 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  aLimit[limitId];
14820 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e  .  if( newLimit>
14830 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
14840 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
14850 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f  R-52476-28732 */
14860 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  .    if( newLimi
14870 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  t>aHardLimit[lim
14880 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e  itId] ){.      n
14890 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c  ewLimit = aHardL
148a0 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20  imit[limitId];  
148b0 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d  /* IMP: R-51463-
148c0 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20  25634 */.    }. 
148d0 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69     db->aLimit[li
148e0 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69  mitId] = newLimi
148f0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
14900 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  oldLimit;       
14910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14920 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35   IMP: R-53341-35
14930 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  419 */.}../*.** 
14940 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
14950 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20 62   used to parse b
14960 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e  oth URIs and non
14970 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70  -URI filenames p
14980 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  assed by the.** 
14990 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63  user to API func
149a0 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70  tions sqlite3_op
149b0 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  en() or sqlite3_
149c0 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66  open_v2(), and f
149d0 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55  or database.** U
149e0 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61 73  RIs specified as
149f0 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48 20   part of ATTACH 
14a00 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
14a10 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
14a20 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
14a30 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d  ction is the nam
14a40 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
14a50 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c  use (or.** a NUL
14a60 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65  L to signify the
14a70 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69 66   default VFS) if
14a80 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f   the URI does no
14a90 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73  t contain a "vfs
14aa0 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70  =xxx".** query p
14ab0 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65  arameter. The se
14ac0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f  cond argument co
14ad0 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20 28  ntains the URI (
14ae0 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e  or non-URI filen
14af0 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20  ame).** itself. 
14b00 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
14b10 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  on is called the
14b20 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c   *pFlags variabl
14b30 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  e should contain
14b40 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20  .** the default 
14b50 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68  flags to open th
14b60 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
14b70 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75  e with. The valu
14b80 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a  e stored in.** *
14b90 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70  pFlags may be up
14ba0 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74  dated before ret
14bb0 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52  urning if the UR
14bc0 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61  I filename conta
14bd0 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78  ins .** "cache=x
14be0 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78  xx" or "mode=xxx
14bf0 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  " query paramete
14c00 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  rs..**.** If suc
14c10 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
14c20 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
14c30 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70 70  In this case *pp
14c40 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Vfs is set to po
14c50 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46  int to.** the VF
14c60 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  S that should be
14c70 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68   used to open th
14c80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
14c90 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20   *pzFile is set 
14ca0 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  to.** point to a
14cb0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
14cc0 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ng the name of t
14cd0 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  he file to open.
14ce0 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
14cf0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
14d00 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
14d10 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73  ventually call s
14d20 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f  qlite3_free() to
14d30 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
14d40 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   buffer..**.** I
14d50 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
14d60 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74  s, then an SQLit
14d70 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
14d80 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a  returned and *pz
14d90 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65  ErrMsg.** may be
14da0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
14db0 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
14dc0 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20  ning an English 
14dd0 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a  language error .
14de0 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  ** message. It i
14df0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
14e00 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
14e10 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
14e20 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
14e30 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69   buffer by calli
14e40 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
14e50 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
14e60 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e  3ParseUri(.  con
14e70 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c  st char *zDefaul
14e80 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20  tVfs,        /* 
14e90 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f  VFS to use if no
14ea0 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72 79   "vfs=xxx" query
14eb0 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e   option */.  con
14ec0 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20  st char *zUri,  
14ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14ee0 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55  Nul-terminated U
14ef0 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20  RI to parse */. 
14f00 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70   unsigned int *p
14f10 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
14f20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49   /* IN/OUT: SQLI
14f30 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
14f40 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  s */.  sqlite3_v
14f50 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20  fs **ppVfs,     
14f60 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
14f70 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20  FS to use */ .  
14f80 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20  char **pzFile,  
14f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fa0 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65  /* OUT: Filename
14fb0 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52   component of UR
14fc0 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  I */.  char **pz
14fd0 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20  ErrMsg          
14fe0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
14ff0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66  rror message (if
15000 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc!=SQLITE_OK) 
15010 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
15020 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
15030 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73  signed int flags
15040 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f   = *pFlags;.  co
15050 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d  nst char *zVfs =
15060 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20   zDefaultVfs;.  
15070 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
15080 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72  har c;.  int nUr
15090 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
150a0 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73  n30(zUri);..  as
150b0 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d  sert( *pzErrMsg=
150c0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66  =0 );..  if( ((f
150d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
150e0 45 4e 5f 55 52 49 29 20 20 20 20 20 20 20 20 20  EN_URI)         
150f0 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 38      /* IMP: R-48
15100 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a 20 20 20  725-32206 */.   
15110 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
15120 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
15130 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20 49 4d 50  bOpenUri) /* IMP
15140 3a 20 52 2d 35 31 36 38 39 2d 34 36 35 34 38 20  : R-51689-46548 
15150 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d 35  */.   && nUri>=5
15160 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c   && memcmp(zUri,
15170 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20   "file:", 5)==0 
15180 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38 34 2d  /* IMP: R-57884-
15190 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a 20 20  37496 */.  ){.  
151a0 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20    char *zOpt;.  
151b0 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20    int eState;   
151c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151d0 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65 20  /* Parser state 
151e0 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49  when parsing URI
151f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b   */.    int iIn;
15200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15210 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63        /* Input c
15220 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
15230 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d  /.    int iOut =
15240 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
15250 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68      /* Output ch
15260 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f  aracter index */
15270 0a 20 20 20 20 75 36 34 20 6e 42 79 74 65 20 3d  .    u64 nByte =
15280 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20   nUri+2;        
15290 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
152a0 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  pace to allocate
152b0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65   */..    /* Make
152c0 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54 45   sure the SQLITE
152d0 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69  _OPEN_URI flag i
152e0 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74  s set to indicat
152f0 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70  e to the VFS xOp
15300 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  en .    ** metho
15310 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79  d that there may
15320 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d 65   be extra parame
15330 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ters following t
15340 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a  he file-name.  *
15350 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  /.    flags |= S
15360 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a  QLITE_OPEN_URI;.
15370 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20  .    for(iIn=0; 
15380 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29  iIn<nUri; iIn++)
15390 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b   nByte += (zUri[
153a0 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20  iIn]=='&');.    
153b0 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  zFile = sqlite3_
153c0 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b  malloc64(nByte);
153d0 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20  .    if( !zFile 
153e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
153f0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 0a 20 20 20  NOMEM_BKPT;..   
15400 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66 64 65 66   iIn = 5;.#ifdef
15410 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52   SQLITE_ALLOW_UR
15420 49 5f 41 55 54 48 4f 52 49 54 59 0a 20 20 20 20  I_AUTHORITY.    
15430 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69  if( strncmp(zUri
15440 2b 35 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30  +5, "///", 3)==0
15450 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20   ){.      iIn = 
15460 37 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  7;.      /* The 
15470 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74  following condit
15480 69 6f 6e 20 63 61 75 73 65 73 20 55 52 49 73 20  ion causes URIs 
15490 77 69 74 68 20 66 69 76 65 20 6c 65 61 64 69 6e  with five leadin
154a0 67 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20  g / characters. 
154b0 20 20 20 20 20 2a 2a 20 6c 69 6b 65 20 66 69 6c       ** like fil
154c0 65 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68  e://///host/path
154d0 20 74 6f 20 62 65 20 63 6f 6e 76 65 72 74 65 64   to be converted
154e0 20 69 6e 74 6f 20 55 4e 43 73 20 6c 69 6b 65 20   into UNCs like 
154f0 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 0a 20 20 20  //host/path..   
15500 20 20 20 2a 2a 20 54 68 65 20 63 6f 72 72 65 63     ** The correc
15510 74 20 55 52 49 20 66 6f 72 20 74 68 61 74 20 55  t URI for that U
15520 4e 43 20 68 61 73 20 6f 6e 6c 79 20 74 77 6f 20  NC has only two 
15530 6f 72 20 66 6f 75 72 20 6c 65 61 64 69 6e 67 20  or four leading 
15540 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20  / characters.   
15550 20 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f 73     ** file://hos
15560 74 2f 70 61 74 68 20 6f 72 20 66 69 6c 65 3a 2f  t/path or file:/
15570 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 20 20 42  ///host/path.  B
15580 75 74 20 35 20 6c 65 61 64 69 6e 67 20 73 6c 61  ut 5 leading sla
15590 73 68 65 73 20 69 73 20 61 20 0a 20 20 20 20 20  shes is a .     
155a0 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f 72   ** common error
155b0 2c 20 77 65 20 61 72 65 20 74 6f 6c 64 2c 20 73  , we are told, s
155c0 6f 20 77 65 20 68 61 6e 64 6c 65 20 69 74 20 61  o we handle it a
155d0 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
155e0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  . */.      if( s
155f0 74 72 6e 63 6d 70 28 7a 55 72 69 2b 37 2c 20 22  trncmp(zUri+7, "
15600 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 20 69  ///", 3)==0 ){ i
15610 49 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73  In++; }.    }els
15620 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55  e if( strncmp(zU
15630 72 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68 6f  ri+5, "//localho
15640 73 74 2f 22 2c 20 31 32 29 3d 3d 30 20 29 7b 0a  st/", 12)==0 ){.
15650 20 20 20 20 20 20 69 49 6e 20 3d 20 31 36 3b 0a        iIn = 16;.
15660 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
15670 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 73  /* Discard the s
15680 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72  cheme and author
15690 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20  ity segments of 
156a0 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20  the URI. */.    
156b0 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27  if( zUri[5]=='/'
156c0 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27   && zUri[6]=='/'
156d0 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20   ){.      iIn = 
156e0 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  7;.      while( 
156f0 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72  zUri[iIn] && zUr
15700 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49  i[iIn]!='/' ) iI
15710 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  n++;.      if( i
15720 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31  In!=7 && (iIn!=1
15730 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63  6 || memcmp("loc
15740 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37  alhost", &zUri[7
15750 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20  ], 9)) ){.      
15760 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71    *pzErrMsg = sq
15770 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69  lite3_mprintf("i
15780 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f  nvalid uri autho
15790 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20  rity: %.*s", .  
157a0 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c            iIn-7,
157b0 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20   &zUri[7]);.    
157c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
157d0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67  ERROR;.        g
157e0 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75  oto parse_uri_ou
157f0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
15800 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
15810 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d  Copy the filenam
15820 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20  e and any query 
15830 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20  parameters into 
15840 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72  the zFile buffer
15850 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65  . .    ** Decode
15860 20 25 48 48 20 65 73 63 61 70 65 20 63 6f 64 65   %HH escape code
15870 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e  s along the way.
15880 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
15890 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70  Within this loop
158a0 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74 61 74  , variable eStat
158b0 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  e may be set to 
158c0 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e  0, 1 or 2, depen
158d0 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  ding.    ** on t
158e0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
158f0 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a  xt. As follows:.
15900 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
15910 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d  0: Parsing file-
15920 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31  name..    **   1
15930 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73  : Parsing name s
15940 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65  ection of a name
15950 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72  =value query par
15960 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20  ameter..    **  
15970 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75   2: Parsing valu
15980 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e  e section of a n
15990 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20  ame=value query 
159a0 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a  parameter..    *
159b0 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20 30  /.    eState = 0
159c0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 20  ;.    while( (c 
159d0 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20  = zUri[iIn])!=0 
159e0 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20  && c!='#' ){.   
159f0 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20     iIn++;.      
15a00 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20  if( c=='%' .    
15a10 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78     && sqlite3Isx
15a20 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29  digit(zUri[iIn])
15a30 20 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69   .       && sqli
15a40 74 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69  te3Isxdigit(zUri
15a50 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20  [iIn+1]) .      
15a60 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f  ){.        int o
15a70 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48  ctet = (sqlite3H
15a80 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e  exToInt(zUri[iIn
15a90 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20  ++]) << 4);.    
15aa0 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c      octet += sql
15ab0 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72  ite3HexToInt(zUr
15ac0 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20  i[iIn++]);..    
15ad0 20 20 20 20 61 73 73 65 72 74 28 20 6f 63 74 65      assert( octe
15ae0 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35  t>=0 && octet<25
15af0 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  6 );.        if(
15b00 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 23 69 66   octet==0 ){.#if
15b10 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
15b20 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52 4f 52 0a  LE_URI_00_ERROR.
15b30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
15b40 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
15b50 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61 70 70  n when "%00" app
15b60 65 61 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  ears within the 
15b70 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20  URI. In this.   
15b80 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77         ** case w
15b90 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78  e ignore all tex
15ba0 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64  t in the remaind
15bb0 65 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20  er of the path, 
15bc0 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20  name or.        
15bd0 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65    ** value curre
15be0 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65  ntly being parse
15bf0 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65  d. So ignore the
15c00 20 63 75 72 72 65 6e 74 20 63 68 61 72 61 63 74   current charact
15c10 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
15c20 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20  and skip to the 
15c30 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72  next "?", "=" or
15c40 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72   "&", as appropr
15c50 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  iate. */.       
15c60 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a     while( (c = z
15c70 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20  Uri[iIn])!=0 && 
15c80 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20  c!='#' .        
15c90 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65        && (eState
15ca0 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20  !=0 || c!='?'). 
15cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
15cc0 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63  (eState!=1 || (c
15cd0 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29  !='=' && c!='&')
15ce0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
15cf0 26 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c  && (eState!=2 ||
15d00 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20   c!='&').       
15d10 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
15d20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20    iIn++;.       
15d30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
15d40 6f 6e 74 69 6e 75 65 3b 0a 23 65 6c 73 65 0a 20  ontinue;.#else. 
15d50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 45           /* If E
15d60 4e 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52  NABLE_URI_00_ERR
15d70 4f 52 20 69 73 20 64 65 66 69 6e 65 64 2c 20 22  OR is defined, "
15d80 25 30 30 22 20 69 6e 20 61 20 55 52 49 20 69 73  %00" in a URI is
15d90 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20   an error. */.  
15da0 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73          *pzErrMs
15db0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
15dc0 6e 74 66 28 22 75 6e 65 78 70 65 63 74 65 64 20  ntf("unexpected 
15dd0 25 25 30 30 20 69 6e 20 75 72 69 22 29 3b 0a 20  %%00 in uri");. 
15de0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
15df0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
15e00 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
15e10 5f 75 72 69 5f 6f 75 74 3b 0a 23 65 6e 64 69 66  _uri_out;.#endif
15e20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15e30 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20     c = octet;.  
15e40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53      }else if( eS
15e50 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27  tate==1 && (c=='
15e60 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b  &' || c=='=') ){
15e70 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69  .        if( zFi
15e80 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b  le[iOut-1]==0 ){
15e90 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  .          /* An
15ea0 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61   empty option na
15eb0 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69 73 20  me. Ignore this 
15ec0 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65  option altogethe
15ed0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  r. */.          
15ee0 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d  while( zUri[iIn]
15ef0 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27   && zUri[iIn]!='
15f00 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31  #' && zUri[iIn-1
15f10 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a  ]!='&' ) iIn++;.
15f20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
15f30 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
15f40 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 26 27        if( c=='&'
15f50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46   ){.          zF
15f60 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
15f70 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0';.        }els
15f80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74  e{.          eSt
15f90 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  ate = 2;.       
15fa0 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30   }.        c = 0
15fb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
15fc0 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26 26 20  ( (eState==0 && 
15fd0 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74 61  c=='?') || (eSta
15fe0 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27 29  te==2 && c=='&')
15ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
16000 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  0;.        eStat
16010 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
16020 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b       zFile[iOut+
16030 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20  +] = c;.    }.  
16040 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20    if( eState==1 
16050 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20  ) zFile[iOut++] 
16060 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c  = '\0';.    zFil
16070 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
16080 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74  ;.    zFile[iOut
16090 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20  ++] = '\0';..   
160a0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
160b0 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70 74 69  re were any opti
160c0 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20 74 68  ons specified th
160d0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 74  at should be int
160e0 65 72 70 72 65 74 65 64 20 0a 20 20 20 20 2a 2a  erpreted .    **
160f0 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74   here. Options t
16100 68 61 74 20 61 72 65 20 69 6e 74 65 72 70 72 65  hat are interpre
16110 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75 64 65  ted here include
16120 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f 73 65   "vfs" and those
16130 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72   that.    ** cor
16140 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73  respond to flags
16150 20 74 68 61 74 20 6d 61 79 20 62 65 20 70 61 73   that may be pas
16160 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  sed to the sqlit
16170 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20  e3_open_v2().   
16180 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20   ** method. */. 
16190 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65     zOpt = &zFile
161a0 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
161b0 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20  (zFile)+1];.    
161c0 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29  while( zOpt[0] )
161d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74  {.      int nOpt
161e0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
161f0 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20  30(zOpt);.      
16200 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f  char *zVal = &zO
16210 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20  pt[nOpt+1];.    
16220 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c    int nVal = sql
16230 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 56 61  ite3Strlen30(zVa
16240 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e  l);..      if( n
16250 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70  Opt==3 && memcmp
16260 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29  ("vfs", zOpt, 3)
16270 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
16280 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20  Vfs = zVal;.    
16290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
162a0 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
162b0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   {.          con
162c0 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
162d0 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a        int mode;.
162e0 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65          } *aMode
162f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
16300 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20  ar *zModeType = 
16310 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d  0;.        int m
16320 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ask = 0;.       
16330 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a   int limit = 0;.
16340 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70  .        if( nOp
16350 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==5 && memcmp("
16360 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29  cache", zOpt, 5)
16370 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
16380 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f   static struct O
16390 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f  penMode aCacheMo
163a0 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  de[] = {.       
163b0 20 20 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c       { "shared",
163c0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48    SQLITE_OPEN_SH
163d0 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20  AREDCACHE },.   
163e0 20 20 20 20 20 20 20 20 20 7b 20 22 70 72 69 76           { "priv
163f0 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ate", SQLITE_OPE
16400 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d  N_PRIVATECACHE }
16410 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
16420 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20  0, 0 }.         
16430 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d   };..          m
16440 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ask = SQLITE_OPE
16450 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c 53 51  N_SHAREDCACHE|SQ
16460 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
16470 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20  ECACHE;.        
16480 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65    aMode = aCache
16490 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Mode;.          
164a0 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20  limit = mask;.  
164b0 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70          zModeTyp
164c0 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20  e = "cache";.   
164d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
164e0 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65  f( nOpt==4 && me
164f0 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70  mcmp("mode", zOp
16500 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, 4)==0 ){.    
16510 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72        static str
16520 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70  uct OpenMode aOp
16530 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20  enMode[] = {.   
16540 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c           { "ro",
16550 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
16560 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20  ADONLY },.      
16570 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53        { "rw",  S
16580 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
16590 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20  RITE }, .       
165a0 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51       { "rwc", SQ
165b0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
165c0 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
165d0 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20  N_CREATE },.    
165e0 20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72          { "memor
165f0 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  y", SQLITE_OPEN_
16600 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20  MEMORY },.      
16610 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20        { 0, 0 }. 
16620 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20           };..   
16630 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51         mask = SQ
16640 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
16650 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  LY | SQLITE_OPEN
16660 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20 20 20  _READWRITE.     
16670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
16680 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
16690 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
166a0 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20  _MEMORY;.       
166b0 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e     aMode = aOpen
166c0 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Mode;.          
166d0 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66  limit = mask & f
166e0 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lags;.          
166f0 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63  zModeType = "acc
16700 65 73 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ess";.        }.
16710 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f  .        if( aMo
16720 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
16730 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
16740 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20   int mode = 0;. 
16750 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
16760 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b  ; aMode[i].z; i+
16770 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
16780 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
16790 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20  aMode[i].z;.    
167a0 20 20 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c          if( nVal
167b0 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
167c0 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  0(z) && 0==memcm
167d0 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29  p(zVal, z, nVal)
167e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
167f0 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69    mode = aMode[i
16800 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ].mode;.        
16810 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16820 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16840 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a   if( mode==0 ){.
16850 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
16860 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
16870 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68  mprintf("no such
16880 20 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a   %s mode: %s", z
16890 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b  ModeType, zVal);
168a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
168b0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
168c0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
168d0 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a   parse_uri_out;.
168e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
168f0 20 20 20 20 20 20 69 66 28 20 28 6d 6f 64 65 20        if( (mode 
16900 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & ~SQLITE_OPEN_M
16910 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a  EMORY)>limit ){.
16920 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
16930 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
16940 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65  mprintf("%s mode
16950 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73   not allowed: %s
16960 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
16970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16980 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65             zMode
16990 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20  Type, zVal);.   
169a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
169b0 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20  LITE_PERM;.     
169c0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73         goto pars
169d0 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20  e_uri_out;.     
169e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
169f0 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20   flags = (flags 
16a00 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b  & ~mask) | mode;
16a10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16a20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d   }..      zOpt =
16a30 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a   &zVal[nVal+1];.
16a40 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
16a50 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69      zFile = sqli
16a60 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 55 72  te3_malloc64(nUr
16a70 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  i+2);.    if( !z
16a80 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51  File ) return SQ
16a90 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
16aa0 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20 29 7b  .    if( nUri ){
16ab0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46  .      memcpy(zF
16ac0 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29  ile, zUri, nUri)
16ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c  ;.    }.    zFil
16ae0 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a  e[nUri] = '\0';.
16af0 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31      zFile[nUri+1
16b00 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c  ] = '\0';.    fl
16b10 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
16b20 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20  PEN_URI;.  }..  
16b30 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33  *ppVfs = sqlite3
16b40 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b  _vfs_find(zVfs);
16b50 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d 3d 30  .  if( *ppVfs==0
16b60 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73   ){.    *pzErrMs
16b70 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
16b80 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76 66 73  ntf("no such vfs
16b90 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20  : %s", zVfs);.  
16ba0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
16bb0 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f  ROR;.  }. parse_
16bc0 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  uri_out:.  if( r
16bd0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16be0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
16bf0 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69  (zFile);.    zFi
16c00 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  le = 0;.  }.  *p
16c10 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
16c20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65   *pzFile = zFile
16c30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16c40 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
16c50 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
16c60 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61  ork of opening a
16c70 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68   database on beh
16c80 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  alf of.** sqlite
16c90 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c  3_open() and sql
16ca0 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54  ite3_open16(). T
16cb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16cc0 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22  name "zFilename"
16cd0 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65    .** is UTF-8 e
16ce0 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ncoded..*/.stati
16cf0 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61  c int openDataba
16d00 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  se(.  const char
16d10 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20   *zFilename, /* 
16d20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
16d30 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  e UTF-8 encoded 
16d40 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
16d50 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  pDb,        /* O
16d60 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74  UT: Returned dat
16d70 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
16d80 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66    unsigned int f
16d90 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72  lags,    /* Oper
16da0 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f  ational flags */
16db0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
16dc0 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Vfs       /* Nam
16dd0 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
16de0 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  use */.){.  sqli
16df0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
16e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
16e10 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68  tore allocated h
16e20 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
16e30 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
16e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e50 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
16e60 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61 64  /.  int isThread
16e70 73 61 66 65 3b 20 20 20 20 20 20 20 20 20 20 20  safe;           
16e80 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
16e90 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65  threadsafe conne
16ea0 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72  ctions */.  char
16eb0 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20   *zOpen = 0;    
16ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
16ed0 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
16ee0 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65   to pass to Btre
16ef0 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61  eOpen() */.  cha
16f00 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20  r *zErrMsg = 0; 
16f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16f20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  Error message fr
16f30 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55  om sqlite3ParseU
16f40 72 69 28 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ri() */..#ifdef 
16f50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
16f60 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70  I_ARMOR.  if( pp
16f70 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  Db==0 ) return S
16f80 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
16f90 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44  T;.#endif.  *ppD
16fa0 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  b = 0;.#ifndef S
16fb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
16fc0 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  NIT.  rc = sqlit
16fd0 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
16fe0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
16ff0 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20  rn rc;.#endif.. 
17000 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73   /* Only allow s
17010 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74  ensible combinat
17020 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20  ions of bits in 
17030 74 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  the flags argume
17040 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77  nt.  .  ** Throw
17050 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
17060 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69   non-sense combi
17070 6e 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20  nation is used. 
17080 20 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e   If we.  ** do n
17090 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c  ot block illegal
170a0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65   combinations he
170b0 72 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69  re, it could tri
170c0 67 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74  gger.  ** assert
170d0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  () statements in
170e0 20 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20   deeper layers. 
170f0 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e   Sensible combin
17100 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a  ations.  ** are:
17110 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20  .  **.  **  1:  
17120 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
17130 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53  ONLY.  **  2:  S
17140 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
17150 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53  RITE.  **  6:  S
17160 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
17170 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
17180 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20  EN_CREATE.  */. 
17190 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
171a0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d  OPEN_READONLY  =
171b0 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65  = 0x01 );.  asse
171c0 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  rt( SQLITE_OPEN_
171d0 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30  READWRITE == 0x0
171e0 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  2 );.  assert( S
171f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
17200 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a  E    == 0x04 );.
17210 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
17220 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32  (flags&7))==0x02
17230 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20   ); /* READONLY 
17240 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  */.  testcase( (
17250 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
17260 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52  x04 ); /* READWR
17270 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ITE */.  testcas
17280 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
17290 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45  )==0x40 ); /* RE
172a0 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
172b0 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28   */.  if( ((1<<(
172c0 66 6c 61 67 73 26 37 29 29 20 26 20 30 78 34 36  flags&7)) & 0x46
172d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )==0 ){.    retu
172e0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
172f0 5f 42 4b 50 54 3b 20 20 2f 2a 20 49 4d 50 3a 20  _BKPT;  /* IMP: 
17300 52 2d 36 35 34 39 37 2d 34 34 35 39 34 20 2a 2f  R-65497-44594 */
17310 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 71 6c 69  .  }..  if( sqli
17320 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
17330 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b  bCoreMutex==0 ){
17340 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
17350 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
17360 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
17370 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29  E_OPEN_NOMUTEX )
17380 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
17390 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  fe = 0;.  }else 
173a0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
173b0 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
173c0 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  X ){.    isThrea
173d0 64 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c  dsafe = 1;.  }el
173e0 73 65 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64  se{.    isThread
173f0 73 61 66 65 20 3d 20 73 71 6c 69 74 65 33 47 6c  safe = sqlite3Gl
17400 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
17410 4d 75 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  Mutex;.  }.  if(
17420 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
17430 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
17440 45 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 26  E ){.    flags &
17450 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  = ~SQLITE_OPEN_S
17460 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 65  HAREDCACHE;.  }e
17470 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 47  lse if( sqlite3G
17480 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72  lobalConfig.shar
17490 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29  edCacheEnabled )
174a0 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  {.    flags |= S
174b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
174c0 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f  DCACHE;.  }..  /
174d0 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c  * Remove harmful
174e0 20 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20 66   bits from the f
174f0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 20  lags parameter. 
17500 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c   **.  ** The SQL
17510 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
17520 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e   and SQLITE_OPEN
17530 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73  _FULLMUTEX flags
17540 20 77 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74   were.  ** dealt
17550 20 77 69 74 68 20 69 6e 20 74 68 65 20 70 72 65   with in the pre
17560 76 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b  vious code block
17570 2e 20 20 42 65 73 69 64 65 73 20 74 68 65 73 65  .  Besides these
17580 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20  , the only.  ** 
17590 76 61 6c 69 64 20 69 6e 70 75 74 20 66 6c 61 67  valid input flag
175a0 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70  s for sqlite3_op
175b0 65 6e 5f 76 32 28 29 20 61 72 65 20 53 51 4c 49  en_v2() are SQLI
175c0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
175d0 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50  ,.  ** SQLITE_OP
175e0 45 4e 5f 52 45 41 44 57 52 49 54 45 2c 20 53 51  EN_READWRITE, SQ
175f0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
17600 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  , SQLITE_OPEN_SH
17610 41 52 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20  AREDCACHE,.  ** 
17620 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
17630 41 54 45 43 41 43 48 45 2c 20 61 6e 64 20 73 6f  ATECACHE, and so
17640 6d 65 20 72 65 73 65 72 76 65 64 20 62 69 74 73  me reserved bits
17650 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b  .  Silently mask
17660 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74  .  ** off all ot
17670 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a  her flags..  */.
17680 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53    flags &=  ~( S
17690 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
176a0 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20  EONCLOSE |.     
176b0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
176c0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
176d0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
176e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
176f0 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20  N_DB |.         
17700 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
17710 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20  N_TEMP_DB | .   
17720 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
17730 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
17740 54 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20  T_DB | .        
17750 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
17760 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
17770 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
17780 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
17790 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  MP_JOURNAL | .  
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
177b0 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
177c0 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
177d0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
177e0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
177f0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
17800 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f    SQLITE_OPEN_NO
17810 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20  MUTEX |.        
17820 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
17830 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20  EN_FULLMUTEX |. 
17840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
17850 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
17860 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20             );.. 
17870 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
17880 20 73 71 6c 69 74 65 20 64 61 74 61 20 73 74 72   sqlite data str
17890 75 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d  ucture */.  db =
178a0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
178b0 72 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  ro( sizeof(sqlit
178c0 65 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d  e3) );.  if( db=
178d0 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62  =0 ) goto opendb
178e0 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54 68  _out;.  if( isTh
178f0 72 65 61 64 73 61 66 65 20 29 7b 0a 20 20 20 20  readsafe ){.    
17900 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  db->mutex = sqli
17910 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
17920 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52  LITE_MUTEX_RECUR
17930 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  SIVE);.    if( d
17940 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  b->mutex==0 ){. 
17950 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
17960 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20  e(db);.      db 
17970 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 0;.      goto 
17980 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20  opendb_out;.    
17990 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
179a0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
179b0 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72  mutex);.  db->er
179c0 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20  rMask = 0xff;.  
179d0 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64  db->nDb = 2;.  d
179e0 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
179f0 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20  E_MAGIC_BUSY;.  
17a00 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
17a10 62 53 74 61 74 69 63 3b 0a 0a 20 20 61 73 73 65  bStatic;..  asse
17a20 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61  rt( sizeof(db->a
17a30 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61  Limit)==sizeof(a
17a40 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20  HardLimit) );.  
17a50 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69  memcpy(db->aLimi
17a60 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73  t, aHardLimit, s
17a70 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74  izeof(db->aLimit
17a80 29 29 3b 0a 20 20 64 62 2d 3e 61 4c 69 6d 69 74  ));.  db->aLimit
17a90 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f  [SQLITE_LIMIT_WO
17aa0 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 20 3d 20  RKER_THREADS] = 
17ab0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
17ac0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3b 0a 20  ORKER_THREADS;. 
17ad0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
17ae0 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41  = 1;.  db->nextA
17af0 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64  utovac = -1;.  d
17b00 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c 69  b->szMmap = sqli
17b10 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
17b20 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e 65  szMmap;.  db->ne
17b30 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a  xtPagesize = 0;.
17b40 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72    db->nMaxSorter
17b50 4d 6d 61 70 20 3d 20 30 78 37 46 46 46 46 46 46  Mmap = 0x7FFFFFF
17b60 46 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  F;.  db->flags |
17b70 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
17b80 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f  lNames | SQLITE_
17b90 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20 7c 20  EnableTrigger | 
17ba0 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c  SQLITE_CacheSpil
17bb0 6c 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  l.#if !defined(S
17bc0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
17bd0 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 29 20 7c  TOMATIC_INDEX) |
17be0 7c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  | SQLITE_DEFAULT
17bf0 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
17c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17c10 20 20 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f 49    | SQLITE_AutoI
17c20 6e 64 65 78 0a 23 65 6e 64 69 66 0a 23 69 66 20  ndex.#endif.#if 
17c30 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
17c40 4b 50 54 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20  KPTFULLFSYNC.   
17c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
17c60 53 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c 46  SQLITE_CkptFullF
17c70 53 79 6e 63 0a 23 65 6e 64 69 66 0a 23 69 66 20  Sync.#endif.#if 
17c80 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
17c90 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20  ILE_FORMAT<4.   
17ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
17cb0 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c  SQLITE_LegacyFil
17cc0 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64  eFmt.#endif.#ifd
17cd0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17ce0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d00 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78   | SQLITE_LoadEx
17d10 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23  tension.#endif.#
17d20 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
17d30 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49 47  T_RECURSIVE_TRIG
17d40 47 45 52 53 0a 20 20 20 20 20 20 20 20 20 20 20  GERS.           
17d50 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52        | SQLITE_R
17d60 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69  ecTriggers.#endi
17d70 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
17d80 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52  LITE_DEFAULT_FOR
17d90 45 49 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51  EIGN_KEYS) && SQ
17da0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52  LITE_DEFAULT_FOR
17db0 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20  EIGN_KEYS.      
17dc0 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
17dd0 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a  ITE_ForeignKeys.
17de0 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
17df0 65 64 28 53 51 4c 49 54 45 5f 52 45 56 45 52 53  ed(SQLITE_REVERS
17e00 45 5f 55 4e 4f 52 44 45 52 45 44 5f 53 45 4c 45  E_UNORDERED_SELE
17e10 43 54 53 29 0a 20 20 20 20 20 20 20 20 20 20 20  CTS).           
17e20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52        | SQLITE_R
17e30 65 76 65 72 73 65 4f 72 64 65 72 0a 23 65 6e 64  everseOrder.#end
17e40 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
17e50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
17e60 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
17e70 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
17e80 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 65 6c 6c     | SQLITE_Cell
17e90 53 69 7a 65 43 6b 0a 23 65 6e 64 69 66 0a 23 69  SizeCk.#endif.#i
17ea0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
17eb0 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b  _ENABLE_FTS3_TOK
17ec0 45 4e 49 5a 45 52 29 0a 20 20 20 20 20 20 20 20  ENIZER).        
17ed0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
17ee0 45 5f 46 74 73 33 54 6f 6b 65 6e 69 7a 65 72 0a  E_Fts3Tokenizer.
17ef0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20  #endif.      ;. 
17f00 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
17f10 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
17f20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17f30 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
17f40 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  E.  sqlite3HashI
17f50 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  nit(&db->aModule
17f60 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
17f70 41 64 64 20 74 68 65 20 64 65 66 61 75 6c 74 20  Add the default 
17f80 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
17f90 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52  ce BINARY. BINAR
17fa0 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68  Y works for both
17fb0 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20   UTF-8.  ** and 
17fc0 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61  UTF-16, so add a
17fd0 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63   version for eac
17fe0 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75  h to avoid any u
17ff0 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20  nnecessary.  ** 
18000 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65  conversions. The
18010 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74   only error that
18020 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20   can occur here 
18030 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  is a malloc() fa
18040 69 6c 75 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  ilure..  **.  **
18050 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
18060 35 32 37 38 36 2d 34 34 38 37 38 20 53 51 4c 69  52786-44878 SQLi
18070 74 65 20 64 65 66 69 6e 65 73 20 74 68 72 65 65  te defines three
18080 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74   built-in collat
18090 69 6e 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  ing.  ** functio
180a0 6e 73 3a 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74  ns:.  */.  creat
180b0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73  eCollation(db, s
180c0 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c  qlite3StrBINARY,
180d0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
180e0 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
180f0 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
18100 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33 53  ion(db, sqlite3S
18110 74 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54 45  trBINARY, SQLITE
18120 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e  _UTF16BE, 0, bin
18130 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
18140 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
18150 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49  db, sqlite3StrBI
18160 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46  NARY, SQLITE_UTF
18170 31 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  16LE, 0, binColl
18180 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
18190 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
181a0 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45  "NOCASE", SQLITE
181b0 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65  _UTF8, 0, nocase
181c0 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30  CollatingFunc, 0
181d0 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
181e0 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22  tion(db, "RTRIM"
181f0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28  , SQLITE_UTF8, (
18200 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c  void*)1, binColl
18210 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  Func, 0);.  if( 
18220 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18230 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65   ){.    goto ope
18240 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f  ndb_out;.  }.  /
18250 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
18260 2d 30 38 33 30 38 2d 31 37 32 32 34 20 54 68 65  -08308-17224 The
18270 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
18280 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ng function for 
18290 61 6c 6c 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73  all.  ** strings
182a0 20 69 73 20 42 49 4e 41 52 59 2e 20 0a 20 20 2a   is BINARY. .  *
182b0 2f 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  /.  db->pDfltCol
182c0 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
182d0 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54  ollSeq(db, SQLIT
182e0 45 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33 53  E_UTF8, sqlite3S
182f0 74 72 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  trBINARY, 0);.  
18300 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c  assert( db->pDfl
18310 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f  tColl!=0 );..  /
18320 2a 20 50 61 72 73 65 20 74 68 65 20 66 69 6c 65  * Parse the file
18330 6e 61 6d 65 2f 55 52 49 20 61 72 67 75 6d 65 6e  name/URI argumen
18340 74 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e  t. */.  db->open
18350 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
18360 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 72   rc = sqlite3Par
18370 73 65 55 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c  seUri(zVfs, zFil
18380 65 6e 61 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26  ename, &flags, &
18390 64 62 2d 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e  db->pVfs, &zOpen
183a0 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  , &zErrMsg);.  i
183b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
183c0 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
183d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 73  SQLITE_NOMEM ) s
183e0 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
183f0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  b);.    sqlite3E
18400 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
18410 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25  rc, zErrMsg ? "%
18420 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29  s" : 0, zErrMsg)
18430 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
18440 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
18450 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
18460 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
18470 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74   the backend dat
18480 61 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a  abase driver */.
18490 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
184a0 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73  reeOpen(db->pVfs
184b0 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62  , zOpen, db, &db
184c0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c  ->aDb[0].pBt, 0,
184d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
184e0 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
184f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
18500 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21  N_DB);.  if( rc!
18510 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18520 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18530 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a  _IOERR_NOMEM ){.
18540 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18550 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
18560 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
18570 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20  rror(db, rc);.  
18580 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
18590 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  t;.  }.  sqlite3
185a0 42 74 72 65 65 45 6e 74 65 72 28 64 62 2d 3e 61  BtreeEnter(db->a
185b0 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62  Db[0].pBt);.  db
185c0 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61  ->aDb[0].pSchema
185d0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
185e0 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b  Get(db, db->aDb[
185f0 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28 20 21  0].pBt);.  if( !
18600 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18610 20 29 20 45 4e 43 28 64 62 29 20 3d 20 53 43 48   ) ENC(db) = SCH
18620 45 4d 41 5f 45 4e 43 28 64 62 29 3b 0a 20 20 73  EMA_ENC(db);.  s
18630 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18640 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
18650 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ;.  db->aDb[1].p
18660 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33  Schema = sqlite3
18670 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29  SchemaGet(db, 0)
18680 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61  ;..  /* The defa
18690 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c  ult safety_level
186a0 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
186b0 74 61 62 61 73 65 20 69 73 20 46 55 4c 4c 3b 20  tabase is FULL; 
186c0 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a  for the temp.  *
186d0 2a 20 64 61 74 61 62 61 73 65 20 69 74 20 69 73  * database it is
186e0 20 4f 46 46 2e 20 54 68 69 73 20 6d 61 74 63 68   OFF. This match
186f0 65 73 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  es the pager lay
18700 65 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20  er defaults.  . 
18710 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d   */.  db->aDb[0]
18720 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 22 6d 61 69  .zDbSName = "mai
18730 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d  n";.  db->aDb[0]
18740 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
18750 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
18760 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 3b 0a 20 20  YNCHRONOUS+1;.  
18770 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62 53 4e  db->aDb[1].zDbSN
18780 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20  ame = "temp";.  
18790 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74  db->aDb[1].safet
187a0 79 5f 6c 65 76 65 6c 20 3d 20 50 41 47 45 52 5f  y_level = PAGER_
187b0 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 3b  SYNCHRONOUS_OFF;
187c0 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ..  db->magic = 
187d0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45  SQLITE_MAGIC_OPE
187e0 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  N;.  if( db->mal
187f0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
18800 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
18810 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69  ;.  }..  /* Regi
18820 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69  ster all built-i
18830 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74  n functions, but
18840 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
18850 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a  to read the.  **
18860 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
18870 20 79 65 74 2e 20 54 68 69 73 20 69 73 20 64 65   yet. This is de
18880 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20  layed until the 
18890 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 64  first time the d
188a0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20  atabase.  ** is 
188b0 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20  accessed..  */. 
188c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
188d0 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20  , SQLITE_OK);.  
188e0 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 50  sqlite3RegisterP
188f0 65 72 43 6f 6e 6e 65 63 74 69 6f 6e 42 75 69 6c  erConnectionBuil
18900 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29  tinFunctions(db)
18910 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
18920 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 0a 23  _errcode(db);..#
18930 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
18940 42 4c 45 5f 46 54 53 35 0a 20 20 2f 2a 20 52 65  BLE_FTS5.  /* Re
18950 67 69 73 74 65 72 20 61 6e 79 20 62 75 69 6c 74  gister any built
18960 2d 69 6e 20 46 54 53 35 20 6d 6f 64 75 6c 65 20  -in FTS5 module 
18970 62 65 66 6f 72 65 20 6c 6f 61 64 69 6e 67 20 74  before loading t
18980 68 65 20 61 75 74 6f 6d 61 74 69 63 0a 20 20 2a  he automatic.  *
18990 2a 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 54 68  * extensions. Th
189a0 69 73 20 61 6c 6c 6f 77 73 20 61 75 74 6f 6d 61  is allows automa
189b0 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 74  tic extensions t
189c0 6f 20 72 65 67 69 73 74 65 72 20 46 54 53 35 20  o register FTS5 
189d0 0a 20 20 2a 2a 20 74 6f 6b 65 6e 69 7a 65 72 73  .  ** tokenizers
189e0 20 61 6e 64 20 61 75 78 69 6c 69 61 72 79 20 66   and auxiliary f
189f0 75 6e 63 74 69 6f 6e 73 2e 20 20 2a 2f 0a 20 20  unctions.  */.  
18a00 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
18a10 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
18a20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
18a30 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e   = sqlite3Fts5In
18a40 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
18a50 69 66 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75  if..  /* Load au
18a60 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f  tomatic extensio
18a70 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20  ns - extensions 
18a80 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 72  that have been r
18a90 65 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75  egistered.  ** u
18aa0 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
18ab0 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e  _automatic_exten
18ac0 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f  sion() API..  */
18ad0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18ae0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
18af0 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e  te3AutoLoadExten
18b00 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20 72  sions(db);.    r
18b10 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
18b20 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 69 66 28  ode(db);.    if(
18b30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18b40 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  {.      goto ope
18b50 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ndb_out;.    }. 
18b60 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
18b70 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20  E_ENABLE_FTS1.  
18b80 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
18b90 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78 74  ailed ){.    ext
18ba0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46  ern int sqlite3F
18bb0 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33 2a  ts1Init(sqlite3*
18bc0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
18bd0 74 65 33 46 74 73 31 49 6e 69 74 28 64 62 29 3b  te3Fts1Init(db);
18be0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
18bf0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
18c00 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64 62  E_FTS2.  if( !db
18c10 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
18c20 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
18c30 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ){.    extern in
18c40 74 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69  t sqlite3Fts2Ini
18c50 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  t(sqlite3*);.   
18c60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
18c70 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  2Init(db);.  }.#
18c80 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
18c90 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
18ca0 20 2f 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   /* automaticall
18cb0 79 20 64 65 66 69 6e 65 64 20 62 79 20 53 51 4c  y defined by SQL
18cc0 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 20  ITE_ENABLE_FTS4 
18cd0 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  */.  if( !db->ma
18ce0 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
18cf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18d00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
18d10 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts3Init(db);.  }
18d20 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
18d30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
18d40 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  U.  if( !db->mal
18d50 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
18d60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18d70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63    rc = sqlite3Ic
18d80 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  uInit(db);.  }.#
18d90 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
18da0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45  LITE_ENABLE_RTRE
18db0 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  E.  if( !db->mal
18dc0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
18dd0 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
18de0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72   rc = sqlite3Rtr
18df0 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  eeInit(db);.  }.
18e00 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
18e10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 53  QLITE_ENABLE_DBS
18e20 54 41 54 5f 56 54 41 42 0a 20 20 69 66 28 20 21  TAT_VTAB.  if( !
18e30 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18e40 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
18e50 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
18e60 69 74 65 33 44 62 73 74 61 74 52 65 67 69 73 74  ite3DbstatRegist
18e70 65 72 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  er(db);.  }.#end
18e80 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
18e90 45 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 31 0a 20  E_ENABLE_JSON1. 
18ea0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
18eb0 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
18ec0 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63  LITE_OK){.    rc
18ed0 20 3d 20 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49   = sqlite3Json1I
18ee0 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
18ef0 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49  dif..  /* -DSQLI
18f00 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
18f10 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20  NG_MODE=1 makes 
18f20 45 58 43 4c 55 53 49 56 45 20 74 68 65 20 64 65  EXCLUSIVE the de
18f30 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20  fault locking.  
18f40 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49  ** mode.  -DSQLI
18f50 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
18f60 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e  NG_MODE=0 make N
18f70 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c  ORMAL the defaul
18f80 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d  t locking.  ** m
18f90 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68  ode.  Doing noth
18fa0 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20  ing at all also 
18fb0 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65  makes NORMAL the
18fc0 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23   default..  */.#
18fd0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46  ifdef SQLITE_DEF
18fe0 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
18ff0 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b  E.  db->dfltLock
19000 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mode = SQLITE_DE
19010 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
19020 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  DE;.  sqlite3Pag
19030 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71  erLockingMode(sq
19040 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
19050 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c  db->aDb[0].pBt),
19060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19070 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
19080 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
19090 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a  G_MODE);.#endif.
190a0 0a 20 20 69 66 28 20 72 63 20 29 20 73 71 6c 69  .  if( rc ) sqli
190b0 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29  te3Error(db, rc)
190c0 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74  ;..  /* Enable t
190d0 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c  he lookaside-mal
190e0 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2a 2f  loc subsystem */
190f0 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64  .  setupLookasid
19100 65 28 64 62 2c 20 30 2c 20 73 71 6c 69 74 65 33  e(db, 0, sqlite3
19110 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c  GlobalConfig.szL
19120 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20 20  ookaside,.      
19130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19140 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
19150 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65  onfig.nLookaside
19160 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77 61  );..  sqlite3_wa
19170 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
19180 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  (db, SQLITE_DEFA
19190 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43  ULT_WAL_AUTOCHEC
191a0 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62  KPOINT);..opendb
191b0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64 62 20 29  _out:.  if( db )
191c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
191d0 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73  ->mutex!=0 || is
191e0 54 68 72 65 61 64 73 61 66 65 3d 3d 30 0a 20 20  Threadsafe==0.  
191f0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
19200 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
19210 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b  bFullMutex==0 );
19220 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
19230 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
19240 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ex);.  }.  rc = 
19250 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
19260 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  db);.  assert( d
19270 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  b!=0 || rc==SQLI
19280 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66  TE_NOMEM );.  if
19290 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
192a0 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EM ){.    sqlite
192b0 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20  3_close(db);.   
192c0 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65   db = 0;.  }else
192d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
192e0 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  OK ){.    db->ma
192f0 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
19300 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a  IC_SICK;.  }.  *
19310 70 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 64 65  ppDb = db;.#ifde
19320 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
19330 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c  SQLLOG.  if( sql
19340 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
19350 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20  .xSqllog ){.    
19360 2f 2a 20 4f 70 65 6e 69 6e 67 20 61 20 64 62 20  /* Opening a db 
19370 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70  handle. Fourth p
19380 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73  arameter is pass
19390 65 64 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f 69  ed 0. */.    voi
193a0 64 20 2a 70 41 72 67 20 3d 20 73 71 6c 69 74 65  d *pArg = sqlite
193b0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
193c0 71 6c 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73 71  qllogArg;.    sq
193d0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
193e0 67 2e 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c 20  g.xSqllog(pArg, 
193f0 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30  db, zFilename, 0
19400 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  );.  }.#endif.#i
19410 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
19420 5f 48 41 53 5f 43 4f 44 45 43 29 0a 20 20 69 66  _HAS_CODEC).  if
19430 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19440 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
19450 72 20 2a 7a 4b 65 79 3b 0a 20 20 20 20 69 66 28  r *zKey;.    if(
19460 20 28 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   (zKey = sqlite3
19470 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a  _uri_parameter(z
19480 4f 70 65 6e 2c 20 22 68 65 78 6b 65 79 22 29 29  Open, "hexkey"))
19490 21 3d 30 20 26 26 20 7a 4b 65 79 5b 30 5d 20 29  !=0 && zKey[0] )
194a0 7b 3b 0a 20 20 20 20 20 20 75 38 20 69 42 79 74  {;.      u8 iByt
194b0 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e;.      int i;.
194c0 20 20 20 20 20 20 63 68 61 72 20 7a 44 65 63 6f        char zDeco
194d0 64 65 64 5b 34 30 5d 3b 0a 20 20 20 20 20 20 66  ded[40];.      f
194e0 6f 72 28 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b  or(i=0, iByte=0;
194f0 20 69 3c 73 69 7a 65 6f 66 28 7a 44 65 63 6f 64   i<sizeof(zDecod
19500 65 64 29 2a 32 20 26 26 20 73 71 6c 69 74 65 33  ed)*2 && sqlite3
19510 49 73 78 64 69 67 69 74 28 7a 4b 65 79 5b 69 5d  Isxdigit(zKey[i]
19520 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
19530 20 69 42 79 74 65 20 3d 20 28 69 42 79 74 65 3c   iByte = (iByte<
19540 3c 34 29 20 2b 20 73 71 6c 69 74 65 33 48 65 78  <4) + sqlite3Hex
19550 54 6f 49 6e 74 28 7a 4b 65 79 5b 69 5d 29 3b 0a  ToInt(zKey[i]);.
19560 20 20 20 20 20 20 20 20 69 66 28 20 28 69 26 31          if( (i&1
19570 29 21 3d 30 20 29 20 7a 44 65 63 6f 64 65 64 5b  )!=0 ) zDecoded[
19580 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b 0a 20 20  i/2] = iByte;.  
19590 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
195a0 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c 20 30  te3_key_v2(db, 0
195b0 2c 20 7a 44 65 63 6f 64 65 64 2c 20 69 2f 32 29  , zDecoded, i/2)
195c0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
195d0 28 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f  (zKey = sqlite3_
195e0 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 4f  uri_parameter(zO
195f0 70 65 6e 2c 20 22 6b 65 79 22 29 29 21 3d 30 20  pen, "key"))!=0 
19600 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
19610 5f 6b 65 79 5f 76 32 28 64 62 2c 20 30 2c 20 7a  _key_v2(db, 0, z
19620 4b 65 79 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  Key, sqlite3Strl
19630 65 6e 33 30 28 7a 4b 65 79 29 29 3b 0a 20 20 20  en30(zKey));.   
19640 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
19650 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70  sqlite3_free(zOp
19660 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  en);.  return rc
19670 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   & 0xff;.}../*.*
19680 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
19690 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
196a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
196b0 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
196c0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
196d0 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29  qlite3 **ppDb .)
196e0 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44  {.  return openD
196f0 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d  atabase(zFilenam
19700 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20  e, ppDb,.       
19710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
19720 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
19730 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
19740 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d  EN_CREATE, 0);.}
19750 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
19760 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68  n_v2(.  const ch
19770 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20  ar *filename,   
19780 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
19790 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  name (UTF-8) */.
197a0 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
197b0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
197c0 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64  : SQLite db hand
197d0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
197e0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
197f0 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  /* Flags */.  co
19800 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
19810 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
19820 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75   VFS module to u
19830 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  se */.){.  retur
19840 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66  n openDatabase(f
19850 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28  ilename, ppDb, (
19860 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61  unsigned int)fla
19870 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69  gs, zVfs);.}..#i
19880 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19890 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70  T_UTF16./*.** Op
198a0 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
198b0 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
198c0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
198d0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
198e0 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c  Filename, .  sql
198f0 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20  ite3 **ppDb.){. 
19900 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
19910 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46  lename8;   /* zF
19920 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20  ilename encoded 
19930 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64  in UTF-8 instead
19940 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20   of UTF-16 */.  
19950 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
19960 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  Val;.  int rc;..
19970 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
19980 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
19990 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72   if( ppDb==0 ) r
199a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
199b0 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
199c0 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69  .  *ppDb = 0;.#i
199d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
199e0 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20  T_AUTOINIT.  rc 
199f0 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
19a00 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
19a10 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
19a20 6e 64 69 66 0a 20 20 69 66 28 20 7a 46 69 6c 65  ndif.  if( zFile
19a30 6e 61 6d 65 3d 3d 30 20 29 20 7a 46 69 6c 65 6e  name==0 ) zFilen
19a40 61 6d 65 20 3d 20 22 5c 30 30 30 5c 30 30 30 22  ame = "\000\000"
19a50 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
19a60 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
19a70 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
19a80 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46  Str(pVal, -1, zF
19a90 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  ilename, SQLITE_
19aa0 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c  UTF16NATIVE, SQL
19ab0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a  ITE_STATIC);.  z
19ac0 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69  Filename8 = sqli
19ad0 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61  te3ValueText(pVa
19ae0 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  l, SQLITE_UTF8);
19af0 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
19b00 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70  8 ){.    rc = op
19b10 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65  enDatabase(zFile
19b20 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20  name8, ppDb,.   
19b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b40 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
19b50 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
19b60 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30  E_OPEN_CREATE, 0
19b70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  );.    assert( *
19b80 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  ppDb || rc==SQLI
19b90 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20  TE_NOMEM );.    
19ba0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19bb0 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f 70 65  K && !DbHasPrope
19bc0 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42  rty(*ppDb, 0, DB
19bd0 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29  _SchemaLoaded) )
19be0 7b 0a 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45  {.      SCHEMA_E
19bf0 4e 43 28 2a 70 70 44 62 29 20 3d 20 45 4e 43 28  NC(*ppDb) = ENC(
19c00 2a 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f  *ppDb) = SQLITE_
19c10 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20  UTF16NATIVE;.   
19c20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
19c30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
19c40 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71  M_BKPT;.  }.  sq
19c50 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
19c60 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Val);..  return 
19c70 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 23 65 6e  rc & 0xff;.}.#en
19c80 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
19c90 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
19ca0 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65  ** Register a ne
19cb0 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  w collation sequ
19cc0 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61  ence with the da
19cd0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
19ce0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19cf0 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
19d00 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  n(.  sqlite3* db
19d10 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
19d20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65  *zName, .  int e
19d30 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
19d40 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
19d50 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
19d60 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
19d70 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  nst void*).){.  
19d80 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63  return sqlite3_c
19d90 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
19da0 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e  v2(db, zName, en
19db0 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  c, pCtx, xCompar
19dc0 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e, 0);.}../*.** 
19dd0 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
19de0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
19df0 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
19e00 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
19e10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
19e20 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
19e30 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  2(.  sqlite3* db
19e40 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
19e50 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65  *zName, .  int e
19e60 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
19e70 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
19e80 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
19e90 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
19ea0 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f  nst void*),.  vo
19eb0 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  id(*xDel)(void*)
19ec0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  .){.  int rc;..#
19ed0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
19ee0 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
19ef0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
19f00 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c  tyCheckOk(db) ||
19f10 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
19f20 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
19f30 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
19f40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
19f50 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
19f60 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
19f70 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
19f80 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c   rc = createColl
19f90 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c  ation(db, zName,
19fa0 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20   (u8)enc, pCtx, 
19fb0 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b  xCompare, xDel);
19fc0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
19fd0 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
19fe0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
19ff0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1a000 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a010 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1a020 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
1a030 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
1a040 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1a050 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
1a060 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
1a070 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1a080 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
1a090 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  16(.  sqlite3* d
1a0a0 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  b, .  const void
1a0b0 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65   *zName,.  int e
1a0c0 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
1a0d0 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
1a0e0 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
1a0f0 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
1a100 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  nst void*).){.  
1a110 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1a120 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  OK;.  char *zNam
1a130 65 38 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  e8;..#ifdef SQLI
1a140 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1a150 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1a160 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1a170 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20  db) || zName==0 
1a180 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1a190 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
1a1a0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
1a1b0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1a1c0 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
1a1d0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1a1e0 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20  d );.  zName8 = 
1a1f0 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28  sqlite3Utf16to8(
1a200 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53  db, zName, -1, S
1a210 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
1a220 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38  E);.  if( zName8
1a230 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65   ){.    rc = cre
1a240 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
1a250 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63   zName8, (u8)enc
1a260 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
1a270 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1a280 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
1a290 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  e8);.  }.  rc = 
1a2a0 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
1a2b0 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
1a2c0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1a2d0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1a2e0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
1a2f0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
1a300 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
1a310 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74  egister a collat
1a320 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
1a330 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69  tory callback wi
1a340 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
1a350 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65  handle.** db. Re
1a360 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f  place any previo
1a370 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63  usly installed c
1a380 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1a390 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e  e factory..*/.in
1a3a0 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  t sqlite3_collat
1a3b0 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71  ion_needed(.  sq
1a3c0 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f  lite3 *db, .  vo
1a3d0 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41  id *pCollNeededA
1a3e0 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f  rg, .  void(*xCo
1a3f0 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c  llNeeded)(void*,
1a400 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65  sqlite3*,int eTe
1a410 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72  xtRep,const char
1a420 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *).){.#ifdef SQL
1a430 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1a440 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
1a450 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
1a460 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
1a470 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
1a480 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
1a490 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1a4a0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
1a4b0 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78  >xCollNeeded = x
1a4c0 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62  CollNeeded;.  db
1a4d0 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20  ->xCollNeeded16 
1a4e0 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c  = 0;.  db->pColl
1a4f0 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c  NeededArg = pCol
1a500 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71  lNeededArg;.  sq
1a510 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1a520 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1a530 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a540 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1a550 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
1a560 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
1a570 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1a580 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62  ce factory callb
1a590 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74  ack with the dat
1a5a0 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
1a5b0 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20  db. Replace any 
1a5c0 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61  previously insta
1a5d0 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  lled collation s
1a5e0 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e  equence factory.
1a5f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1a600 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
1a610 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  16(.  sqlite3 *d
1a620 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c  b, .  void *pCol
1a630 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76  lNeededArg, .  v
1a640 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64  oid(*xCollNeeded
1a650 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65  16)(void*,sqlite
1a660 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c  3*,int eTextRep,
1a670 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
1a680 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1a690 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1a6a0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1a6b0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
1a6c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1a6d0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
1a6e0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
1a6f0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1a700 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  ex);.  db->xColl
1a710 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62  Needed = 0;.  db
1a720 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20  ->xCollNeeded16 
1a730 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b  = xCollNeeded16;
1a740 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64  .  db->pCollNeed
1a750 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65  edArg = pCollNee
1a760 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  dedArg;.  sqlite
1a770 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1a780 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1a790 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1a7a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1a7b0 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
1a7c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a7d0 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f  MIT_DEPRECATED./
1a7e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1a7f0 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61  on is now an ana
1a800 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65  chronism. It use
1a810 64 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20  d to be used to 
1a820 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a  recover from a.*
1a830 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  * malloc() failu
1a840 72 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e  re, but SQLite n
1a850 6f 77 20 64 6f 65 73 20 74 68 69 73 20 61 75 74  ow does this aut
1a860 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69  omatically..*/.i
1a870 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61  nt sqlite3_globa
1a880 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b  l_recover(void){
1a890 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a8a0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
1a8b0 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65  *.** Test to see
1a8c0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
1a8d0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
1a8e0 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75  nection is in au
1a8f0 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65  tocommit.** mode
1a900 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
1a910 66 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53  f it is and FALS
1a920 45 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63  E if not.  Autoc
1a930 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e  ommit mode is on
1a940 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20  .** by default. 
1a950 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64   Autocommit is d
1a960 69 73 61 62 6c 65 64 20 62 79 20 61 20 42 45 47  isabled by a BEG
1a970 49 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  IN statement and
1a980 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79   reenabled.** by
1a990 20 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54   the next COMMIT
1a9a0 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f   or ROLLBACK..*/
1a9b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74  .int sqlite3_get
1a9c0 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69  _autocommit(sqli
1a9d0 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66  te3 *db){.#ifdef
1a9e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1a9f0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1aa00 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1aa10 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
1aa20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
1aa30 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
1aa40 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
1aa50 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  if.  return db->
1aa60 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f  autoCommit;.}../
1aa70 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1aa80 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  ng routines are 
1aa90 73 75 62 73 74 69 74 75 74 65 73 20 66 6f 72 20  substitutes for 
1aaa0 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45  constants SQLITE
1aab0 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c  _CORRUPT,.** SQL
1aac0 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49  ITE_MISUSE, SQLI
1aad0 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c  TE_CANTOPEN, SQL
1aae0 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 70 6f  ITE_NOMEM and po
1aaf0 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72  ssibly other err
1ab00 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e  or.** constants.
1ab10 20 20 54 68 65 79 20 73 65 72 76 65 20 74 77 6f    They serve two
1ab20 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a   purposes:.**.**
1ab30 20 20 20 31 2e 20 20 53 65 72 76 65 20 61 73 20     1.  Serve as 
1ab40 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61  a convenient pla
1ab50 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ce to set a brea
1ab60 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75  kpoint in a debu
1ab70 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f  gger.**       to
1ab80 20 64 65 74 65 63 74 20 77 68 65 6e 20 76 65 72   detect when ver
1ab90 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69  sion error condi
1aba0 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a  tions occurs..**
1abb0 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65  .**   2.  Invoke
1abc0 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74   sqlite3_log() t
1abd0 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f  o provide the so
1abe0 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69  urce code locati
1abf0 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20  on where.**     
1ac00 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72    a low-level er
1ac10 72 6f 72 20 69 73 20 66 69 72 73 74 20 64 65 74  ror is first det
1ac20 65 63 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ected..*/.static
1ac30 20 69 6e 74 20 72 65 70 6f 72 74 45 72 72 6f 72   int reportError
1ac40 28 69 6e 74 20 69 45 72 72 2c 20 69 6e 74 20 6c  (int iErr, int l
1ac50 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61  ineno, const cha
1ac60 72 20 2a 7a 54 79 70 65 29 7b 0a 20 20 73 71 6c  r *zType){.  sql
1ac70 69 74 65 33 5f 6c 6f 67 28 69 45 72 72 2c 20 22  ite3_log(iErr, "
1ac80 25 73 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66  %s at line %d of
1ac90 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20   [%.10s]",.     
1aca0 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20           zType, 
1acb0 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
1acc0 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
1acd0 20 20 72 65 74 75 72 6e 20 69 45 72 72 3b 0a 7d    return iErr;.}
1ace0 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72  .int sqlite3Corr
1acf0 75 70 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  uptError(int lin
1ad00 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
1ad10 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1ad20 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
1ad30 0a 20 20 72 65 74 75 72 6e 20 72 65 70 6f 72 74  .  return report
1ad40 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 4f 52  Error(SQLITE_COR
1ad50 52 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20 22 64  RUPT, lineno, "d
1ad60 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1ad70 6f 6e 22 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  on");.}.int sqli
1ad80 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69  te3MisuseError(i
1ad90 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
1ada0 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
1adb0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
1adc0 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
1add0 72 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49  reportError(SQLI
1ade0 54 45 5f 4d 49 53 55 53 45 2c 20 6c 69 6e 65 6e  TE_MISUSE, linen
1adf0 6f 2c 20 22 6d 69 73 75 73 65 22 29 3b 0a 7d 0a  o, "misuse");.}.
1ae00 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f  int sqlite3Canto
1ae10 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  penError(int lin
1ae20 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
1ae30 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1ae40 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
1ae50 0a 20 20 72 65 74 75 72 6e 20 72 65 70 6f 72 74  .  return report
1ae60 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
1ae70 54 4f 50 45 4e 2c 20 6c 69 6e 65 6e 6f 2c 20 22  TOPEN, lineno, "
1ae80 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
1ae90 22 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c  ");.}.#ifdef SQL
1aea0 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71  ITE_DEBUG.int sq
1aeb0 6c 69 74 65 33 4e 6f 6d 65 6d 45 72 72 6f 72 28  lite3NomemError(
1aec0 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
1aed0 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
1aee0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
1aef0 67 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  g!=0 );.  return
1af00 20 72 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c   reportError(SQL
1af10 49 54 45 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e 65 6e  ITE_NOMEM, linen
1af20 6f 2c 20 22 4f 4f 4d 22 29 3b 0a 7d 0a 69 6e 74  o, "OOM");.}.int
1af30 20 73 71 6c 69 74 65 33 49 6f 65 72 72 6e 6f 6d   sqlite3Ioerrnom
1af40 65 6d 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  emError(int line
1af50 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
1af60 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1af70 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
1af80 20 20 72 65 74 75 72 6e 20 72 65 70 6f 72 74 45    return reportE
1af90 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1afa0 52 5f 4e 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c  R_NOMEM, lineno,
1afb0 20 22 49 2f 4f 20 4f 4f 4d 20 65 72 72 6f 72 22   "I/O OOM error"
1afc0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
1afd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1afe0 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a  _DEPRECATED./*.*
1aff0 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f 6e 76  * This is a conv
1b000 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e 65 20  enience routine 
1b010 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 20  that makes sure 
1b020 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61 64 2d  that all thread-
1b030 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61  specific.** data
1b040 20 66 6f 72 20 74 68 69 73 20 74 68 72 65 61 64   for this thread
1b050 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f   has been deallo
1b060 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  cated..**.** SQL
1b070 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73  ite no longer us
1b080 65 73 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  es thread-specif
1b090 69 63 20 64 61 74 61 20 73 6f 20 74 68 69 73 20  ic data so this 
1b0a0 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77 20 61  routine is now a
1b0b0 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69  .** no-op.  It i
1b0c0 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20 68  s retained for h
1b0d0 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74  istorical compat
1b0e0 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64  ibility..*/.void
1b0f0 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f   sqlite3_thread_
1b100 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d  cleanup(void){.}
1b110 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
1b120 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72  eturn meta infor
1b130 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 73  mation about a s
1b140 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f  pecific column o
1b150 66 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  f a database tab
1b160 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65  le..** See comme
1b170 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 20  nt in sqlite3.h 
1b180 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f  (sqlite.h.in) fo
1b190 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e  r details..*/.in
1b1a0 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  t sqlite3_table_
1b1b0 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28  column_metadata(
1b1c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1b1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b1e0 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e  * Connection han
1b1f0 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dle */.  const c
1b200 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20  har *zDbName,   
1b210 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1b220 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f   name or NULL */
1b230 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b240 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f  TableName,     /
1b250 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  * Table name */.
1b260 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1b270 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a  olumnName,    /*
1b280 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a   Column name */.
1b290 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70    char const **p
1b2a0 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a  zDataType,    /*
1b2b0 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65   OUTPUT: Declare
1b2c0 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20  d data type */. 
1b2d0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a   char const **pz
1b2e0 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20  CollSeq,     /* 
1b2f0 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f  OUTPUT: Collatio
1b300 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20  n sequence name 
1b310 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75  */.  int *pNotNu
1b320 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
1b330 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65   /* OUTPUT: True
1b340 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e   if NOT NULL con
1b350 73 74 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a  straint exists *
1b360 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72  /.  int *pPrimar
1b370 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  yKey,           
1b380 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
1b390 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f  if column part o
1b3a0 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  f PK */.  int *p
1b3b0 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20  Autoinc         
1b3c0 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a        /* OUTPUT:
1b3d0 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20   True if column 
1b3e0 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e  is auto-incremen
1b3f0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
1b400 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
1b410 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a  g = 0;.  Table *
1b420 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75  pTab = 0;.  Colu
1b430 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20  mn *pCol = 0;.  
1b440 69 6e 74 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20  int iCol = 0;.  
1b450 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74  char const *zDat
1b460 61 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61  aType = 0;.  cha
1b470 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65  r const *zCollSe
1b480 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74  q = 0;.  int not
1b490 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  null = 0;.  int 
1b4a0 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a  primarykey = 0;.
1b4b0 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20    int autoinc = 
1b4c0 30 3b 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  0;...#ifdef SQLI
1b4d0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1b4e0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1b4f0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1b500 64 62 29 20 7c 7c 20 7a 54 61 62 6c 65 4e 61 6d  db) || zTableNam
1b510 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
1b520 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
1b530 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
1b540 66 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74  f..  /* Ensure t
1b550 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
1b560 6d 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64  ma has been load
1b570 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
1b580 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
1b590 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65  mutex);.  sqlite
1b5a0 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
1b5b0 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  b);.  rc = sqlit
1b5c0 65 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72  e3Init(db, &zErr
1b5d0 4d 73 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  Msg);.  if( SQLI
1b5e0 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
1b5f0 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
1b600 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
1b610 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71  e the table in q
1b620 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61  uestion */.  pTa
1b630 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
1b640 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e  able(db, zTableN
1b650 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  ame, zDbName);. 
1b660 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54   if( !pTab || pT
1b670 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
1b680 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20     pTab = 0;.   
1b690 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
1b6a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  .  }..  /* Find 
1b6b0 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77  the column for w
1b6c0 68 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71  hich info is req
1b6d0 75 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  uested */.  if( 
1b6e0 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29  zColumnName==0 )
1b6f0 7b 0a 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66  {.    /* Query f
1b700 6f 72 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20  or existance of 
1b710 74 61 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20  table only */.  
1b720 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
1b730 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
1b740 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
1b750 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70  .      pCol = &p
1b760 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
1b770 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71  .      if( 0==sq
1b780 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
1b790 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d  l->zName, zColum
1b7a0 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  nName) ){.      
1b7b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1b7c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
1b7d0 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  Col==pTab->nCol 
1b7e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73  ){.      if( Has
1b7f0 52 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 73  Rowid(pTab) && s
1b800 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43  qlite3IsRowid(zC
1b810 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20  olumnName) ){.  
1b820 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61        iCol = pTa
1b830 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
1b840 20 20 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30    pCol = iCol>=0
1b850 20 3f 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   ? &pTab->aCol[i
1b860 43 6f 6c 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20  Col] : 0;.      
1b870 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1b880 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Tab = 0;.       
1b890 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
1b8a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b8b0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
1b8c0 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f  lowing block sto
1b8d0 72 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66  res the meta inf
1b8e0 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69  ormation that wi
1b8f0 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20  ll be returned. 
1b900 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65   ** to the calle
1b910 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61  r in local varia
1b920 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20  bles zDataType, 
1b930 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c  zCollSeq, notnul
1b940 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20  l, primarykey.  
1b950 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20  ** and autoinc. 
1b960 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
1b970 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73  ere are two poss
1b980 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20  ibilities:.  ** 
1b990 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65  .  **     1. The
1b9a0 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d   specified colum
1b9b0 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64  n name was rowid
1b9c0 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f  ", "oid" or "_ro
1b9d0 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20  wid_" .  **     
1b9e0 20 20 20 61 6e 64 20 74 68 65 72 65 20 69 73 20     and there is 
1b9f0 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65  no explicitly de
1ba00 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d  clared IPK colum
1ba10 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  n. .  **.  **   
1ba20 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69    2. The table i
1ba30 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64  s not a view and
1ba40 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
1ba50 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a   identified an .
1ba60 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c    **        expl
1ba70 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20  icitly declared 
1ba80 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74  column. Copy met
1ba90 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
1baa0 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a  om *pCol..  */ .
1bab0 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20    if( pCol ){.  
1bac0 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 73 71    zDataType = sq
1bad0 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28  lite3ColumnType(
1bae0 70 43 6f 6c 2c 30 29 3b 0a 20 20 20 20 7a 43 6f  pCol,0);.    zCo
1baf0 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43  llSeq = pCol->zC
1bb00 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c  oll;.    notnull
1bb10 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c   = pCol->notNull
1bb20 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79  !=0;.    primary
1bb30 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f  key  = (pCol->co
1bb40 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47  lFlags & COLFLAG
1bb50 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20  _PRIMKEY)!=0;.  
1bb60 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62    autoinc = pTab
1bb70 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26  ->iPKey==iCol &&
1bb80 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
1bb90 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
1bba0 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ent)!=0;.  }else
1bbb0 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20  {.    zDataType 
1bbc0 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
1bbd0 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b   primarykey = 1;
1bbe0 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c  .  }.  if( !zCol
1bbf0 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c  lSeq ){.    zCol
1bc00 6c 53 65 71 20 3d 20 73 71 6c 69 74 65 33 53 74  lSeq = sqlite3St
1bc10 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 0a 65 72  rBINARY;.  }..er
1bc20 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ror_out:.  sqlit
1bc30 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
1bc40 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68  db);..  /* Wheth
1bc50 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  er the function 
1bc60 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f  call succeeded o
1bc70 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68  r failed, set th
1bc80 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  e output paramet
1bc90 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74  ers.  ** to what
1bca0 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c  ever their local
1bcb0 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f   counterparts co
1bcc0 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72  ntain. If an err
1bcd0 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20  or did occur,.  
1bce0 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68 65 20  ** this has the 
1bcf0 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e  effect of zeroin
1bd00 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72  g all output par
1bd10 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20  ameters..  */.  
1bd20 69 66 28 20 70 7a 44 61 74 61 54 79 70 65 20 29  if( pzDataType )
1bd30 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a   *pzDataType = z
1bd40 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20  DataType;.  if( 
1bd50 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43  pzCollSeq ) *pzC
1bd60 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65  ollSeq = zCollSe
1bd70 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c  q;.  if( pNotNul
1bd80 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20  l ) *pNotNull = 
1bd90 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70  notnull;.  if( p
1bda0 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50  PrimaryKey ) *pP
1bdb0 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d  rimaryKey = prim
1bdc0 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41  arykey;.  if( pA
1bdd0 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69  utoinc ) *pAutoi
1bde0 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20  nc = autoinc;.. 
1bdf0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
1be00 72 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  rc && !pTab ){. 
1be10 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1be20 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  (db, zErrMsg);. 
1be30 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c     zErrMsg = sql
1be40 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1be50 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63  "no such table c
1be60 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a  olumn: %s.%s", z
1be70 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20  TableName,.     
1be80 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b     zColumnName);
1be90 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1bea0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71  _ERROR;.  }.  sq
1beb0 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
1bec0 67 28 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d  g(db, rc, (zErrM
1bed0 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72  sg?"%s":0), zErr
1bee0 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
1bef0 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
1bf00 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  g);.  rc = sqlit
1bf10 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
1bf20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
1bf30 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1bf40 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
1bf50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  ;.}../*.** Sleep
1bf60 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
1bf70 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
1bf80 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
1bf90 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  slept..*/.int sq
1bfa0 6c 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20  lite3_sleep(int 
1bfb0 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ms){.  sqlite3_v
1bfc0 66 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20  fs *pVfs;.  int 
1bfd0 72 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c  rc;.  pVfs = sql
1bfe0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
1bff0 3b 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20  ;.  if( pVfs==0 
1c000 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
1c010 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1c020 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65  works in millise
1c030 63 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75  conds, but the u
1c040 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65  nderlying OsSlee
1c050 70 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73  p() .  ** API us
1c060 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e  es microseconds.
1c070 20 48 65 6e 63 65 20 74 68 65 20 31 30 30 30 27   Hence the 1000'
1c080 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28  s..  */.  rc = (
1c090 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70  sqlite3OsSleep(p
1c0a0 56 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30  Vfs, 1000*ms)/10
1c0b0 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  00);.  return rc
1c0c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ;.}../*.** Enabl
1c0d0 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
1c0e0 20 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74   extended result
1c0f0 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   codes..*/.int s
1c100 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
1c110 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c  result_codes(sql
1c120 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e  ite3 *db, int on
1c130 6f 66 66 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  off){.#ifdef SQL
1c140 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1c150 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
1c160 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
1c170 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
1c180 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
1c190 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
1c1a0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
1c1b0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
1c1c0 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66  >errMask = onoff
1c1d0 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20   ? 0xffffffff : 
1c1e0 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f  0xff;.  sqlite3_
1c1f0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1c200 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
1c210 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1c220 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
1c230 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74  xFileControl met
1c240 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75  hod on a particu
1c250 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  lar database..*/
1c260 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c  .int sqlite3_fil
1c270 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  e_control(sqlite
1c280 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1c290 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20  r *zDbName, int 
1c2a0 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
1c2b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1c2c0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72 65  TE_ERROR;.  Btre
1c2d0 65 20 2a 70 42 74 72 65 65 3b 0a 0a 23 69 66 64  e *pBtree;..#ifd
1c2e0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1c2f0 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
1c300 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
1c310 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74  heckOk(db) ) ret
1c320 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
1c330 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
1c340 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1c350 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1c360 0a 20 20 70 42 74 72 65 65 20 3d 20 73 71 6c 69  .  pBtree = sqli
1c370 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65  te3DbNameToBtree
1c380 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  (db, zDbName);. 
1c390 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
1c3a0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
1c3b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
1c3c0 6c 65 20 2a 66 64 3b 0a 20 20 20 20 73 71 6c 69  le *fd;.    sqli
1c3d0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
1c3e0 74 72 65 65 29 3b 0a 20 20 20 20 70 50 61 67 65  tree);.    pPage
1c3f0 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
1c400 50 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Pager(pBtree);. 
1c410 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c420 72 21 3d 30 20 29 3b 0a 20 20 20 20 66 64 20 3d  r!=0 );.    fd =
1c430 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
1c440 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61  e(pPager);.    a
1c450 73 73 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a  ssert( fd!=0 );.
1c460 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49      if( op==SQLI
1c470 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f  TE_FCNTL_FILE_PO
1c480 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a  INTER ){.      *
1c490 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29  (sqlite3_file**)
1c4a0 70 41 72 67 20 3d 20 66 64 3b 0a 20 20 20 20 20  pArg = fd;.     
1c4b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c4c0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  .    }else if( o
1c4d0 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  p==SQLITE_FCNTL_
1c4e0 56 46 53 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20  VFS_POINTER ){. 
1c4f0 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 76       *(sqlite3_v
1c500 66 73 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69  fs**)pArg = sqli
1c510 74 65 33 50 61 67 65 72 56 66 73 28 70 50 61 67  te3PagerVfs(pPag
1c520 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
1c530 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1c540 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c  else if( op==SQL
1c550 49 54 45 5f 46 43 4e 54 4c 5f 4a 4f 55 52 4e 41  ITE_FCNTL_JOURNA
1c560 4c 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20  L_POINTER ){.   
1c570 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c     *(sqlite3_fil
1c580 65 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74  e**)pArg = sqlit
1c590 65 33 50 61 67 65 72 4a 72 6e 6c 46 69 6c 65 28  e3PagerJrnlFile(
1c5a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
1c5b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c5c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 64 2d     }else if( fd-
1c5d0 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
1c5e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1c5f0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c  sFileControl(fd,
1c600 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20   op, pArg);.    
1c610 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1c620 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
1c630 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  D;.    }.    sql
1c640 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1c650 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Btree);.  }.  sq
1c660 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1c670 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1c680 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c690 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f  .** Interface to
1c6a0 20 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67   the testing log
1c6b0 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ic..*/.int sqlit
1c6c0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1c6d0 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20  int op, ...){.  
1c6e0 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 64  int rc = 0;.#ifd
1c6f0 65 66 20 53 51 4c 49 54 45 5f 55 4e 54 45 53 54  ef SQLITE_UNTEST
1c700 41 42 4c 45 0a 20 20 55 4e 55 53 45 44 5f 50 41  ABLE.  UNUSED_PA
1c710 52 41 4d 45 54 45 52 28 6f 70 29 3b 0a 23 65 6c  RAMETER(op);.#el
1c720 73 65 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  se.  va_list ap;
1c730 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
1c740 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op);.  switch( o
1c750 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  p ){..    /*.   
1c760 20 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72   ** Save the cur
1c770 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68  rent state of th
1c780 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20  e PRNG..    */. 
1c790 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1c7a0 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56  ESTCTRL_PRNG_SAV
1c7b0 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
1c7c0 65 33 50 72 6e 67 53 61 76 65 53 74 61 74 65 28  e3PrngSaveState(
1c7d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c7e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1c7f0 20 20 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65    ** Restore the
1c800 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52   state of the PR
1c810 4e 47 20 74 6f 20 74 68 65 20 6c 61 73 74 20 73  NG to the last s
1c820 74 61 74 65 20 73 61 76 65 64 20 75 73 69 6e 67  tate saved using
1c830 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56  .    ** PRNG_SAV
1c840 45 2e 20 20 49 66 20 50 52 4e 47 5f 53 41 56 45  E.  If PRNG_SAVE
1c850 20 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72   has never befor
1c860 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74  e been called, t
1c870 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  hen.    ** this 
1c880 76 65 72 62 20 61 63 74 73 20 6c 69 6b 65 20 50  verb acts like P
1c890 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a  RNG_RESET..    *
1c8a0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1c8b0 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
1c8c0 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20  RESTORE: {.     
1c8d0 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 74   sqlite3PrngRest
1c8e0 6f 72 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20  oreState();.    
1c8f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1c900 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65      /*.    ** Re
1c910 73 65 74 20 74 68 65 20 50 52 4e 47 20 62 61 63  set the PRNG bac
1c920 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e 69 74 69  k to its uniniti
1c930 61 6c 69 7a 65 64 20 73 74 61 74 65 2e 20 20 54  alized state.  T
1c940 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20  he next call.   
1c950 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72   ** to sqlite3_r
1c960 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c  andomness() will
1c970 20 72 65 73 65 65 64 20 74 68 65 20 50 52 4e 47   reseed the PRNG
1c980 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
1c990 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74  call.    ** to t
1c9a0 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d  he xRandomness m
1c9b0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 64 65 66  ethod of the def
1c9c0 61 75 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f  ault VFS..    */
1c9d0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1c9e0 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
1c9f0 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  ESET: {.      sq
1ca00 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
1ca10 28 30 2c 30 29 3b 0a 20 20 20 20 20 20 62 72 65  (0,0);.      bre
1ca20 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1ca30 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
1ca40 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42  3_test_control(B
1ca50 49 54 56 45 43 5f 54 45 53 54 2c 20 73 69 7a 65  ITVEC_TEST, size
1ca60 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a  , program).    *
1ca70 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61 20 74  *.    ** Run a t
1ca80 65 73 74 20 61 67 61 69 6e 73 74 20 61 20 42 69  est against a Bi
1ca90 74 76 65 63 20 6f 62 6a 65 63 74 20 6f 66 20 73  tvec object of s
1caa0 69 7a 65 2e 20 20 54 68 65 20 70 72 6f 67 72 61  ize.  The progra
1cab0 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a  m argument.    *
1cac0 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66  * is an array of
1cad0 20 69 6e 74 65 67 65 72 73 20 74 68 61 74 20 64   integers that d
1cae0 65 66 69 6e 65 73 20 74 68 65 20 74 65 73 74 2e  efines the test.
1caf0 20 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61    Return -1 on a
1cb00 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61  .    ** memory a
1cb10 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c  llocation error,
1cb20 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f   0 on success, o
1cb30 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61  r non-zero for a
1cb40 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20  n error..    ** 
1cb50 53 65 65 20 74 68 65 20 73 71 6c 69 74 65 33 42  See the sqlite3B
1cb60 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74  itvecBuiltinTest
1cb70 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
1cb80 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
1cb90 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1cba0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
1cbb0 49 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20  ITVEC_TEST: {.  
1cbc0 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f      int sz = va_
1cbd0 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
1cbe0 20 20 20 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d      int *aProg =
1cbf0 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
1cc00 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
1cc10 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74  lite3BitvecBuilt
1cc20 69 6e 54 65 73 74 28 73 7a 2c 20 61 50 72 6f 67  inTest(sz, aProg
1cc30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1cc40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1cc50 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
1cc60 73 74 5f 63 6f 6e 74 72 6f 6c 28 46 41 55 4c 54  st_control(FAULT
1cc70 5f 49 4e 53 54 41 4c 4c 2c 20 78 43 61 6c 6c 62  _INSTALL, xCallb
1cc80 61 63 6b 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ack).    **.    
1cc90 2a 2a 20 41 72 72 61 6e 67 65 20 74 6f 20 69 6e  ** Arrange to in
1cca0 76 6f 6b 65 20 78 43 61 6c 6c 62 61 63 6b 28 29  voke xCallback()
1ccb0 20 77 68 65 6e 65 76 65 72 20 73 71 6c 69 74 65   whenever sqlite
1ccc0 33 46 61 75 6c 74 53 69 6d 28 29 20 69 73 20 63  3FaultSim() is c
1ccd0 61 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a 20 69 66  alled,.    ** if
1cce0 20 78 43 61 6c 6c 62 61 63 6b 20 69 73 20 6e 6f   xCallback is no
1ccf0 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 0a 20  t NULL..    **. 
1cd00 20 20 20 2a 2a 20 41 73 20 61 20 74 65 73 74 20     ** As a test 
1cd10 6f 66 20 74 68 65 20 66 61 75 6c 74 20 73 69 6d  of the fault sim
1cd20 75 6c 61 74 6f 72 20 6d 65 63 68 61 6e 69 73 6d  ulator mechanism
1cd30 20 69 74 73 65 6c 66 2c 20 73 71 6c 69 74 65 33   itself, sqlite3
1cd40 46 61 75 6c 74 53 69 6d 28 30 29 0a 20 20 20 20  FaultSim(0).    
1cd50 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 69 6d 6d  ** is called imm
1cd60 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 69  ediately after i
1cd70 6e 73 74 61 6c 6c 69 6e 67 20 74 68 65 20 6e 65  nstalling the ne
1cd80 77 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20 74  w callback and t
1cd90 68 65 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  he return.    **
1cda0 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 71 6c 69   value from sqli
1cdb0 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 20 62  te3FaultSim(0) b
1cdc0 65 63 6f 6d 65 73 20 74 68 65 20 72 65 74 75 72  ecomes the retur
1cdd0 6e 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71  n from.    ** sq
1cde0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1cdf0 6f 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ol()..    */.   
1ce00 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1ce10 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54  TCTRL_FAULT_INST
1ce20 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ALL: {.      /* 
1ce30 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20 61 62  MSVC is picky ab
1ce40 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63  out pulling func
1ce50 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69   ptrs from va li
1ce60 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74  sts..      ** ht
1ce70 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63  tp://support.mic
1ce80 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37  rosoft.com/kb/47
1ce90 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  961.      ** sql
1cea0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ceb0 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d  .xTestCallback =
1cec0 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 28   va_arg(ap, int(
1ced0 2a 29 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20  *)(int));.      
1cee0 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65 66  */.      typedef
1cef0 20 69 6e 74 28 2a 54 45 53 54 43 41 4c 4c 42 41   int(*TESTCALLBA
1cf00 43 4b 46 55 4e 43 5f 74 29 28 69 6e 74 29 3b 0a  CKFUNC_t)(int);.
1cf10 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1cf20 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43  balConfig.xTestC
1cf30 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67  allback = va_arg
1cf40 28 61 70 2c 20 54 45 53 54 43 41 4c 4c 42 41 43  (ap, TESTCALLBAC
1cf50 4b 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  KFUNC_t);.      
1cf60 72 63 20 3d 20 73 71 6c 69 74 65 33 46 61 75 6c  rc = sqlite3Faul
1cf70 74 53 69 6d 28 30 29 3b 0a 20 20 20 20 20 20 62  tSim(0);.      b
1cf80 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1cf90 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1cfa0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1cfb0 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48  (BENIGN_MALLOC_H
1cfc0 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78 45  OOKS, xBegin, xE
1cfd0 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  nd).    **.    *
1cfe0 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f 6b 73  * Register hooks
1cff0 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69   to call to indi
1d000 63 61 74 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f  cate which mallo
1d010 63 28 29 20 66 61 69 6c 75 72 65 73 20 0a 20 20  c() failures .  
1d020 20 20 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e    ** are benign.
1d030 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1d040 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1d050 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48  _BENIGN_MALLOC_H
1d060 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74 79  OOKS: {.      ty
1d070 70 65 64 65 66 20 76 6f 69 64 20 28 2a 76 6f 69  pedef void (*voi
1d080 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64  d_function)(void
1d090 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75  );.      void_fu
1d0a0 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65  nction xBenignBe
1d0b0 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f  gin;.      void_
1d0c0 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e  function xBenign
1d0d0 45 6e 64 3b 0a 20 20 20 20 20 20 78 42 65 6e 69  End;.      xBeni
1d0e0 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61 72 67  gnBegin = va_arg
1d0f0 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69  (ap, void_functi
1d100 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42 65 6e 69  on);.      xBeni
1d110 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67 28 61  gnEnd = va_arg(a
1d120 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e  p, void_function
1d130 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d140 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b  BenignMallocHook
1d150 73 28 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20  s(xBenignBegin, 
1d160 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20  xBenignEnd);.   
1d170 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d180 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1d190 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1d1a0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1d1b0 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54  CTRL_PENDING_BYT
1d1c0 45 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  E, unsigned int 
1d1d0 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
1d1e0 20 53 65 74 20 74 68 65 20 50 45 4e 44 49 4e 47   Set the PENDING
1d1f0 20 62 79 74 65 20 74 6f 20 74 68 65 20 76 61 6c   byte to the val
1d200 75 65 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ue in the argume
1d210 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20 20  nt, if X>0..    
1d220 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
1d230 65 73 20 69 66 20 58 3d 3d 30 2e 20 20 52 65 74  es if X==0.  Ret
1d240 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
1d250 20 74 68 65 20 70 65 6e 64 69 6e 67 20 62 79 74   the pending byt
1d260 65 0a 20 20 20 20 2a 2a 20 61 73 20 69 74 20 65  e.    ** as it e
1d270 78 69 73 74 69 6e 67 20 62 65 66 6f 72 65 20 74  xisting before t
1d280 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
1d290 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  called..    **. 
1d2a0 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a     ** IMPORTANT:
1d2b0 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50    Changing the P
1d2c0 45 4e 44 49 4e 47 20 62 79 74 65 20 66 72 6f 6d  ENDING byte from
1d2d0 20 30 78 34 30 30 30 30 30 30 30 20 72 65 73 75   0x40000000 resu
1d2e0 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e  lts in.    ** an
1d2f0 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64 61   incompatible da
1d300 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 6d  tabase file form
1d310 61 74 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68  at.  Changing th
1d320 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 0a 20  e PENDING byte. 
1d330 20 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20     ** while any 
1d340 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1d350 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65 73 75  ion is open resu
1d360 6c 74 73 20 69 6e 20 75 6e 64 65 66 69 6e 65 64  lts in undefined
1d370 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65   and.    ** dele
1d380 74 65 72 69 6f 75 73 20 62 65 68 61 76 69 6f 72  terious behavior
1d390 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1d3a0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1d3b0 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20  L_PENDING_BYTE: 
1d3c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 50 45 4e  {.      rc = PEN
1d3d0 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66 6e 64  DING_BYTE;.#ifnd
1d3e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1d3f0 53 44 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  SD.      {.     
1d400 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
1d410 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61 72 67 28  newVal = va_arg(
1d420 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ap, unsigned int
1d430 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1d440 65 77 56 61 6c 20 29 20 73 71 6c 69 74 65 33 50  ewVal ) sqlite3P
1d450 65 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e 65 77  endingByte = new
1d460 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  Val;.      }.#en
1d470 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  dif.      break;
1d480 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1d490 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
1d4a0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1d4b0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
1d4c0 52 54 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a  RT, int X).    *
1d4d0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63  *.    ** This ac
1d4e0 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20  tion provides a 
1d4f0 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f  run-time test to
1d500 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20   see whether or 
1d510 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73 65 72  not.    ** asser
1d520 74 28 29 20 77 61 73 20 65 6e 61 62 6c 65 64 20  t() was enabled 
1d530 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e  at compile-time.
1d540 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61    If X is true a
1d550 6e 64 20 61 73 73 65 72 74 28 29 0a 20 20 20 20  nd assert().    
1d560 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  ** is enabled, t
1d570 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
1d580 61 6c 75 65 20 69 73 20 74 72 75 65 2e 20 20 49  alue is true.  I
1d590 66 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 0a  f X is true and.
1d5a0 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20      ** assert() 
1d5b0 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65  is disabled, the
1d5c0 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
1d5d0 75 65 20 69 73 20 7a 65 72 6f 2e 20 20 49 66 20  ue is zero.  If 
1d5e0 58 20 69 73 0a 20 20 20 20 2a 2a 20 66 61 6c 73  X is.    ** fals
1d5f0 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69  e and assert() i
1d600 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
1d610 74 68 65 20 61 73 73 65 72 74 69 6f 6e 20 66 69  the assertion fi
1d620 72 65 73 20 61 6e 64 20 74 68 65 0a 20 20 20 20  res and the.    
1d630 2a 2a 20 70 72 6f 63 65 73 73 20 61 62 6f 72 74  ** process abort
1d640 73 2e 20 20 49 66 20 58 20 69 73 20 66 61 6c 73  s.  If X is fals
1d650 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69  e and assert() i
1d660 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  s disabled, then
1d670 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 74 75   the.    ** retu
1d680 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  rn value is zero
1d690 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1d6a0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1d6b0 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20 20 20  L_ASSERT: {.    
1d6c0 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 78    volatile int x
1d6d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
1d6e0 72 74 28 20 2f 2a 73 69 64 65 2d 65 66 66 65 63  rt( /*side-effec
1d6f0 74 73 2d 6f 6b 2a 2f 20 28 78 20 3d 20 76 61 5f  ts-ok*/ (x = va_
1d700 61 72 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20  arg(ap,int))!=0 
1d710 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b  );.      rc = x;
1d720 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d730 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20    }...    /*.   
1d740 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
1d750 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1d760 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
1d770 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a  , int X).    **.
1d780 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69      ** This acti
1d790 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75  on provides a ru
1d7a0 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73  n-time test to s
1d7b0 65 65 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59  ee how the ALWAY
1d7c0 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56  S and.    ** NEV
1d7d0 45 52 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64  ER macros were d
1d7e0 65 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c  efined at compil
1d7f0 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20  e-time..    **. 
1d800 20 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e     ** The return
1d810 20 76 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53   value is ALWAYS
1d820 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  (X).  .    **.  
1d830 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65    ** The recomme
1d840 6e 64 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d  nded test is X==
1d850 32 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72  2.  If the retur
1d860 6e 20 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68  n value is 2, th
1d870 61 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  at means.    ** 
1d880 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56  ALWAYS() and NEV
1d890 45 52 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f  ER() are both no
1d8a0 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68  -op pass-through
1d8b0 20 6d 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69   macros, which i
1d8c0 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66  s the.    ** def
1d8d0 61 75 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49  ault setting.  I
1d8e0 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
1d8f0 75 65 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c  ue is 1, then AL
1d900 57 41 59 53 28 29 20 69 73 20 65 69 74 68 65 72  WAYS() is either
1d910 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64  .    ** hard-cod
1d920 65 64 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c  ed to true or el
1d930 73 65 20 69 74 20 61 73 73 65 72 74 73 20 69 66  se it asserts if
1d940 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73   its argument is
1d950 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54   false..    ** T
1d960 68 65 20 66 69 72 73 74 20 62 65 68 61 76 69 6f  he first behavio
1d970 72 20 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f  r (hard-coded to
1d980 20 74 72 75 65 29 20 69 73 20 74 68 65 20 63 61   true) is the ca
1d990 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c  se if.    ** SQL
1d9a0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
1d9b0 45 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61  ERT shows that a
1d9c0 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
1d9d0 6c 65 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f  led and the seco
1d9e0 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69  nd.    ** behavi
1d9f0 6f 72 20 28 61 73 73 65 72 74 20 69 66 20 74 68  or (assert if th
1da00 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c  e argument to AL
1da10 57 41 59 53 28 29 20 69 73 20 66 61 6c 73 65 29  WAYS() is false)
1da20 20 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a   is the case if.
1da30 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45      ** SQLITE_TE
1da40 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68  STCTRL_ASSERT sh
1da50 6f 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28  ows that assert(
1da60 29 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20  ) is enabled..  
1da70 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1da80 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72  run-time test pr
1da90 6f 63 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f  ocedure might lo
1daa0 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b  ok something lik
1dab0 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
1dac0 20 20 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c     **    if( sql
1dad0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1dae0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1daf0 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20  L_ALWAYS, 2)==2 
1db00 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f  ){.    **      /
1db10 2f 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e  / ALWAYS() and N
1db20 45 56 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70  EVER() are no-op
1db30 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61   pass-through ma
1db40 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d  cros.    **    }
1db50 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
1db60 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1db70 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
1db80 53 45 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20  SERT, 1) ){.    
1db90 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59  **      // ALWAY
1dba0 53 28 78 29 20 61 73 73 65 72 74 73 20 74 68 61  S(x) asserts tha
1dbb0 74 20 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56  t x is true. NEV
1dbc0 45 52 28 78 29 20 61 73 73 65 72 74 73 20 78 20  ER(x) asserts x 
1dbd0 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a  is false..    **
1dbe0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a      }else{.    *
1dbf0 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
1dc00 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  (x) is a constan
1dc10 74 20 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69  t 1.  NEVER(x) i
1dc20 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a  s a constant 0..
1dc30 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20      **    }.    
1dc40 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1dc50 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
1dc60 59 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  YS: {.      int 
1dc70 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
1dc80 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41  t);.      rc = A
1dc90 4c 57 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20  LWAYS(x);.      
1dca0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1dcb0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 73 71    /*.    **   sq
1dcc0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1dcd0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1dce0 52 4c 5f 42 59 54 45 4f 52 44 45 52 29 3b 0a 20  RL_BYTEORDER);. 
1dcf0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1dd00 20 69 6e 74 65 67 65 72 20 72 65 74 75 72 6e 65   integer returne
1dd10 64 20 72 65 76 65 61 6c 73 20 74 68 65 20 62 79  d reveals the by
1dd20 74 65 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 20  te-order of the 
1dd30 63 6f 6d 70 75 74 65 72 20 6f 6e 20 77 68 69 63  computer on whic
1dd40 68 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74 65 20  h.    ** SQLite 
1dd50 69 73 20 72 75 6e 6e 69 6e 67 3a 0a 20 20 20 20  is running:.    
1dd60 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1dd70 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e  1     big-endian
1dd80 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20  ,    determined 
1dd90 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20  at run-time.    
1dda0 2a 2a 20 20 20 20 20 20 31 30 20 20 20 20 20 6c  **      10     l
1ddb0 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65  ittle-endian, de
1ddc0 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d  termined at run-
1ddd0 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 34 33 32  time.    **  432
1dde0 31 30 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69  101     big-endi
1ddf0 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65  an,    determine
1de00 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1de10 65 0a 20 20 20 20 2a 2a 20 20 31 32 33 34 31 30  e.    **  123410
1de20 20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69       little-endi
1de30 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61  an, determined a
1de40 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20  t compile-time. 
1de50 20 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20     */ .    case 
1de60 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1de70 42 59 54 45 4f 52 44 45 52 3a 20 7b 0a 20 20 20  BYTEORDER: {.   
1de80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
1de90 59 54 45 4f 52 44 45 52 2a 31 30 30 20 2b 20 53  YTEORDER*100 + S
1dea0 51 4c 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49  QLITE_LITTLEENDI
1deb0 41 4e 2a 31 30 20 2b 20 53 51 4c 49 54 45 5f 42  AN*10 + SQLITE_B
1dec0 49 47 45 4e 44 49 41 4e 3b 0a 20 20 20 20 20 20  IGENDIAN;.      
1ded0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1dee0 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
1def0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1df00 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45  TE_TESTCTRL_RESE
1df10 52 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  RVE, sqlite3 *db
1df20 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a  , int N).    **.
1df30 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e      ** Set the n
1df40 52 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20  Reserve size to 
1df50 4e 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  N for the main d
1df60 61 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64  atabase on the d
1df70 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63  atabase.    ** c
1df80 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20  onnection db..  
1df90 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1dfa0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45  LITE_TESTCTRL_RE
1dfb0 53 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73  SERVE: {.      s
1dfc0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
1dfd0 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
1dfe0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d  );.      int x =
1dff0 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b   va_arg(ap,int);
1e000 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
1e010 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1e020 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c  utex);.      sql
1e030 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
1e040 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  Size(db->aDb[0].
1e050 70 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20  pBt, 0, x, 0);. 
1e060 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
1e070 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1e080 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
1e090 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1e0a0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1e0b0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1e0c0 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
1e0d0 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  ONS, sqlite3 *db
1e0e0 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a  , int N).    **.
1e0f0 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72      ** Enable or
1e100 20 64 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73   disable various
1e110 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66   optimizations f
1e120 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
1e130 73 65 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a  ses.  The .    *
1e140 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20  * argument N is 
1e150 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74  a bitmask of opt
1e160 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65  imizations to be
1e170 20 64 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20   disabled.  For 
1e180 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70  normal.    ** op
1e190 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64  eration N should
1e1a0 20 62 65 20 30 2e 20 20 54 68 65 20 69 64 65 61   be 0.  The idea
1e1b0 20 69 73 20 74 68 61 74 20 61 20 74 65 73 74 20   is that a test 
1e1c0 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68  program (like th
1e1d0 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67  e.    ** SQL Log
1e1e0 69 63 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74  ic Test or SLT t
1e1f0 65 73 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20  est module) can 
1e200 72 75 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c  run the same SQL
1e210 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a   multiple times.
1e220 20 20 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69      ** with vari
1e230 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
1e240 73 20 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65  s disabled to ve
1e250 72 69 66 79 20 74 68 61 74 20 74 68 65 20 73 61  rify that the sa
1e260 6d 65 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a  me answer.    **
1e270 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20   is obtained in 
1e280 65 76 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20  every case..    
1e290 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1e2a0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
1e2b0 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20  MIZATIONS: {.   
1e2c0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1e2d0 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
1e2e0 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d  te3*);.      db-
1e2f0 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d 20 28 75  >dbOptFlags = (u
1e300 31 36 29 28 76 61 5f 61 72 67 28 61 70 2c 20 69  16)(va_arg(ap, i
1e310 6e 74 29 20 26 20 30 78 66 66 66 66 29 3b 0a 20  nt) & 0xffff);. 
1e320 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e330 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1e340 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f  _N_KEYWORD.    /
1e350 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
1e360 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1e370 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44  STCTRL_ISKEYWORD
1e380 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57  , const char *zW
1e390 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ord).    **.    
1e3a0 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69 73 20 61  ** If zWord is a
1e3b0 20 6b 65 79 77 6f 72 64 20 72 65 63 6f 67 6e 69   keyword recogni
1e3c0 7a 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  zed by the parse
1e3d0 72 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  r, then return t
1e3e0 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  he.    ** number
1e3f0 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f   of keywords.  O
1e400 72 20 69 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f  r if zWord is no
1e410 74 20 61 20 6b 65 79 77 6f 72 64 2c 20 72 65 74  t a keyword, ret
1e420 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20  urn 0..    ** . 
1e430 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20     ** This test 
1e440 66 65 61 74 75 72 65 20 69 73 20 6f 6e 6c 79 20  feature is only 
1e450 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65  available in the
1e460 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69   amalgamation si
1e470 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 53  nce.    ** the S
1e480 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20  QLITE_N_KEYWORD 
1e490 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66  macro is not def
1e4a0 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c  ined in this fil
1e4b0 65 20 69 66 20 53 51 4c 69 74 65 0a 20 20 20 20  e if SQLite.    
1e4c0 2a 2a 20 69 73 20 62 75 69 6c 74 20 75 73 69 6e  ** is built usin
1e4d0 67 20 73 65 70 61 72 61 74 65 20 73 6f 75 72 63  g separate sourc
1e4e0 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a  e files..    */.
1e4f0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e500 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f  TESTCTRL_ISKEYWO
1e510 52 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  RD: {.      cons
1e520 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20  t char *zWord = 
1e530 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74  va_arg(ap, const
1e540 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 69   char*);.      i
1e550 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
1e560 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20  rlen30(zWord);. 
1e570 20 20 20 20 20 72 63 20 3d 20 28 73 71 6c 69 74       rc = (sqlit
1e580 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 28 75  e3KeywordCode((u
1e590 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b  8*)zWord, n)!=TK
1e5a0 5f 49 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f  _ID) ? SQLITE_N_
1e5b0 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20  KEYWORD : 0;.   
1e5c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e5d0 23 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20  #endif ..    /* 
1e5e0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1e5f0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1e600 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c  CTRL_SCRATCHMALL
1e610 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70  OC, sz, &pNew, p
1e620 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  Free);.    **.  
1e630 20 20 2a 2a 20 50 61 73 73 20 70 46 72 65 65 20    ** Pass pFree 
1e640 69 6e 74 6f 20 73 71 6c 69 74 65 33 53 63 72 61  into sqlite3Scra
1e650 74 63 68 46 72 65 65 28 29 2e 20 0a 20 20 20 20  tchFree(). .    
1e660 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68 65 6e 20  ** If sz>0 then 
1e670 61 6c 6c 6f 63 61 74 65 20 61 20 73 63 72 61 74  allocate a scrat
1e680 63 68 20 62 75 66 66 65 72 20 69 6e 74 6f 20 70  ch buffer into p
1e690 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20  New.  .    */.  
1e6a0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1e6b0 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41  STCTRL_SCRATCHMA
1e6c0 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f  LLOC: {.      vo
1e6d0 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e  id *pFree, **ppN
1e6e0 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  ew;.      int sz
1e6f0 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 76 61 5f  ;.      sz = va_
1e700 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
1e710 20 20 20 20 70 70 4e 65 77 20 3d 20 76 61 5f 61      ppNew = va_a
1e720 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a  rg(ap, void**);.
1e730 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 76 61        pFree = va
1e740 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
1e750 0a 20 20 20 20 20 20 69 66 28 20 73 7a 20 29 20  .      if( sz ) 
1e760 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33  *ppNew = sqlite3
1e770 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a  ScratchMalloc(sz
1e780 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e790 53 63 72 61 74 63 68 46 72 65 65 28 70 46 72 65  ScratchFree(pFre
1e7a0 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
1e7b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
1e7c0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1e7d0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1e7e0 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
1e7f0 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66  FAULT, int onoff
1e800 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1e810 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e   If parameter on
1e820 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  off is non-zero,
1e830 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 77   configure the w
1e840 72 61 70 70 65 72 73 20 73 6f 20 74 68 61 74 20  rappers so that 
1e850 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73 65  all.    ** subse
1e860 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c  quent calls to l
1e870 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e 64 20 76  ocaltime() and v
1e880 61 72 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66  ariants fail. If
1e890 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a   onoff is zero,.
1e8a0 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73      ** undo this
1e8b0 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f   setting..    */
1e8c0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e8d0 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54  _TESTCTRL_LOCALT
1e8e0 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20  IME_FAULT: {.   
1e8f0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1e900 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d  Config.bLocaltim
1e910 65 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28  eFault = va_arg(
1e920 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1e930 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1e940 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
1e950 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1e960 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45  TE_TESTCTRL_NEVE
1e970 52 5f 43 4f 52 52 55 50 54 2c 20 69 6e 74 29 3b  R_CORRUPT, int);
1e980 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
1e990 65 74 20 6f 72 20 63 6c 65 61 72 20 61 20 66 6c  et or clear a fl
1e9a0 61 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  ag that indicate
1e9b0 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  s that the datab
1e9c0 61 73 65 20 66 69 6c 65 20 69 73 20 61 6c 77 61  ase file is alwa
1e9d0 79 73 20 77 65 6c 6c 2d 0a 20 20 20 20 2a 2a 20  ys well-.    ** 
1e9e0 66 6f 72 6d 65 64 20 61 6e 64 20 6e 65 76 65 72  formed and never
1e9f0 20 63 6f 72 72 75 70 74 2e 20 20 54 68 69 73 20   corrupt.  This 
1ea00 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 62 79  flag is clear by
1ea10 20 64 65 66 61 75 6c 74 2c 20 69 6e 64 69 63 61   default, indica
1ea20 74 69 6e 67 20 74 68 61 74 0a 20 20 20 20 2a 2a  ting that.    **
1ea30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1ea40 6d 69 67 68 74 20 68 61 76 65 20 61 72 62 69 74  might have arbit
1ea50 72 61 72 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e  rary corruption.
1ea60 20 20 53 65 74 74 69 6e 67 20 74 68 65 20 66 6c    Setting the fl
1ea70 61 67 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a  ag during.    **
1ea80 20 74 65 73 74 69 6e 67 20 63 61 75 73 65 73 20   testing causes 
1ea90 63 65 72 74 61 69 6e 20 61 73 73 65 72 74 28 29  certain assert()
1eaa0 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
1eab0 68 65 20 63 6f 64 65 20 74 6f 20 62 65 20 61 63  he code to be ac
1eac0 74 69 76 61 74 65 64 0a 20 20 20 20 2a 2a 20 74  tivated.    ** t
1ead0 68 61 74 20 64 65 6d 6f 6e 73 74 72 61 74 20 69  hat demonstrat i
1eae0 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20 77 65 6c  nvariants on wel
1eaf0 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
1eb00 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a  e files..    */.
1eb10 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1eb20 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43  TESTCTRL_NEVER_C
1eb30 4f 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 20 20  ORRUPT: {.      
1eb40 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1eb50 66 69 67 2e 6e 65 76 65 72 43 6f 72 72 75 70 74  fig.neverCorrupt
1eb60 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1eb70 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
1eb80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
1eb90 65 74 20 74 68 65 20 74 68 72 65 73 68 6f 6c 64  et the threshold
1eba0 20 61 74 20 77 68 69 63 68 20 4f 50 5f 4f 6e 63   at which OP_Onc
1ebb0 65 20 63 6f 75 6e 74 65 72 73 20 72 65 73 65 74  e counters reset
1ebc0 20 62 61 63 6b 20 74 6f 20 7a 65 72 6f 2e 0a 20   back to zero.. 
1ebd0 20 20 20 2a 2a 20 42 79 20 64 65 66 61 75 6c 74     ** By default
1ebe0 20 74 68 69 73 20 69 73 20 30 78 37 66 66 66 66   this is 0x7ffff
1ebf0 66 66 65 20 28 6f 76 65 72 20 32 20 62 69 6c 6c  ffe (over 2 bill
1ec00 69 6f 6e 29 2c 20 62 75 74 20 74 68 61 74 20 76  ion), but that v
1ec10 61 6c 75 65 20 69 73 0a 20 20 20 20 2a 2a 20 74  alue is.    ** t
1ec20 6f 6f 20 62 69 67 20 74 6f 20 74 65 73 74 20 69  oo big to test i
1ec30 6e 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 20 61  n a reasonable a
1ec40 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 2c 20 73  mount of time, s
1ec50 6f 20 74 68 69 73 20 63 6f 6e 74 72 6f 6c 20 69  o this control i
1ec60 73 0a 20 20 20 20 2a 2a 20 70 72 6f 76 69 64 65  s.    ** provide
1ec70 64 20 74 6f 20 73 65 74 20 61 20 73 6d 61 6c 6c  d to set a small
1ec80 20 61 6e 64 20 65 61 73 69 6c 79 20 72 65 61 63   and easily reac
1ec90 68 61 62 6c 65 20 72 65 73 65 74 20 76 61 6c 75  hable reset valu
1eca0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  e..    */.    ca
1ecb0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1ecc0 52 4c 5f 4f 4e 43 45 5f 52 45 53 45 54 5f 54 48  RL_ONCE_RESET_TH
1ecd0 52 45 53 48 4f 4c 44 3a 20 7b 0a 20 20 20 20 20  RESHOLD: {.     
1ece0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1ecf0 6e 66 69 67 2e 69 4f 6e 63 65 52 65 73 65 74 54  nfig.iOnceResetT
1ed00 68 72 65 73 68 6f 6c 64 20 3d 20 76 61 5f 61 72  hreshold = va_ar
1ed10 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
1ed20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1ed30 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
1ed40 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1ed50 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44  LITE_TESTCTRL_VD
1ed60 42 45 5f 43 4f 56 45 52 41 47 45 2c 20 78 43 61  BE_COVERAGE, xCa
1ed70 6c 6c 62 61 63 6b 2c 20 70 74 72 29 3b 0a 20 20  llback, ptr);.  
1ed80 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20    **.    ** Set 
1ed90 74 68 65 20 56 44 42 45 20 63 6f 76 65 72 61 67  the VDBE coverag
1eda0 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
1edb0 69 6f 6e 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b  ion to xCallback
1edc0 20 77 69 74 68 20 63 6f 6e 74 65 78 74 20 0a 20   with context . 
1edd0 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 70 74     ** pointer pt
1ede0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
1edf0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1ee00 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  RL_VDBE_COVERAGE
1ee10 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  : {.#ifdef SQLIT
1ee20 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a  E_VDBE_COVERAGE.
1ee30 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
1ee40 69 64 20 28 2a 62 72 61 6e 63 68 5f 63 61 6c 6c  id (*branch_call
1ee50 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  back)(void*,int,
1ee60 75 38 2c 75 38 29 3b 0a 20 20 20 20 20 20 73 71  u8,u8);.      sq
1ee70 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1ee80 67 2e 78 56 64 62 65 42 72 61 6e 63 68 20 3d 20  g.xVdbeBranch = 
1ee90 76 61 5f 61 72 67 28 61 70 2c 62 72 61 6e 63 68  va_arg(ap,branch
1eea0 5f 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  _callback);.    
1eeb0 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1eec0 6f 6e 66 69 67 2e 70 56 64 62 65 42 72 61 6e 63  onfig.pVdbeBranc
1eed0 68 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70  hArg = va_arg(ap
1eee0 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a  ,void*);.#endif.
1eef0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ef00 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
1ef10 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1ef20 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1ef30 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64  L_SORTER_MMAP, d
1ef40 62 2c 20 6e 4d 61 78 29 3b 20 2a 2f 0a 20 20 20  b, nMax); */.   
1ef50 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1ef60 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41  TCTRL_SORTER_MMA
1ef70 50 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  P: {.      sqlit
1ef80 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
1ef90 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
1efa0 20 20 20 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72       db->nMaxSor
1efb0 74 65 72 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67  terMmap = va_arg
1efc0 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
1efd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1efe0 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1eff0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1f000 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49  ITE_TESTCTRL_ISI
1f010 4e 49 54 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  NIT);.    **.   
1f020 20 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54   ** Return SQLIT
1f030 45 5f 4f 4b 20 69 66 20 53 51 4c 69 74 65 20 68  E_OK if SQLite h
1f040 61 73 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  as been initiali
1f050 7a 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 45  zed and SQLITE_E
1f060 52 52 4f 52 20 69 66 0a 20 20 20 20 2a 2a 20 6e  RROR if.    ** n
1f070 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ot..    */.    c
1f080 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1f090 54 52 4c 5f 49 53 49 4e 49 54 3a 20 7b 0a 20 20  TRL_ISINIT: {.  
1f0a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
1f0b0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
1f0c0 69 74 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c  it==0 ) rc = SQL
1f0d0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
1f0e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1f0f0 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74     /*  sqlite3_t
1f100 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1f110 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
1f120 53 54 45 52 2c 20 64 62 2c 20 64 62 4e 61 6d 65  STER, db, dbName
1f130 2c 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a  , onOff, tnum);.
1f140 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1f150 69 73 20 74 65 73 74 20 63 6f 6e 74 72 6f 6c 20  is test control 
1f160 69 73 20 75 73 65 64 20 74 6f 20 63 72 65 61 74  is used to creat
1f170 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  e imposter table
1f180 73 2e 20 20 22 64 62 22 20 69 73 20 61 20 70 6f  s.  "db" is a po
1f190 69 6e 74 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20  inter.    ** to 
1f1a0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
1f1b0 6e 65 63 74 69 6f 6e 2e 20 20 64 62 4e 61 6d 65  nection.  dbName
1f1c0 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
1f1d0 20 6e 61 6d 65 20 28 65 78 3a 20 22 6d 61 69 6e   name (ex: "main
1f1e0 22 20 6f 72 0a 20 20 20 20 2a 2a 20 22 74 65 6d  " or.    ** "tem
1f1f0 70 22 29 20 77 68 69 63 68 20 77 69 6c 6c 20 72  p") which will r
1f200 65 63 65 69 76 65 20 74 68 65 20 69 6d 70 6f 73  eceive the impos
1f210 74 65 72 2e 20 20 22 6f 6e 4f 66 66 22 20 74 75  ter.  "onOff" tu
1f220 72 6e 73 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64  rns imposter mod
1f230 65 20 6f 6e 0a 20 20 20 20 2a 2a 20 6f 72 20 6f  e on.    ** or o
1f240 66 66 2e 20 20 22 74 6e 75 6d 22 20 69 73 20 74  ff.  "tnum" is t
1f250 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1f260 74 68 65 20 62 2d 74 72 65 65 20 74 6f 20 77 68  the b-tree to wh
1f270 69 63 68 20 74 68 65 20 69 6d 70 6f 73 74 65 72  ich the imposter
1f280 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 73 68  .    ** table sh
1f290 6f 75 6c 64 20 63 6f 6e 6e 65 63 74 2e 0a 20 20  ould connect..  
1f2a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62    **.    ** Enab
1f2b0 6c 65 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65  le imposter mode
1f2c0 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 20 73   only when the s
1f2d0 63 68 65 6d 61 20 68 61 73 20 61 6c 72 65 61 64  chema has alread
1f2e0 79 20 62 65 65 6e 20 70 61 72 73 65 64 2e 20 20  y been parsed.  
1f2f0 54 68 65 6e 0a 20 20 20 20 2a 2a 20 72 75 6e 20  Then.    ** run 
1f300 61 20 73 69 6e 67 6c 65 20 43 52 45 41 54 45 20  a single CREATE 
1f310 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
1f320 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  to construct the
1f330 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
1f340 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  in.    ** the pa
1f350 72 73 65 64 20 73 63 68 65 6d 61 2e 20 20 54 68  rsed schema.  Th
1f360 65 6e 20 74 75 72 6e 20 69 6d 70 6f 73 74 65 72  en turn imposter
1f370 20 6d 6f 64 65 20 62 61 63 6b 20 6f 66 66 20 61   mode back off a
1f380 67 61 69 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  gain..    **.   
1f390 20 2a 2a 20 49 66 20 6f 6e 4f 66 66 3d 3d 30 20   ** If onOff==0 
1f3a0 61 6e 64 20 74 6e 75 6d 3e 30 20 74 68 65 6e 20  and tnum>0 then 
1f3b0 72 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61  reset the schema
1f3c0 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
1f3d0 65 73 2c 20 63 61 75 73 69 6e 67 0a 20 20 20 20  es, causing.    
1f3e0 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
1f3f0 20 62 65 20 72 65 70 61 72 73 65 64 20 74 68 65   be reparsed the
1f400 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73   next time it is
1f410 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20 68   needed.  This h
1f420 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 66  as the.    ** ef
1f430 66 65 63 74 20 6f 66 20 65 72 61 73 69 6e 67 20  fect of erasing 
1f440 61 6c 6c 20 69 6d 70 6f 73 74 65 72 20 74 61 62  all imposter tab
1f450 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  les..    */.    
1f460 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1f470 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 3a 20 7b  CTRL_IMPOSTER: {
1f480 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
1f490 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
1f4a0 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
1f4b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1f4c0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1f4d0 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e  .      db->init.
1f4e0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
1f4f0 64 44 62 4e 61 6d 65 28 64 62 2c 20 76 61 5f 61  dDbName(db, va_a
1f500 72 67 28 61 70 2c 63 6f 6e 73 74 20 63 68 61 72  rg(ap,const char
1f510 2a 29 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69  *));.      db->i
1f520 6e 69 74 2e 62 75 73 79 20 3d 20 64 62 2d 3e 69  nit.busy = db->i
1f530 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c  nit.imposterTabl
1f540 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  e = va_arg(ap,in
1f550 74 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e  t);.      db->in
1f560 69 74 2e 6e 65 77 54 6e 75 6d 20 3d 20 76 61 5f  it.newTnum = va_
1f570 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
1f580 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e     if( db->init.
1f590 62 75 73 79 3d 3d 30 20 26 26 20 64 62 2d 3e 69  busy==0 && db->i
1f5a0 6e 69 74 2e 6e 65 77 54 6e 75 6d 3e 30 20 29 7b  nit.newTnum>0 ){
1f5b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f5c0 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
1f5d0 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b  fConnection(db);
1f5e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1f5f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1f600 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1f610 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f620 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
1f630 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  p);.#endif /* SQ
1f640 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 20  LITE_UNTESTABLE 
1f650 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
1f660 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
1f670 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69   a utility routi
1f680 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20 56 46  ne, useful to VF
1f690 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  S implementation
1f6a0 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73 0a 2a  s, that checks.*
1f6b0 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20 64 61  * to see if a da
1f6c0 74 61 62 61 73 65 20 66 69 6c 65 20 77 61 73 20  tabase file was 
1f6d0 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e 74 61  a URI that conta
1f6e0 69 6e 65 64 20 61 20 73 70 65 63 69 66 69 63 20  ined a specific 
1f6f0 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65  query .** parame
1f700 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f  ter, and if so o
1f710 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65  btains the value
1f720 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 70 61   of the query pa
1f730 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  rameter..**.** T
1f740 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
1f750 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 6c  ument is the fil
1f760 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20 70 61  ename pointer pa
1f770 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f  ssed into the xO
1f780 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  pen().** method 
1f790 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65 6d 65  of a VFS impleme
1f7a0 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50  ntation.  The zP
1f7b0 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20 69 73  aram argument is
1f7c0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1f7d0 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65  .** query parame
1f7e0 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20 54 68  ter we seek.  Th
1f7f0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1f800 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ns the value of 
1f810 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61  the zParam.** pa
1f820 72 61 6d 65 74 65 72 20 69 66 20 69 74 20 65 78  rameter if it ex
1f830 69 73 74 73 2e 20 20 49 66 20 74 68 65 20 70 61  ists.  If the pa
1f840 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74  rameter does not
1f850 20 65 78 69 73 74 2c 20 74 68 69 73 20 72 6f 75   exist, this rou
1f860 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
1f870 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a  a NULL pointer..
1f880 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
1f890 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
1f8a0 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  eter(const char 
1f8b0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73  *zFilename, cons
1f8c0 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b  t char *zParam){
1f8d0 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
1f8e0 3d 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d 3d 30  ==0 || zParam==0
1f8f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a   ) return 0;.  z
1f900 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
1f910 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
1f920 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68  ename) + 1;.  wh
1f930 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  ile( zFilename[0
1f940 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  ] ){.    int x =
1f950 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
1f960 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20  e, zParam);.    
1f970 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c  zFilename += sql
1f980 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
1f990 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  lename) + 1;.   
1f9a0 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74 75   if( x==0 ) retu
1f9b0 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  rn zFilename;.  
1f9c0 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
1f9d0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1f9e0 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
1f9f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1fa00 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1fa10 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66   boolean value f
1fa20 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d  or a query param
1fa30 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eter..*/.int sql
1fa40 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
1fa50 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1fa60 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  lename, const ch
1fa70 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20  ar *zParam, int 
1fa80 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20  bDflt){.  const 
1fa90 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
1faa0 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
1fab0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61  zFilename, zPara
1fac0 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62 44  m);.  bDflt = bD
1fad0 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e  flt!=0;.  return
1fae0 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74 42   z ? sqlite3GetB
1faf0 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29  oolean(z, bDflt)
1fb00 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a   : bDflt;.}../*.
1fb10 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d 62  ** Return a 64-b
1fb20 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  it integer value
1fb30 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72   for a query par
1fb40 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74  ameter..*/.sqlit
1fb50 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  e3_int64 sqlite3
1fb60 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f  _uri_int64(.  co
1fb70 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1fb80 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e  ame,    /* Filen
1fb90 61 6d 65 20 61 73 20 70 61 73 73 65 64 20 74 6f  ame as passed to
1fba0 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73   xOpen */.  cons
1fbb0 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20  t char *zParam, 
1fbc0 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61 72        /* URI par
1fbd0 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a 2f  ameter sought */
1fbe0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1fbf0 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a 20   bDflt       /* 
1fc00 72 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d 65  return if parame
1fc10 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2a  ter is missing *
1fc20 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
1fc30 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75  r *z = sqlite3_u
1fc40 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69  ri_parameter(zFi
1fc50 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b  lename, zParam);
1fc60 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1fc70 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 73   v;.  if( z && s
1fc80 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f  qlite3DecOrHexTo
1fc90 49 36 34 28 7a 2c 20 26 76 29 3d 3d 53 51 4c 49  I64(z, &v)==SQLI
1fca0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66  TE_OK ){.    bDf
1fcb0 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65  lt = v;.  }.  re
1fcc0 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f  turn bDflt;.}../
1fcd0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1fce0 42 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69 64  Btree pointer id
1fcf0 65 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62 4e  entified by zDbN
1fd00 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ame.  Return NUL
1fd10 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
1fd20 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74 65  */.Btree *sqlite
1fd30 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 73  3DbNameToBtree(s
1fd40 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
1fd50 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29  t char *zDbName)
1fd60 7b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 7a 44  {.  int iDb = zD
1fd70 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 33 46  bName ? sqlite3F
1fd80 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44  indDbName(db, zD
1fd90 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 72 65  bName) : 0;.  re
1fda0 74 75 72 6e 20 69 44 62 3c 30 20 3f 20 30 20 3a  turn iDb<0 ? 0 :
1fdb0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
1fdc0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
1fdd0 72 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  rn the filename 
1fde0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1fdf0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1fe00 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
1fe10 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e  nnection..*/.con
1fe20 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
1fe30 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c  _db_filename(sql
1fe40 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
1fe50 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
1fe60 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23 69    Btree *pBt;.#i
1fe70 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1fe80 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1fe90 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1fea0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
1feb0 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
1fec0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
1fed0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1fee0 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d 20 73  #endif.  pBt = s
1fef0 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
1ff00 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ree(db, zDbName)
1ff10 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f  ;.  return pBt ?
1ff20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1ff30 46 69 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a 20  Filename(pBt) : 
1ff40 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
1ff50 72 6e 20 31 20 69 66 20 64 61 74 61 62 61 73 65  rn 1 if database
1ff60 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72   is read-only or
1ff70 20 30 20 69 66 20 72 65 61 64 2f 77 72 69 74 65   0 if read/write
1ff80 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 0a  .  Return -1 if.
1ff90 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61 74 61 62  ** no such datab
1ffa0 61 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69  ase exists..*/.i
1ffb0 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  nt sqlite3_db_re
1ffc0 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a  adonly(sqlite3 *
1ffd0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1ffe0 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65  zDbName){.  Btre
1fff0 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53  e *pBt;.#ifdef S
20000 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
20010 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
20020 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
20030 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
20040 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
20050 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
20060 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn -1;.  }.#endi
20070 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65  f.  pBt = sqlite
20080 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64  3DbNameToBtree(d
20090 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72  b, zDbName);.  r
200a0 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69  eturn pBt ? sqli
200b0 74 65 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e  te3BtreeIsReadon
200c0 6c 79 28 70 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a  ly(pBt) : -1;.}.
200d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
200e0 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f  NABLE_SNAPSHOT./
200f0 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 73 6e  *.** Obtain a sn
20100 61 70 73 68 6f 74 20 68 61 6e 64 6c 65 20 66 6f  apshot handle fo
20110 72 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 6f  r the snapshot o
20120 66 20 64 61 74 61 62 61 73 65 20 7a 44 62 20 63  f database zDb c
20130 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 62 65 69  urrently .** bei
20140 6e 67 20 72 65 61 64 20 62 79 20 68 61 6e 64 6c  ng read by handl
20150 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
20160 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65  ite3_snapshot_ge
20170 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t(.  sqlite3 *db
20180 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
20190 2a 7a 44 62 2c 0a 20 20 73 71 6c 69 74 65 33 5f  *zDb,.  sqlite3_
201a0 73 6e 61 70 73 68 6f 74 20 2a 2a 70 70 53 6e 61  snapshot **ppSna
201b0 70 73 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20 72  pshot.){.  int r
201c0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
201d0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
201e0 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65  _OMIT_WAL..#ifde
201f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
20200 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
20210 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
20220 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
20230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
20240 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
20250 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
20260 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
20270 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 69 66 28 20  >mutex);..  if( 
20280 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
20290 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62  0 ){.    int iDb
202a0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
202b0 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20  Name(db, zDb);. 
202c0 20 20 20 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c     if( iDb==0 ||
202d0 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 20 20   iDb>1 ){.      
202e0 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
202f0 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
20300 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
20310 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
20320 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
20330 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
20340 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42  reeBeginTrans(pB
20350 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  t, 0);.        i
20360 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20370 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
20380 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
20390 6e 61 70 73 68 6f 74 47 65 74 28 73 71 6c 69 74  napshotGet(sqlit
203a0 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
203b0 29 2c 20 70 70 53 6e 61 70 73 68 6f 74 29 3b 0a  ), ppSnapshot);.
203c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
203d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  }.    }.  }..  s
203e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
203f0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23  ve(db->mutex);.#
20400 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54  endif   /* SQLIT
20410 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20  E_OMIT_WAL */.  
20420 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
20430 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d  .** Open a read-
20440 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
20450 68 65 20 73 6e 61 70 73 68 6f 74 20 69 64 65 6e  he snapshot iden
20460 64 69 66 69 65 64 20 62 79 20 70 53 6e 61 70 73  dified by pSnaps
20470 68 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  hot..*/.int sqli
20480 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65  te3_snapshot_ope
20490 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n(.  sqlite3 *db
204a0 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
204b0 2a 7a 44 62 2c 20 0a 20 20 73 71 6c 69 74 65 33  *zDb, .  sqlite3
204c0 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70  _snapshot *pSnap
204d0 73 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63  shot.){.  int rc
204e0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
204f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20500 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66  OMIT_WAL..#ifdef
20510 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
20520 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
20530 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
20540 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
20550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
20560 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
20570 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
20580 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
20590 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
205a0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20  ->autoCommit==0 
205b0 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 0a  ){.    int iDb;.
205c0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
205d0 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
205e0 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69 44  zDb);.    if( iD
205f0 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b  b==0 || iDb>1 ){
20600 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
20610 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  t = db->aDb[iDb]
20620 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
20630 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 49  0==sqlite3BtreeI
20640 73 49 6e 52 65 61 64 54 72 61 6e 73 28 70 42 74  sInReadTrans(pBt
20650 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
20660 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e  = sqlite3PagerSn
20670 61 70 73 68 6f 74 4f 70 65 6e 28 73 71 6c 69 74  apshotOpen(sqlit
20680 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
20690 29 2c 20 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20  ), pSnapshot);. 
206a0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
206b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
206c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
206d0 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
206e0 73 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  s(pBt, 0);.     
206f0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
20700 72 53 6e 61 70 73 68 6f 74 4f 70 65 6e 28 73 71  rSnapshotOpen(sq
20710 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
20720 70 42 74 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  pBt), 0);.      
20730 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
20740 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
20750 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
20760 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 20  >mutex);.#endif 
20770 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    /* SQLITE_OMIT
20780 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e  _WAL */.  return
20790 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
207a0 63 6f 76 65 72 20 61 73 20 6d 61 6e 79 20 73 6e  cover as many sn
207b0 61 70 73 68 6f 74 73 20 61 73 20 70 6f 73 73 69  apshots as possi
207c0 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 77 61 6c  ble from the wal
207d0 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
207e0 20 77 69 74 68 0a 2a 2a 20 73 63 68 65 6d 61 20   with.** schema 
207f0 7a 44 62 20 6f 66 20 64 61 74 61 62 61 73 65 20  zDb of database 
20800 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
20810 65 33 5f 73 6e 61 70 73 68 6f 74 5f 72 65 63 6f  e3_snapshot_reco
20820 76 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ver(sqlite3 *db,
20830 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
20840 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
20850 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69 6e  LITE_ERROR;.  in
20860 74 20 69 44 62 3b 0a 23 69 66 6e 64 65 66 20 53  t iDb;.#ifndef S
20870 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
20880 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
20890 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
208a0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
208b0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
208c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
208d0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
208e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
208f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
20900 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
20910 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
20920 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62  ndDbName(db, zDb
20930 29 3b 0a 20 20 69 66 28 20 69 44 62 3d 3d 30 20  );.  if( iDb==0 
20940 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20  || iDb>1 ){.    
20950 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
20960 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
20970 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
20980 33 42 74 72 65 65 49 73 49 6e 52 65 61 64 54 72  3BtreeIsInReadTr
20990 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
209a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
209b0 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42  reeBeginTrans(pB
209c0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
209d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
209e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
209f0 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73  qlite3PagerSnaps
20a00 68 6f 74 52 65 63 6f 76 65 72 28 73 71 6c 69 74  hotRecover(sqlit
20a10 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
20a20 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
20a30 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70  te3BtreeCommit(p
20a40 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Bt);.      }.   
20a50 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
20a60 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
20a70 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 20  >mutex);.#endif 
20a80 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    /* SQLITE_OMIT
20a90 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e  _WAL */.  return
20aa0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   rc;.}../*.** Fr
20ab0 65 65 20 61 20 73 6e 61 70 73 68 6f 74 20 68 61  ee a snapshot ha
20ac0 6e 64 6c 65 20 6f 62 74 61 69 6e 65 64 20 66 72  ndle obtained fr
20ad0 6f 6d 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  om sqlite3_snaps
20ae0 68 6f 74 5f 67 65 74 28 29 2e 0a 2a 2f 0a 76 6f  hot_get()..*/.vo
20af0 69 64 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  id sqlite3_snaps
20b00 68 6f 74 5f 66 72 65 65 28 73 71 6c 69 74 65 33  hot_free(sqlite3
20b10 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70  _snapshot *pSnap
20b20 73 68 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  shot){.  sqlite3
20b30 5f 66 72 65 65 28 70 53 6e 61 70 73 68 6f 74 29  _free(pSnapshot)
20b40 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
20b50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50  LITE_ENABLE_SNAP
20b60 53 48 4f 54 20 2a 2f 0a                          SHOT */.