/ Hex Artifact Content
Login

Artifact 91feb5c7e393ad8f0c434754114a3493c3b0617a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64  u.h".#endif.#ifd
0320: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0330: 5f 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74  _JSON1.int sqlit
0340: 65 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69  e3Json1Init(sqli
0350: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69  te3*);.#endif.#i
0360: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
0370: 4c 45 5f 46 54 53 35 0a 69 6e 74 20 73 71 6c 69  LE_FTS5.int sqli
0380: 74 65 33 46 74 73 35 49 6e 69 74 28 73 71 6c 69  te3Fts5Init(sqli
0390: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  te3*);.#endif..#
03a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d  ifndef SQLITE_AM
03b0: 41 4c 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d  ALGAMATION./* IM
03c0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
03d0: 20 52 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54   R-46656-45156 T
03e0: 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69  he sqlite3_versi
03f0: 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73  on[] string cons
0400: 74 61 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  tant.** contains
0410: 20 74 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c   the text of SQL
0420: 49 54 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72  ITE_VERSION macr
0430: 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  o. .*/.const cha
0440: 72 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  r sqlite3_versio
0450: 6e 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52  n[] = SQLITE_VER
0460: 53 49 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  SION;.#endif../*
0470: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0480: 4f 46 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37  OF: R-53536-4257
0490: 35 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  5 The sqlite3_li
04a0: 62 76 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74  bversion() funct
04b0: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61  ion returns.** a
04c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
04d0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  to the sqlite3_v
04e0: 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20  ersion[] string 
04f0: 63 6f 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f  constant. .*/.co
0500: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0510: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69  3_libversion(voi
0520: 64 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  d){ return sqlit
0530: 65 33 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f  e3_version; }../
0540: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
0550: 2d 4f 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33  -OF: R-63124-393
0560: 30 30 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73  00 The sqlite3_s
0570: 6f 75 72 63 65 69 64 28 29 20 66 75 6e 63 74 69  ourceid() functi
0580: 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20  on returns a.** 
0590: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
05a0: 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f  ing constant who
05b0: 73 65 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  se value is the 
05c0: 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53  same as the.** S
05d0: 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20  QLITE_SOURCE_ID 
05e0: 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d  C preprocessor m
05f0: 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20  acro. .*/.const 
0600: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f  char *sqlite3_so
0610: 75 72 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65  urceid(void){ re
0620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52  turn SQLITE_SOUR
0630: 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  CE_ID; }../* IMP
0640: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0650: 52 2d 33 35 32 31 30 2d 36 33 35 30 38 20 54 68  R-35210-63508 Th
0660: 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  e sqlite3_libver
0670: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75  sion_number() fu
0680: 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  nction.** return
0690: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75  s an integer equ
06a0: 61 6c 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52  al to SQLITE_VER
06b0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a  SION_NUMBER..*/.
06c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  int sqlite3_libv
06d0: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f  ersion_number(vo
06e0: 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  id){ return SQLI
06f0: 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
0700: 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  R; }../* IMPLEME
0710: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30  NTATION-OF: R-20
0720: 37 39 30 2d 31 34 30 32 35 20 54 68 65 20 73 71  790-14025 The sq
0730: 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65  lite3_threadsafe
0740: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
0750: 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61  rns.** zero if a
0760: 6e 64 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74  nd only if SQLit
0770: 65 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77  e was compiled w
0780: 69 74 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64  ith mutexing cod
0790: 65 20 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f  e omitted due to
07a0: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54  .** the SQLITE_T
07b0: 48 52 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c  HREADSAFE compil
07c0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65  e-time option be
07d0: 69 6e 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f  ing set to 0..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72  .int sqlite3_thr
07f0: 65 61 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72  eadsafe(void){ r
0800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52  eturn SQLITE_THR
0810: 45 41 44 53 41 46 45 3b 20 7d 0a 0a 2f 2a 0a 2a  EADSAFE; }../*.*
0820: 2a 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * When compiling
0830: 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72   the test fixtur
0840: 65 20 6f 72 20 77 69 74 68 20 64 65 62 75 67 67  e or with debugg
0850: 69 6e 67 20 65 6e 61 62 6c 65 64 20 28 6f 6e 20  ing enabled (on 
0860: 57 69 6e 33 32 29 2c 0a 2a 2a 20 74 68 69 73 20  Win32),.** this 
0870: 76 61 72 69 61 62 6c 65 20 62 65 69 6e 67 20 73  variable being s
0880: 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 77  et to non-zero w
0890: 69 6c 6c 20 63 61 75 73 65 20 4f 53 54 52 41 43  ill cause OSTRAC
08a0: 45 20 6d 61 63 72 6f 73 20 74 6f 20 65 6d 69 74  E macros to emit
08b0: 0a 2a 2a 20 65 78 74 72 61 20 64 69 61 67 6e 6f  .** extra diagno
08c0: 73 74 69 63 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  stic information
08d0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
08e0: 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
08f0: 0a 23 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  .# ifndef SQLITE
0900: 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 0a  _DEBUG_OS_TRACE.
0910: 23 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  #   define SQLIT
0920: 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45  E_DEBUG_OS_TRACE
0930: 20 30 0a 23 20 65 6e 64 69 66 0a 20 20 69 6e 74   0.# endif.  int
0940: 20 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 20   sqlite3OSTrace 
0950: 3d 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f  = SQLITE_DEBUG_O
0960: 53 5f 54 52 41 43 45 3b 0a 23 65 6e 64 69 66 0a  S_TRACE;.#endif.
0970: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0980: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
0990: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
09a0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
09b0: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E)./*.** If the 
09c0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
09d0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  on pointer is no
09e0: 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a 2a 2a  t NULL and if.**
09f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
0a00: 4f 54 52 41 43 45 20 69 73 20 65 6e 61 62 6c 65  OTRACE is enable
0a10: 64 2c 20 74 68 65 6e 20 6d 65 73 73 61 67 65 73  d, then messages
0a20: 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20 49   describing.** I
0a30: 2f 4f 20 61 63 74 69 76 65 20 61 72 65 20 77 72  /O active are wr
0a40: 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68 69 73  itten using this
0a50: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 73   function.  Thes
0a60: 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20 61 72  e messages.** ar
0a70: 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 64  e intended for d
0a80: 65 62 75 67 67 69 6e 67 20 61 63 74 69 76 69 74  ebugging activit
0a90: 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53 51 4c 49 54  y only..*/.SQLIT
0aa0: 45 5f 41 50 49 20 76 6f 69 64 20 28 53 51 4c 49  E_API void (SQLI
0ab0: 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74 65  TE_CDECL *sqlite
0ac0: 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20  3IoTrace)(const 
0ad0: 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b  char*, ...) = 0;
0ae0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
0af0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0b00: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
0b10: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
0b20: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  ng which is the.
0b30: 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  ** name of a dir
0b40: 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61  ectory, then tha
0b50: 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  t directory will
0b60: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
0b70: 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66  e.** temporary f
0b80: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  iles..**.** See 
0b90: 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41  also the "PRAGMA
0ba0: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
0bb0: 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61  ctory" SQL comma
0bc0: 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nd..*/.char *sql
0bd0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
0be0: 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ory = 0;../*.** 
0bf0: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0c00: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0c10: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0c20: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0c30: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0c40: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0c50: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0c60: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0c70: 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62 61  re.** all databa
0c80: 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66 69  se files specifi
0c90: 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ed with a relati
0ca0: 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a 0a  ve pathname..**.
0cb0: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  ** See also the 
0cc0: 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f  "PRAGMA data_sto
0cd0: 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53 51  re_directory" SQ
0ce0: 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68  L command..*/.ch
0cf0: 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74 61  ar *sqlite3_data
0d00: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  _directory = 0;.
0d10: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0d20: 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a 2a  e SQLite.  .**.*
0d30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0d40: 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ust be called to
0d50: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
0d60: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
0d70: 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20 6d  n,.** VFS, and m
0d80: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73 20  utex subsystems 
0d90: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61  prior to doing a
0da0: 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b 20  ny serious work 
0db0: 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e 20  with.** SQLite. 
0dc0: 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73 20   But as long as 
0dd0: 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70 69  you do not compi
0de0: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f  le with SQLITE_O
0df0: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a 20  MIT_AUTOINIT.** 
0e00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
0e10: 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74 6f  l be called auto
0e20: 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65 79  matically by key
0e30: 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20 61   routines such a
0e40: 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  s.** sqlite3_ope
0e50: 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  n().  .**.** Thi
0e60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
0e70: 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20 69  o-op except on i
0e80: 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63 61  ts very first ca
0e90: 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63 65  ll for the proce
0ea0: 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74 68  ss,.** or for th
0eb0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66 74  e first call aft
0ec0: 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
0ed0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a 2a  ite3_shutdown..*
0ee0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
0ef0: 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74 68  hread to call th
0f00: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
0f10: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
0f20: 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65 74  on to.** complet
0f30: 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71 75  ion.  If subsequ
0f40: 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c 6c  ent threads call
0f50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
0f60: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  fore the first.*
0f70: 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69 6e  * thread has fin
0f80: 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69 61  ished the initia
0f90: 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73  lization process
0fa0: 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73 65  , then the subse
0fb0: 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64 73  quent.** threads
0fc0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fd0: 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  l the first thre
0fe0: 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74 68  ad finishes with
0ff0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1000: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
1010: 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67 68  irst thread migh
1020: 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  t call this rout
1030: 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79 2e  ine recursively.
1040: 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20 63    Recursive.** c
1050: 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75  alls to this rou
1060: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tine should not 
1070: 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73 65  block, of course
1080: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
1090: 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  .** initializati
10a0: 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c 64  on process would
10b0: 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65 2e   never complete.
10c0: 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65 20  .**.** Let X be 
10d0: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  the first thread
10e0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 72   to enter this r
10f0: 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20 62  outine.  Let Y b
1100: 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  e some other.** 
1110: 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77 68  thread.  Then wh
1120: 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ile the initial 
1130: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  invocation of th
1140: 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58 20  is routine by X 
1150: 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74 65  is.** incomplete
1160: 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65 64  , it is required
1170: 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   that:.**.**    
1180: 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69 73  *  Calls to this
1190: 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59 20   routine from Y 
11a0: 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69 6c  must block until
11b0: 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74 0a   the outer-most.
11c0: 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62 79  **       call by
11d0: 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a 2a   X completes..**
11e0: 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72 73  .**    *  Recurs
11f0: 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68 69  ive calls to thi
1200: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
1210: 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20 69  hread X return i
1220: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
1230: 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f 63      without bloc
1240: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
1250: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1260: 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f 4c  void){.  MUTEX_L
1270: 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
1280: 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20  tex *pMaster; ) 
1290: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
12a0: 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a  n static mutex *
12b0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1300: 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69 6e  _EXTRA_INIT.  in
1310: 74 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20  t bRunExtraInit 
1320: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
1340: 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  tra initializati
1350: 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6e  on needed */.#en
1360: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1370: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63  TE_OMIT_WSD.  rc
1380: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
1390: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
13a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13b0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
13c0: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
13d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 6f 6c  .  /* If the fol
13e0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20  lowing assert() 
13f0: 66 61 69 6c 73 20 6f 6e 20 73 6f 6d 65 20 6f 62  fails on some ob
1400: 73 63 75 72 65 20 70 72 6f 63 65 73 73 6f 72 2f  scure processor/
1410: 63 6f 6d 70 69 6c 65 72 0a 20 20 2a 2a 20 63 6f  compiler.  ** co
1420: 6d 62 69 6e 61 74 69 6f 6e 2c 20 74 68 65 20 77  mbination, the w
1430: 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 74 6f  ork-around is to
1440: 20 73 65 74 20 74 68 65 20 63 6f 72 72 65 63 74   set the correct
1450: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 73 69   pointer.  ** si
1460: 7a 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ze at compile-ti
1470: 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  me using -DSQLIT
1480: 45 5f 50 54 52 53 49 5a 45 3d 6e 20 63 6f 6d 70  E_PTRSIZE=n comp
1490: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
14a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  */.  assert( SQL
14b0: 49 54 45 5f 50 54 52 53 49 5a 45 3d 3d 73 69 7a  ITE_PTRSIZE==siz
14c0: 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 0a 20  eof(char*) );.. 
14d0: 20 2f 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73   /* If SQLite is
14e0: 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c 65 74   already complet
14f0: 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  ely initialized,
1500: 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 0a   then this call.
1510: 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
1520: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 73 68 6f  initialize() sho
1530: 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20  uld be a no-op. 
1540: 20 42 75 74 20 74 68 65 20 69 6e 69 74 69 61 6c   But the initial
1550: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d 75 73  ization.  ** mus
1560: 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e 20 20  t be complete.  
1570: 53 6f 20 69 73 49 6e 69 74 20 6d 75 73 74 20 6e  So isInit must n
1580: 6f 74 20 62 65 20 73 65 74 20 75 6e 74 69 6c 20  ot be set until 
1590: 74 68 65 20 76 65 72 79 20 65 6e 64 0a 20 20 2a  the very end.  *
15a0: 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * of this routin
15b0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  e..  */.  if( sq
15c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15d0: 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72  g.isInit ) retur
15e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
15f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
1600: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
1610: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   is initialized.
1620: 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 0a    If unable to .
1630: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
1640: 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  the mutex subsys
1650: 74 65 6d 2c 20 72 65 74 75 72 6e 20 65 61 72 6c  tem, return earl
1660: 79 20 77 69 74 68 20 74 68 65 20 65 72 72 6f 72  y with the error
1670: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 79  ..  ** If the sy
1680: 73 74 65 6d 20 69 73 20 73 6f 20 73 69 63 6b 20  stem is so sick 
1690: 74 68 61 74 20 77 65 20 61 72 65 20 75 6e 61 62  that we are unab
16a0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  le to allocate a
16b0: 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20 74 68 65   mutex,.  ** the
16c0: 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 53  re is not much S
16d0: 51 4c 69 74 65 20 69 73 20 67 6f 69 6e 67 20 74  QLite is going t
16e0: 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 2e  o be able to do.
16f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d  .  **.  ** The m
1700: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 20 6d  utex subsystem m
1710: 75 73 74 20 74 61 6b 65 20 63 61 72 65 20 6f 66  ust take care of
1720: 20 73 65 72 69 61 6c 69 7a 69 6e 67 20 69 74 73   serializing its
1730: 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69 74 69 61   own.  ** initia
1740: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  lization..  */. 
1750: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 75 74   rc = sqlite3Mut
1760: 65 78 49 6e 69 74 28 29 3b 0a 20 20 69 66 28 20  exInit();.  if( 
1770: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1780: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1790: 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20 73 79   the malloc() sy
17a0: 73 74 65 6d 20 61 6e 64 20 74 68 65 20 72 65 63  stem and the rec
17b0: 75 72 73 69 76 65 20 70 49 6e 69 74 4d 75 74 65  ursive pInitMute
17c0: 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a 20 54 68  x mutex..  ** Th
17d0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  is operation is 
17e0: 70 72 6f 74 65 63 74 65 64 20 62 79 20 74 68 65  protected by the
17f0: 20 53 54 41 54 49 43 5f 4d 41 53 54 45 52 20 6d   STATIC_MASTER m
1800: 75 74 65 78 2e 20 20 4e 6f 74 65 20 74 68 61 74  utex.  Note that
1810: 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c 6c 6f 63  .  ** MutexAlloc
1820: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  () is called for
1830: 20 61 20 73 74 61 74 69 63 20 6d 75 74 65 78 20   a static mutex 
1840: 70 72 69 6f 72 20 74 6f 20 69 6e 69 74 69 61 6c  prior to initial
1850: 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6d  izing the.  ** m
1860: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20  alloc subsystem 
1870: 2d 20 74 68 69 73 20 69 6d 70 6c 69 65 73 20 74  - this implies t
1880: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
1890: 6f 6e 20 6f 66 20 61 20 73 74 61 74 69 63 0a 20  on of a static. 
18a0: 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74 20 6e   ** mutex must n
18b0: 6f 74 20 72 65 71 75 69 72 65 20 73 75 70 70 6f  ot require suppo
18c0: 72 74 20 66 72 6f 6d 20 74 68 65 20 6d 61 6c 6c  rt from the mall
18d0: 6f 63 20 73 75 62 73 79 73 74 65 6d 2e 0a 20 20  oc subsystem..  
18e0: 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  */.  MUTEX_LOGIC
18f0: 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69  ( pMaster = sqli
1900: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
1910: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1920: 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73  C_MASTER); ).  s
1930: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1940: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
1950: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1960: 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d  ig.isMutexInit =
1970: 20 31 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   1;.  if( !sqlit
1980: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1990: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
19a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
19b0: 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a 20 20 7d  allocInit();.  }
19c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
19e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
19f0: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 31  isMallocInit = 1
1a00: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
1a10: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1a20: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1a30: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1a40: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
1a50: 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 73  x =.           s
1a60: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1a70: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
1a80: 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20 20  CURSIVE);.      
1a90: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1aa0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
1ab0: 65 78 20 26 26 20 21 73 71 6c 69 74 65 33 47 6c  ex && !sqlite3Gl
1ac0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1ad0: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
1ae0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1af0: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
1b00: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
1b10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b20: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1b30: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
1b40: 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ex++;.  }.  sqli
1b50: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1b60: 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pMaster);..  /* 
1b70: 49 66 20 72 63 20 69 73 20 6e 6f 74 20 53 51 4c  If rc is not SQL
1b80: 49 54 45 5f 4f 4b 20 61 74 20 74 68 69 73 20 70  ITE_OK at this p
1b90: 6f 69 6e 74 2c 20 74 68 65 6e 20 65 69 74 68 65  oint, then eithe
1ba0: 72 20 74 68 65 20 6d 61 6c 6c 6f 63 0a 20 20 2a  r the malloc.  *
1bb0: 2a 20 73 75 62 73 79 73 74 65 6d 20 63 6f 75 6c  * subsystem coul
1bc0: 64 20 6e 6f 74 20 62 65 20 69 6e 69 74 69 61 6c  d not be initial
1bd0: 69 7a 65 64 20 6f 72 20 74 68 65 20 73 79 73 74  ized or the syst
1be0: 65 6d 20 66 61 69 6c 65 64 20 74 6f 20 61 6c 6c  em failed to all
1bf0: 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70  ocate.  ** the p
1c00: 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65 78 2e  InitMutex mutex.
1c10: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
1c20: 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e   in either case.
1c30: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53    */.  if( rc!=S
1c40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c50: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1c60: 20 20 2f 2a 20 44 6f 20 74 68 65 20 72 65 73 74    /* Do the rest
1c70: 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
1c80: 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20 74 68 65  zation under the
1c90: 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78   recursive mutex
1ca0: 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 77 65   so.  ** that we
1cb0: 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1cc0: 20 68 61 6e 64 6c 65 20 72 65 63 75 72 73 69 76   handle recursiv
1cd0: 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a 20 20 2a  e calls into.  *
1ce0: 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  * sqlite3_initia
1cf0: 6c 69 7a 65 28 29 2e 20 20 54 68 65 20 72 65 63  lize().  The rec
1d00: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6e 6f 72  ursive calls nor
1d10: 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68 72 6f 75  mally come throu
1d20: 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  gh.  ** sqlite3_
1d30: 6f 73 5f 69 6e 69 74 28 29 20 77 68 65 6e 20 69  os_init() when i
1d40: 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65  t invokes sqlite
1d50: 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 29  3_vfs_register()
1d60: 2c 20 62 75 74 20 6f 74 68 65 72 0a 20 20 2a 2a  , but other.  **
1d70: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1d80: 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 70   might also be p
1d90: 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  ossible..  **.  
1da0: 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
1db0: 4e 2d 4f 46 3a 20 52 2d 30 30 31 34 30 2d 33 37  N-OF: R-00140-37
1dc0: 34 34 35 20 53 51 4c 69 74 65 20 61 75 74 6f 6d  445 SQLite autom
1dd0: 61 74 69 63 61 6c 6c 79 20 73 65 72 69 61 6c 69  atically seriali
1de0: 7a 65 73 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 74  zes calls.  ** t
1df0: 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68  o the xInit meth
1e00: 6f 64 2c 20 73 6f 20 74 68 65 20 78 49 6e 69 74  od, so the xInit
1e10: 20 6d 65 74 68 6f 64 20 6e 65 65 64 20 6e 6f 74   method need not
1e20: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2e 0a   be threadsafe..
1e30: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f    **.  ** The fo
1e40: 6c 6c 6f 77 69 6e 67 20 6d 75 74 65 78 20 69 73  llowing mutex is
1e50: 20 77 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73   what serializes
1e60: 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 61   access to the a
1e70: 70 70 64 65 66 20 70 63 61 63 68 65 20 78 49 6e  ppdef pcache xIn
1e80: 69 74 0a 20 20 2a 2a 20 6d 65 74 68 6f 64 73 2e  it.  ** methods.
1e90: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 70 63    The sqlite3_pc
1ea0: 61 63 68 65 5f 6d 65 74 68 6f 64 73 2e 78 49 6e  ache_methods.xIn
1eb0: 69 74 28 29 20 61 6c 6c 20 69 73 20 65 6d 62 65  it() all is embe
1ec0: 64 64 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a  dded in the.  **
1ed0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1ee0: 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65  PcacheInitialize
1ef0: 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ()..  */.  sqlit
1f00: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
1f10: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1f20: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a  ig.pInitMutex);.
1f30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1f40: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
1f50: 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 47 6c  ==0 && sqlite3Gl
1f60: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
1f70: 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20  gress==0 ){.    
1f80: 46 75 6e 63 44 65 66 48 61 73 68 20 2a 70 48 61  FuncDefHash *pHa
1f90: 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28 46 75 6e  sh = &GLOBAL(Fun
1fa0: 63 44 65 66 48 61 73 68 2c 20 73 71 6c 69 74 65  cDefHash, sqlite
1fb0: 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73  3GlobalFunctions
1fc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
1fd0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
1fe0: 67 72 65 73 73 20 3d 20 31 3b 0a 23 69 66 64 65  gress = 1;.#ifde
1ff0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2000: 53 51 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20 20 20  SQLLOG.    {.   
2010: 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73     extern void s
2020: 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c  qlite3_init_sqll
2030: 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20  og(void);.      
2040: 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c  sqlite3_init_sql
2050: 6c 6f 67 28 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  log();.    }.#en
2060: 64 69 66 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  dif.    memset(p
2070: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
2080: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e  sqlite3GlobalFun
2090: 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20 73 71  ctions));.    sq
20a0: 6c 69 74 65 33 52 65 67 69 73 74 65 72 47 6c 6f  lite3RegisterGlo
20b0: 62 61 6c 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a  balFunctions();.
20c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
20d0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
20e0: 61 63 68 65 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  acheInit==0 ){. 
20f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2100: 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a  3PcacheInitializ
2110: 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  e();.    }.    i
2120: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2130: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2140: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
2150: 50 43 61 63 68 65 49 6e 69 74 20 3d 20 31 3b 0a  PCacheInit = 1;.
2160: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2170: 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20 20 20 20  e3OsInit();.    
2180: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2190: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21a0: 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 42 75   sqlite3PCacheBu
21b0: 66 66 65 72 53 65 74 75 70 28 20 73 71 6c 69 74  fferSetup( sqlit
21c0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
21d0: 50 61 67 65 2c 20 0a 20 20 20 20 20 20 20 20 20  Page, .         
21e0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
21f0: 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c  nfig.szPage, sql
2200: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2210: 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 73  .nPage);.      s
2220: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2230: 69 67 2e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 23  ig.isInit = 1;.#
2240: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54  ifdef SQLITE_EXT
2250: 52 41 5f 49 4e 49 54 0a 20 20 20 20 20 20 62 52  RA_INIT.      bR
2260: 75 6e 45 78 74 72 61 49 6e 69 74 20 3d 20 31 3b  unExtraInit = 1;
2270: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
2280: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2290: 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73  onfig.inProgress
22a0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
22b0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
22c0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
22d0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b  fig.pInitMutex);
22e0: 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75  ..  /* Go back u
22f0: 6e 64 65 72 20 74 68 65 20 73 74 61 74 69 63 20  nder the static 
2300: 6d 75 74 65 78 20 61 6e 64 20 63 6c 65 61 6e 20  mutex and clean 
2310: 75 70 20 74 68 65 20 72 65 63 75 72 73 69 76 65  up the recursive
2320: 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70  .  ** mutex to p
2330: 72 65 76 65 6e 74 20 61 20 72 65 73 6f 75 72 63  revent a resourc
2340: 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73  e leak..  */.  s
2350: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
2360: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
2370: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2380: 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78  ig.nRefInitMutex
2390: 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  --;.  if( sqlite
23a0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
23b0: 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29  efInitMutex<=0 )
23c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
23d0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
23e0: 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3d  g.nRefInitMutex=
23f0: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
2400: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 73 71 6c  3_mutex_free(sql
2410: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2420: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20  .pInitMutex);.  
2430: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2440: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
2450: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
2460: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2470: 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pMaster);..  /* 
2480: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
2490: 20 6a 75 73 74 20 61 20 73 61 6e 69 74 79 20 63   just a sanity c
24a0: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
24b0: 65 20 53 51 4c 69 74 65 20 68 61 73 0a 20 20 2a  e SQLite has.  *
24c0: 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20  * been compiled 
24d0: 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 74 20 69  correctly.  It i
24e0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72  s important to r
24f0: 75 6e 20 74 68 69 73 20 63 6f 64 65 2c 20 62 75  un this code, bu
2500: 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  t.  ** we don't 
2510: 77 61 6e 74 20 74 6f 20 72 75 6e 20 69 74 20 74  want to run it t
2520: 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61  oo often and soa
2530: 6b 20 75 70 20 43 50 55 20 63 79 63 6c 65 73 20  k up CPU cycles 
2540: 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73  for no.  ** reas
2550: 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75 6e 20 69  on.  So we run i
2560: 74 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 69 6e  t once during in
2570: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
2580: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
2590: 47 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  G.#ifndef SQLITE
25a0: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
25b0: 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69 73 20 73  OINT.  /* This s
25c0: 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73  ection of code's
25d0: 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74 22 20 69   only "output" i
25e0: 73 20 76 69 61 20 61 73 73 65 72 74 28 29 20 73  s via assert() s
25f0: 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  tatements. */.  
2600: 69 66 20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  if ( rc==SQLITE_
2610: 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34 20 78 20  OK ){.    u64 x 
2620: 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 36 33 29  = (((u64)1)<<63)
2630: 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79  -1;.    double y
2640: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73 69 7a  ;.    assert(siz
2650: 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20 20 20 20  eof(x)==8);.    
2660: 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29  assert(sizeof(x)
2670: 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b 0a 20 20  ==sizeof(y));.  
2680: 20 20 6d 65 6d 63 70 79 28 26 79 2c 20 26 78 2c    memcpy(&y, &x,
2690: 20 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   8);.    assert(
26a0: 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 79 29   sqlite3IsNaN(y)
26b0: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   );.  }.#endif.#
26c0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 65  endif..  /* Do e
26d0: 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74  xtra initializat
26e0: 69 6f 6e 20 73 74 65 70 73 20 72 65 71 75 65 73  ion steps reques
26f0: 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ted by the SQLIT
2700: 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 2a  E_EXTRA_INIT.  *
2710: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  * compile-time o
2720: 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  ption..  */.#ifd
2730: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
2740: 49 4e 49 54 0a 20 20 69 66 28 20 62 52 75 6e 45  INIT.  if( bRunE
2750: 78 74 72 61 49 6e 69 74 20 29 7b 0a 20 20 20 20  xtraInit ){.    
2760: 69 6e 74 20 53 51 4c 49 54 45 5f 45 58 54 52 41  int SQLITE_EXTRA
2770: 5f 49 4e 49 54 28 63 6f 6e 73 74 20 63 68 61 72  _INIT(const char
2780: 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  *);.    rc = SQL
2790: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 30  ITE_EXTRA_INIT(0
27a0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
27b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27c0: 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65 20 65 66  *.** Undo the ef
27d0: 66 65 63 74 73 20 6f 66 20 73 71 6c 69 74 65 33  fects of sqlite3
27e0: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20  _initialize().  
27f0: 4d 75 73 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c  Must not be call
2800: 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72  ed while.** ther
2810: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
2820: 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  g database conne
2830: 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79  ctions or memory
2840: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a   allocations or.
2850: 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 70 61 72  ** while any par
2860: 74 20 6f 66 20 53 51 4c 69 74 65 20 69 73 20 6f  t of SQLite is o
2870: 74 68 65 72 77 69 73 65 20 69 6e 20 75 73 65 20  therwise in use 
2880: 69 6e 20 61 6e 79 20 74 68 72 65 61 64 2e 20 20  in any thread.  
2890: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
28a0: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
28b0: 65 2e 20 20 42 75 74 20 69 74 20 69 73 20 73 61  e.  But it is sa
28c0: 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69  fe to invoke thi
28d0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20  s routine.** on 
28e0: 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20 61  when SQLite is a
28f0: 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e  lready shut down
2900: 2e 20 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  .  If SQLite is 
2910: 61 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f 77  already shut dow
2920: 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72  n.** when this r
2930: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
2940: 64 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  d, then this rou
2950: 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65  tine is a harmle
2960: 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74  ss no-op..*/.int
2970: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
2980: 6e 28 76 6f 69 64 29 7b 0a 23 69 66 64 65 66 20  n(void){.#ifdef 
2990: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
29a0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
29b0: 65 33 5f 77 73 64 5f 69 6e 69 74 28 34 30 39 36  e3_wsd_init(4096
29c0: 2c 20 32 34 29 3b 0a 20 20 69 66 28 20 72 63 21  , 24);.  if( rc!
29d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
29f0: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73  .#endif..  if( s
2a00: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2a10: 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a 23 69 66  ig.isInit ){.#if
2a20: 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41  def SQLITE_EXTRA
2a30: 5f 53 48 55 54 44 4f 57 4e 0a 20 20 20 20 76 6f  _SHUTDOWN.    vo
2a40: 69 64 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  id SQLITE_EXTRA_
2a50: 53 48 55 54 44 4f 57 4e 28 76 6f 69 64 29 3b 0a  SHUTDOWN(void);.
2a60: 20 20 20 20 53 51 4c 49 54 45 5f 45 58 54 52 41      SQLITE_EXTRA
2a70: 5f 53 48 55 54 44 4f 57 4e 28 29 3b 0a 23 65 6e  _SHUTDOWN();.#en
2a80: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
2a90: 6f 73 5f 65 6e 64 28 29 3b 0a 20 20 20 20 73 71  os_end();.    sq
2aa0: 6c 69 74 65 33 5f 72 65 73 65 74 5f 61 75 74 6f  lite3_reset_auto
2ab0: 5f 65 78 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20  _extension();.  
2ac0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2ad0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 30  onfig.isInit = 0
2ae0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
2af0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2b00: 69 73 50 43 61 63 68 65 49 6e 69 74 20 29 7b 0a  isPCacheInit ){.
2b10: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2b20: 65 53 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 20  eShutdown();.   
2b30: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2b40: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2b50: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
2b60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2b70: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
2b80: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2b90: 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 20  MallocEnd();.   
2ba0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2bb0: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
2bc0: 74 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20  t = 0;..#ifndef 
2bd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 55 54  SQLITE_OMIT_SHUT
2be0: 44 4f 57 4e 5f 44 49 52 45 43 54 4f 52 49 45 53  DOWN_DIRECTORIES
2bf0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70  .    /* The heap
2c00: 20 73 75 62 73 79 73 74 65 6d 20 68 61 73 20 6e   subsystem has n
2c10: 6f 77 20 62 65 65 6e 20 73 68 75 74 64 6f 77 6e  ow been shutdown
2c20: 20 61 6e 64 20 74 68 65 73 65 20 76 61 6c 75 65   and these value
2c30: 73 20 61 72 65 20 73 75 70 70 6f 73 65 64 0a 20  s are supposed. 
2c40: 20 20 20 2a 2a 20 74 6f 20 62 65 20 4e 55 4c 4c     ** to be NULL
2c50: 20 6f 72 20 70 6f 69 6e 74 20 74 6f 20 6d 65 6d   or point to mem
2c60: 6f 72 79 20 74 68 61 74 20 77 61 73 20 6f 62 74  ory that was obt
2c70: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
2c80: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 0a 20 20 20  e3_malloc(),.   
2c90: 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20   ** which would 
2ca0: 72 65 6c 79 20 6f 6e 20 74 68 61 74 20 68 65 61  rely on that hea
2cb0: 70 20 73 75 62 73 79 73 74 65 6d 3b 20 74 68 65  p subsystem; the
2cc0: 72 65 66 6f 72 65 2c 20 6d 61 6b 65 20 73 75 72  refore, make sur
2cd0: 65 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 76  e these.    ** v
2ce0: 61 6c 75 65 73 20 63 61 6e 6e 6f 74 20 72 65 66  alues cannot ref
2cf0: 65 72 20 74 6f 20 68 65 61 70 20 6d 65 6d 6f 72  er to heap memor
2d00: 79 20 74 68 61 74 20 77 61 73 20 6a 75 73 74 20  y that was just 
2d10: 69 6e 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e  invalidated when
2d20: 20 74 68 65 0a 20 20 20 20 2a 2a 20 68 65 61 70   the.    ** heap
2d30: 20 73 75 62 73 79 73 74 65 6d 20 77 61 73 20 73   subsystem was s
2d40: 68 75 74 64 6f 77 6e 2e 20 20 54 68 69 73 20 69  hutdown.  This i
2d50: 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 69 66 20 74  s only done if t
2d60: 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 20  he current call 
2d70: 74 6f 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66  to.    ** this f
2d80: 75 6e 63 74 69 6f 6e 20 72 65 73 75 6c 74 65 64  unction resulted
2d90: 20 69 6e 20 74 68 65 20 68 65 61 70 20 73 75 62   in the heap sub
2da0: 73 79 73 74 65 6d 20 61 63 74 75 61 6c 6c 79 20  system actually 
2db0: 62 65 69 6e 67 20 73 68 75 74 64 6f 77 6e 2e 0a  being shutdown..
2dc0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
2dd0: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
2de0: 79 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  y = 0;.    sqlit
2df0: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
2e00: 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  y = 0;.#endif.  
2e10: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2e20: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75  lobalConfig.isMu
2e30: 74 65 78 49 6e 69 74 20 29 7b 0a 20 20 20 20 73  texInit ){.    s
2e40: 71 6c 69 74 65 33 4d 75 74 65 78 45 6e 64 28 29  qlite3MutexEnd()
2e50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
2e60: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65  balConfig.isMute
2e70: 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  xInit = 0;.  }..
2e80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e90: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
2ea0: 73 20 41 50 49 20 61 6c 6c 6f 77 73 20 61 70 70  s API allows app
2eb0: 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64  lications to mod
2ec0: 69 66 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 63  ify the global c
2ed0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a  onfiguration of.
2ee0: 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  ** the SQLite li
2ef0: 62 72 61 72 79 20 61 74 20 72 75 6e 2d 74 69 6d  brary at run-tim
2f00: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
2f10: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
2f20: 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  y be called when
2f30: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
2f40: 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74  tstanding.** dat
2f50: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2f60: 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  s or memory allo
2f70: 63 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 72  cations.  This r
2f80: 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a  outine is not.**
2f90: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 46 61   threadsafe.  Fa
2fa0: 69 6c 75 72 65 20 74 6f 20 68 65 65 64 20 74 68  ilure to heed th
2fb0: 65 73 65 20 77 61 72 6e 69 6e 67 73 20 63 61 6e  ese warnings can
2fc0: 20 6c 65 61 64 20 74 6f 20 75 6e 70 72 65 64 69   lead to unpredi
2fd0: 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69  ctable.** behavi
2fe0: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
2ff0: 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70  e3_config(int op
3000: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
3010: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d  t ap;.  int rc =
3020: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
3030: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  * sqlite3_config
3040: 28 29 20 73 68 61 6c 6c 20 72 65 74 75 72 6e 20  () shall return 
3050: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66  SQLITE_MISUSE if
3060: 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 77   it is invoked w
3070: 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53 51  hile.  ** the SQ
3080: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 69 73 20  Lite library is 
3090: 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28  in use. */.  if(
30a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
30b0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65  nfig.isInit ) re
30c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
30d0: 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76 61 5f 73  SE_BKPT;..  va_s
30e0: 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
30f0: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20  switch( op ){.. 
3100: 20 20 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66     /* Mutex conf
3110: 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
3120: 73 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  s are only avail
3130: 61 62 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64  able in a thread
3140: 73 61 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  safe.    ** comp
3150: 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20  ile..    */.#if 
3160: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
3170: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
3180: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
3190: 30 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 34 34  0  /* IMP: R-544
31a0: 36 36 2d 34 36 37 35 36 20 2a 2f 0a 20 20 20 20  66-46756 */.    
31b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
31c0: 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 3a  IG_SINGLETHREAD:
31d0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
31e0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 32 37 34 38  ENCE-OF: R-02748
31f0: 2d 31 39 30 39 36 20 54 68 69 73 20 6f 70 74 69  -19096 This opti
3200: 6f 6e 20 73 65 74 73 20 74 68 65 20 74 68 72 65  on sets the thre
3210: 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20  ading mode to.  
3220: 20 20 20 20 2a 2a 20 53 69 6e 67 6c 65 2d 74 68      ** Single-th
3230: 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73  read. */.      s
3240: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3250: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
3260: 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d  0;  /* Disable m
3270: 75 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a  utex on core */.
3280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3290: 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
32a0: 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a 20 44 69  utex = 0;  /* Di
32b0: 73 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63  sable mutex on c
32c0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
32d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
32e0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
32f0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
3300: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3310: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a  _THREADSAFE>0 /*
3320: 20 49 4d 50 3a 20 52 2d 32 30 35 32 30 2d 35 34   IMP: R-20520-54
3330: 30 38 36 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  086 */.    case 
3340: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55  SQLITE_CONFIG_MU
3350: 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a 20 20 20  LTITHREAD: {.   
3360: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
3370: 46 3a 20 52 2d 31 34 33 37 34 2d 34 32 34 36 38  F: R-14374-42468
3380: 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73 65 74   This option set
3390: 73 20 74 68 65 20 74 68 72 65 61 64 69 6e 67 20  s the threading 
33a0: 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  mode to.      **
33b0: 20 4d 75 6c 74 69 2d 74 68 72 65 61 64 2e 20 2a   Multi-thread. *
33c0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
33d0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
33e0: 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20  eMutex = 1;  /* 
33f0: 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20  Enable mutex on 
3400: 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  core */.      sq
3410: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3420: 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30  g.bFullMutex = 0
3430: 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75  ;  /* Disable mu
3440: 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f  tex on connectio
3450: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ns */.      brea
3460: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3470: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3480: 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26  TE_THREADSAFE) &
3490: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
34a0: 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  AFE>0 /* IMP: R-
34b0: 35 39 35 39 33 2d 32 31 38 31 30 20 2a 2f 0a 20  59593-21810 */. 
34c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
34d0: 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49 5a 45 44  ONFIG_SERIALIZED
34e0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
34f0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 32 32  DENCE-OF: R-4122
3500: 30 2d 35 31 38 30 30 20 54 68 69 73 20 6f 70 74  0-51800 This opt
3510: 69 6f 6e 20 73 65 74 73 20 74 68 65 20 74 68 72  ion sets the thr
3520: 65 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f 0a 20  eading mode to. 
3530: 20 20 20 20 20 2a 2a 20 53 65 72 69 61 6c 69 7a       ** Serializ
3540: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ed. */.      sql
3550: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3560: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b  .bCoreMutex = 1;
3570: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65    /* Enable mute
3580: 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20  x on core */.   
3590: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
35a0: 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
35b0: 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62 6c  x = 1;  /* Enabl
35c0: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65  e mutex on conne
35d0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ctions */.      
35e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
35f0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3600: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3610: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3620: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
3630: 3a 20 52 2d 36 33 36 36 36 2d 34 38 37 35 35 20  : R-63666-48755 
3640: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3650: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a  TE_CONFIG_MUTEX:
3660: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63   {.      /* Spec
3670: 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  ify an alternati
3680: 76 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65  ve mutex impleme
3690: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
36a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
36b0: 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61  nfig.mutex = *va
36c0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
36d0: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29  _mutex_methods*)
36e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
36f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
3700: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
3710: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
3720: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
3730: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 34 34 35  0 /* IMP: R-1445
3740: 30 2d 33 37 35 39 37 20 2a 2f 0a 20 20 20 20 63  0-37597 */.    c
3750: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3760: 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b 0a 20 20  G_GETMUTEX: {.  
3770: 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20      /* Retrieve 
3780: 74 68 65 20 63 75 72 72 65 6e 74 20 6d 75 74 65  the current mute
3790: 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  x implementation
37a0: 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72   */.      *va_ar
37b0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75  g(ap, sqlite3_mu
37c0: 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20  tex_methods*) = 
37d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
37e0: 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20 20 20 20  fig.mutex;.     
37f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
3800: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
3810: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c  QLITE_CONFIG_MAL
3820: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
3830: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
3840: 35 35 39 34 2d 32 31 30 33 30 20 54 68 65 20 53  5594-21030 The S
3850: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c  QLITE_CONFIG_MAL
3860: 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73  LOC option takes
3870: 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
3880: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
3890: 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  h is a pointer t
38a0: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
38b0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71   the.      ** sq
38c0: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
38d0: 73 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  s structure. The
38e0: 20 61 72 67 75 6d 65 6e 74 20 73 70 65 63 69 66   argument specif
38f0: 69 65 73 20 61 6c 74 65 72 6e 61 74 69 76 65 0a  ies alternative.
3900: 20 20 20 20 20 20 2a 2a 20 6c 6f 77 2d 6c 65 76        ** low-lev
3910: 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  el memory alloca
3920: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 6f  tion routines to
3930: 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63   be used in plac
3940: 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 0a  e of the memory.
3950: 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
3960: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 62 75 69  ion routines bui
3970: 6c 74 20 69 6e 74 6f 20 53 51 4c 69 74 65 2e 20  lt into SQLite. 
3980: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3990: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d  GlobalConfig.m =
39a0: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
39b0: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
39c0: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
39d0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
39e0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
39f0: 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20  TMALLOC: {.     
3a00: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
3a10: 20 52 2d 35 31 32 31 33 2d 34 36 34 31 34 20 54   R-51213-46414 T
3a20: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
3a30: 5f 47 45 54 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f  _GETMALLOC optio
3a40: 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20  n takes a.      
3a50: 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65  ** single argume
3a60: 6e 74 20 77 68 69 63 68 20 69 73 20 61 20 70 6f  nt which is a po
3a70: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
3a80: 61 6e 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20  ance of the.    
3a90: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d    ** sqlite3_mem
3aa0: 5f 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75  _methods structu
3ab0: 72 65 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f  re. The sqlite3_
3ac0: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75  mem_methods stru
3ad0: 63 74 75 72 65 20 69 73 0a 20 20 20 20 20 20 2a  cture is.      *
3ae0: 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  * filled with th
3af0: 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
3b00: 6e 65 64 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ned memory alloc
3b10: 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 2e 20  ation routines. 
3b20: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
3b30: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3b40: 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20  .m.xMalloc==0 ) 
3b50: 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66  sqlite3MemSetDef
3b60: 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 2a 76  ault();.      *v
3b70: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
3b80: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 20  3_mem_methods*) 
3b90: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
3ba0: 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20 20 20 62  onfig.m;.      b
3bb0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3bc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3bd0: 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a 20 7b 0a  IG_MEMSTATUS: {.
3be0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3bf0: 45 2d 4f 46 3a 20 52 2d 36 31 32 37 35 2d 33 35  E-OF: R-61275-35
3c00: 31 35 37 20 54 68 65 20 53 51 4c 49 54 45 5f 43  157 The SQLITE_C
3c10: 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 20  ONFIG_MEMSTATUS 
3c20: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a 20 20 20  option takes.   
3c30: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67     ** single arg
3c40: 75 6d 65 6e 74 20 6f 66 20 74 79 70 65 20 69 6e  ument of type in
3c50: 74 2c 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  t, interpreted a
3c60: 73 20 61 20 62 6f 6f 6c 65 61 6e 2c 20 77 68 69  s a boolean, whi
3c70: 63 68 20 65 6e 61 62 6c 65 73 0a 20 20 20 20 20  ch enables.     
3c80: 20 2a 2a 20 6f 72 20 64 69 73 61 62 6c 65 73 20   ** or disables 
3c90: 74 68 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f  the collection o
3ca0: 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  f memory allocat
3cb0: 69 6f 6e 20 73 74 61 74 69 73 74 69 63 73 2e 20  ion statistics. 
3cc0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3cd0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65  GlobalConfig.bMe
3ce0: 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67 28 61  mstat = va_arg(a
3cf0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3d00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3d10: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3d20: 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20 20  IG_SCRATCH: {.  
3d30: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
3d40: 4f 46 3a 20 52 2d 30 38 34 30 34 2d 36 30 38 38  OF: R-08404-6088
3d50: 37 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65  7 There are thre
3d60: 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20  e arguments to. 
3d70: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43       ** SQLITE_C
3d80: 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 41  ONFIG_SCRATCH: A
3d90: 20 70 6f 69 6e 74 65 72 20 61 6e 20 38 2d 62 79   pointer an 8-by
3da0: 74 65 20 61 6c 69 67 6e 65 64 20 6d 65 6d 6f 72  te aligned memor
3db0: 79 20 62 75 66 66 65 72 20 66 72 6f 6d 0a 20 20  y buffer from.  
3dc0: 20 20 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65      ** which the
3dd0: 20 73 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74   scratch allocat
3de0: 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 64 72 61  ions will be dra
3df0: 77 6e 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 20  wn, the size of 
3e00: 65 61 63 68 20 73 63 72 61 74 63 68 0a 20 20 20  each scratch.   
3e10: 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e     ** allocation
3e20: 20 28 73 7a 29 2c 20 61 6e 64 20 74 68 65 20 6d   (sz), and the m
3e30: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
3e40: 20 73 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74   scratch allocat
3e50: 69 6f 6e 73 20 28 4e 29 2e 20 2a 2f 0a 20 20 20  ions (N). */.   
3e60: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3e70: 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63 68 20  Config.pScratch 
3e80: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
3e90: 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d*);.      sqlit
3ea0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
3eb0: 7a 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72  zScratch = va_ar
3ec0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3ed0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3ee0: 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 20 3d  onfig.nScratch =
3ef0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
3f00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3f10: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3f20: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45  LITE_CONFIG_PAGE
3f30: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
3f40: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
3f50: 2d 33 31 34 30 38 2d 34 30 35 31 30 20 54 68 65  -31408-40510 The
3f60: 72 65 20 61 72 65 20 74 68 72 65 65 20 61 72 67  re are three arg
3f70: 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20 20  uments to.      
3f80: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ** SQLITE_CONFIG
3f90: 5f 50 41 47 45 43 41 43 48 45 3a 20 41 20 70 6f  _PAGECACHE: A po
3fa0: 69 6e 74 65 72 20 74 6f 20 38 2d 62 79 74 65 20  inter to 8-byte 
3fb0: 61 6c 69 67 6e 65 64 20 6d 65 6d 6f 72 79 2c 20  aligned memory, 
3fc0: 74 68 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a  the size.      *
3fd0: 2a 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 62  * of each page b
3fe0: 75 66 66 65 72 20 28 73 7a 29 2c 20 61 6e 64 20  uffer (sz), and 
3ff0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
4000: 67 65 73 20 28 4e 29 2e 20 2a 2f 0a 20 20 20 20  ges (N). */.    
4010: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4020: 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76 61  onfig.pPage = va
4030: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
4040: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4050: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67  obalConfig.szPag
4060: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
4070: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
4080: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
4090: 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70  Page = va_arg(ap
40a0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
40b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
40c0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
40d0: 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 3a 20  G_PCACHE_HDRSZ: 
40e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
40f0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 39 31 30 30 2d  NCE-OF: R-39100-
4100: 32 37 33 31 37 20 54 68 65 20 53 51 4c 49 54 45  27317 The SQLITE
4110: 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f 48  _CONFIG_PCACHE_H
4120: 44 52 53 5a 20 6f 70 74 69 6f 6e 20 74 61 6b 65  DRSZ option take
4130: 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e  s.      ** a sin
4140: 67 6c 65 20 70 61 72 61 6d 65 74 65 72 20 77 68  gle parameter wh
4150: 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ich is a pointer
4160: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61   to an integer a
4170: 6e 64 20 77 72 69 74 65 73 20 69 6e 74 6f 0a 20  nd writes into. 
4180: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 6e 74       ** that int
4190: 65 67 65 72 20 74 68 65 20 6e 75 6d 62 65 72 20  eger the number 
41a0: 6f 66 20 65 78 74 72 61 20 62 79 74 65 73 20 70  of extra bytes p
41b0: 65 72 20 70 61 67 65 20 72 65 71 75 69 72 65 64  er page required
41c0: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 0a 20   for each page. 
41d0: 20 20 20 20 20 2a 2a 20 69 6e 20 53 51 4c 49 54       ** in SQLIT
41e0: 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43  E_CONFIG_PAGECAC
41f0: 48 45 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61  HE. */.      *va
4200: 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 20 3d  _arg(ap, int*) =
4210: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
4220: 74 65 33 48 65 61 64 65 72 53 69 7a 65 42 74 72  te3HeaderSizeBtr
4230: 65 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20 20  ee() +.         
4240: 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53 69   sqlite3HeaderSi
4250: 7a 65 50 63 61 63 68 65 28 29 20 2b 0a 20 20 20  zePcache() +.   
4260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 65         sqlite3He
4270: 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 31 28  aderSizePcache1(
4280: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4290: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
42a0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43  SQLITE_CONFIG_PC
42b0: 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ACHE: {.      /*
42c0: 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20   no-op */.      
42d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
42e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
42f0: 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20 7b  FIG_GETPCACHE: {
4300: 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 6e  .      /* now an
4310: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
4320: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
4330: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
4340: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
4350: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43  SQLITE_CONFIG_PC
4360: 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f  ACHE2: {.      /
4370: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
4380: 2d 36 33 33 32 35 2d 34 38 33 37 38 20 54 68 65  -63325-48378 The
4390: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
43a0: 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74 61  CACHE2 option ta
43b0: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
43c0: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
43d0: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
43e0: 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
43f0: 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a  pcache_methods2.
4400: 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e        ** object.
4410: 20 54 68 69 73 20 6f 62 6a 65 63 74 20 73 70 65   This object spe
4420: 63 69 66 69 65 73 20 74 68 65 20 69 6e 74 65 72  cifies the inter
4430: 66 61 63 65 20 74 6f 20 61 20 63 75 73 74 6f 6d  face to a custom
4440: 20 70 61 67 65 20 63 61 63 68 65 0a 20 20 20 20   page cache.    
4450: 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74    ** implementat
4460: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ion. */.      sq
4470: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4480: 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61 5f  g.pcache2 = *va_
4490: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
44a0: 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a  pcache_methods2*
44b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
44c0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
44d0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
44e0: 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20  PCACHE2: {.     
44f0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
4500: 20 52 2d 32 32 30 33 35 2d 34 36 31 38 32 20 54   R-22035-46182 T
4510: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
4520: 5f 47 45 54 50 43 41 43 48 45 32 20 6f 70 74 69  _GETPCACHE2 opti
4530: 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20  on takes a.     
4540: 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d   ** single argum
4550: 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20 70  ent which is a p
4560: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
4570: 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68  ite3_pcache_meth
4580: 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f 62  ods2.      ** ob
4590: 6a 65 63 74 2e 20 53 51 4c 69 74 65 20 63 6f 70  ject. SQLite cop
45a0: 69 65 73 20 6f 66 20 74 68 65 20 63 75 72 72 65  ies of the curre
45b0: 6e 74 20 70 61 67 65 20 63 61 63 68 65 20 69 6d  nt page cache im
45c0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74  plementation int
45d0: 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  o.      ** that 
45e0: 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20 20  object. */.     
45f0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
4600: 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32  alConfig.pcache2
4610: 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  .xInit==0 ){.   
4620: 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63       sqlite3PCac
4630: 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a  heSetDefault();.
4640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 76        }.      *v
4650: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
4660: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
4670: 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  2*) = sqlite3Glo
4680: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
4690: 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  2;.      break;.
46a0: 20 20 20 20 7d 0a 0a 2f 2a 20 45 56 49 44 45 4e      }../* EVIDEN
46b0: 43 45 2d 4f 46 3a 20 52 2d 30 36 36 32 36 2d 31  CE-OF: R-06626-1
46c0: 32 39 31 31 20 54 68 65 20 53 51 4c 49 54 45 5f  2911 The SQLITE_
46d0: 43 4f 4e 46 49 47 5f 48 45 41 50 20 6f 70 74 69  CONFIG_HEAP opti
46e0: 6f 6e 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61 76  on is only.** av
46f0: 61 69 6c 61 62 6c 65 20 69 66 20 53 51 4c 69 74  ailable if SQLit
4700: 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  e is compiled wi
4710: 74 68 20 65 69 74 68 65 72 20 53 51 4c 49 54 45  th either SQLITE
4720: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20  _ENABLE_MEMSYS3 
4730: 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41  or.** SQLITE_ENA
4740: 42 4c 45 5f 4d 45 4d 53 59 53 35 20 61 6e 64 20  BLE_MEMSYS5 and 
4750: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45  returns SQLITE_E
4760: 52 52 4f 52 20 69 66 20 69 6e 76 6f 6b 65 64 20  RROR if invoked 
4770: 6f 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 23 69  otherwise. */.#i
4780: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4790: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29  _ENABLE_MEMSYS3)
47a0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
47b0: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53  TE_ENABLE_MEMSYS
47c0: 35 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  5).    case SQLI
47d0: 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20  TE_CONFIG_HEAP: 
47e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
47f0: 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 38 35 34 2d  NCE-OF: R-19854-
4800: 34 32 31 32 36 20 54 68 65 72 65 20 61 72 65 20  42126 There are 
4810: 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20  three arguments 
4820: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  to.      ** SQLI
4830: 54 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20  TE_CONFIG_HEAP: 
4840: 41 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  An 8-byte aligne
4850: 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  d pointer to the
4860: 20 6d 65 6d 6f 72 79 2c 20 74 68 65 0a 20 20 20   memory, the.   
4870: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
4880: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 65 6d  bytes in the mem
4890: 6f 72 79 20 62 75 66 66 65 72 2c 20 61 6e 64 20  ory buffer, and 
48a0: 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f  the minimum allo
48b0: 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 20 20 20  cation size..   
48c0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
48d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
48e0: 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61  pHeap = va_arg(a
48f0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
4900: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4910: 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f  nfig.nHeap = va_
4920: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
4930: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4940: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
4950: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
4960: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
4970: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4980: 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20 20  mnReq<1 ){.     
4990: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
49a0: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31  Config.mnReq = 1
49b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
49c0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
49d0: 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c  onfig.mnReq>(1<<
49e0: 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  12) ){.        /
49f0: 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65 73  * cap min reques
4a00: 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20 2a  t size at 2^12 *
4a10: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
4a20: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
4a30: 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20  Req = (1<<12);. 
4a40: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
4a50: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
4a60: 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20 29  onfig.pHeap==0 )
4a70: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
4a80: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 39 32  DENCE-OF: R-4992
4a90: 30 2d 36 30 31 38 39 20 49 66 20 74 68 65 20 66  0-60189 If the f
4aa0: 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28 74 68  irst pointer (th
4ab0: 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72  e memory pointer
4ac0: 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20  ).        ** is 
4ad0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c 69 74  NULL, then SQLit
4ae0: 65 20 72 65 76 65 72 74 73 20 74 6f 20 75 73 69  e reverts to usi
4af0: 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74 20 6d  ng its default m
4b00: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 0a  emory allocator.
4b10: 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20          ** (the 
4b20: 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28 29 20  system malloc() 
4b30: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 2c  implementation),
4b40: 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70 72 69   undoing any pri
4b50: 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  or invocation of
4b60: 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  .        ** SQLI
4b70: 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43  TE_CONFIG_MALLOC
4b80: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
4b90: 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e 67 20       ** Setting 
4ba0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4bb0: 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65 72  fig.m to all zer
4bc0: 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20 6d 61  os will cause ma
4bd0: 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20 20 20  lloc to.        
4be0: 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69 74 73  ** revert to its
4bf0: 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65   default impleme
4c00: 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c  ntation when sql
4c10: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
4c20: 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20 20 20  ) is run.       
4c30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   */.        mems
4c40: 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62 61  et(&sqlite3Globa
4c50: 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69  lConfig.m, 0, si
4c60: 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f 62  zeof(sqlite3Glob
4c70: 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20  alConfig.m));.  
4c80: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4c90: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
4ca0: 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39 31 38  F: R-61006-08918
4cb0: 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 70   If the memory p
4cc0: 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55  ointer is not NU
4cd0: 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  LL then the.    
4ce0: 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61 74 69      ** alternati
4cf0: 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ve memory alloca
4d00: 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64 20 74  tor is engaged t
4d10: 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f 66 20  o handle all of 
4d20: 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20 20 20  SQLites.        
4d30: 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ** memory alloca
4d40: 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a 23  tion needs. */.#
4d50: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
4d60: 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20  BLE_MEMSYS3.    
4d70: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4d80: 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c  lConfig.m = *sql
4d90: 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73  ite3MemGetMemsys
4da0: 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  3();.#endif.#ifd
4db0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
4dc0: 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20 20  _MEMSYS5.       
4dd0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4de0: 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65  nfig.m = *sqlite
4df0: 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28 29  3MemGetMemsys5()
4e00: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
4e10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4e20: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
4e30: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
4e40: 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a  IG_LOOKASIDE: {.
4e50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4e60: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b  balConfig.szLook
4e70: 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61  aside = va_arg(a
4e80: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  p, int);.      s
4e90: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4ea0: 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  ig.nLookaside = 
4eb0: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
4ec0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4ed0: 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20    }.    .    /* 
4ee0: 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72  Record a pointer
4ef0: 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20 66   to the logger f
4f00: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74 73 20  unction and its 
4f10: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
4f20: 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75      ** The defau
4f30: 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67  lt is NULL.  Log
4f40: 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64  ging is disabled
4f50: 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   if the function
4f60: 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20 20   pointer is.    
4f70: 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a  ** NULL..    */.
4f80: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4f90: 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20  CONFIG_LOG: {.  
4fa0: 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70      /* MSVC is p
4fb0: 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69  icky about pulli
4fc0: 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f  ng func ptrs fro
4fd0: 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20  m va lists..    
4fe0: 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70    ** http://supp
4ff0: 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f  ort.microsoft.co
5000: 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20  m/kb/47961.     
5010: 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   ** sqlite3Globa
5020: 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76  lConfig.xLog = v
5030: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28 2a  a_arg(ap, void(*
5040: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
5050: 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20  t char*));.     
5060: 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65   */.      typede
5070: 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f  f void(*LOGFUNC_
5080: 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  t)(void*,int,con
5090: 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  st char*);.     
50a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
50b0: 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61  nfig.xLog = va_a
50c0: 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74  rg(ap, LOGFUNC_t
50d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
50e0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f  GlobalConfig.pLo
50f0: 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70  gArg = va_arg(ap
5100: 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
5110: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
5120: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
5130: 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31 37 20  : R-55548-33817 
5140: 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  The compile-time
5150: 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55 52 49   setting for URI
5160: 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20 20 2a   filenames.    *
5170: 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64  * can be changed
5180: 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20 75   at start-time u
5190: 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20  sing the.    ** 
51a0: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
51b0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49  QLITE_CONFIG_URI
51c0: 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  ,1) or.    ** sq
51d0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
51e0: 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 30  ITE_CONFIG_URI,0
51f0: 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  ) configuration 
5200: 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  calls..    */.  
5210: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5220: 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20 20  NFIG_URI: {.    
5230: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
5240: 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32 35 20  : R-25451-61125 
5250: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
5260: 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74 61 6b  G_URI option tak
5270: 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20 20 20  es a single.    
5280: 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6f 66    ** argument of
5290: 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20 6e 6f   type int. If no
52a0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52 49  n-zero, then URI
52b0: 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c 6f   handling is glo
52c0: 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 65  bally.      ** e
52d0: 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65 20 70  nabled. If the p
52e0: 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72 6f  arameter is zero
52f0: 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64 6c  , then URI handl
5300: 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a  ing is globally.
5310: 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
5320: 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  d. */.      sqli
5330: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
5340: 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61 72  bOpenUri = va_ar
5350: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
5360: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
5370: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5380: 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f  CONFIG_COVERING_
5390: 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20 20  INDEX_SCAN: {.  
53a0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
53b0: 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32 37 37  OF: R-36592-0277
53c0: 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  2 The SQLITE_CON
53d0: 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44  FIG_COVERING_IND
53e0: 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20 2a 2a  EX_SCAN.      **
53f0: 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 20   option takes a 
5400: 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 61  single integer a
5410: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
5420: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
5430: 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f 6c 65  a.      ** boole
5440: 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 65  an in order to e
5450: 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
5460: 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f 76 65   the use of cove
5470: 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66 6f 72  ring indices for
5480: 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 20 74  .      ** full t
5490: 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20 74 68  able scans in th
54a0: 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65  e query optimize
54b0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
54c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
54d0: 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61 72 67  bUseCis = va_arg
54e0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
54f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
5500: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
5510: 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 63  BLE_SQLLOG.    c
5520: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
5530: 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20 20  G_SQLLOG: {.    
5540: 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28 2a    typedef void(*
5550: 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f  SQLLOGFUNC_t)(vo
5560: 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63  id*, sqlite3*, c
5570: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29  onst char*, int)
5580: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
5590: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
55a0: 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  log = va_arg(ap,
55b0: 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a   SQLLOGFUNC_t);.
55c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
55d0: 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
55e0: 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70  gArg = va_arg(ap
55f0: 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20 20 20  , void *);.     
5600: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
5610: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
5620: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41  QLITE_CONFIG_MMA
5630: 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  P_SIZE: {.      
5640: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
5650: 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20 53 51  R-58063-38258 SQ
5660: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50  LITE_CONFIG_MMAP
5670: 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77 6f 20  _SIZE takes two 
5680: 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  64-bit.      ** 
5690: 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74 65 33  integer (sqlite3
56a0: 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73 20 74  _int64) values t
56b0: 68 61 74 20 61 72 65 20 74 68 65 20 64 65 66 61  hat are the defa
56c0: 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69  ult mmap size li
56d0: 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68  mit.      ** (th
56e0: 65 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e  e default settin
56f0: 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d 6d 61  g for PRAGMA mma
5700: 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68 65 20  p_size) and the 
5710: 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 0a  maximum allowed.
5720: 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20 73 69        ** mmap si
5730: 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20 20  ze limit. */.   
5740: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
5750: 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67   szMmap = va_arg
5760: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  (ap, sqlite3_int
5770: 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  64);.      sqlit
5780: 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61 70 20  e3_int64 mxMmap 
5790: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
57a0: 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20  ite3_int64);.   
57b0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
57c0: 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31 39 30  F: R-53367-43190
57d0: 20 49 66 20 65 69 74 68 65 72 20 61 72 67 75 6d   If either argum
57e0: 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70 74 69  ent to this opti
57f0: 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e  on is.      ** n
5800: 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68  egative, then th
5810: 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 63  at argument is c
5820: 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20 63 6f  hanged to its co
5830: 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61 75  mpile-time defau
5840: 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  lt..      **.   
5850: 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
5860: 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30 33 31  F: R-34993-45031
5870: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   The maximum all
5880: 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65 20 77  owed mmap size w
5890: 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ill be.      ** 
58a0: 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63 61 74  silently truncat
58b0: 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  ed if necessary 
58c0: 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  so that it does 
58d0: 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65 0a 20  not exceed the. 
58e0: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d       ** compile-
58f0: 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d 6d 61  time maximum mma
5900: 70 20 73 69 7a 65 20 73 65 74 20 62 79 20 74 68  p size set by th
5910: 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  e SQLITE_MAX_MMA
5920: 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a 2a 20  P_SIZE.      ** 
5930: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
5940: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
5950: 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70 3c 30      if( mxMmap<0
5960: 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c 49 54   || mxMmap>SQLIT
5970: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 20  E_MAX_MMAP_SIZE 
5980: 29 7b 0a 20 20 20 20 20 20 20 20 6d 78 4d 6d 61  ){.        mxMma
5990: 70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  p = SQLITE_MAX_M
59a0: 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  MAP_SIZE;.      
59b0: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 6d  }.      if( szMm
59c0: 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d 20  ap<0 ) szMmap = 
59d0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d  SQLITE_DEFAULT_M
59e0: 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  MAP_SIZE;.      
59f0: 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d 61  if( szMmap>mxMma
5a00: 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d 6d  p) szMmap = mxMm
5a10: 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ap;.      sqlite
5a20: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78  3GlobalConfig.mx
5a30: 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20  Mmap = mxMmap;. 
5a40: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
5a50: 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 20  alConfig.szMmap 
5a60: 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20  = szMmap;.      
5a70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
5a80: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20  f SQLITE_OS_WIN 
5a90: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
5aa0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29 20  E_WIN32_MALLOC) 
5ab0: 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30 2d  /* IMP: R-04780-
5ac0: 35 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61 73  55815 */.    cas
5ad0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
5ae0: 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a 20  WIN32_HEAPSIZE: 
5af0: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
5b00: 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36 2d  NCE-OF: R-34926-
5b10: 30 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f 4e  03360 SQLITE_CON
5b20: 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53 49  FIG_WIN32_HEAPSI
5b30: 5a 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62 69  ZE takes a 32-bi
5b40: 74 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69 67  t.      ** unsig
5b50: 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c 75  ned integer valu
5b60: 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73  e that specifies
5b70: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   the maximum siz
5b80: 65 20 6f 66 20 74 68 65 20 63 72 65 61 74 65 64  e of the created
5b90: 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e 20  .      ** heap. 
5ba0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
5bb0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65  GlobalConfig.nHe
5bc0: 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
5bd0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
5be0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
5bf0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5c00: 5f 43 4f 4e 46 49 47 5f 50 4d 41 53 5a 3a 20 7b  _CONFIG_PMASZ: {
5c10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
5c20: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d 61  obalConfig.szPma
5c30: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e   = va_arg(ap, un
5c40: 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20  signed int);.   
5c50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5c60: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
5c70: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
5c80: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  E_ERROR;.      b
5c90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
5ca0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
5cb0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5cc0: 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c  .** Set up the l
5cd0: 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72 73  ookaside buffers
5ce0: 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
5cf0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52  connection..** R
5d00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
5d10: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a  on success.  .**
5d20: 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73   If lookaside is
5d30: 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c   already active,
5d40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
5d50: 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  USY..**.** The s
5d60: 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  z parameter is t
5d70: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
5d80: 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61  es in each looka
5d90: 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68  side slot..** Th
5da0: 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20  e cnt parameter 
5db0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
5dc0: 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61   slots.  If pSta
5dd0: 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a  rt is NULL the.*
5de0: 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  * space for the 
5df0: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
5e00: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
5e10: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
5e20: 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74  ()..** If pStart
5e30: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
5e40: 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62  n it is sz*cnt b
5e50: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74  ytes of memory t
5e60: 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65  o use for.** the
5e70: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
5e80: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
5e90: 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
5ea0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69  sqlite3 *db, voi
5eb0: 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c  d *pBuf, int sz,
5ec0: 20 69 6e 74 20 63 6e 74 29 7b 0a 23 69 66 6e 64   int cnt){.#ifnd
5ed0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
5ee0: 4f 4f 4b 41 53 49 44 45 0a 20 20 76 6f 69 64 20  OOKASIDE.  void 
5ef0: 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64  *pStart;.  if( d
5f00: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75  b->lookaside.nOu
5f10: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
5f20: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
5f30: 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65  .  /* Free any e
5f40: 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64  xisting lookasid
5f50: 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 68 69  e buffer for thi
5f60: 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a  s handle before.
5f70: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20    ** allocating 
5f80: 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20  a new one so we 
5f90: 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61  don't have to ha
5fa0: 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20  ve space for .  
5fb0: 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65 20 73  ** both at the s
5fc0: 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20  ame time..  */. 
5fd0: 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   if( db->lookasi
5fe0: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a  de.bMalloced ){.
5ff0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
6000: 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70  (db->lookaside.p
6010: 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Start);.  }.  /*
6020: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c   The size of a l
6030: 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20 61 66  ookaside slot af
6040: 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20 6e  ter ROUNDDOWN8 n
6050: 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65  eeds to be large
6060: 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20 70 6f  r.  ** than a po
6070: 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73 65 66  inter to be usef
6080: 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d 20  ul..  */.  sz = 
6090: 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20  ROUNDDOWN8(sz); 
60a0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38   /* IMP: R-33038
60b0: 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66 28 20  -09382 */.  if( 
60c0: 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28  sz<=(int)sizeof(
60d0: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20  LookasideSlot*) 
60e0: 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  ) sz = 0;.  if( 
60f0: 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b  cnt<0 ) cnt = 0;
6100: 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20  .  if( sz==0 || 
6110: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a  cnt==0 ){.    sz
6120: 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
6130: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
6140: 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pBuf==0 ){.   
6150: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
6160: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
6170: 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   pStart = sqlite
6180: 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20  3Malloc( sz*cnt 
6190: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31  );  /* IMP: R-61
61a0: 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20  949-35727 */.   
61b0: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
61c0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69  nMalloc();.    i
61d0: 66 28 20 70 53 74 61 72 74 20 29 20 63 6e 74 20  f( pStart ) cnt 
61e0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  = sqlite3MallocS
61f0: 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a 3b 0a  ize(pStart)/sz;.
6200: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74    }else{.    pSt
6210: 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a  art = pBuf;.  }.
6220: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6230: 70 53 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b  pStart = pStart;
6240: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
6250: 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62  .pFree = 0;.  db
6260: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d  ->lookaside.sz =
6270: 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20   (u16)sz;.  if( 
6280: 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e  pStart ){.    in
6290: 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69  t i;.    Lookasi
62a0: 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61  deSlot *p;.    a
62b0: 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74  ssert( sz > (int
62c0: 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64  )sizeof(Lookasid
62d0: 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70  eSlot*) );.    p
62e0: 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f   = (LookasideSlo
62f0: 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66  t*)pStart;.    f
6300: 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30  or(i=cnt-1; i>=0
6310: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d  ; i--){.      p-
6320: 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f  >pNext = db->loo
6330: 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20  kaside.pFree;.  
6340: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
6350: 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20  e.pFree = p;.   
6360: 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64     p = (Lookasid
6370: 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29  eSlot*)&((u8*)p)
6380: 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [sz];.    }.    
6390: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45  db->lookaside.pE
63a0: 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e  nd = p;.    db->
63b0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
63c0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e  ed = 1;.    db->
63d0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
63e0: 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31  ced = pBuf==0 ?1
63f0: 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  :0;.  }else{.   
6400: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
6410: 53 74 61 72 74 20 3d 20 64 62 3b 0a 20 20 20 20  Start = db;.    
6420: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45  db->lookaside.pE
6430: 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d  nd = db;.    db-
6440: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
6450: 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  led = 0;.    db-
6460: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
6470: 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  oced = 0;.  }.#e
6480: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
6490: 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 20 2a 2f  MIT_LOOKASIDE */
64a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
64b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
64c0: 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20 61  turn the mutex a
64d0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
64e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
64f0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  tion..*/.sqlite3
6500: 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33 5f  _mutex *sqlite3_
6510: 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65 33  db_mutex(sqlite3
6520: 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
6530: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
6540: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
6550: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
6560: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
6570: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
6580: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
6590: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
65a0: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d 75 74    return db->mut
65b0: 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ex;.}../*.** Fre
65c0: 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d 65 6d  e up as much mem
65d0: 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20 66 72  ory as we can fr
65e0: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  om the given dat
65f0: 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
6600: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
6610: 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d  te3_db_release_m
6620: 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20 2a 64  emory(sqlite3 *d
6630: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  b){.  int i;..#i
6640: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6650: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
6660: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
6670: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
6680: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
6690: 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
66a0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
66b0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
66c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
66d0: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
66e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
66f0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
6700: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
6710: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
6720: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
6730: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
6740: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
6750: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73  er(pBt);.      s
6760: 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
6770: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
6780: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
6790: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
67a0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
67b0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
67c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
67d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
67e0: 46 6c 75 73 68 20 61 6e 79 20 64 69 72 74 79 20  Flush any dirty 
67f0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
6800: 65 72 2d 63 61 63 68 65 20 66 6f 72 20 61 6e 79  er-cache for any
6810: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
6820: 73 65 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a  se.** to disk..*
6830: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
6840: 5f 63 61 63 68 65 66 6c 75 73 68 28 73 71 6c 69  _cacheflush(sqli
6850: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
6860: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  i;.  int rc = SQ
6870: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 62  LITE_OK;.  int b
6880: 53 65 65 6e 42 75 73 79 20 3d 20 30 3b 0a 0a 23  SeenBusy = 0;..#
6890: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
68a0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
68b0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
68c0: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
68d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
68e0: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
68f0: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
6900: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
6910: 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  x);.  sqlite3Btr
6920: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
6930: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
6940: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
6950: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
6960: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
6970: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
6980: 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c    if( pBt && sql
6990: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
69a0: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
69b0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
69c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
69d0: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  er(pBt);.      r
69e0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
69f0: 46 6c 75 73 68 28 70 50 61 67 65 72 29 3b 0a 20  Flush(pPager);. 
6a00: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
6a10: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
6a20: 20 20 20 20 62 53 65 65 6e 42 75 73 79 20 3d 20      bSeenBusy = 
6a30: 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  1;.        rc = 
6a40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
6a50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
6a60: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
6a70: 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  All(db);.  sqlit
6a80: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
6a90: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
6aa0: 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45  urn ((rc==SQLITE
6ab0: 5f 4f 4b 20 26 26 20 62 53 65 65 6e 42 75 73 79  _OK && bSeenBusy
6ac0: 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ) ? SQLITE_BUSY 
6ad0: 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
6ae0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  Configuration se
6af0: 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e  ttings for an in
6b00: 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73  dividual databas
6b10: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a  e connection.*/.
6b20: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  int sqlite3_db_c
6b30: 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64  onfig(sqlite3 *d
6b40: 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  b, int op, ...){
6b50: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
6b60: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74   int rc;.  va_st
6b70: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
6b80: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
6b90: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
6ba0: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
6bb0: 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
6bc0: 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Buf = va_arg(ap,
6bd0: 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a   void*); /* IMP:
6be0: 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a   R-26835-10964 *
6bf0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  /.      int sz =
6c00: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
6c10: 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  ;       /* IMP: 
6c20: 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f  R-47871-25994 */
6c30: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
6c40: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
6c50: 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ;      /* IMP: R
6c60: 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a  -04460-53386 */.
6c70: 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75 70        rc = setup
6c80: 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42  Lookaside(db, pB
6c90: 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20  uf, sz, cnt);.  
6ca0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6cb0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
6cc0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
6cd0: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
6ce0: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
6cf0: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a   /* The opcode *
6d00: 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d 61  /.        u32 ma
6d10: 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  sk;    /* Mask o
6d20: 66 20 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c  f the bit in sql
6d30: 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65  ite3.flags to se
6d40: 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20  t/clear */.     
6d50: 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b   } aFlagOp[] = {
6d60: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
6d70: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
6d80: 45 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54  E_FKEY,    SQLIT
6d90: 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20  E_ForeignKeys   
6da0: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
6db0: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
6dc0: 41 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51  ABLE_TRIGGER, SQ
6dd0: 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67  LITE_EnableTrigg
6de0: 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  er  },.      };.
6df0: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
6e00: 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt i;.      rc =
6e10: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
6e20: 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32  * IMP: R-42790-2
6e30: 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f  3372 */.      fo
6e40: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
6e50: 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b  ze(aFlagOp); i++
6e60: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
6e70: 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70  FlagOp[i].op==op
6e80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
6e90: 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67  t onoff = va_arg
6ea0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
6eb0: 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d       int *pRes =
6ec0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
6ed0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
6ee0: 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e   oldFlags = db->
6ef0: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
6f00: 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a   if( onoff>0 ){.
6f10: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
6f20: 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70  flags |= aFlagOp
6f30: 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  [i].mask;.      
6f40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
6f50: 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  off==0 ){.      
6f60: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
6f70: 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  &= ~aFlagOp[i].m
6f80: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ask;.          }
6f90: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
6fa0: 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61  ldFlags!=db->fla
6fb0: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gs ){.          
6fc0: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
6fd0: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
6fe0: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
6ff0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
7000: 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20   pRes ){.       
7010: 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62       *pRes = (db
7020: 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f  ->flags & aFlagO
7030: 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20  p[i].mask)!=0;. 
7040: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7050: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
7060: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  _OK;.          b
7070: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
7080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
7090: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
70a0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
70b0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
70c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
70d0: 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b  if the buffer z[
70e0: 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  0..n-1] contains
70f0: 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a   all spaces..*/.
7100: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70  static int allSp
7110: 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20  aces(const char 
7120: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68  *z, int n){.  wh
7130: 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
7140: 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20  1]==' ' ){ n--; 
7150: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b  }.  return n==0;
7160: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
7170: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  s the default co
7180: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
7190: 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20   named "BINARY" 
71a0: 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a  which is always.
71b0: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ** available..**
71c0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c  .** If the padFl
71d0: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ag argument is n
71e0: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61  ot NULL then spa
71f0: 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68  ce padding at th
7200: 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69  e end.** of stri
7210: 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ngs is ignored. 
7220: 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73   This implements
7230: 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61   the RTRIM colla
7240: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
7250: 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28  int binCollFunc(
7260: 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67  .  void *padFlag
7270: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
7280: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
7290: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
72a0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
72b0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b  .){.  int rc, n;
72c0: 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65  .  n = nKey1<nKe
72d0: 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65  y2 ? nKey1 : nKe
72e0: 79 32 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  y2;.  /* EVIDENC
72f0: 45 2d 4f 46 3a 20 52 2d 36 35 30 33 33 2d 32 38  E-OF: R-65033-28
7300: 34 34 39 20 54 68 65 20 62 75 69 6c 74 2d 69 6e  449 The built-in
7310: 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f   BINARY collatio
7320: 6e 20 63 6f 6d 70 61 72 65 73 0a 20 20 2a 2a 20  n compares.  ** 
7330: 73 74 72 69 6e 67 73 20 62 79 74 65 20 62 79 20  strings byte by 
7340: 62 79 74 65 20 75 73 69 6e 67 20 74 68 65 20 6d  byte using the m
7350: 65 6d 63 6d 70 28 29 20 66 75 6e 63 74 69 6f 6e  emcmp() function
7360: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
7370: 72 64 20 43 0a 20 20 2a 2a 20 6c 69 62 72 61 72  rd C.  ** librar
7380: 79 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6d 65 6d  y. */.  rc = mem
7390: 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32  cmp(pKey1, pKey2
73a0: 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , n);.  if( rc==
73b0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64  0 ){.    if( pad
73c0: 46 6c 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c  Flag.     && all
73d0: 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70  Spaces(((char*)p
73e0: 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e  Key1)+n, nKey1-n
73f0: 29 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61  ).     && allSpa
7400: 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79  ces(((char*)pKey
7410: 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20  2)+n, nKey2-n). 
7420: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45     ){.      /* E
7430: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31  VIDENCE-OF: R-31
7440: 36 32 34 2d 32 34 37 33 37 20 52 54 52 49 4d 20  624-24737 RTRIM 
7450: 69 73 20 6c 69 6b 65 20 42 49 4e 41 52 59 20 65  is like BINARY e
7460: 78 63 65 70 74 20 74 68 61 74 20 65 78 74 72 61  xcept that extra
7470: 0a 20 20 20 20 20 20 2a 2a 20 73 70 61 63 65 73  .      ** spaces
7480: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
7490: 69 74 68 65 72 20 73 74 72 69 6e 67 20 64 6f 20  ither string do 
74a0: 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 72  not change the r
74b0: 65 73 75 6c 74 2e 20 49 6e 20 6f 74 68 65 72 0a  esult. In other.
74c0: 20 20 20 20 20 20 2a 2a 20 77 6f 72 64 73 2c 20        ** words, 
74d0: 73 74 72 69 6e 67 73 20 77 69 6c 6c 20 63 6f 6d  strings will com
74e0: 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 6f 6e  pare equal to on
74f0: 65 20 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f 6e  e another as lon
7500: 67 20 61 73 20 74 68 65 79 0a 20 20 20 20 20 20  g as they.      
7510: 2a 2a 20 64 69 66 66 65 72 20 6f 6e 6c 79 20 69  ** differ only i
7520: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
7530: 73 70 61 63 65 73 20 61 74 20 74 68 65 20 65 6e  spaces at the en
7540: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
7550: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
7560: 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b  = nKey1 - nKey2;
7570: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
7580: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7590: 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69   Another built-i
75a0: 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  n collating sequ
75b0: 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a  ence: NOCASE. .*
75c0: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74  *.** This collat
75d0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
75e0: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
75f0: 73 65 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e  sed for "case in
7600: 64 65 70 65 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d  dependent.** com
7610: 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65  parison". SQLite
7620: 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20  's knowledge of 
7630: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
7640: 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73  case equivalents
7650: 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79  .** extends only
7660: 20 74 6f 20 74 68 65 20 32 36 20 63 68 61 72 61   to the 26 chara
7670: 63 74 65 72 73 20 75 73 65 64 20 69 6e 20 74 68  cters used in th
7680: 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  e English langua
7690: 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65  ge..**.** At the
76a0: 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73   moment there is
76b0: 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d   only a UTF-8 im
76c0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f  plementation..*/
76d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61  .static int noca
76e0: 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28  seCollatingFunc(
76f0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
7700: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
7710: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
7720: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
7730: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
7740: 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71  .){.  int r = sq
7750: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20  lite3StrNICmp(. 
7760: 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72       (const char
7770: 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74   *)pKey1, (const
7780: 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28   char *)pKey2, (
7790: 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65  nKey1<nKey2)?nKe
77a0: 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55  y1:nKey2);.  UNU
77b0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
77c0: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d  tUsed);.  if( 0=
77d0: 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b  =r ){.    r = nK
77e0: 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20  ey1-nKey2;.  }. 
77f0: 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a   return r;.}../*
7800: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52  .** Return the R
7810: 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74  OWID of the most
7820: 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a   recent insert.*
7830: 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73  /.sqlite_int64 s
7840: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
7850: 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33  rt_rowid(sqlite3
7860: 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
7870: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
7880: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
7890: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
78a0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
78b0: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
78c0: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
78d0: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
78e0: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73    return db->las
78f0: 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tRowid;.}../*.**
7900: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
7910: 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e  er of changes in
7920: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
7930: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
7940: 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _exec()..*/.int 
7950: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
7960: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
7970: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7980: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
7990: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
79a0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
79b0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
79c0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
79d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
79e0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
79f0: 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a  db->nChange;.}..
7a00: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7a10: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67   number of chang
7a20: 65 73 20 73 69 6e 63 65 20 74 68 65 20 64 61 74  es since the dat
7a30: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73  abase handle was
7a40: 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20   opened..*/.int 
7a50: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
7a60: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
7a70: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
7a80: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
7a90: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
7aa0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
7ab0: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
7ac0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
7ad0: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
7ae0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
7af0: 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c  eturn db->nTotal
7b00: 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
7b10: 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20   Close all open 
7b20: 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69 73  savepoints. This
7b30: 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d   function only m
7b40: 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c 64  anipulates field
7b50: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  s of the.** data
7b60: 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65  base handle obje
7b70: 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ct, it does not 
7b80: 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70 6f  close any savepo
7b90: 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62 65  ints that may be
7ba0: 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20   open.** at the 
7bb0: 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65 76  b-tree/pager lev
7bc0: 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  el..*/.void sqli
7bd0: 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
7be0: 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
7bf0: 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53  .  while( db->pS
7c00: 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
7c10: 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20  Savepoint *pTmp 
7c20: 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74  = db->pSavepoint
7c30: 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70  ;.    db->pSavep
7c40: 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65  oint = pTmp->pNe
7c50: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  xt;.    sqlite3D
7c60: 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b  bFree(db, pTmp);
7c70: 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65  .  }.  db->nSave
7c80: 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  point = 0;.  db-
7c90: 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
7ca0: 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63  .  db->isTransac
7cb0: 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  tionSavepoint = 
7cc0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  0;.}../*.** Invo
7cd0: 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
7ce0: 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63  r function assoc
7cf0: 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63 44  iated with FuncD
7d00: 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45 78  ef p, if any. Ex
7d10: 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73  cept,.** if this
7d20: 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74   is not the last
7d30: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75 6e   copy of the fun
7d40: 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e  ction, do not in
7d50: 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c  voke it. Multipl
7d60: 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 61  e.** copies of a
7d70: 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e   single function
7d80: 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68 65   are created whe
7d90: 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  n create_functio
7da0: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  n() is called.**
7db0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e 59   with SQLITE_ANY
7dc0: 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
7dd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7de0: 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79   functionDestroy
7df0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75  (sqlite3 *db, Fu
7e00: 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e  ncDef *p){.  Fun
7e10: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65  cDestructor *pDe
7e20: 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70 44  structor = p->pD
7e30: 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28  estructor;.  if(
7e40: 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a   pDestructor ){.
7e50: 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d      pDestructor-
7e60: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28  >nRef--;.    if(
7e70: 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52   pDestructor->nR
7e80: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ef==0 ){.      p
7e90: 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73  Destructor->xDes
7ea0: 74 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72  troy(pDestructor
7eb0: 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20  ->pUserData);.  
7ec0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7ed0: 65 28 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f  e(db, pDestructo
7ee0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
7ef0: 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63  ./*.** Disconnec
7f00: 74 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74  t all sqlite3_vt
7f10: 61 62 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20  ab objects that 
7f20: 62 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62 61  belong to databa
7f30: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
7f40: 20 64 62 2e 20 54 68 69 73 20 69 73 20 63 61 6c   db. This is cal
7f50: 6c 65 64 20 77 68 65 6e 20 64 62 20 69 73 20 62  led when db is b
7f60: 65 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  eing closed..*/.
7f70: 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 63  static void disc
7f80: 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 73 71  onnectAllVtab(sq
7f90: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e  lite3 *db){.#ifn
7fa0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7fb0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
7fc0: 6e 74 20 69 3b 0a 20 20 48 61 73 68 45 6c 65 6d  nt i;.  HashElem
7fd0: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   *p;.  sqlite3Bt
7fe0: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
7ff0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
8000: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
8010: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
8020: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53   = db->aDb[i].pS
8030: 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 64  chema;.    if( d
8040: 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d  b->aDb[i].pSchem
8050: 61 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  a ){.      for(p
8060: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
8070: 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  (&pSchema->tblHa
8080: 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65  sh); p; p=sqlite
8090: 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20  HashNext(p)){.  
80a0: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
80b0: 62 20 3d 20 28 54 61 62 6c 65 20 2a 29 73 71 6c  b = (Table *)sql
80c0: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
80d0: 20 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69          if( IsVi
80e0: 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 73 71  rtual(pTab) ) sq
80f0: 6c 69 74 65 33 56 74 61 62 44 69 73 63 6f 6e 6e  lite3VtabDisconn
8100: 65 63 74 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ect(db, pTab);. 
8110: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8120: 0a 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48  .  for(p=sqliteH
8130: 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d  ashFirst(&db->aM
8140: 6f 64 75 6c 65 29 3b 20 70 3b 20 70 3d 73 71 6c  odule); p; p=sql
8150: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
8160: 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f  .    Module *pMo
8170: 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71  d = (Module *)sq
8180: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b  liteHashData(p);
8190: 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70  .    if( pMod->p
81a0: 45 70 6f 54 61 62 20 29 7b 0a 20 20 20 20 20 20  EpoTab ){.      
81b0: 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63 6f  sqlite3VtabDisco
81c0: 6e 6e 65 63 74 28 64 62 2c 20 70 4d 6f 64 2d 3e  nnect(db, pMod->
81d0: 70 45 70 6f 54 61 62 29 3b 0a 20 20 20 20 7d 0a  pEpoTab);.    }.
81e0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61    }.  sqlite3Vta
81f0: 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b  bUnlockList(db);
8200: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
8210: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 23 65 6c  eaveAll(db);.#el
8220: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
8230: 4d 45 54 45 52 28 64 62 29 3b 0a 23 65 6e 64 69  METER(db);.#endi
8240: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
8250: 6e 20 54 52 55 45 20 69 66 20 64 61 74 61 62 61  n TRUE if databa
8260: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
8270: 20 68 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65 64   has unfinalized
8280: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
8290: 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e  tements or unfin
82a0: 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61  ished sqlite3_ba
82b0: 63 6b 75 70 20 6f 62 6a 65 63 74 73 2e 20 20 0a  ckup objects.  .
82c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
82d0: 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 73  nnectionIsBusy(s
82e0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
82f0: 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20  nt j;.  assert( 
8300: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
8310: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
8320: 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65  .  if( db->pVdbe
8330: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66   ) return 1;.  f
8340: 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44  or(j=0; j<db->nD
8350: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; j++){.    Btr
8360: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
8370: 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[j].pBt;.    if
8380: 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33  ( pBt && sqlite3
8390: 42 74 72 65 65 49 73 49 6e 42 61 63 6b 75 70 28  BtreeIsInBackup(
83a0: 70 42 74 29 20 29 20 72 65 74 75 72 6e 20 31 3b  pBt) ) return 1;
83b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
83c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
83d0: 61 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69  an existing SQLi
83e0: 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73  te database.*/.s
83f0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
8400: 33 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a  3Close(sqlite3 *
8410: 64 62 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f 6d  db, int forceZom
8420: 62 69 65 29 7b 0a 20 20 69 66 28 20 21 64 62 20  bie){.  if( !db 
8430: 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
8440: 43 45 2d 4f 46 3a 20 52 2d 36 33 32 35 37 2d 31  CE-OF: R-63257-1
8450: 31 37 34 30 20 43 61 6c 6c 69 6e 67 20 73 71 6c  1740 Calling sql
8460: 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 6f 72 0a  ite3_close() or.
8470: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
8480: 6c 6f 73 65 5f 76 32 28 29 20 77 69 74 68 20 61  lose_v2() with a
8490: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 72   NULL pointer ar
84a0: 67 75 6d 65 6e 74 20 69 73 20 61 20 68 61 72 6d  gument is a harm
84b0: 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  less no-op. */. 
84c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
84d0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
84e0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
84f0: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
8500: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8510: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
8520: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
8530: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
8540: 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72  utex);..  /* For
8550: 63 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 63  ce xDisconnect c
8560: 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74  alls on all virt
8570: 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ual tables */.  
8580: 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61  disconnectAllVta
8590: 62 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  b(db);..  /* If 
85a0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
85b0: 20 6f 70 65 6e 2c 20 74 68 65 20 64 69 73 63 6f   open, the disco
85c0: 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 29 20 63  nnectAllVtab() c
85d0: 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77  all above.  ** w
85e0: 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c  ill not have cal
85f0: 6c 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e  led the xDisconn
8600: 65 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20  ect() method on 
8610: 61 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a  any virtual.  **
8620: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64   tables in the d
8630: 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72  b->aVTrans[] arr
8640: 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ay. The followin
8650: 67 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c  g sqlite3VtabRol
8660: 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c  lback().  ** cal
8670: 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65  l will do so. We
8680: 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73   need to do this
8690: 20 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63   before the chec
86a0: 6b 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a  k for active.  *
86b0: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
86c0: 20 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76   below, as the v
86d0: 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74  -table implement
86e0: 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f  ation may be sto
86f0: 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70  ring.  ** some p
8700: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
8710: 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ts internally.. 
8720: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61   */.  sqlite3Vta
8730: 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a  bRollback(db);..
8740: 20 20 2f 2a 20 4c 65 67 61 63 79 20 62 65 68 61    /* Legacy beha
8750: 76 69 6f 72 20 28 73 71 6c 69 74 65 33 5f 63 6c  vior (sqlite3_cl
8760: 6f 73 65 28 29 20 62 65 68 61 76 69 6f 72 29 20  ose() behavior) 
8770: 69 73 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a  is to return.  *
8780: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66  * SQLITE_BUSY if
8790: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
87a0: 63 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65  can not be close
87b0: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
87c0: 20 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72 63 65   */.  if( !force
87d0: 5a 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65 63  Zombie && connec
87e0: 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29  tionIsBusy(db) )
87f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
8800: 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
8810: 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e 61 62  LITE_BUSY, "unab
8820: 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20  le to close due 
8830: 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22  to unfinalized "
8840: 0a 20 20 20 20 20 20 20 22 73 74 61 74 65 6d 65  .       "stateme
8850: 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65  nts or unfinishe
8860: 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20 20 20  d backups");.   
8870: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
8880: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
8890: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
88a0: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69  TE_BUSY;.  }..#i
88b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
88c0: 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20  LE_SQLLOG.  if( 
88d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
88e0: 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20  fig.xSqllog ){. 
88f0: 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68     /* Closing th
8900: 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68  e handle. Fourth
8910: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61   parameter is pa
8920: 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 32  ssed the value 2
8930: 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
8940: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
8950: 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f 62  llog(sqlite3Glob
8960: 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
8970: 41 72 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a  Arg, db, 0, 2);.
8980: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
8990: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63 6f 6e   Convert the con
89a0: 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a  nection into a z
89b0: 6f 6d 62 69 65 20 61 6e 64 20 74 68 65 6e 20 63  ombie and then c
89c0: 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  lose it..  */.  
89d0: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
89e0: 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b  TE_MAGIC_ZOMBIE;
89f0: 0a 20 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d  .  sqlite3LeaveM
8a00: 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62  utexAndCloseZomb
8a10: 69 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e  ie(db);.  return
8a20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
8a30: 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61 74 69  *.** Two variati
8a40: 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75 62 6c 69  ons on the publi
8a50: 63 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20  c interface for 
8a60: 63 6c 6f 73 69 6e 67 20 61 20 64 61 74 61 62 61  closing a databa
8a70: 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
8a80: 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c  . The sqlite3_cl
8a90: 6f 73 65 28 29 20 76 65 72 73 69 6f 6e 20 72 65  ose() version re
8aa0: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53  turns SQLITE_BUS
8ab0: 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20  Y and.** leaves 
8ac0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
8ad0: 70 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61  ption if there a
8ae0: 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70  re unfinalized p
8af0: 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65  repared.** state
8b00: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
8b10: 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  hed sqlite3_back
8b20: 75 70 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ups.  The sqlite
8b30: 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20  3_close_v2().** 
8b40: 76 65 72 73 69 6f 6e 20 66 6f 72 63 65 73 20 74  version forces t
8b50: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
8b60: 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65   become a zombie
8b70: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
8b80: 20 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75 72   unclosed resour
8b90: 63 65 73 2c 20 61 6e 64 20 61 72 72 61 6e 67 65  ces, and arrange
8ba0: 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69  s for deallocati
8bb0: 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  on when the last
8bc0: 0a 2a 2a 20 70 72 65 70 61 72 65 20 73 74 61 74  .** prepare stat
8bd0: 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74 65 33  ement or sqlite3
8be0: 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a  _backup closes..
8bf0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
8c00: 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lose(sqlite3 *db
8c10: 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  ){ return sqlite
8c20: 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a  3Close(db,0); }.
8c30: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  int sqlite3_clos
8c40: 65 5f 76 32 28 73 71 6c 69 74 65 33 20 2a 64 62  e_v2(sqlite3 *db
8c50: 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  ){ return sqlite
8c60: 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a  3Close(db,1); }.
8c70: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
8c80: 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62  e mutex on datab
8c90: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
8ca0: 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72  b..**.** Further
8cb0: 6d 6f 72 65 2c 20 69 66 20 64 61 74 61 62 61 73  more, if databas
8cc0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  e connection db 
8cd0: 69 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61  is a zombie (mea
8ce0: 6e 69 6e 67 20 74 68 61 74 20 74 68 65 72 65 0a  ning that there.
8cf0: 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 20 70 72  ** has been a pr
8d00: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
8d10: 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72  te3_close(db) or
8d20: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
8d30: 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76  2(db)) and.** ev
8d40: 65 72 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ery sqlite3_stmt
8d50: 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 66 69   has now been fi
8d60: 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65 76 65 72  nalized and ever
8d70: 79 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  y sqlite3_backup
8d80: 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64   has.** finished
8d90: 2c 20 74 68 65 6e 20 66 72 65 65 20 61 6c 6c 20  , then free all 
8da0: 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f  resources..*/.vo
8db0: 69 64 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d  id sqlite3LeaveM
8dc0: 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62  utexAndCloseZomb
8dd0: 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ie(sqlite3 *db){
8de0: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20  .  HashElem *i; 
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e00: 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65     /* Hash table
8e10: 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   iterator */.  i
8e20: 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  nt j;..  /* If t
8e30: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
8e40: 64 69 6e 67 20 73 71 6c 69 74 65 33 5f 73 74 6d  ding sqlite3_stm
8e50: 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63  t or sqlite3_bac
8e60: 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a  kup objects.  **
8e70: 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6e 6e 65   or if the conne
8e80: 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  ction has not ye
8e90: 74 20 62 65 65 6e 20 63 6c 6f 73 65 64 20 62 79  t been closed by
8ea0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
8eb0: 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a  2(),.  ** then j
8ec0: 75 73 74 20 6c 65 61 76 65 20 74 68 65 20 6d 75  ust leave the mu
8ed0: 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  tex and return..
8ee0: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d    */.  if( db->m
8ef0: 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47  agic!=SQLITE_MAG
8f00: 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e  IC_ZOMBIE || con
8f10: 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62  nectionIsBusy(db
8f20: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
8f30: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
8f40: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74  >mutex);.    ret
8f50: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  urn;.  }..  /* I
8f60: 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
8f70: 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
8f80: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
8f90: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  e connection has
8fa0: 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c  .  ** closed all
8fb0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e   sqlite3_stmt an
8fc0: 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  d sqlite3_backup
8fd0: 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 68 61 73   objects and has
8fe0: 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65   been.  ** passe
8ff0: 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f  d to sqlite3_clo
9000: 73 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74  se (meaning that
9010: 20 69 74 20 69 73 20 61 20 7a 6f 6d 62 69 65 29   it is a zombie)
9020: 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 0a 20 20  .  Therefore,.  
9030: 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ** go ahead and 
9040: 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63  free all resourc
9050: 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49  es..  */..  /* I
9060: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
9070: 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74  is open, roll it
9080: 20 62 61 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f   back. This also
9090: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 69 66   ensures that if
90a0: 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74 61 62 61  .  ** any databa
90b0: 73 65 20 73 63 68 65 6d 61 73 20 68 61 76 65 20  se schemas have 
90c0: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 62 79  been modified by
90d0: 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20   an uncommitted 
90e0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
90f0: 20 74 68 65 79 20 61 72 65 20 72 65 73 65 74 2e   they are reset.
9100: 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 72 65   And that the re
9110: 71 75 69 72 65 64 20 62 2d 74 72 65 65 20 6d 75  quired b-tree mu
9120: 74 65 78 20 69 73 20 68 65 6c 64 20 74 6f 20 6d  tex is held to m
9130: 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ake.  ** the pag
9140: 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  er rollback and 
9150: 73 63 68 65 6d 61 20 72 65 73 65 74 20 61 6e 20  schema reset an 
9160: 61 74 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e  atomic operation
9170: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f  . */.  sqlite3Ro
9180: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
9190: 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20  LITE_OK);..  /* 
91a0: 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61 6e  Free any outstan
91b0: 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20 73  ding Savepoint s
91c0: 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20  tructures. */.  
91d0: 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
91e0: 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f  points(db);..  /
91f0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61  * Close all data
9200: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
9210: 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   */.  for(j=0; j
9220: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
9230: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
9240: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d  Db = &db->aDb[j]
9250: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
9260: 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Bt ){.      sqli
9270: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44  te3BtreeClose(pD
9280: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70  b->pBt);.      p
9290: 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20  Db->pBt = 0;.   
92a0: 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20     if( j!=1 ){. 
92b0: 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68         pDb->pSch
92c0: 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ema = 0;.      }
92d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
92e0: 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50 20 73  Clear the TEMP s
92f0: 63 68 65 6d 61 20 73 65 70 61 72 61 74 65 6c 79  chema separately
9300: 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69   and last */.  i
9310: 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  f( db->aDb[1].pS
9320: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c  chema ){.    sql
9330: 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28  ite3SchemaClear(
9340: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
9350: 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ma);.  }.  sqlit
9360: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74  e3VtabUnlockList
9370: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  (db);..  /* Free
9380: 20 75 70 20 74 68 65 20 61 72 72 61 79 20 6f 66   up the array of
9390: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
93a0: 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ases */.  sqlite
93b0: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
93c0: 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20 61 73  eArray(db);.  as
93d0: 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32  sert( db->nDb<=2
93e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
93f0: 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74  ->aDb==db->aDbSt
9400: 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65  atic );..  /* Te
9410: 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e 20 6e  ll the code in n
9420: 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74 68 65  otify.c that the
9430: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c   connection no l
9440: 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a  onger holds any.
9450: 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64    ** locks and d
9460: 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
9470: 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e 6c 6f  any further unlo
9480: 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
9490: 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  cks..  */.  sqli
94a0: 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f  te3ConnectionClo
94b0: 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28  sed(db);..  for(
94c0: 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65  j=0; j<ArraySize
94d0: 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20 6a  (db->aFunc.a); j
94e0: 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  ++){.    FuncDef
94f0: 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73 68 2c   *pNext, *pHash,
9500: 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 64   *p;.    for(p=d
9510: 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70  b->aFunc.a[j]; p
9520: 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20 20 20  ; p=pHash){.    
9530: 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61    pHash = p->pHa
9540: 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  sh;.      while(
9550: 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 66 75   p ){.        fu
9560: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
9570: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  , p);.        pN
9580: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
9590: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
95a0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
95b0: 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b        p = pNext;
95c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
95d0: 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74   }.  for(i=sqlit
95e0: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
95f0: 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d  aCollSeq); i; i=
9600: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
9610: 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  )){.    CollSeq 
9620: 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65  *pColl = (CollSe
9630: 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  q *)sqliteHashDa
9640: 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e  ta(i);.    /* In
9650: 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63  voke any destruc
9660: 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64 20  tors registered 
9670: 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  for collation se
9680: 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74 61  quence user data
9690: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30  . */.    for(j=0
96a0: 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
96b0: 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e     if( pColl[j].
96c0: 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  xDel ){.        
96d0: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43  pColl[j].xDel(pC
96e0: 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20  oll[j].pUser);. 
96f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
9700: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9710: 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, pColl);.  }. 
9720: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
9730: 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  r(&db->aCollSeq)
9740: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
9750: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
9760: 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  LE.  for(i=sqlit
9770: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
9780: 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73  aModule); i; i=s
9790: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
97a0: 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70  ){.    Module *p
97b0: 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29  Mod = (Module *)
97c0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
97d0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d  );.    if( pMod-
97e0: 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20  >xDestroy ){.   
97f0: 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f     pMod->xDestro
9800: 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20  y(pMod->pAux);. 
9810: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
9820: 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62  VtabEponymousTab
9830: 6c 65 43 6c 65 61 72 28 64 62 2c 20 70 4d 6f 64  leClear(db, pMod
9840: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
9850: 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29 3b 0a  Free(db, pMod);.
9860: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73    }.  sqlite3Has
9870: 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64  hClear(&db->aMod
9880: 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ule);.#endif..  
9890: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
98a0: 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 20 2f 2a 20   SQLITE_OK); /* 
98b0: 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20  Deallocates any 
98c0: 63 61 63 68 65 64 20 65 72 72 6f 72 20 73 74 72  cached error str
98d0: 69 6e 67 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  ings. */.  sqlit
98e0: 65 33 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e  e3ValueFree(db->
98f0: 70 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  pErr);.  sqlite3
9900: 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73 28  CloseExtensions(
9910: 64 62 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  db);.#if SQLITE_
9920: 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
9930: 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ION.  sqlite3_fr
9940: 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74  ee(db->auth.zAut
9950: 68 55 73 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  hUser);.  sqlite
9960: 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e  3_free(db->auth.
9970: 7a 41 75 74 68 50 57 29 3b 0a 23 65 6e 64 69 66  zAuthPW);.#endif
9980: 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ..  db->magic = 
9990: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52  SQLITE_MAGIC_ERR
99a0: 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65  OR;..  /* The te
99b0: 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63 68 65  mp-database sche
99c0: 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ma is allocated 
99d0: 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d  differently from
99e0: 20 74 68 65 20 6f 74 68 65 72 20 73 63 68 65 6d   the other schem
99f0: 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28  a.  ** objects (
9a00: 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c  using sqliteMall
9a10: 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c 20 69  oc() directly, i
9a20: 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69 74 65  nstead of sqlite
9a30: 33 42 74 72 65 65 53 63 68 65 6d 61 28 29 29 2e  3BtreeSchema()).
9a40: 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64  .  ** So it need
9a50: 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 68 65  s to be freed he
9a60: 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f  re. Todo: Why no
9a70: 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20  t roll the temp 
9a80: 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a  schema into.  **
9a90: 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69 74 65   the same sqlite
9aa0: 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68 65 20  Malloc() as the 
9ab0: 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63 61 74  one that allocat
9ac0: 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
9ad0: 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 3f  .  ** structure?
9ae0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
9af0: 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44  bFree(db, db->aD
9b00: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20  b[1].pSchema);. 
9b10: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
9b20: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
9b30: 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
9b40: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53  QLITE_MAGIC_CLOS
9b50: 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ED;.  sqlite3_mu
9b60: 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74  tex_free(db->mut
9b70: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ex);.  assert( d
9b80: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75  b->lookaside.nOu
9b90: 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46 61 69 6c  t==0 );  /* Fail
9ba0: 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69 64 65  s on a lookaside
9bb0: 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 2a 2f 0a   memory leak */.
9bc0: 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73    if( db->lookas
9bd0: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b  ide.bMalloced ){
9be0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
9bf0: 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  e(db->lookaside.
9c00: 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 73  pStart);.  }.  s
9c10: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b  qlite3_free(db);
9c20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
9c30: 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20  ck all database 
9c40: 66 69 6c 65 73 2e 20 20 49 66 20 74 72 69 70 43  files.  If tripC
9c50: 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54  ode is not SQLIT
9c60: 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e  E_OK, then.** an
9c70: 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
9c80: 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20  are invalidated 
9c90: 28 22 74 72 69 70 70 65 64 22 20 2d 20 61 73 20  ("tripped" - as 
9ca0: 69 6e 20 22 74 72 69 70 70 69 6e 67 20 61 20 63  in "tripping a c
9cb0: 69 72 63 75 69 74 0a 2a 2a 20 62 72 65 61 6b 65  ircuit.** breake
9cc0: 72 22 29 20 61 6e 64 20 6d 61 64 65 20 74 6f 20  r") and made to 
9cd0: 72 65 74 75 72 6e 20 74 72 69 70 43 6f 64 65 20  return tripCode 
9ce0: 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
9cf0: 20 66 75 72 74 68 65 72 0a 2a 2a 20 61 74 74 65   further.** atte
9d00: 6d 70 74 73 20 74 6f 20 75 73 65 20 74 68 61 74  mpts to use that
9d10: 20 63 75 72 73 6f 72 2e 20 20 52 65 61 64 20 63   cursor.  Read c
9d20: 75 72 73 6f 72 73 20 72 65 6d 61 69 6e 20 6f 70  ursors remain op
9d30: 65 6e 20 61 6e 64 20 76 61 6c 69 64 0a 2a 2a 20  en and valid.** 
9d40: 62 75 74 20 61 72 65 20 22 73 61 76 65 64 22 20  but are "saved" 
9d50: 69 6e 20 63 61 73 65 20 74 68 65 20 74 61 62 6c  in case the tabl
9d60: 65 20 70 61 67 65 73 20 61 72 65 20 6d 6f 76 65  e pages are move
9d70: 64 20 61 72 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f 69  d around..*/.voi
9d80: 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63  d sqlite3Rollbac
9d90: 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  kAll(sqlite3 *db
9da0: 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b  , int tripCode){
9db0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
9dc0: 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 69  inTrans = 0;.  i
9dd0: 6e 74 20 73 63 68 65 6d 61 43 68 61 6e 67 65 3b  nt schemaChange;
9de0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9df0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
9e00: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
9e10: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
9e20: 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20  Malloc();..  /* 
9e30: 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72 65  Obtain all b-tre
9e40: 65 20 6d 75 74 65 78 65 73 20 62 65 66 6f 72 65  e mutexes before
9e50: 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c 6c   making any call
9e60: 73 20 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62 61  s to BtreeRollba
9e70: 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69 73  ck(). .  ** This
9e80: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e   is important in
9e90: 20 63 61 73 65 20 74 68 65 20 74 72 61 6e 73 61   case the transa
9ea0: 63 74 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c 6c  ction being roll
9eb0: 65 64 20 62 61 63 6b 20 68 61 73 0a 20 20 2a 2a  ed back has.  **
9ec0: 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61   modified the da
9ed0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
9ee0: 66 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74  f the b-tree mut
9ef0: 65 78 65 73 20 61 72 65 20 6e 6f 74 20 74 61 6b  exes are not tak
9f00: 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74 68  en.  ** here, th
9f10: 65 6e 20 61 6e 6f 74 68 65 72 20 73 68 61 72 65  en another share
9f20: 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65 63 74 69  d-cache connecti
9f30: 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69  on might sneak i
9f40: 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74  n between.  ** t
9f50: 68 65 20 64 61 74 61 62 61 73 65 20 72 6f 6c 6c  he database roll
9f60: 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20  back and schema 
9f70: 72 65 73 65 74 2c 20 77 68 69 63 68 20 63 61 6e  reset, which can
9f80: 20 63 61 75 73 65 20 66 61 6c 73 65 0a 20 20 2a   cause false.  *
9f90: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 72 65 70  * corruption rep
9fa0: 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20 63 61 73  orts in some cas
9fb0: 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  es.  */.  sqlite
9fc0: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
9fd0: 62 29 3b 0a 20 20 73 63 68 65 6d 61 43 68 61 6e  b);.  schemaChan
9fe0: 67 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  ge = (db->flags 
9ff0: 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  & SQLITE_InternC
a000: 68 61 6e 67 65 73 29 21 3d 30 20 26 26 20 64 62  hanges)!=0 && db
a010: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 3b 0a  ->init.busy==0;.
a020: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
a030: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
a040: 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e   Btree *p = db->
a050: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
a060: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 69  if( p ){.      i
a070: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
a080: 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20  sInTrans(p) ){. 
a090: 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d         inTrans =
a0a0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
a0b0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
a0c0: 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69 70 43 6f  llback(p, tripCo
a0d0: 64 65 2c 20 21 73 63 68 65 6d 61 43 68 61 6e 67  de, !schemaChang
a0e0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
a0f0: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
a100: 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ack(db);.  sqlit
a110: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
a120: 63 28 29 3b 0a 0a 20 20 69 66 28 20 28 64 62 2d  c();..  if( (db-
a130: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e  >flags&SQLITE_In
a140: 74 65 72 6e 43 68 61 6e 67 65 73 29 21 3d 30 20  ternChanges)!=0 
a150: 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  && db->init.busy
a160: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
a170: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
a180: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
a190: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
a1a0: 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e  AllSchemasOfConn
a1b0: 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a  ection(db);.  }.
a1c0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
a1d0: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f  aveAll(db);..  /
a1e0: 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64 20 63  * Any deferred c
a1f0: 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
a200: 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20 62 65  ions have now be
a210: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a  en resolved. */.
a220: 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
a230: 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e  ons = 0;.  db->n
a240: 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
a250: 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  = 0;.  db->flags
a260: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65   &= ~SQLITE_Defe
a270: 72 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  rFKs;..  /* If o
a280: 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66  ne has been conf
a290: 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74  igured, invoke t
a2a0: 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b  he rollback-hook
a2b0: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69   callback */.  i
a2c0: 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b  f( db->xRollback
a2d0: 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e 54  Callback && (inT
a2e0: 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74  rans || !db->aut
a2f0: 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20  oCommit) ){.    
a300: 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
a310: 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62  lback(db->pRollb
a320: 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a  ackArg);.  }.}..
a330: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
a340: 74 61 74 69 63 20 73 74 72 69 6e 67 20 63 6f 6e  tatic string con
a350: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
a360: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
a370: 6f 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  o the error code
a380: 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 69 6e  .** specified in
a390: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   the argument..*
a3a0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
a3b0: 4c 49 54 45 5f 4e 45 45 44 5f 45 52 52 5f 4e 41  LITE_NEED_ERR_NA
a3c0: 4d 45 29 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  ME).const char *
a3d0: 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 69  sqlite3ErrName(i
a3e0: 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20  nt rc){.  const 
a3f0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
a400: 0a 20 20 69 6e 74 20 69 2c 20 6f 72 69 67 52 63  .  int i, origRc
a410: 20 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30   = rc;.  for(i=0
a420: 3b 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d  ; i<2 && zName==
a430: 30 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78  0; i++, rc &= 0x
a440: 66 66 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  ff){.    switch(
a450: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 63 61 73   rc ){.      cas
a460: 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20  e SQLITE_OK:    
a470: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
a480: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22  me = "SQLITE_OK"
a490: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a4a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a4b0: 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a  se SQLITE_ERROR:
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
a4d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52  ame = "SQLITE_ER
a4e0: 52 4f 52 22 3b 20 20 20 20 20 20 20 20 20 20 20  ROR";           
a4f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a500: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  ase SQLITE_INTER
a510: 4e 41 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a  NAL:           z
a520: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
a530: 4e 54 45 52 4e 41 4c 22 3b 20 20 20 20 20 20 20  NTERNAL";       
a540: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a550: 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d  case SQLITE_PERM
a560: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
a570: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a580: 50 45 52 4d 22 3b 20 20 20 20 20 20 20 20 20 20  PERM";          
a590: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a5a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f   case SQLITE_ABO
a5b0: 52 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  RT:             
a5c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a5d0: 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20 20 20  _ABORT";        
a5e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a5f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
a600: 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20  ORT_ROLLBACK:   
a610: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a620: 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
a630: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
a640: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
a650: 55 53 59 3a 20 20 20 20 20 20 20 20 20 20 20 20  USY:            
a660: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a670: 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20  TE_BUSY";       
a680: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a690: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a6a0: 42 55 53 59 5f 52 45 43 4f 56 45 52 59 3a 20 20  BUSY_RECOVERY:  
a6b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a6c0: 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52  ITE_BUSY_RECOVER
a6d0: 59 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  Y";     break;. 
a6e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a6f0: 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a 20  _BUSY_SNAPSHOT: 
a700: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a710: 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48  LITE_BUSY_SNAPSH
a720: 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  OT";     break;.
a730: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a740: 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20 20  E_LOCKED:       
a750: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a760: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20  QLITE_LOCKED";  
a770: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a780: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a790: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
a7a0: 43 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22  CACHE: zName = "
a7b0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
a7c0: 41 52 45 44 43 41 43 48 45 22 3b 62 72 65 61 6b  AREDCACHE";break
a7d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a7e0: 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20  ITE_NOMEM:      
a7f0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a800: 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20  "SQLITE_NOMEM"; 
a810: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a820: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a830: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20  LITE_READONLY:  
a840: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
a850: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
a860: 59 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  Y";          bre
a870: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a880: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
a890: 45 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20  ECOVERY:  zName 
a8a0: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
a8b0: 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 62 72  LY_RECOVERY"; br
a8c0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a8d0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
a8e0: 43 41 4e 54 4c 4f 43 4b 3a 20 20 7a 4e 61 6d 65  CANTLOCK:  zName
a8f0: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
a900: 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 22 3b 20 62  NLY_CANTLOCK"; b
a910: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a920: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
a930: 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d  _ROLLBACK:  zNam
a940: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
a950: 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20  ONLY_ROLLBACK"; 
a960: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a970: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
a980: 59 5f 44 42 4d 4f 56 45 44 3a 20 20 20 7a 4e 61  Y_DBMOVED:   zNa
a990: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
a9a0: 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 22 3b 20  DONLY_DBMOVED"; 
a9b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a9c0: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  se SQLITE_INTERR
a9d0: 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 7a 4e  UPT:          zN
a9e0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e  ame = "SQLITE_IN
a9f0: 54 45 52 52 55 50 54 22 3b 20 20 20 20 20 20 20  TERRUPT";       
aa00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
aa10: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
aa20: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
aa30: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
aa40: 4f 45 52 52 22 3b 20 20 20 20 20 20 20 20 20 20  OERR";          
aa50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
aa60: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
aa70: 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20 20 20  R_READ:         
aa80: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
aa90: 49 4f 45 52 52 5f 52 45 41 44 22 3b 20 20 20 20  IOERR_READ";    
aaa0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
aab0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
aac0: 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20 20  RR_SHORT_READ:  
aad0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
aae0: 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
aaf0: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
ab00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
ab10: 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20 20 20  ERR_WRITE:      
ab20: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ab30: 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22 3b 20  E_IOERR_WRITE"; 
ab40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ab50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
ab60: 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20 20 20 20  OERR_FSYNC:     
ab70: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ab80: 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b  TE_IOERR_FSYNC";
ab90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
aba0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
abb0: 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a  IOERR_DIR_FSYNC:
abc0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
abd0: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
abe0: 59 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  YNC";   break;. 
abf0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ac00: 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3a  _IOERR_TRUNCATE:
ac10: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ac20: 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
ac30: 41 54 45 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  ATE";    break;.
ac40: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ac50: 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a 20 20  E_IOERR_FSTAT:  
ac60: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ac70: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
ac80: 54 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  T";       break;
ac90: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
aca0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a  TE_IOERR_UNLOCK:
acb0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
acc0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
acd0: 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b  OCK";      break
ace0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
acf0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
ad00: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
ad10: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44  "SQLITE_IOERR_RD
ad20: 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61  LOCK";      brea
ad30: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ad40: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
ad50: 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  E:       zName =
ad60: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44   "SQLITE_IOERR_D
ad70: 45 4c 45 54 45 22 3b 20 20 20 20 20 20 62 72 65  ELETE";      bre
ad80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ad90: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
ada0: 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  M:        zName 
adb0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
adc0: 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 62 72  NOMEM";       br
add0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ade0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
adf0: 45 53 53 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  ESS:       zName
ae00: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
ae10: 5f 41 43 43 45 53 53 22 3b 20 20 20 20 20 20 62  _ACCESS";      b
ae20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ae30: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
ae40: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a  ECKRESERVEDLOCK:
ae50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae70: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ae80: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
ae90: 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b  RVEDLOCK"; break
aea0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
aeb0: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20  ITE_IOERR_LOCK: 
aec0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
aed0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f  "SQLITE_IOERR_LO
aee0: 43 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  CK";        brea
aef0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
af00: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
af10: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
af20: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43   "SQLITE_IOERR_C
af30: 4c 4f 53 45 22 3b 20 20 20 20 20 20 20 62 72 65  LOSE";       bre
af40: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
af50: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
af60: 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d 65 20  CLOSE:    zName 
af70: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
af80: 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20 62 72  DIR_CLOSE";   br
af90: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
afa0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
afb0: 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61 6d 65  OPEN:      zName
afc0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
afd0: 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20 20 62  _SHMOPEN";     b
afe0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
aff0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
b000: 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e 61 6d  MSIZE:      zNam
b010: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b020: 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20 20 20  R_SHMSIZE";     
b030: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b040: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
b050: 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a 4e 61  HMLOCK:      zNa
b060: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b070: 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20 20 20  RR_SHMLOCK";    
b080: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b090: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b0a0: 53 48 4d 4d 41 50 3a 20 20 20 20 20 20 20 7a 4e  SHMMAP:       zN
b0b0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b0c0: 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20 20 20  ERR_SHMMAP";    
b0d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b0e0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b0f0: 5f 53 45 45 4b 3a 20 20 20 20 20 20 20 20 20 7a  _SEEK:         z
b100: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b110: 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20 20 20 20  OERR_SEEK";     
b120: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b130: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b140: 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20  R_DELETE_NOENT: 
b150: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b160: 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
b170: 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  NT";break;.     
b180: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b190: 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20 20 20  RR_MMAP:        
b1a0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b1b0: 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20 20 20  _IOERR_MMAP";   
b1c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b1d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b1e0: 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 3a  ERR_GETTEMPPATH:
b1f0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b200: 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
b210: 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ATH"; break;.   
b220: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b230: 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a 20 20  OERR_CONVPATH:  
b240: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b250: 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54  TE_IOERR_CONVPAT
b260: 48 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  H";    break;.  
b270: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b280: 43 4f 52 52 55 50 54 3a 20 20 20 20 20 20 20 20  CORRUPT:        
b290: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b2a0: 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20 20  ITE_CORRUPT";   
b2b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b2c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b2d0: 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3a 20 20  _CORRUPT_VTAB:  
b2e0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b2f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
b300: 42 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  B";      break;.
b310: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b320: 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20 20 20  E_NOTFOUND:     
b330: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b340: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b  QLITE_NOTFOUND";
b350: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b360: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b370: 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20 20  TE_FULL:        
b380: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b390: 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20  SQLITE_FULL";   
b3a0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b3b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b3c0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20  ITE_CANTOPEN:   
b3d0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b3e0: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
b3f0: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
b400: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b410: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f  LITE_CANTOPEN_NO
b420: 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65 20 3d  TEMPDIR: zName =
b430: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
b440: 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62 72 65  N_NOTEMPDIR";bre
b450: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b460: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
b470: 53 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d 65 20  SDIR:     zName 
b480: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
b490: 45 4e 5f 49 53 44 49 52 22 3b 20 20 20 20 62 72  EN_ISDIR";    br
b4a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b4b0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
b4c0: 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61 6d 65  FULLPATH:  zName
b4d0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
b4e0: 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b 20 62  PEN_FULLPATH"; b
b4f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b500: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
b510: 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e 61 6d  _CONVPATH:  zNam
b520: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
b530: 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22 3b 20  OPEN_CONVPATH"; 
b540: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b550: 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  e SQLITE_PROTOCO
b560: 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  L:           zNa
b570: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 52 4f  me = "SQLITE_PRO
b580: 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20 20 20  TOCOL";         
b590: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b5a0: 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a  se SQLITE_EMPTY:
b5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
b5c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d  ame = "SQLITE_EM
b5d0: 50 54 59 22 3b 20 20 20 20 20 20 20 20 20 20 20  PTY";           
b5e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b5f0: 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45 4d  ase SQLITE_SCHEM
b600: 41 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  A:             z
b610: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 53  Name = "SQLITE_S
b620: 43 48 45 4d 41 22 3b 20 20 20 20 20 20 20 20 20  CHEMA";         
b630: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b640: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42  case SQLITE_TOOB
b650: 49 47 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  IG:             
b660: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b670: 54 4f 4f 42 49 47 22 3b 20 20 20 20 20 20 20 20  TOOBIG";        
b680: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b690: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
b6a0: 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20 20 20  STRAINT:        
b6b0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b6c0: 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20 20 20  _CONSTRAINT";   
b6d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b6e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
b6f0: 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 3a  NSTRAINT_UNIQUE:
b700: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b710: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49  E_CONSTRAINT_UNI
b720: 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  QUE"; break;.   
b730: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b740: 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45  ONSTRAINT_TRIGGE
b750: 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  R: zName = "SQLI
b760: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52  TE_CONSTRAINT_TR
b770: 49 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a 20 20  IGGER";break;.  
b780: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b790: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
b7a0: 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20  GNKEY:.         
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7c0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b7d0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b7e0: 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b 20 20  T_FOREIGNKEY";  
b7f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b800: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
b810: 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20 7a 4e  AINT_CHECK:   zN
b820: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b830: 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 22 3b  NSTRAINT_CHECK";
b840: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b850: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
b860: 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
b870: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
b880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b890: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b8a0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49  E_CONSTRAINT_PRI
b8b0: 4d 41 52 59 4b 45 59 22 3b 20 20 20 62 72 65 61  MARYKEY";   brea
b8c0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b8d0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b8e0: 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d  NOTNULL: zName =
b8f0: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
b900: 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65  INT_NOTNULL";bre
b910: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b920: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b930: 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20  _COMMITHOOK:.   
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
b960: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
b970: 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f  STRAINT_COMMITHO
b980: 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  OK";   break;.  
b990: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b9a0: 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 3a  CONSTRAINT_VTAB:
b9b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b9c0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56  ITE_CONSTRAINT_V
b9d0: 54 41 42 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  TAB";   break;. 
b9e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b9f0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43  _CONSTRAINT_FUNC
ba00: 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20 20 20  TION:.          
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ba30: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
ba40: 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20 20 20  _FUNCTION";     
ba50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ba60: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
ba70: 49 4e 54 5f 52 4f 57 49 44 3a 20 20 20 7a 4e 61  INT_ROWID:   zNa
ba80: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
ba90: 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 22 3b 20  STRAINT_ROWID"; 
baa0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bab0: 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  se SQLITE_MISMAT
bac0: 43 48 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  CH:           zN
bad0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49  ame = "SQLITE_MI
bae0: 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20 20 20  SMATCH";        
baf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bb00: 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  ase SQLITE_MISUS
bb10: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  E:             z
bb20: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d  Name = "SQLITE_M
bb30: 49 53 55 53 45 22 3b 20 20 20 20 20 20 20 20 20  ISUSE";         
bb40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bb50: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  case SQLITE_NOLF
bb60: 53 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S:              
bb70: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bb80: 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20 20 20  NOLFS";         
bb90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bba0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55 54   case SQLITE_AUT
bbb0: 48 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H:              
bbc0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bbd0: 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20 20 20  _AUTH";         
bbe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bbf0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4f    case SQLITE_FO
bc00: 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20 20 20  RMAT:           
bc10: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bc20: 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20 20  E_FORMAT";      
bc30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bc40: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
bc50: 41 4e 47 45 3a 20 20 20 20 20 20 20 20 20 20 20  ANGE:           
bc60: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bc70: 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20 20  TE_RANGE";      
bc80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bc90: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bca0: 4e 4f 54 41 44 42 3a 20 20 20 20 20 20 20 20 20  NOTADB:         
bcb0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bcc0: 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20  ITE_NOTADB";    
bcd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bce0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bcf0: 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 20 20 20  _ROW:           
bd00: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bd10: 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20 20 20  LITE_ROW";      
bd20: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bd30: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bd40: 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20 20 20  E_NOTICE:       
bd50: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bd60: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b 20 20  QLITE_NOTICE";  
bd70: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bd80: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bd90: 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
bda0: 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22  R_WAL: zName = "
bdb0: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
bdc0: 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65 61 6b  COVER_WAL";break
bdd0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bde0: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
bdf0: 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20  ER_ROLLBACK:.   
be00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
be20: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54  me = "SQLITE_NOT
be30: 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c  ICE_RECOVER_ROLL
be40: 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20  BACK"; break;.  
be50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
be60: 57 41 52 4e 49 4e 47 3a 20 20 20 20 20 20 20 20  WARNING:        
be70: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
be80: 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20 20 20  ITE_WARNING";   
be90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bea0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
beb0: 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44  _WARNING_AUTOIND
bec0: 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  EX:  zName = "SQ
bed0: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54  LITE_WARNING_AUT
bee0: 4f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  OINDEX"; break;.
bef0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bf00: 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20 20 20  E_DONE:         
bf10: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bf20: 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20  QLITE_DONE";    
bf30: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bf40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
bf50: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
bf60: 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 42 75   static char zBu
bf70: 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  f[50];.    sqlit
bf80: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
bf90: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
bfa0: 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28  "SQLITE_UNKNOWN(
bfb0: 25 64 29 22 2c 20 6f 72 69 67 52 63 29 3b 0a 20  %d)", origRc);. 
bfc0: 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75 66 3b     zName = zBuf;
bfd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
bfe0: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ame;.}.#endif../
bff0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
c000: 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61 74  atic string that
c010: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b   describes the k
c020: 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65  ind of error spe
c030: 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  cified in the.**
c040: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f   argument..*/.co
c050: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
c060: 33 45 72 72 53 74 72 28 69 6e 74 20 72 63 29 7b  3ErrStr(int rc){
c070: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
c080: 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67  char* const aMsg
c090: 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51  [] = {.    /* SQ
c0a0: 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20  LITE_OK         
c0b0: 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f   */ "not an erro
c0c0: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
c0d0: 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a 2f  E_ERROR       */
c0e0: 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f   "SQL logic erro
c0f0: 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64 61 74  r or missing dat
c100: 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53  abase",.    /* S
c110: 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20  QLITE_INTERNAL  
c120: 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53    */ 0,.    /* S
c130: 51 4c 49 54 45 5f 50 45 52 4d 20 20 20 20 20 20  QLITE_PERM      
c140: 20 20 2a 2f 20 22 61 63 63 65 73 73 20 70 65 72    */ "access per
c150: 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c  mission denied",
c160: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41  .    /* SQLITE_A
c170: 42 4f 52 54 20 20 20 20 20 20 20 2a 2f 20 22 63  BORT       */ "c
c180: 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73 74 65  allback requeste
c190: 64 20 71 75 65 72 79 20 61 62 6f 72 74 22 2c 0a  d query abort",.
c1a0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55      /* SQLITE_BU
c1b0: 53 59 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61  SY        */ "da
c1c0: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
c1d0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c1e0: 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a 2f 20  _LOCKED      */ 
c1f0: 22 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20  "database table 
c200: 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20  is locked",.    
c210: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  /* SQLITE_NOMEM 
c220: 20 20 20 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66        */ "out of
c230: 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a   memory",.    /*
c240: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
c250: 20 20 20 20 2a 2f 20 22 61 74 74 65 6d 70 74 20      */ "attempt 
c260: 74 6f 20 77 72 69 74 65 20 61 20 72 65 61 64 6f  to write a reado
c270: 6e 6c 79 20 64 61 74 61 62 61 73 65 22 2c 0a 20  nly database",. 
c280: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54     /* SQLITE_INT
c290: 45 52 52 55 50 54 20 20 20 2a 2f 20 22 69 6e 74  ERRUPT   */ "int
c2a0: 65 72 72 75 70 74 65 64 22 2c 0a 20 20 20 20 2f  errupted",.    /
c2b0: 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 20  * SQLITE_IOERR  
c2c0: 20 20 20 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f       */ "disk I/
c2d0: 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a  O error",.    /*
c2e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
c2f0: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
c300: 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d   disk image is m
c310: 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f  alformed",.    /
c320: 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  * SQLITE_NOTFOUN
c330: 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e  D    */ "unknown
c340: 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20   operation",.   
c350: 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   /* SQLITE_FULL 
c360: 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62         */ "datab
c370: 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66  ase or disk is f
c380: 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ull",.    /* SQL
c390: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20  ITE_CANTOPEN    
c3a0: 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  */ "unable to op
c3b0: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
c3c0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c3d0: 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20  _PROTOCOL    */ 
c3e0: 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f  "locking protoco
c3f0: 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  l",.    /* SQLIT
c400: 45 5f 45 4d 50 54 59 20 20 20 20 20 20 20 2a 2f  E_EMPTY       */
c410: 20 22 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73   "table contains
c420: 20 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20 20 2f   no data",.    /
c430: 2a 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20  * SQLITE_SCHEMA 
c440: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
c450: 65 20 73 63 68 65 6d 61 20 68 61 73 20 63 68 61  e schema has cha
c460: 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  nged",.    /* SQ
c470: 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20 20 20 20  LITE_TOOBIG     
c480: 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72 20 62   */ "string or b
c490: 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20  lob too big",.  
c4a0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53    /* SQLITE_CONS
c4b0: 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73  TRAINT  */ "cons
c4c0: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a  traint failed",.
c4d0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49      /* SQLITE_MI
c4e0: 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22 64 61  SMATCH    */ "da
c4f0: 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22  tatype mismatch"
c500: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c510: 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f 20 22  MISUSE      */ "
c520: 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e 65 20  library routine 
c530: 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20 73 65  called out of se
c540: 71 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20  quence",.    /* 
c550: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20  SQLITE_NOLFS    
c560: 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c     */ "large fil
c570: 65 20 73 75 70 70 6f 72 74 20 69 73 20 64 69 73  e support is dis
c580: 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  abled",.    /* S
c590: 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20 20 20  QLITE_AUTH      
c5a0: 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61 74    */ "authorizat
c5b0: 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20  ion denied",.   
c5c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41   /* SQLITE_FORMA
c5d0: 54 20 20 20 20 20 20 2a 2f 20 22 61 75 78 69 6c  T      */ "auxil
c5e0: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 6f  iary database fo
c5f0: 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20 20 20  rmat error",.   
c600: 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47 45   /* SQLITE_RANGE
c610: 20 20 20 20 20 20 20 2a 2f 20 22 62 69 6e 64 20         */ "bind 
c620: 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  or column index 
c630: 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20  out of range",. 
c640: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
c650: 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c  ADB      */ "fil
c660: 65 20 69 73 20 65 6e 63 72 79 70 74 65 64 20 6f  e is encrypted o
c670: 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62  r is not a datab
c680: 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e  ase",.  };.  con
c690: 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  st char *zErr = 
c6a0: 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b  "unknown error";
c6b0: 0a 20 20 73 77 69 74 63 68 28 20 72 63 20 29 7b  .  switch( rc ){
c6c0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
c6d0: 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a  _ABORT_ROLLBACK:
c6e0: 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20   {.      zErr = 
c6f0: 22 61 62 6f 72 74 20 64 75 65 20 74 6f 20 52 4f  "abort due to RO
c700: 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 62  LLBACK";.      b
c710: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
c720: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
c730: 20 72 63 20 26 3d 20 30 78 66 66 3b 0a 20 20 20   rc &= 0xff;.   
c740: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 72 63     if( ALWAYS(rc
c750: 3e 3d 30 29 20 26 26 20 72 63 3c 41 72 72 61 79  >=0) && rc<Array
c760: 53 69 7a 65 28 61 4d 73 67 29 20 26 26 20 61 4d  Size(aMsg) && aM
c770: 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20  sg[rc]!=0 ){.   
c780: 20 20 20 20 20 7a 45 72 72 20 3d 20 61 4d 73 67       zErr = aMsg
c790: 5b 72 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [rc];.      }.  
c7a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c7b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45  .  }.  return zE
c7c0: 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rr;.}../*.** Thi
c7d0: 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
c7e0: 65 6e 74 73 20 61 20 62 75 73 79 20 63 61 6c 6c  ents a busy call
c7f0: 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65 70 73  back that sleeps
c800: 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61 67   and tries.** ag
c810: 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d 65  ain until a time
c820: 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72 65 61  out value is rea
c830: 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d 65 6f  ched.  The timeo
c840: 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61  ut value is.** a
c850: 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
c860: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
c870: 20 70 61 73 73 65 64 20 69 6e 20 61 73 20 74 68   passed in as th
c880: 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
c890: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
c8a0: 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74  nt sqliteDefault
c8b0: 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20 76  BusyCallback(. v
c8c0: 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20 20 20  oid *ptr,       
c8d0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
c8e0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
c8f0: 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20 20 20  /. int count    
c900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c910: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
c920: 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20 62 75  able has been bu
c930: 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c  sy */.){.#if SQL
c940: 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20 48 41  ITE_OS_WIN || HA
c950: 56 45 5f 55 53 4c 45 45 50 0a 20 20 73 74 61 74  VE_USLEEP.  stat
c960: 69 63 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61  ic const u8 dela
c970: 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c  ys[] =.     { 1,
c980: 20 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32   2, 5, 10, 15, 2
c990: 30 2c 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20  0, 25, 25,  25, 
c9a0: 20 35 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b   50,  50, 100 };
c9b0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
c9c0: 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20  u8 totals[] =.  
c9d0: 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38     { 0, 1, 3,  8
c9e0: 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38  , 18, 33, 53, 78
c9f0: 2c 20 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c  , 103, 128, 178,
ca00: 20 32 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65   228 };.# define
ca10: 20 4e 44 45 4c 41 59 20 41 72 72 61 79 53 69 7a   NDELAY ArraySiz
ca20: 65 28 64 65 6c 61 79 73 29 0a 20 20 73 71 6c 69  e(delays).  sqli
ca30: 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74  te3 *db = (sqlit
ca40: 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20  e3 *)ptr;.  int 
ca50: 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75  timeout = db->bu
ca60: 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74  syTimeout;.  int
ca70: 20 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a   delay, prior;..
ca80: 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e    assert( count>
ca90: 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e  =0 );.  if( coun
caa0: 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20  t < NDELAY ){.  
cab0: 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73    delay = delays
cac0: 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69  [count];.    pri
cad0: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e  or = totals[coun
cae0: 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t];.  }else{.   
caf0: 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b   delay = delays[
cb00: 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70  NDELAY-1];.    p
cb10: 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44  rior = totals[ND
cb20: 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a  ELAY-1] + delay*
cb30: 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31  (count-(NDELAY-1
cb40: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72  ));.  }.  if( pr
cb50: 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 69  ior + delay > ti
cb60: 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c  meout ){.    del
cb70: 61 79 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70  ay = timeout - p
cb80: 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 64 65  rior;.    if( de
cb90: 6c 61 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20  lay<=0 ) return 
cba0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
cbb0: 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73  OsSleep(db->pVfs
cbc0: 2c 20 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20  , delay*1000);. 
cbd0: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65   return 1;.#else
cbe0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
cbf0: 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b   (sqlite3 *)ptr;
cc00: 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d  .  int timeout =
cc10: 20 28 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72   ((sqlite3 *)ptr
cc20: 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a  )->busyTimeout;.
cc30: 20 20 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a    if( (count+1)*
cc40: 31 30 30 30 20 3e 20 74 69 6d 65 6f 75 74 20 29  1000 > timeout )
cc50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
cc60: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
cc70: 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31  leep(db->pVfs, 1
cc80: 30 30 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72  000000);.  retur
cc90: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
cca0: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
ccb0: 67 69 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c  given busy handl
ccc0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
ccd0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
cce0: 20 77 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69   when an operati
ccf0: 6f 6e 20 66 61 69 6c 65 64 20 77 69 74 68 20 61  on failed with a
cd00: 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69   lock..** If thi
cd10: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
cd20: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20  s non-zero, the 
cd30: 6c 6f 63 6b 20 69 73 20 72 65 74 72 69 65 64 2e  lock is retried.
cd40: 20 20 49 66 20 69 74 0a 2a 2a 20 72 65 74 75 72    If it.** retur
cd50: 6e 73 20 30 2c 20 74 68 65 20 6f 70 65 72 61 74  ns 0, the operat
cd60: 69 6f 6e 20 61 62 6f 72 74 73 20 77 69 74 68 20  ion aborts with 
cd70: 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65  an SQLITE_BUSY e
cd80: 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rror..*/.int sql
cd90: 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
cda0: 6e 64 6c 65 72 28 42 75 73 79 48 61 6e 64 6c 65  ndler(BusyHandle
cdb0: 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  r *p){.  int rc;
cdc0: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d  .  if( NEVER(p==
cdd0: 30 29 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d  0) || p->xFunc==
cde0: 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20  0 || p->nBusy<0 
cdf0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63  ) return 0;.  rc
ce00: 20 3d 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70   = p->xFunc(p->p
ce10: 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a  Arg, p->nBusy);.
ce20: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
ce30: 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31     p->nBusy = -1
ce40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
ce50: 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20  ->nBusy++;.  }. 
ce60: 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a   return rc; .}..
ce70: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
ce80: 6e 65 20 73 65 74 73 20 74 68 65 20 62 75 73 79  ne sets the busy
ce90: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
cea0: 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65   Sqlite database
ceb0: 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e   to the.** given
cec0: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
ced0: 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65  on with the give
cee0: 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  n argument..*/.i
cef0: 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  nt sqlite3_busy_
cf00: 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74  handler(.  sqlit
cf10: 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a  e3 *db,.  int (*
cf20: 78 42 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74  xBusy)(void*,int
cf30: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  ),.  void *pArg.
cf40: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
cf50: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
cf60: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
cf70: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
cf80: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
cf90: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
cfa0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
cfb0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
cfc0: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75  mutex);.  db->bu
cfd0: 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20  syHandler.xFunc 
cfe0: 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62  = xBusy;.  db->b
cff0: 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72 67 20  usyHandler.pArg 
d000: 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75  = pArg;.  db->bu
d010: 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20  syHandler.nBusy 
d020: 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 54  = 0;.  db->busyT
d030: 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 73 71  imeout = 0;.  sq
d040: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
d050: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
d060: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d070: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
d080: 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
d090: 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a  S_CALLBACK./*.**
d0a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
d0b0: 74 73 20 74 68 65 20 70 72 6f 67 72 65 73 73 20  ts the progress 
d0c0: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20  callback for an 
d0d0: 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20  Sqlite database 
d0e0: 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20  to the.** given 
d0f0: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
d100: 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  n with the given
d110: 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 70   argument. The p
d120: 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b  rogress callback
d130: 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f   will.** be invo
d140: 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73 20 6f  ked every nOps o
d150: 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  pcodes..*/.void 
d160: 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73  sqlite3_progress
d170: 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69  _handler(.  sqli
d180: 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20  te3 *db, .  int 
d190: 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50  nOps,.  int (*xP
d1a0: 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a 29 2c  rogress)(void*),
d1b0: 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29   .  void *pArg.)
d1c0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
d1d0: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
d1e0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
d1f0: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
d200: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
d210: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
d220: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
d230: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
d240: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
d250: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
d260: 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20 64   nOps>0 ){.    d
d270: 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 78  b->xProgress = x
d280: 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 64 62  Progress;.    db
d290: 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d  ->nProgressOps =
d2a0: 20 28 75 6e 73 69 67 6e 65 64 29 6e 4f 70 73 3b   (unsigned)nOps;
d2b0: 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65  .    db->pProgre
d2c0: 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  ssArg = pArg;.  
d2d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 78  }else{.    db->x
d2e0: 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  Progress = 0;.  
d2f0: 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f    db->nProgressO
d300: 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  ps = 0;.    db->
d310: 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 30  pProgressArg = 0
d320: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
d330: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
d340: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
d350: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
d360: 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61  utine installs a
d370: 20 64 65 66 61 75 6c 74 20 62 75 73 79 20 68 61   default busy ha
d380: 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69 74 73  ndler that waits
d390: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65 63   for the.** spec
d3a0: 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  ified number of 
d3b0: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66  milliseconds bef
d3c0: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30 2e  ore returning 0.
d3d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
d3e0: 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c  busy_timeout(sql
d3f0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73  ite3 *db, int ms
d400: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
d410: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
d420: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
d430: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
d440: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
d450: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
d460: 65 6e 64 69 66 0a 20 20 69 66 28 20 6d 73 3e 30  endif.  if( ms>0
d470: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
d480: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c  busy_handler(db,
d490: 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75   sqliteDefaultBu
d4a0: 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  syCallback, (voi
d4b0: 64 2a 29 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e  d*)db);.    db->
d4c0: 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73  busyTimeout = ms
d4d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
d4e0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
d4f0: 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20  ler(db, 0, 0);. 
d500: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
d510: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
d520: 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e  Cause any pendin
d530: 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73  g operation to s
d540: 74 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c 69  top at its earli
d550: 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e  est opportunity.
d560: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d570: 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74  _interrupt(sqlit
d580: 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20  e3 *db){.#ifdef 
d590: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
d5a0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
d5b0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
d5c0: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
d5d0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
d5e0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
d5f0: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
d600: 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72    db->u1.isInter
d610: 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a  rupted = 1;.}...
d620: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
d630: 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74  ion is exactly t
d640: 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
d650: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
d660: 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20  on(), except.** 
d670: 74 68 61 74 20 69 74 20 69 73 20 64 65 73 69 67  that it is desig
d680: 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ned to be called
d690: 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64   by internal cod
d6a0: 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  e. The differenc
d6b0: 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66 20  e is.** that if 
d6c0: 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  a malloc() fails
d6d0: 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61   in sqlite3_crea
d6e0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61  te_function(), a
d6f0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  n error code.** 
d700: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
d710: 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  the mallocFailed
d720: 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20 0a   flag cleared. .
d730: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 72  */.int sqlite3Cr
d740: 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69  eateFunc(.  sqli
d750: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
d760: 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e   char *zFunction
d770: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
d780: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
d790: 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a  oid *pUserData,.
d7a0: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
d7b0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
d7c0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
d7d0: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
d7e0: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
d7f0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
d800: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
d810: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
d820: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
d830: 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72 75  *),.  FuncDestru
d840: 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f  ctor *pDestructo
d850: 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a  r.){.  FuncDef *
d860: 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  p;.  int nName;.
d870: 20 20 69 6e 74 20 65 78 74 72 61 46 6c 61 67 73    int extraFlags
d880: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
d890: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d8a0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
d8b0: 69 66 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  if( zFunctionNam
d8c0: 65 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28 78  e==0 ||.      (x
d8d0: 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20  Func && (xFinal 
d8e0: 7c 7c 20 78 53 74 65 70 29 29 20 7c 7c 20 0a 20  || xStep)) || . 
d8f0: 20 20 20 20 20 28 21 78 46 75 6e 63 20 26 26 20       (!xFunc && 
d900: 28 78 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65  (xFinal && !xSte
d910: 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78  p)) ||.      (!x
d920: 46 75 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c  Func && (!xFinal
d930: 20 26 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20   && xStep)) ||. 
d940: 20 20 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c       (nArg<-1 ||
d950: 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58   nArg>SQLITE_MAX
d960: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c  _FUNCTION_ARG) |
d970: 7c 0a 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e  |.      (255<(nN
d980: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
d990: 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e  len30( zFunction
d9a0: 4e 61 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72  Name))) ){.    r
d9b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
d9c0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  USE_BKPT;.  }.. 
d9d0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
d9e0: 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53  FUNC_CONSTANT==S
d9f0: 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
da00: 54 49 43 20 29 3b 0a 20 20 65 78 74 72 61 46 6c  TIC );.  extraFl
da10: 61 67 73 20 3d 20 65 6e 63 20 26 20 20 53 51 4c  ags = enc &  SQL
da20: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
da30: 43 3b 0a 20 20 65 6e 63 20 26 3d 20 28 53 51 4c  C;.  enc &= (SQL
da40: 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b  ITE_FUNC_ENCMASK
da50: 7c 53 51 4c 49 54 45 5f 41 4e 59 29 3b 0a 20 20  |SQLITE_ANY);.  
da60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
da70: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20  OMIT_UTF16.  /* 
da80: 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  If SQLITE_UTF16 
da90: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
daa0: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70  the encoding typ
dab0: 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69  e, transform thi
dac0: 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66  s.  ** to one of
dad0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
dae0: 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  or SQLITE_UTF16B
daf0: 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  E using the.  **
db00: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
db10: 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54  IVE macro. SQLIT
db20: 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75  E_UTF16 is not u
db30: 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  sed internally..
db40: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c    **.  ** If SQL
db50: 49 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69  ITE_ANY is speci
db60: 66 69 65 64 2c 20 61 64 64 20 74 68 72 65 65 20  fied, add three 
db70: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
db80: 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f  function.  ** to
db90: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
dba0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d  .  */.  if( enc=
dbb0: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b  =SQLITE_UTF16 ){
dbc0: 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  .    enc = SQLIT
dbd0: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
dbe0: 20 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d   }else if( enc==
dbf0: 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20  SQLITE_ANY ){.  
dc00: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63    int rc;.    rc
dc10: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
dc20: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69  Func(db, zFuncti
dc30: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51  onName, nArg, SQ
dc40: 4c 49 54 45 5f 55 54 46 38 7c 65 78 74 72 61 46  LITE_UTF8|extraF
dc50: 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 70  lags,.         p
dc60: 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c  UserData, xFunc,
dc70: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20   xStep, xFinal, 
dc80: 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  pDestructor);.  
dc90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dca0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
dcb0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
dcc0: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  unc(db, zFunctio
dcd0: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  nName, nArg, SQL
dce0: 49 54 45 5f 55 54 46 31 36 4c 45 7c 65 78 74 72  ITE_UTF16LE|extr
dcf0: 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20  aFlags,.        
dd00: 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75    pUserData, xFu
dd10: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
dd20: 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b  l, pDestructor);
dd30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
dd40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
dd50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
dd60: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d  .    }.    enc =
dd70: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b   SQLITE_UTF16BE;
dd80: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63  .  }.#else.  enc
dd90: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
dda0: 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43  #endif.  .  /* C
ddb0: 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74  heck if an exist
ddc0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ing function is 
ddd0: 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e  being overridden
dde0: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20   or deleted. If 
ddf0: 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  so,.  ** and the
de00: 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d  re are active VM
de10: 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53  s, then return S
de20: 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61  QLITE_BUSY. If a
de30: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
de40: 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64  s being overridd
de50: 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74  en/deleted but t
de60: 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69  here are no acti
de70: 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68  ve VMs, allow th
de80: 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  e.  ** operation
de90: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74   to continue but
dea0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
deb0: 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  precompiled stat
dec0: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70  ements..  */.  p
ded0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
dee0: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63  nction(db, zFunc
def0: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  tionName, nName,
df00: 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20   nArg, (u8)enc, 
df10: 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 28  0);.  if( p && (
df20: 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  p->funcFlags & S
df30: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41  QLITE_FUNC_ENCMA
df40: 53 4b 29 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e  SK)==enc && p->n
df50: 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20  Arg==nArg ){.   
df60: 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63   if( db->nVdbeAc
df70: 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71  tive ){.      sq
df80: 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
df90: 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  g(db, SQLITE_BUS
dfa0: 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61  Y, .        "una
dfb0: 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f  ble to delete/mo
dfc0: 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74 69  dify user-functi
dfd0: 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76 65  on due to active
dfe0: 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20   statements");. 
dff0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
e000: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e010: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
e020: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
e030: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
e040: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
e050: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
e060: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
e070: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
e080: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63  nction(db, zFunc
e090: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  tionName, nName,
e0a0: 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20   nArg, (u8)enc, 
e0b0: 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c  1);.  assert(p |
e0c0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
e0d0: 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  ed);.  if( !p ){
e0e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e0f0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
e100: 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72 20   /* If an older 
e110: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 66  version of the f
e120: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20 63  unction with a c
e130: 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74 72 75  onfigured destru
e140: 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65 69  ctor is.  ** bei
e150: 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76 6f  ng replaced invo
e160: 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
e170: 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e  r function here.
e180: 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44 65   */.  functionDe
e190: 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a 20  stroy(db, p);.. 
e1a0: 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72   if( pDestructor
e1b0: 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63   ){.    pDestruc
e1c0: 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  tor->nRef++;.  }
e1d0: 0a 20 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f  .  p->pDestructo
e1e0: 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72 3b  r = pDestructor;
e1f0: 0a 20 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  .  p->funcFlags 
e200: 3d 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  = (p->funcFlags 
e210: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e  & SQLITE_FUNC_EN
e220: 43 4d 41 53 4b 29 20 7c 20 65 78 74 72 61 46 6c  CMASK) | extraFl
e230: 61 67 73 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ags;.  testcase(
e240: 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20   p->funcFlags & 
e250: 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
e260: 53 54 49 43 20 29 3b 0a 20 20 70 2d 3e 78 46 75  STIC );.  p->xFu
e270: 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70 2d  nc = xFunc;.  p-
e280: 3e 78 53 74 65 70 20 3d 20 78 53 74 65 70 3b 0a  >xStep = xStep;.
e290: 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d    p->xFinalize =
e2a0: 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55   xFinal;.  p->pU
e2b0: 73 65 72 44 61 74 61 20 3d 20 70 55 73 65 72 44  serData = pUserD
e2c0: 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d  ata;.  p->nArg =
e2d0: 20 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72 65   (u16)nArg;.  re
e2e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e2f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
e300: 6e 65 77 20 75 73 65 72 20 66 75 6e 63 74 69 6f  new user functio
e310: 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ns..*/.int sqlit
e320: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
e330: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  on(.  sqlite3 *d
e340: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
e350: 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41  *zFunc,.  int nA
e360: 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20  rg,.  int enc,. 
e370: 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64   void *p,.  void
e380: 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
e390: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
e3a0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
e3b0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
e3c0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e3d0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
e3e0: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
e3f0: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
e400: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a  e3_context*).){.
e410: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
e420: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
e430: 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e  _v2(db, zFunc, n
e440: 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75  Arg, enc, p, xFu
e450: 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20 20  nc, xStep,.     
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78                 x
e480: 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e  Final, 0);.}..in
e490: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
e4a0: 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20  _function_v2(.  
e4b0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
e4c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
e4d0: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
e4e0: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
e4f0: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75  *p,.  void (*xFu
e500: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
e510: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
e520: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
e530: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
e540: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
e550: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
e560: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
e570: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
e580: 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28  text*),.  void (
e590: 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20  *xDestroy)(void 
e5a0: 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *).){.  int rc =
e5b0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
e5c0: 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20   FuncDestructor 
e5d0: 2a 70 41 72 67 20 3d 20 30 3b 0a 0a 23 69 66 64  *pArg = 0;..#ifd
e5e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e5f0: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
e600: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
e610: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
e620: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e630: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
e640: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
e650: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
e660: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
e670: 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20  xDestroy ){.    
e680: 70 41 72 67 20 3d 20 28 46 75 6e 63 44 65 73 74  pArg = (FuncDest
e690: 72 75 63 74 6f 72 20 2a 29 73 71 6c 69 74 65 33  ructor *)sqlite3
e6a0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
e6b0: 20 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73 74   sizeof(FuncDest
e6c0: 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69 66  ructor));.    if
e6d0: 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20 20  ( !pArg ){.     
e6e0: 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20   xDestroy(p);.  
e6f0: 20 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20      goto out;.  
e700: 20 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e 78 44    }.    pArg->xD
e710: 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72 6f  estroy = xDestro
e720: 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55 73  y;.    pArg->pUs
e730: 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a  erData = p;.  }.
e740: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
e750: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
e760: 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70  nc, nArg, enc, p
e770: 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20  , xFunc, xStep, 
e780: 78 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20  xFinal, pArg);. 
e790: 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72   if( pArg && pAr
e7a0: 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
e7b0: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
e7c0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78  LITE_OK );.    x
e7d0: 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20  Destroy(p);.    
e7e0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
e7f0: 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f  , pArg);.  }.. o
e800: 75 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ut:.  rc = sqlit
e810: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
e820: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
e830: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
e840: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
e850: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
e860: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69  ITE_OMIT_UTF16.i
e870: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
e880: 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20  e_function16(.  
e890: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
e8a0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63  onst void *zFunc
e8b0: 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  tionName,.  int 
e8c0: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65 78  nArg,.  int eTex
e8d0: 74 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c  tRep,.  void *p,
e8e0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29  .  void (*xFunc)
e8f0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e900: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
e910: 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  lue**),.  void (
e920: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
e930: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
e940: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20  ite3_value**),. 
e950: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
e960: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
e970: 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ).){.  int rc;. 
e980: 20 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a   char *zFunc8;..
e990: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e9a0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
e9b0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
e9c0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c  etyCheckOk(db) |
e9d0: 7c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d  | zFunctionName=
e9e0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
e9f0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
ea00: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
ea10: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
ea20: 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
ea30: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
ea40: 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38  iled );.  zFunc8
ea50: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74   = sqlite3Utf16t
ea60: 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  o8(db, zFunction
ea70: 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
ea80: 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
ea90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
eaa0: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
eab0: 63 38 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52  c8, nArg, eTextR
eac0: 65 70 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53  ep, p, xFunc, xS
ead0: 74 65 70 2c 20 78 46 69 6e 61 6c 2c 30 29 3b 0a  tep, xFinal,0);.
eae0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
eaf0: 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72  db, zFunc8);.  r
eb00: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
eb10: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
eb20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
eb30: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
eb40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
eb50: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c  dif.../*.** Decl
eb60: 61 72 65 20 74 68 61 74 20 61 20 66 75 6e 63 74  are that a funct
eb70: 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ion has been ove
eb80: 72 6c 6f 61 64 65 64 20 62 79 20 61 20 76 69 72  rloaded by a vir
eb90: 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
eba0: 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f  * If the functio
ebb0: 6e 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  n already exists
ebc0: 20 61 73 20 61 20 72 65 67 75 6c 61 72 20 67 6c   as a regular gl
ebd0: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74  obal function, t
ebe0: 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
ebf0: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
ec00: 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   If the function
ec10: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
ec20: 20 74 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20   then create.** 
ec30: 61 20 6e 65 77 20 6f 6e 65 20 74 68 61 74 20 61  a new one that a
ec40: 6c 77 61 79 73 20 74 68 72 6f 77 73 20 61 20 72  lways throws a r
ec50: 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20 20  un-time error.  
ec60: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74  .**.** When virt
ec70: 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 74 65 6e  ual tables inten
ec80: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20  d to provide an 
ec90: 6f 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74  overloaded funct
eca0: 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f  ion, they.** sho
ecb0: 75 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72 6f  uld call this ro
ecc0: 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75  utine to make su
ecd0: 72 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75  re the global fu
ece0: 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a  nction exists..*
ecf0: 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  * A global funct
ed00: 69 6f 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69  ion must exist i
ed10: 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d 65  n order for name
ed20: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77   resolution to w
ed30: 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e  ork.** properly.
ed40: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
ed50: 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f  overload_functio
ed60: 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n(.  sqlite3 *db
ed70: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
ed80: 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  zName,.  int nAr
ed90: 67 0a 29 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  g.){.  int nName
eda0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
edb0: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74  30(zName);.  int
edc0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
edd0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ede0: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
edf0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
ee00: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
ee10: 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20   || zName==0 || 
ee20: 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20 72  nArg<-2 ){.    r
ee30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
ee40: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
ee50: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
ee60: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
ee70: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c  utex);.  if( sql
ee80: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
ee90: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  (db, zName, nNam
eea0: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
eeb0: 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  UTF8, 0)==0 ){. 
eec0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
eed0: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 4e  reateFunc(db, zN
eee0: 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
eef0: 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20  E_UTF8,.        
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef10: 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e 76     0, sqlite3Inv
ef20: 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c  alidFunction, 0,
ef30: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63   0, 0);.  }.  rc
ef40: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
ef50: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
ef60: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
ef70: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
ef80: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
ef90: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
efa0: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67  _TRACE./*.** Reg
efb0: 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66 75  ister a trace fu
efc0: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72  nction.  The pAr
efd0: 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  g from the previ
efe0: 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
eff0: 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65 74   trace.** is ret
f000: 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  urned.  .**.** A
f010: 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e 63   NULL trace func
f020: 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20  tion means that 
f030: 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65 78  no tracing is ex
f040: 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e  ecutes.  A non-N
f050: 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73 20  ULL.** trace is 
f060: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
f070: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
f080: 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 73  invoked at the s
f090: 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20  tart of each.** 
f0a0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
f0b0: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
f0c0: 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a 64  trace(sqlite3 *d
f0d0: 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63 65  b, void (*xTrace
f0e0: 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
f0f0: 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67  ar*), void *pArg
f100: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b  ){.  void *pOld;
f110: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
f120: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
f130: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
f140: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
f150: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
f160: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
f170: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
f180: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
f190: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
f1a0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
f1b0: 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65  Old = db->pTrace
f1c0: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63  Arg;.  db->xTrac
f1d0: 65 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62  e = xTrace;.  db
f1e0: 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70 41  ->pTraceArg = pA
f1f0: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
f200: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
f210: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
f220: 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67  Old;.}./*.** Reg
f230: 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20  ister a profile 
f240: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70  function.  The p
f250: 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65  Arg from the pre
f260: 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72  viously register
f270: 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66  ed .** profile f
f280: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72  unction is retur
f290: 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e  ned.  .**.** A N
f2a0: 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  ULL profile func
f2b0: 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20  tion means that 
f2c0: 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20  no profiling is 
f2d0: 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e  executes.  A non
f2e0: 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65  -NULL.** profile
f2f0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
f300: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74   a function that
f310: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74   is invoked at t
f320: 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
f330: 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61  .** each SQL sta
f340: 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72  tement that is r
f350: 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  un..*/.void *sql
f360: 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20  ite3_profile(.  
f370: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76  sqlite3 *db,.  v
f380: 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28  oid (*xProfile)(
f390: 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
f3a0: 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29  *,sqlite_uint64)
f3b0: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29  ,.  void *pArg.)
f3c0: 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a  {.  void *pOld;.
f3d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
f3e0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
f3f0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
f400: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
f410: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
f420: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
f430: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
f440: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
f450: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
f460: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f  db->mutex);.  pO
f470: 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c  ld = db->pProfil
f480: 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f  eArg;.  db->xPro
f490: 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b  file = xProfile;
f4a0: 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41  .  db->pProfileA
f4b0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
f4c0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f4d0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
f4e0: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65  eturn pOld;.}.#e
f4f0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
f500: 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  MIT_TRACE */../*
f510: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 66  .** Register a f
f520: 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  unction to be in
f530: 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72 61  voked when a tra
f540: 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73  nsaction commits
f550: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 76 6f  ..** If the invo
f560: 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  ked function ret
f570: 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  urns non-zero, t
f580: 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20 62  hen the commit b
f590: 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c  ecomes a.** roll
f5a0: 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  back..*/.void *s
f5b0: 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f  qlite3_commit_ho
f5c0: 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
f5d0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
f5e0: 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
f5f0: 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ok to this datab
f600: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ase */.  int (*x
f610: 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29  Callback)(void*)
f620: 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74  ,  /* Function t
f630: 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68  o invoke on each
f640: 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69   commit */.  voi
f650: 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
f660: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
f670: 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
f680: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  on */.){.  void 
f690: 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53  *pOld;..#ifdef S
f6a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
f6b0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
f6c0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
f6d0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
f6e0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
f6f0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
f700: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
f710: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f720: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
f730: 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e  );.  pOld = db->
f740: 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62  pCommitArg;.  db
f750: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63  ->xCommitCallbac
f760: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
f770: 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20   db->pCommitArg 
f780: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
f790: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
f7a0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
f7b0: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pOld;.}../*.*
f7c0: 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
f7d0: 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
f7e0: 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
f7f0: 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a  row is updated,.
f800: 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64  ** inserted or d
f810: 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68 69  eleted using thi
f820: 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
f830: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
f840: 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68  sqlite3_update_h
f850: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
f860: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
f870: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
f880: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
f890: 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28  base */.  void (
f8a0: 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
f8b0: 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74  *,int,char const
f8c0: 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c   *,char const *,
f8d0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20  sqlite_int64),. 
f8e0: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
f8f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
f900: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
f910: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
f920: 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64  oid *pRet;..#ifd
f930: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f940: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
f950: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
f960: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
f970: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
f980: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
f990: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
f9a0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
f9b0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
f9c0: 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
f9d0: 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a  db->pUpdateArg;.
f9e0: 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c    db->xUpdateCal
f9f0: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
fa00: 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65  k;.  db->pUpdate
fa10: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
fa20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
fa30: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
fa40: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
fa50: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
fa60: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
fa70: 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
fa80: 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
fa90: 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  is rolled.** bac
faa0: 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  k by this databa
fab0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
fac0: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
fad0: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20  rollback_hook(. 
fae0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
faf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
fb00: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
fb10: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
fb20: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
fb30: 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a  back)(void*), /*
fb40: 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   Callback functi
fb50: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  on */.  void *pA
fb60: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
fb70: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
fb80: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
fb90: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  .){.  void *pRet
fba0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
fbb0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
fbc0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
fbd0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
fbe0: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
fbf0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
fc00: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
fc10: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
fc20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
fc30: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
fc40: 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c  pRet = db->pRoll
fc50: 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78  backArg;.  db->x
fc60: 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b  RollbackCallback
fc70: 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
fc80: 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
fc90: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
fca0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
fcb0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
fcc0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66  urn pRet;.}..#if
fcd0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
fce0: 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  _WAL./*.** The s
fcf0: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
fd00: 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73  ) callback regis
fd10: 74 65 72 65 64 20 62 79 20 73 71 6c 69 74 65 33  tered by sqlite3
fd20: 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
fd30: 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65  int()..** Invoke
fd40: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
fd50: 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e  ckpoint if the n
fd60: 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20  umber of frames 
fd70: 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a  in the log file.
fd80: 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
fd90: 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41  an sqlite3.pWalA
fda0: 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e  rg cast to an in
fdb0: 74 65 67 65 72 20 28 74 68 65 20 76 61 6c 75 65  teger (the value
fdc0: 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a   configured by.*
fdd0: 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  * wal_autocheckp
fde0: 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74  oint())..*/ .int
fdf0: 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75   sqlite3WalDefau
fe00: 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a  ltHook(.  void *
fe10: 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20  pClientData,    
fe20: 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a   /* Argument */.
fe30: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
fe40: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e           /* Conn
fe50: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ection */.  cons
fe60: 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
fe70: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a     /* Database *
fe80: 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20  /.  int nFrame  
fe90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
fea0: 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a  ze of WAL */.){.
feb0: 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51    if( nFrame>=SQ
fec0: 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
fed0: 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a  pClientData) ){.
fee0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
fef0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
ff00: 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
ff10: 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a  checkpoint(db, z
ff20: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
ff30: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
ff40: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
ff50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
ff60: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
ff70: 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
ff80: 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71   Configure an sq
ff90: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
ffa0: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74   callback to aut
ffb0: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b  omatically check
ffc0: 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62  point.** a datab
ffd0: 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74  ase after commit
ffe0: 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
fff0: 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  on if there are 
10000 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72  nFrame or.** mor
10010 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20  e frames in the 
10020 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e  log file. Passin
10030 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61  g zero or a nega
10040 74 69 76 65 20 76 61 6c 75 65 20 61 73 20 74 68  tive value as th
10050 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61  e.** nFrame para
10060 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73 20 61  meter disables a
10070 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f  utomatic checkpo
10080 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a  ints entirely..*
10090 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63  *.** The callbac
100a0 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20  k registered by 
100b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
100c0 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73 74  places any exist
100d0 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  ing callback.** 
100e0 72 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67  registered using
100f0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
10100 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72  k(). Likewise, r
10110 65 67 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c  egistering a cal
10120 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73  lback.** using s
10130 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
10140 29 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61  ) disables the a
10150 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f  utomatic checkpo
10160 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a  int mechanism.**
10170 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74   configured by t
10180 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
10190 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c  .int sqlite3_wal
101a0 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
101b0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
101c0 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66   nFrame){.#ifdef
101d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
101e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
101f0 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45  TER(db);.  UNUSE
10200 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61  D_PARAMETER(nFra
10210 6d 65 29 3b 0a 23 65 6c 73 65 0a 23 69 66 64 65  me);.#else.#ifde
10220 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10230 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
10240 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
10250 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
10260 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
10270 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
10280 69 66 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a  if( nFrame>0 ){.
10290 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
102a0 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65 33  hook(db, sqlite3
102b0 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20  WalDefaultHook, 
102c0 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
102d0 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65  R(nFrame));.  }e
102e0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
102f0 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c  _wal_hook(db, 0,
10300 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
10310 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10320 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  OK;.}../*.** Reg
10330 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
10340 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
10350 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73  ach time a trans
10360 61 63 74 69 6f 6e 20 69 73 20 77 72 69 74 74 65  action is writte
10370 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77 72  n.** into the wr
10380 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79  ite-ahead-log by
10390 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
103a0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
103b0 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f  id *sqlite3_wal_
103c0 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
103d0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
103e0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
103f0 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
10400 69 73 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a  is db handle */.
10410 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b    int(*xCallback
10420 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65  )(void *, sqlite
10430 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c  3*, const char*,
10440 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70   int),.  void *p
10450 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
10460 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
10470 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
10480 64 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29  d to xCallback()
10490 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
104a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
104b0 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 23 69 66   void *pRet;.#if
104c0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
104d0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
104e0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
104f0 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
10500 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
10510 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
10520 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
10530 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
10540 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
10550 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
10560 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20   db->pWalArg;.  
10570 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b  db->xWalCallback
10580 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
10590 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70 41  db->pWalArg = pA
105a0 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
105b0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
105c0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
105d0 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  Ret;.#else.  ret
105e0 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
105f0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e  ./*.** Checkpoin
10600 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 0a  t database zDb..
10610 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
10620 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
10630 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10650 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
10660 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
10670 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
10680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10690 61 6d 65 20 6f 66 20 61 74 74 61 63 68 65 64 20  ame of attached 
106a0 64 61 74 61 62 61 73 65 20 28 6f 72 20 4e 55 4c  database (or NUL
106b0 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64  L) */.  int eMod
106c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
106d0 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
106e0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76  E_CHECKPOINT_* v
106f0 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
10700 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20 20 20 20  nLog,           
10710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
10720 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f  : Size of WAL lo
10730 67 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20  g in frames */. 
10740 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20 20   int *pnCkpt    
10750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10760 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e   /* OUT: Total n
10770 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20  umber of frames 
10780 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a  checkpointed */.
10790 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
107a0 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74 75  _OMIT_WAL.  retu
107b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
107c0 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  lse.  int rc;   
107d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
107f0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  code */.  int iD
10800 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  b = SQLITE_MAX_A
10810 54 54 41 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c  TTACHED;  /* sql
10820 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78  ite3.aDb[] index
10830 20 6f 66 20 64 62 20 74 6f 20 63 68 65 63 6b 70   of db to checkp
10840 6f 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20  oint */..#ifdef 
10850 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
10860 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
10870 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
10880 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
10890 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
108a0 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  KPT;.#endif..  /
108b0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
108c0 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
108d0 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20  s to -1 in case 
108e0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
108f0 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20   */.  if( pnLog 
10900 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20  ) *pnLog = -1;. 
10910 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70   if( pnCkpt ) *p
10920 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61  nCkpt = -1;..  a
10930 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
10940 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
10950 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
10960 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
10970 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20  NT_FULL==1 );.  
10980 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
10990 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
109a0 54 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74  T==2 );.  assert
109b0 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
109c0 49 4e 54 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20  INT_TRUNCATE==3 
109d0 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53  );.  if( eMode<S
109e0 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
109f0 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64  _PASSIVE || eMod
10a00 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  e>SQLITE_CHECKPO
10a10 49 4e 54 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a  INT_TRUNCATE ){.
10a20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
10a30 4f 46 3a 20 52 2d 30 33 39 39 36 2d 31 32 30 38  OF: R-03996-1208
10a40 38 20 54 68 65 20 4d 20 70 61 72 61 6d 65 74 65  8 The M paramete
10a50 72 20 6d 75 73 74 20 62 65 20 61 20 76 61 6c 69  r must be a vali
10a60 64 20 63 68 65 63 6b 70 6f 69 6e 74 0a 20 20 20  d checkpoint.   
10a70 20 2a 2a 20 6d 6f 64 65 3a 20 2a 2f 0a 20 20 20   ** mode: */.   
10a80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
10a90 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71  ISUSE;.  }..  sq
10aa0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
10ab0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
10ac0 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62 5b 30  if( zDb && zDb[0
10ad0 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 73  ] ){.    iDb = s
10ae0 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
10af0 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20  (db, zDb);.  }. 
10b00 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20   if( iDb<0 ){.  
10b10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
10b20 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
10b30 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
10b40 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22   SQLITE_ERROR, "
10b50 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
10b60 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d  : %s", zDb);.  }
10b70 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 62 75  else{.    db->bu
10b80 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20  syHandler.nBusy 
10b90 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
10ba0 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
10bb0 64 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20  db, iDb, eMode, 
10bc0 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a  pnLog, pnCkpt);.
10bd0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10be0 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  (db, rc);.  }.  
10bf0 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
10c00 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
10c10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
10c20 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
10c30 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
10c40 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  if.}.../*.** Che
10c50 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65  ckpoint database
10c60 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20   zDb. If zDb is 
10c70 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20  NULL, or if the 
10c80 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74  buffer zDb point
10c90 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73  s.** to contains
10ca0 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73   a zero-length s
10cb0 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63  tring, all attac
10cc0 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72  hed databases ar
10cd0 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74  e .** checkpoint
10ce0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
10cf0 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
10d00 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  t(sqlite3 *db, c
10d10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
10d20 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
10d30 46 3a 20 52 2d 34 31 36 31 33 2d 32 30 35 35 33  F: R-41613-20553
10d40 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c   The sqlite3_wal
10d50 5f 63 68 65 63 6b 70 6f 69 6e 74 28 44 2c 58 29  _checkpoint(D,X)
10d60 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
10d70 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 77  o.  ** sqlite3_w
10d80 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
10d90 28 44 2c 58 2c 53 51 4c 49 54 45 5f 43 48 45 43  (D,X,SQLITE_CHEC
10da0 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30  KPOINT_PASSIVE,0
10db0 2c 30 29 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ,0). */.  return
10dc0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
10dd0 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 7a 44  ckpoint_v2(db,zD
10de0 62 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  b,SQLITE_CHECKPO
10df0 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30 29  INT_PASSIVE,0,0)
10e00 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
10e10 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
10e20 2a 2a 20 52 75 6e 20 61 20 63 68 65 63 6b 70 6f  ** Run a checkpo
10e30 69 6e 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20  int on database 
10e40 69 44 62 2e 20 54 68 69 73 20 69 73 20 61 20 6e  iDb. This is a n
10e50 6f 2d 6f 70 20 69 66 20 64 61 74 61 62 61 73 65  o-op if database
10e60 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63   iDb is.** not c
10e70 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e  urrently open in
10e80 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a   WAL mode..**.**
10e90 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
10ea0 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  n is open on the
10eb0 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
10ec0 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68  checkpointed, th
10ed0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
10ee0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c  returns SQLITE_L
10ef0 4f 43 4b 45 44 20 61 6e 64 20 61 20 63 68 65 63  OCKED and a chec
10f00 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 74  kpoint is not at
10f10 74 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20  tempted. If .** 
10f20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
10f30 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68  while running th
10f40 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e  e checkpoint, an
10f50 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
10f60 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  de is .** return
10f70 65 64 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f  ed (i.e. SQLITE_
10f80 49 4f 45 52 52 29 2e 20 4f 74 68 65 72 77 69 73  IOERR). Otherwis
10f90 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  e, SQLITE_OK..**
10fa0 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 6e  .** The mutex on
10fb0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
10fc0 20 64 62 20 73 68 6f 75 6c 64 20 62 65 20 68 65   db should be he
10fd0 6c 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ld by the caller
10fe0 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61  . The mutex.** a
10ff0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
11000 68 65 20 73 70 65 63 69 66 69 63 20 62 2d 74 72  he specific b-tr
11010 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f  ee being checkpo
11020 69 6e 74 65 64 20 69 73 20 74 61 6b 65 6e 20 62  inted is taken b
11030 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  y.** this functi
11040 6f 6e 20 77 68 69 6c 65 20 74 68 65 20 63 68 65  on while the che
11050 63 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69  ckpoint is runni
11060 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  ng..**.** If iDb
11070 20 69 73 20 70 61 73 73 65 64 20 53 51 4c 49 54   is passed SQLIT
11080 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 20  E_MAX_ATTACHED, 
11090 74 68 65 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  then all attache
110a0 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65 0a  d databases are.
110b0 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e  ** checkpointed.
110c0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
110d0 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69  encountered it i
110e0 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64  s returned immed
110f0 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61  iately -.** no a
11100 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
11110 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79  o checkpoint any
11120 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 62   remaining datab
11130 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  ases..**.** Para
11140 6d 65 74 65 72 20 65 4d 6f 64 65 20 69 73 20 6f  meter eMode is o
11150 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45  ne of SQLITE_CHE
11160 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c  CKPOINT_PASSIVE,
11170 20 46 55 4c 4c 20 6f 72 20 52 45 53 54 41 52 54   FULL or RESTART
11180 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11190 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  Checkpoint(sqlit
111a0 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
111b0 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20   int eMode, int 
111c0 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43  *pnLog, int *pnC
111d0 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  kpt){.  int rc =
111e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
111f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
11200 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
11210 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
11220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
11230 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
11240 68 72 6f 75 67 68 20 61 74 74 61 63 68 65 64 20  hrough attached 
11250 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75  dbs */.  int bBu
11260 73 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sy = 0;         
11270 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
11280 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   if SQLITE_BUSY 
11290 68 61 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  has been encount
112a0 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ered */..  asser
112b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
112c0 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
112d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
112e0 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d  nLog || *pnLog==
112f0 2d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  -1 );.  assert( 
11300 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b  !pnCkpt || *pnCk
11310 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72  pt==-1 );..  for
11320 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20  (i=0; i<db->nDb 
11330 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
11340 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
11350 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53  i==iDb || iDb==S
11360 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
11370 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ED ){.      rc =
11380 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 68 65   sqlite3BtreeChe
11390 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b  ckpoint(db->aDb[
113a0 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70  i].pBt, eMode, p
113b0 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20  nLog, pnCkpt);. 
113c0 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a       pnLog = 0;.
113d0 20 20 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30        pnCkpt = 0
113e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
113f0 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
11400 20 20 20 20 20 20 20 62 42 75 73 79 20 3d 20 31         bBusy = 1
11410 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
11420 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
11430 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
11440 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
11450 45 5f 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f  E_OK && bBusy) ?
11460 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72   SQLITE_BUSY : r
11470 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
11480 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
11490 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
114a0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
114b0 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f  rue if main-memo
114c0 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  ry should be use
114d0 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
114e0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
114f0 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70   for transient p
11500 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73  ager files and s
11510 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
11520 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  s..** The value 
11530 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73  returned depends
11540 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
11550 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
11560 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61  (runtime.** para
11570 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65 20 63  meter) and the c
11580 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75  ompile time valu
11590 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  e of SQLITE_TEMP
115a0 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66  _STORE. The.** f
115b0 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64  ollowing table d
115c0 65 73 63 72 69 62 65 73 20 74 68 65 20 72 65 6c  escribes the rel
115d0 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65  ationship betwee
115e0 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75  n these two valu
115f0 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66  es.** and this f
11600 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
11610 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  value..**.**   S
11620 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
11630 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74       db->temp_st
11640 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e  ore     Location
11650 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61   of temporary da
11660 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d  tabase.**   ----
11670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
11680 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
11690 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
116a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116b0 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
116c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
116d0 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
116e0 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
116f0 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20  urn 0).**   1   
11700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11710 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
11720 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
11730 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31  return 0).**   1
11740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11750 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
11760 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
11770 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
11780 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
11790 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
117a0 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
117b0 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
117c0 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
117d0 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
117e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
117f0 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
11800 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  0).**   2       
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11830 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
11840 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 1).**   2    
11850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11860 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
11870 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
11880 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20  eturn 1).**   3 
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118a0 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
118b0 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
118c0 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69   (return 1).*/.i
118d0 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  nt sqlite3TempIn
118e0 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c  Memory(const sql
118f0 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53  ite3 *db){.#if S
11900 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
11910 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64  ==1.  return ( d
11920 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32  b->temp_store==2
11930 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   );.#endif.#if S
11940 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
11950 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64  ==2.  return ( d
11960 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31  b->temp_store!=1
11970 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   );.#endif.#if S
11980 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
11990 3d 3d 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ==3.  UNUSED_PAR
119a0 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65  AMETER(db);.  re
119b0 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23  turn 1;.#endif.#
119c0 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
119d0 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45  TORE<1 || SQLITE
119e0 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20  _TEMP_STORE>3.  
119f0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
11a00 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  (db);.  return 0
11a10 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
11a20 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65  * Return UTF-8 e
11a30 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c  ncoded English l
11a40 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74  anguage explanat
11a50 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
11a60 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e  recent.** error.
11a70 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
11a80 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73  sqlite3_errmsg(s
11a90 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63  qlite3 *db){.  c
11aa0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
11ab0 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72  if( !db ){.    r
11ac0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
11ad0 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  Str(SQLITE_NOMEM
11ae0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  );.  }.  if( !sq
11af0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
11b00 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
11b10 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
11b20 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
11b30 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20  MISUSE_BKPT);.  
11b40 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
11b50 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
11b60 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  x);.  if( db->ma
11b70 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
11b80 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72    z = sqlite3Err
11b90 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  Str(SQLITE_NOMEM
11ba0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11bb0 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 70 45  testcase( db->pE
11bc0 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7a 20 3d  rr==0 );.    z =
11bd0 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
11be0 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70  value_text(db->p
11bf0 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Err);.    assert
11c00 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
11c10 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  led );.    if( z
11c20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  ==0 ){.      z =
11c30 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64   sqlite3ErrStr(d
11c40 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20  b->errCode);.   
11c50 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
11c60 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
11c70 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
11c80 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n z;.}..#ifndef 
11c90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
11ca0 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55  6./*.** Return U
11cb0 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e  TF-16 encoded En
11cc0 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
11cd0 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
11ce0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
11cf0 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   error..*/.const
11d00 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65   void *sqlite3_e
11d10 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20  rrmsg16(sqlite3 
11d20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63  *db){.  static c
11d30 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65  onst u16 outOfMe
11d40 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c  m[] = {.    'o',
11d50 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20   'u', 't', ' ', 
11d60 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27  'o', 'f', ' ', '
11d70 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f  m', 'e', 'm', 'o
11d80 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20  ', 'r', 'y', 0. 
11d90 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
11da0 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20  st u16 misuse[] 
11db0 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69 27  = {.    'l', 'i'
11dc0 2c 20 27 62 27 2c 20 27 72 27 2c 20 27 61 27 2c  , 'b', 'r', 'a',
11dd0 20 27 72 27 2c 20 27 79 27 2c 20 27 20 27 2c 20   'r', 'y', ' ', 
11de0 0a 20 20 20 20 27 72 27 2c 20 27 6f 27 2c 20 27  .    'r', 'o', '
11df0 75 27 2c 20 27 74 27 2c 20 27 69 27 2c 20 27 6e  u', 't', 'i', 'n
11e00 27 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'e', ' ', .  
11e10 20 20 27 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c    'c', 'a', 'l',
11e20 20 27 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c 20   'l', 'e', 'd', 
11e30 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27  ' ', .    'o', '
11e40 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a 20  u', 't', ' ', . 
11e50 20 20 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27     'o', 'f', ' '
11e60 2c 20 0a 20 20 20 20 27 73 27 2c 20 27 65 27 2c  , .    's', 'e',
11e70 20 27 71 27 2c 20 27 75 27 2c 20 27 65 27 2c 20   'q', 'u', 'e', 
11e80 27 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c 20 30  'n', 'c', 'e', 0
11e90 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76  .  };..  const v
11ea0 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64  oid *z;.  if( !d
11eb0 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
11ec0 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d  (void *)outOfMem
11ed0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
11ee0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
11ef0 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
11f00 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20     return (void 
11f10 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20  *)misuse;.  }.  
11f20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
11f30 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
11f40 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
11f50 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20  Failed ){.    z 
11f60 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d  = (void *)outOfM
11f70 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  em;.  }else{.   
11f80 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
11f90 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45  ue_text16(db->pE
11fa0 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  rr);.    if( z==
11fb0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
11fc0 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
11fd0 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20  b, db->errCode, 
11fe0 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62  sqlite3ErrStr(db
11ff0 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20 20 20  ->errCode));.   
12000 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
12010 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e  alue_text16(db->
12020 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pErr);.    }.   
12030 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d   /* A malloc() m
12040 61 79 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  ay have failed w
12050 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74  ithin the call t
12060 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  o sqlite3_value_
12070 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20  text16().    ** 
12080 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69  above. If this i
12090 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
120a0 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
120b0 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73  ailed flag needs
120c0 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c   to.    ** be cl
120d0 65 61 72 65 64 20 62 65 66 6f 72 65 20 72 65 74  eared before ret
120e0 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20  urning. Do this 
120f0 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61  directly, instea
12100 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20  d of via.    ** 
12110 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 29  sqlite3ApiExit()
12120 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69  , to avoid setti
12130 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
12140 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73  handle error mes
12150 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sage..    */.   
12160 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
12170 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  d = 0;.  }.  sql
12180 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
12190 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
121a0 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69  eturn z;.}.#endi
121b0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
121c0 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
121d0 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   Return the most
121e0 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f   recent error co
121f0 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  de generated by 
12200 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e  an SQLite routin
12210 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a  e. If NULL is.**
12220 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
12230 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73  function, we ass
12240 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66  ume a malloc() f
12250 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c  ailed during sql
12260 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a  ite3_open()..*/.
12270 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63  int sqlite3_errc
12280 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ode(sqlite3 *db)
12290 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73  {.  if( db && !s
122a0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
122b0 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
122c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
122d0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
122e0 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c    }.  if( !db ||
122f0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
12300 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
12310 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
12320 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65  }.  return db->e
12330 72 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72 72  rrCode & db->err
12340 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  Mask;.}.int sqli
12350 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
12360 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  code(sqlite3 *db
12370 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21  ){.  if( db && !
12380 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
12390 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
123a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
123b0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
123c0 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c  .  }.  if( !db |
123d0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
123e0 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
123f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12400 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
12410 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  errCode;.}../*.*
12420 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e  * Return a strin
12430 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
12440 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72   the kind of err
12450 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
12460 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  the.** argument.
12470 20 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20    For now, this 
12480 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74 68 65  simply calls the
12490 20 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69 74 65   internal sqlite
124a0 33 45 72 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e  3ErrStr().** fun
124b0 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ction..*/.const 
124c0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72  char *sqlite3_er
124d0 72 73 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20  rstr(int rc){.  
124e0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
124f0 72 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  rStr(rc);.}../*.
12500 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
12510 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
12520 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  on for database 
12530 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65 20  "db".  The name 
12540 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20  is zName.** and 
12550 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20  the encoding is 
12560 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  enc..*/.static i
12570 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  nt createCollati
12580 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  on(.  sqlite3* d
12590 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
125a0 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e  *zName, .  u8 en
125b0 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  c,.  void* pCtx,
125c0 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
125d0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
125e0 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
125f0 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  t void*),.  void
12600 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29  (*xDel)(void*).)
12610 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
12620 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a  ll;.  int enc2;.
12630 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c    .  assert( sql
12640 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12650 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
12660 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54   /* If SQLITE_UT
12670 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64  F16 is specified
12680 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
12690 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d   type, transform
126a0 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e   this.  ** to on
126b0 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31  e of SQLITE_UTF1
126c0 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54  6LE or SQLITE_UT
126d0 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a  F16BE using the.
126e0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31    ** SQLITE_UTF1
126f0 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53  6NATIVE macro. S
12700 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e  QLITE_UTF16 is n
12710 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  ot used internal
12720 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20  ly..  */.  enc2 
12730 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73  = enc;.  testcas
12740 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  e( enc2==SQLITE_
12750 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63  UTF16 );.  testc
12760 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54  ase( enc2==SQLIT
12770 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
12780 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53  );.  if( enc2==S
12790 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65  QLITE_UTF16 || e
127a0 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
127b0 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20  6_ALIGNED ){.   
127c0 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55   enc2 = SQLITE_U
127d0 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a  TF16NATIVE;.  }.
127e0 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54    if( enc2<SQLIT
127f0 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53  E_UTF8 || enc2>S
12800 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b  QLITE_UTF16BE ){
12810 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12820 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
12830 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
12840 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  if this call is 
12850 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c  removing or repl
12860 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e  acing an existin
12870 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a  g collation .  *
12880 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73  * sequence. If s
12890 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  o, and there are
128a0 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74   active VMs, ret
128b0 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65  urn busy. If the
128c0 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61  re.  ** are no a
128d0 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c  ctive VMs, inval
128e0 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f  idate any pre-co
128f0 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
12900 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20  s..  */.  pColl 
12910 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
12920 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63  lSeq(db, (u8)enc
12930 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  2, zName, 0);.  
12940 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f  if( pColl && pCo
12950 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20  ll->xCmp ){.    
12960 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  if( db->nVdbeAct
12970 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ive ){.      sql
12980 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
12990 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  (db, SQLITE_BUSY
129a0 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62  , .        "unab
129b0 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64  le to delete/mod
129c0 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ify collation se
129d0 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20 61 63  quence due to ac
129e0 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22  tive statements"
129f0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12a00 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
12a10 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
12a20 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
12a30 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20  ements(db);..   
12a40 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e   /* If collation
12a50 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20   sequence pColl 
12a60 77 61 73 20 63 72 65 61 74 65 64 20 64 69 72 65  was created dire
12a70 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c 20 74  ctly by a call t
12a80 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
12a90 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
12aa0 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72  n, and not gener
12ab0 61 74 65 64 20 62 79 20 73 79 6e 74 68 43 6f 6c  ated by synthCol
12ac0 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74  lSeq(),.    ** t
12ad0 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73 20 6d  hen any copies m
12ae0 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c  ade by synthColl
12af0 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20 62 65  Seq() need to be
12b00 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20 20   invalidated..  
12b10 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61    ** Also, colla
12b20 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f 72 20  tion destructor 
12b30 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29  - CollSeq.xDel()
12b40 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20   - function may 
12b50 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62  need.    ** to b
12b60 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f  e called..    */
12b70 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c 6c   .    if( (pColl
12b80 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f  ->enc & ~SQLITE_
12b90 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d  UTF16_ALIGNED)==
12ba0 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20 43 6f  enc2 ){.      Co
12bb0 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73  llSeq *aColl = s
12bc0 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
12bd0 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e  db->aCollSeq, zN
12be0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  ame);.      int 
12bf0 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
12c00 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
12c10 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20       CollSeq *p 
12c20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  = &aColl[j];.   
12c30 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d       if( p->enc=
12c40 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20  =pColl->enc ){. 
12c50 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
12c60 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  xDel ){.        
12c70 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70      p->xDel(p->p
12c80 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  User);.         
12c90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
12ca0 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  xCmp = 0;.      
12cb0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12cc0 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d  }.  }..  pColl =
12cd0 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
12ce0 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32  Seq(db, (u8)enc2
12cf0 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69  , zName, 1);.  i
12d00 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65  f( pColl==0 ) re
12d10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12d20 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  M;.  pColl->xCmp
12d30 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70   = xCompare;.  p
12d40 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43  Coll->pUser = pC
12d50 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65  tx;.  pColl->xDe
12d60 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c  l = xDel;.  pCol
12d70 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e  l->enc = (u8)(en
12d80 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49  c2 | (enc & SQLI
12d90 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
12da0 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72  ));.  sqlite3Err
12db0 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
12dc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12dd0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
12de0 20 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69   This array defi
12df0 6e 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62  nes hard upper b
12e00 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76  ounds on limit v
12e10 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69  alues.  The.** i
12e20 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20  nitializer must 
12e30 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20  be kept in sync 
12e40 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
12e50 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69  LIMIT_*.** #defi
12e60 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68  nes in sqlite3.h
12e70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
12e80 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74  t int aHardLimit
12e90 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f  [] = {.  SQLITE_
12ea0 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  MAX_LENGTH,.  SQ
12eb0 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
12ec0 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
12ed0 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49  X_COLUMN,.  SQLI
12ee0 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
12ef0 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
12f00 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c  COMPOUND_SELECT,
12f10 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  .  SQLITE_MAX_VD
12f20 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f  BE_OP,.  SQLITE_
12f30 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
12f40 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  ,.  SQLITE_MAX_A
12f50 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54  TTACHED,.  SQLIT
12f60 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
12f70 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  RN_LENGTH,.  SQL
12f80 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
12f90 5f 4e 55 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a  _NUMBER,      /*
12fa0 20 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33 32   IMP: R-38091-32
12fb0 33 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f  352 */.  SQLITE_
12fc0 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
12fd0 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
12fe0 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a  WORKER_THREADS,.
12ff0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  };../*.** Make s
13000 75 72 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d  ure the hard lim
13010 69 74 73 20 61 72 65 20 73 65 74 20 74 6f 20 72  its are set to r
13020 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73  easonable values
13030 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .*/.#if SQLITE_M
13040 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20  AX_LENGTH<100.# 
13050 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
13060 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
13070 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e  at least 100.#en
13080 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
13090 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30  AX_SQL_LENGTH<10
130a0 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
130b0 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
130c0 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
130d0 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20   100.#endif.#if 
130e0 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
130f0 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58  ENGTH>SQLITE_MAX
13100 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20  _LENGTH.# error 
13110 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
13120 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62  ENGTH must not b
13130 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53  e greater than S
13140 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
13150 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
13160 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
13170 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72  SELECT<2.# error
13180 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
13190 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74  OUND_SELECT must
131a0 20 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23   be at least 2.#
131b0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
131c0 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a  _MAX_VDBE_OP<40.
131d0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
131e0 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20  AX_VDBE_OP must 
131f0 62 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23  be at least 40.#
13200 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
13210 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
13220 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  G<0 || SQLITE_MA
13230 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31  X_FUNCTION_ARG>1
13240 30 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  000.# error SQLI
13250 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
13260 41 52 47 20 6d 75 73 74 20 62 65 20 62 65 74 77  ARG must be betw
13270 65 65 6e 20 30 20 61 6e 64 20 31 30 30 30 0a 23  een 0 and 1000.#
13280 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
13290 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3c 30 20  _MAX_ATTACHED<0 
132a0 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  || SQLITE_MAX_AT
132b0 54 41 43 48 45 44 3e 31 32 35 0a 23 20 65 72 72  TACHED>125.# err
132c0 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  or SQLITE_MAX_AT
132d0 54 41 43 48 45 44 20 6d 75 73 74 20 62 65 20 62  TACHED must be b
132e0 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 32 35  etween 0 and 125
132f0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
13300 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
13310 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65  ERN_LENGTH<1.# e
13320 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
13330 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
13340 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
13350 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69  east 1.#endif.#i
13360 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
13370 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f  UMN>32767.# erro
13380 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  r SQLITE_MAX_COL
13390 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63  UMN must not exc
133a0 65 65 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66  eed 32767.#endif
133b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
133c0 54 52 49 47 47 45 52 5f 44 45 50 54 48 3c 31 0a  TRIGGER_DEPTH<1.
133d0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
133e0 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
133f0 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
13400 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 1.#endif.#if S
13410 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
13420 5f 54 48 52 45 41 44 53 3c 30 20 7c 7c 20 53 51  _THREADS<0 || SQ
13430 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
13440 54 48 52 45 41 44 53 3e 35 30 0a 23 20 65 72 72  THREADS>50.# err
13450 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  or SQLITE_MAX_WO
13460 52 4b 45 52 5f 54 48 52 45 41 44 53 20 6d 75 73  RKER_THREADS mus
13470 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  t be between 0 a
13480 6e 64 20 35 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f  nd 50.#endif.../
13490 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
134a0 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74  value of a limit
134b0 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c  .  Report the ol
134c0 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61  d value..** If a
134d0 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20  n invalid limit 
134e0 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69 65  index is supplie
134f0 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a  d, report -1..**
13500 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
13510 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72   but still repor
13520 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20  t the old value 
13530 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69  if the.** new li
13540 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e  mit is negative.
13550 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77  .**.** A new low
13560 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f  er limit does no
13570 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e  t shrink existin
13580 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a  g constructs..**
13590 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65   It merely preve
135a0 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63  nts new construc
135b0 74 73 20 74 68 61 74 20 65 78 63 65 65 64 20 74  ts that exceed t
135c0 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d  he limit.** from
135d0 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   forming..*/.int
135e0 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73   sqlite3_limit(s
135f0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
13600 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77  limitId, int new
13610 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c  Limit){.  int ol
13620 64 4c 69 6d 69 74 3b 0a 0a 23 69 66 64 65 66 20  dLimit;..#ifdef 
13630 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
13640 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
13650 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
13660 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
13670 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
13680 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
13690 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64  urn -1;.  }.#end
136a0 69 66 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  if..  /* EVIDENC
136b0 45 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34  E-OF: R-30189-54
136c0 30 39 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d  097 For each lim
136d0 69 74 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49  it category SQLI
136e0 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20  TE_LIMIT_NAME.  
136f0 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 61  ** there is a ha
13700 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73  rd upper bound s
13710 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  et at compile-ti
13720 6d 65 20 62 79 20 61 20 43 20 70 72 65 70 72 6f  me by a C prepro
13730 63 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72  cessor.  ** macr
13740 6f 20 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f  o called SQLITE_
13750 4d 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22  MAX_NAME. (The "
13760 5f 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20  _LIMIT_" in the 
13770 6e 61 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20  name is changed 
13780 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e  to.  ** "_MAX_".
13790 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ).  */.  assert(
137a0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
137b0 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d  TE_LIMIT_LENGTH]
137c0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  ==SQLITE_MAX_LEN
137d0 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  GTH );.  assert(
137e0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
137f0 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e  TE_LIMIT_SQL_LEN
13800 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  GTH]==SQLITE_MAX
13810 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  _SQL_LENGTH );. 
13820 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
13830 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
13840 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45  _COLUMN]==SQLITE
13850 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _MAX_COLUMN );. 
13860 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
13870 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
13880 5f 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51  _EXPR_DEPTH]==SQ
13890 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
138a0 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
138b0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
138c0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
138d0 44 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54  D_SELECT]==SQLIT
138e0 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
138f0 45 4c 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74  ELECT);.  assert
13900 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
13910 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f  ITE_LIMIT_VDBE_O
13920 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56  P]==SQLITE_MAX_V
13930 44 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65  DBE_OP );.  asse
13940 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
13950 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43  QLITE_LIMIT_FUNC
13960 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54  TION_ARG]==SQLIT
13970 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
13980 52 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  RG );.  assert( 
13990 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
139a0 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44  E_LIMIT_ATTACHED
139b0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  ]==SQLITE_MAX_AT
139c0 54 41 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65  TACHED );.  asse
139d0 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
139e0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45  QLITE_LIMIT_LIKE
139f0 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d  _PATTERN_LENGTH]
13a00 3d 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ==.             
13a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a30 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b    SQLITE_MAX_LIK
13a40 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
13a50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
13a60 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
13a70 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
13a80 55 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d  UMBER]==SQLITE_M
13a90 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  AX_VARIABLE_NUMB
13aa0 45 52 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ER);.  assert( a
13ab0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
13ac0 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44  _LIMIT_TRIGGER_D
13ad0 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  EPTH]==SQLITE_MA
13ae0 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
13af0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
13b00 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
13b10 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
13b20 41 44 53 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  ADS]==SQLITE_MAX
13b30 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20  _WORKER_THREADS 
13b40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
13b50 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
13b60 5f 54 48 52 45 41 44 53 3d 3d 28 53 51 4c 49 54  _THREADS==(SQLIT
13b70 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a  E_N_LIMIT-1) );.
13b80 0a 0a 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c  ..  if( limitId<
13b90 30 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51  0 || limitId>=SQ
13ba0 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a  LITE_N_LIMIT ){.
13bb0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
13bc0 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20   }.  oldLimit = 
13bd0 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74  db->aLimit[limit
13be0 49 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69  Id];.  if( newLi
13bf0 6d 69 74 3e 3d 30 20 29 7b 20 20 20 20 20 20 20  mit>=0 ){       
13c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13c10 4d 50 3a 20 52 2d 35 32 34 37 36 2d 32 38 37 33  MP: R-52476-2873
13c20 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77  2 */.    if( new
13c30 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74  Limit>aHardLimit
13c40 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20  [limitId] ){.   
13c50 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48     newLimit = aH
13c60 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ardLimit[limitId
13c70 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31  ];  /* IMP: R-51
13c80 34 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20  463-25634 */.   
13c90 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69   }.    db->aLimi
13ca0 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77  t[limitId] = new
13cb0 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74  Limit;.  }.  ret
13cc0 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20  urn oldLimit;   
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ce0 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34    /* IMP: R-5334
13cf0 31 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a  1-35419 */.}../*
13d00 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
13d10 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 72  n is used to par
13d20 73 65 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64  se both URIs and
13d30 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d   non-URI filenam
13d40 65 73 20 70 61 73 73 65 64 20 62 79 20 74 68 65  es passed by the
13d50 0a 2a 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20  .** user to API 
13d60 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65  functions sqlite
13d70 33 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69  3_open() or sqli
13d80 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61  te3_open_v2(), a
13d90 6e 64 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a  nd for database.
13da0 2a 2a 20 55 52 49 73 20 73 70 65 63 69 66 69 65  ** URIs specifie
13db0 64 20 61 73 20 70 61 72 74 20 6f 66 20 41 54 54  d as part of ATT
13dc0 41 43 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ACH statements..
13dd0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
13de0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
13df0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65   function is the
13e00 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53   name of the VFS
13e10 20 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61   to use (or.** a
13e20 20 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79   NULL to signify
13e30 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
13e40 29 20 69 66 20 74 68 65 20 55 52 49 20 64 6f 65  ) if the URI doe
13e50 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  s not contain a 
13e60 22 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65  "vfs=xxx".** que
13e70 72 79 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68  ry parameter. Th
13e80 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
13e90 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55  t contains the U
13ea0 52 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66  RI (or non-URI f
13eb0 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65  ilename).** itse
13ec0 6c 66 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75  lf. When this fu
13ed0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13ee0 20 74 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72   the *pFlags var
13ef0 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e  iable should con
13f00 74 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61  tain.** the defa
13f10 75 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65  ult flags to ope
13f20 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
13f30 61 6e 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20  andle with. The 
13f40 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a  value stored in.
13f50 2a 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62  ** *pFlags may b
13f60 65 20 75 70 64 61 74 65 64 20 62 65 66 6f 72 65  e updated before
13f70 20 72 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68   returning if th
13f80 65 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63  e URI filename c
13f90 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63  ontains .** "cac
13fa0 68 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65  he=xxx" or "mode
13fb0 3d 78 78 78 22 20 71 75 65 72 79 20 70 61 72 61  =xxx" query para
13fc0 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  meters..**.** If
13fd0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
13fe0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
13ff0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
14000 20 2a 70 70 56 66 73 20 69 73 20 73 65 74 20 74   *ppVfs is set t
14010 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
14020 65 20 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c  e VFS that shoul
14030 64 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65  d be used to ope
14040 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
14050 69 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20  ile. *pzFile is 
14060 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20  set to.** point 
14070 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
14080 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20  aining the name 
14090 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f  of the file to o
140a0 70 65 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a  pen. It is the .
140b0 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
140c0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
140d0 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61  to eventually ca
140e0 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ll sqlite3_free(
140f0 29 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20  ) to release.** 
14100 74 68 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  this buffer..**.
14110 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
14120 63 63 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53  ccurs, then an S
14130 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
14140 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
14150 20 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61   *pzErrMsg.** ma
14160 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e  y be set to poin
14170 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
14180 6e 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c  ntaining an Engl
14190 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72  ish language err
141a0 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20  or .** message. 
141b0 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
141c0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
141d0 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
141e0 61 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20  ally release.** 
141f0 74 68 69 73 20 62 75 66 66 65 72 20 62 79 20 63  this buffer by c
14200 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66  alling sqlite3_f
14210 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ree()..*/.int sq
14220 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 0a 20  lite3ParseUri(. 
14230 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
14240 66 61 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20  faultVfs,       
14250 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69   /* VFS to use i
14260 66 20 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71  f no "vfs=xxx" q
14270 75 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  uery option */. 
14280 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72   const char *zUr
14290 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i,              
142a0 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74   /* Nul-terminat
142b0 65 64 20 55 52 49 20 74 6f 20 70 61 72 73 65 20  ed URI to parse 
142c0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  */.  unsigned in
142d0 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20  t *pFlags,      
142e0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
142f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20  SQLITE_OPEN_XXX 
14300 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  flags */.  sqlit
14310 65 33 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20  e3_vfs **ppVfs, 
14320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
14330 54 3a 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f  T: VFS to use */
14340 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c   .  char **pzFil
14350 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
14360 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65      /* OUT: File
14370 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f  name component o
14380 66 20 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20  f URI */.  char 
14390 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20  **pzErrMsg      
143a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
143b0 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  T: Error message
143c0 20 28 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f   (if rc!=SQLITE_
143d0 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  OK) */.){.  int 
143e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
143f0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66    unsigned int f
14400 6c 61 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a  lags = *pFlags;.
14410 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
14420 66 73 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73  fs = zDefaultVfs
14430 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  ;.  char *zFile;
14440 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74  .  char c;.  int
14450 20 6e 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53   nUri = sqlite3S
14460 74 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a  trlen30(zUri);..
14470 20 20 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72    assert( *pzErr
14480 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  Msg==0 );..  if(
14490 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54   ((flags & SQLIT
144a0 45 5f 4f 50 45 4e 5f 55 52 49 29 20 20 20 20 20  E_OPEN_URI)     
144b0 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
144c0 52 2d 34 38 37 32 35 2d 33 32 32 30 36 20 2a 2f  R-48725-32206 */
144d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
144e0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
144f0 66 69 67 2e 62 4f 70 65 6e 55 72 69 29 20 2f 2a  fig.bOpenUri) /*
14500 20 49 4d 50 3a 20 52 2d 35 31 36 38 39 2d 34 36   IMP: R-51689-46
14510 35 34 38 20 2a 2f 0a 20 20 20 26 26 20 6e 55 72  548 */.   && nUr
14520 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a  i>=5 && memcmp(z
14530 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29  Uri, "file:", 5)
14540 3d 3d 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 37  ==0 /* IMP: R-57
14550 38 38 34 2d 33 37 34 39 36 20 2a 2f 0a 20 20 29  884-37496 */.  )
14560 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74  {.    char *zOpt
14570 3b 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65  ;.    int eState
14580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14590 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 73 74      /* Parser st
145a0 61 74 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67  ate when parsing
145b0 20 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20   URI */.    int 
145c0 69 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  iIn;            
145d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
145e0 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64  ut character ind
145f0 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f  ex */.    int iO
14600 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
14610 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
14620 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65  t character inde
14630 78 20 2a 2f 0a 20 20 20 20 75 36 34 20 6e 42 79  x */.    u64 nBy
14640 74 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20  te = nUri+2;    
14650 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
14660 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  of space to allo
14670 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  cate */..    /* 
14680 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 53 51  Make sure the SQ
14690 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c  LITE_OPEN_URI fl
146a0 61 67 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64  ag is set to ind
146b0 69 63 61 74 65 20 74 6f 20 74 68 65 20 56 46 53  icate to the VFS
146c0 20 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d   xOpen .    ** m
146d0 65 74 68 6f 64 20 74 68 61 74 20 74 68 65 72 65  ethod that there
146e0 20 6d 61 79 20 62 65 20 65 78 74 72 61 20 70 61   may be extra pa
146f0 72 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69  rameters followi
14700 6e 67 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65  ng the file-name
14710 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20  .  */.    flags 
14720 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  |= SQLITE_OPEN_U
14730 52 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e  RI;..    for(iIn
14740 3d 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49  =0; iIn<nUri; iI
14750 6e 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a  n++) nByte += (z
14760 55 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a  Uri[iIn]=='&');.
14770 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69      zFile = sqli
14780 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79  te3_malloc64(nBy
14790 74 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46  te);.    if( !zF
147a0 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ile ) return SQL
147b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20 20  ITE_NOMEM;..    
147c0 69 49 6e 20 3d 20 35 3b 0a 23 69 66 64 65 66 20  iIn = 5;.#ifdef 
147d0 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52 49  SQLITE_ALLOW_URI
147e0 5f 41 55 54 48 4f 52 49 54 59 0a 20 20 20 20 69  _AUTHORITY.    i
147f0 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b  f( strncmp(zUri+
14800 35 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20  5, "///", 3)==0 
14810 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37  ){.      iIn = 7
14820 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  ;.      /* The f
14830 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69  ollowing conditi
14840 6f 6e 20 63 61 75 73 65 73 20 55 52 49 73 20 77  on causes URIs w
14850 69 74 68 20 66 69 76 65 20 6c 65 61 64 69 6e 67  ith five leading
14860 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20 20   / characters.  
14870 20 20 20 20 2a 2a 20 6c 69 6b 65 20 66 69 6c 65      ** like file
14880 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 20  ://///host/path 
14890 74 6f 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  to be converted 
148a0 69 6e 74 6f 20 55 4e 43 73 20 6c 69 6b 65 20 2f  into UNCs like /
148b0 2f 68 6f 73 74 2f 70 61 74 68 2e 0a 20 20 20 20  /host/path..    
148c0 20 20 2a 2a 20 54 68 65 20 63 6f 72 72 65 63 74    ** The correct
148d0 20 55 52 49 20 66 6f 72 20 74 68 61 74 20 55 4e   URI for that UN
148e0 43 20 68 61 73 20 6f 6e 6c 79 20 74 77 6f 20 6f  C has only two o
148f0 72 20 66 6f 75 72 20 6c 65 61 64 69 6e 67 20 2f  r four leading /
14900 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20 20   characters.    
14910 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f 73 74    ** file://host
14920 2f 70 61 74 68 20 6f 72 20 66 69 6c 65 3a 2f 2f  /path or file://
14930 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 20 20 42 75  //host/path.  Bu
14940 74 20 35 20 6c 65 61 64 69 6e 67 20 73 6c 61 73  t 5 leading slas
14950 68 65 73 20 69 73 20 61 20 0a 20 20 20 20 20 20  hes is a .      
14960 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f 72 2c  ** common error,
14970 20 77 65 20 61 72 65 20 74 6f 6c 64 2c 20 73 6f   we are told, so
14980 20 77 65 20 68 61 6e 64 6c 65 20 69 74 20 61 73   we handle it as
14990 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2e   a special case.
149a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74   */.      if( st
149b0 72 6e 63 6d 70 28 7a 55 72 69 2b 37 2c 20 22 2f  rncmp(zUri+7, "/
149c0 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 20 69 49  //", 3)==0 ){ iI
149d0 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65  n++; }.    }else
149e0 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72   if( strncmp(zUr
149f0 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68 6f 73  i+5, "//localhos
14a00 74 2f 22 2c 20 31 32 29 3d 3d 30 20 29 7b 0a 20  t/", 12)==0 ){. 
14a10 20 20 20 20 20 69 49 6e 20 3d 20 31 36 3b 0a 20       iIn = 16;. 
14a20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f     }.#else.    /
14a30 2a 20 44 69 73 63 61 72 64 20 74 68 65 20 73 63  * Discard the sc
14a40 68 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72 69  heme and authori
14a50 74 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 74  ty segments of t
14a60 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69  he URI. */.    i
14a70 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20  f( zUri[5]=='/' 
14a80 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20  && zUri[6]=='/' 
14a90 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37  ){.      iIn = 7
14aa0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a  ;.      while( z
14ab0 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69  Uri[iIn] && zUri
14ac0 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e  [iIn]!='/' ) iIn
14ad0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 49  ++;.      if( iI
14ae0 6e 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31 36  n!=7 && (iIn!=16
14af0 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61   || memcmp("loca
14b00 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d  lhost", &zUri[7]
14b10 2c 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20 20  , 9)) ){.       
14b20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
14b30 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e  ite3_mprintf("in
14b40 76 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f 72  valid uri author
14b50 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20  ity: %.*s", .   
14b60 20 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c 20           iIn-7, 
14b70 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20  &zUri[7]);.     
14b80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
14b90 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f  RROR;.        go
14ba0 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
14bb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14bc0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43  #endif..    /* C
14bd0 6f 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  opy the filename
14be0 20 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70   and any query p
14bf0 61 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74  arameters into t
14c00 68 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e  he zFile buffer.
14c10 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20   .    ** Decode 
14c20 25 48 48 20 65 73 63 61 70 65 20 63 6f 64 65 73  %HH escape codes
14c30 20 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20   along the way. 
14c40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
14c50 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c  ithin this loop,
14c60 20 76 61 72 69 61 62 6c 65 20 65 53 74 61 74 65   variable eState
14c70 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 30   may be set to 0
14c80 2c 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64  , 1 or 2, depend
14c90 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ing.    ** on th
14ca0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
14cb0 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  t. As follows:. 
14cc0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30     **.    **   0
14cd0 3a 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e  : Parsing file-n
14ce0 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a  ame..    **   1:
14cf0 20 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65   Parsing name se
14d00 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d  ction of a name=
14d10 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61  value query para
14d20 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20  meter..    **   
14d30 32 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65  2: Parsing value
14d40 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61   section of a na
14d50 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70  me=value query p
14d60 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f  arameter..    */
14d70 0a 20 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b  .    eState = 0;
14d80 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d  .    while( (c =
14d90 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26   zUri[iIn])!=0 &
14da0 26 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20  & c!='#' ){.    
14db0 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69    iIn++;.      i
14dc0 66 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20  f( c=='%' .     
14dd0 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64    && sqlite3Isxd
14de0 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20  igit(zUri[iIn]) 
14df0 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
14e00 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b  e3Isxdigit(zUri[
14e10 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29  iIn+1]) .      )
14e20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63  {.        int oc
14e30 74 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65  tet = (sqlite3He
14e40 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b  xToInt(zUri[iIn+
14e50 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20  +]) << 4);.     
14e60 20 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69     octet += sqli
14e70 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69  te3HexToInt(zUri
14e80 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20  [iIn++]);..     
14e90 20 20 20 61 73 73 65 72 74 28 20 6f 63 74 65 74     assert( octet
14ea0 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36  >=0 && octet<256
14eb0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
14ec0 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  octet==0 ){.    
14ed0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
14ee0 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68  anch is taken wh
14ef0 65 6e 20 22 25 30 30 22 20 61 70 70 65 61 72 73  en "%00" appears
14f00 20 77 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e   within the URI.
14f10 20 49 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20   In this.       
14f20 20 20 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67     ** case we ig
14f30 6e 6f 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e  nore all text in
14f40 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
14f50 66 20 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65  f the path, name
14f60 20 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   or.          **
14f70 20 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79   value currently
14f80 20 62 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53   being parsed. S
14f90 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72  o ignore the cur
14fa0 72 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20  rent character. 
14fb0 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
14fc0 73 6b 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74  skip to the next
14fd0 20 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22   "?", "=" or "&"
14fe0 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  , as appropriate
14ff0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77  . */.          w
15000 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b  hile( (c = zUri[
15010 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  iIn])!=0 && c!='
15020 23 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  #' .            
15030 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 30 20    && (eState!=0 
15040 7c 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20  || c!='?').     
15050 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74           && (eSt
15060 61 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d  ate!=1 || (c!='=
15070 27 20 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20  ' && c!='&')).  
15080 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
15090 65 53 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d  eState!=2 || c!=
150a0 27 26 27 29 0a 20 20 20 20 20 20 20 20 20 20 29  '&').          )
150b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49  {.            iI
150c0 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n++;.          }
150d0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
150e0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
150f0 20 20 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74         c = octet
15100 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
15110 28 20 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28  ( eState==1 && (
15120 63 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27  c=='&' || c=='='
15130 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
15140 20 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d   zFile[iOut-1]==
15150 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
15160 2a 20 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f  * An empty optio
15170 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74  n name. Ignore t
15180 68 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67  his option altog
15190 65 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ether. */.      
151a0 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b      while( zUri[
151b0 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e  iIn] && zUri[iIn
151c0 5d 21 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69  ]!='#' && zUri[i
151d0 49 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e  In-1]!='&' ) iIn
151e0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  ++;.          co
151f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
15200 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  }.        if( c=
15210 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='&' ){.        
15220 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
15230 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
15240 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
15250 20 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20   eState = 2;.   
15260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
15270 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
15280 65 20 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30  e if( (eState==0
15290 20 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28   && c=='?') || (
152a0 65 53 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d  eState==2 && c==
152b0 27 26 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '&') ){.        
152c0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65  c = 0;.        e
152d0 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  State = 1;.     
152e0 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69   }.      zFile[i
152f0 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  Out++] = c;.    
15300 7d 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65  }.    if( eState
15310 3d 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74  ==1 ) zFile[iOut
15320 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
15330 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
15340 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
15350 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  iOut++] = '\0';.
15360 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  .    /* Check if
15370 20 74 68 65 72 65 20 77 65 72 65 20 61 6e 79 20   there were any 
15380 6f 70 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65  options specifie
15390 64 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  d that should be
153a0 20 69 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20   interpreted .  
153b0 20 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f    ** here. Optio
153c0 6e 73 20 74 68 61 74 20 61 72 65 20 69 6e 74 65  ns that are inte
153d0 72 70 72 65 74 65 64 20 68 65 72 65 20 69 6e 63  rpreted here inc
153e0 6c 75 64 65 20 22 76 66 73 22 20 61 6e 64 20 74  lude "vfs" and t
153f0 68 6f 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  hose that.    **
15400 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66   correspond to f
15410 6c 61 67 73 20 74 68 61 74 20 6d 61 79 20 62 65  lags that may be
15420 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73   passed to the s
15430 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
15440 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20  .    ** method. 
15450 2a 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a  */.    zOpt = &z
15460 46 69 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c  File[sqlite3Strl
15470 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a  en30(zFile)+1];.
15480 20 20 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b      while( zOpt[
15490 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  0] ){.      int 
154a0 6e 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74  nOpt = sqlite3St
154b0 72 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20  rlen30(zOpt);.  
154c0 20 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d      char *zVal =
154d0 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a   &zOpt[nOpt+1];.
154e0 20 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d        int nVal =
154f0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
15500 28 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69  (zVal);..      i
15510 66 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65  f( nOpt==3 && me
15520 6d 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74  mcmp("vfs", zOpt
15530 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 3)==0 ){.     
15540 20 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a     zVfs = zVal;.
15550 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15560 20 20 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e       struct Open
15570 4d 6f 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20  Mode {.         
15580 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
15590 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f            int mo
155a0 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61  de;.        } *a
155b0 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Mode = 0;.      
155c0 20 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70    char *zModeTyp
155d0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  e = 0;.        i
155e0 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20  nt mask = 0;.   
155f0 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d       int limit =
15600 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28   0;..        if(
15610 20 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63   nOpt==5 && memc
15620 6d 70 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74  mp("cache", zOpt
15630 2c 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 5)==0 ){.     
15640 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75       static stru
15650 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63  ct OpenMode aCac
15660 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20  heMode[] = {.   
15670 20 20 20 20 20 20 20 20 20 7b 20 22 73 68 61 72           { "shar
15680 65 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45  ed",  SQLITE_OPE
15690 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c  N_SHAREDCACHE },
156a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
156b0 70 72 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45  private", SQLITE
156c0 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
156d0 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  HE },.          
156e0 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20    { 0, 0 }.     
156f0 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20       };..       
15700 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45     mask = SQLITE
15710 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
15720 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  E|SQLITE_OPEN_PR
15730 49 56 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20  IVATECACHE;.    
15740 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43        aMode = aC
15750 61 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20  acheMode;.      
15760 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b      limit = mask
15770 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64  ;.          zMod
15780 65 54 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b  eType = "cache";
15790 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
157a0 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26     if( nOpt==4 &
157b0 26 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c  & memcmp("mode",
157c0 20 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a   zOpt, 4)==0 ){.
157d0 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
157e0 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
157f0 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b   aOpenMode[] = {
15800 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
15810 72 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45  ro",  SQLITE_OPE
15820 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20  N_READONLY },.  
15830 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 22            { "rw"
15840 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ,  SQLITE_OPEN_R
15850 45 41 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20  EADWRITE }, .   
15860 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 63 22           { "rwc"
15870 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  , SQLITE_OPEN_RE
15880 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
15890 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a  _OPEN_CREATE },.
158a0 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d              { "m
158b0 65 6d 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f  emory", SQLITE_O
158c0 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20  PEN_MEMORY },.  
158d0 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30            { 0, 0
158e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a   }.          };.
158f0 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20  .          mask 
15900 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
15910 41 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f  ADONLY | SQLITE_
15920 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20  OPEN_READWRITE. 
15930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15940 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    | SQLITE_OPEN_
15950 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f  CREATE | SQLITE_
15960 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20  OPEN_MEMORY;.   
15970 20 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61         aMode = a
15980 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20  OpenMode;.      
15990 20 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b      limit = mask
159a0 20 26 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20   & flags;.      
159b0 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20      zModeType = 
159c0 22 61 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20  "access";.      
159d0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
159e0 20 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20   aMode ){.      
159f0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
15a00 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20       int mode = 
15a10 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  0;.          for
15a20 28 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a  (i=0; aMode[i].z
15a30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
15a40 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15a50 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a  z = aMode[i].z;.
15a60 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
15a70 6e 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72  nVal==sqlite3Str
15a80 6c 65 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d  len30(z) && 0==m
15a90 65 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e  emcmp(zVal, z, n
15aa0 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Val) ){.        
15ab0 20 20 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f        mode = aMo
15ac0 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20  de[i].mode;.    
15ad0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
15ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
15af0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15b00 20 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30       if( mode==0
15b10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15b20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
15b30 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20  te3_mprintf("no 
15b40 73 75 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73  such %s mode: %s
15b50 22 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56  ", zModeType, zV
15b60 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  al);.           
15b70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
15b80 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  OR;.            
15b90 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
15ba0 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ut;.          }.
15bb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6d            if( (m
15bc0 6f 64 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50  ode & ~SQLITE_OP
15bd0 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74  EN_MEMORY)>limit
15be0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15bf0 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
15c00 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20  te3_mprintf("%s 
15c10 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  mode not allowed
15c20 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  : %s",.         
15c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
15c50 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b  ModeType, zVal);
15c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
15c70 3d 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  = SQLITE_PERM;. 
15c80 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
15c90 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20  parse_uri_out;. 
15ca0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15cb0 20 20 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c       flags = (fl
15cc0 61 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d  ags & ~mask) | m
15cd0 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ode;.        }. 
15ce0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f       }..      zO
15cf0 70 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b  pt = &zVal[nVal+
15d00 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  1];.    }..  }el
15d10 73 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20  se{.    zFile = 
15d20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
15d30 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66  (nUri+2);.    if
15d40 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72  ( !zFile ) retur
15d50 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
15d60 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65      memcpy(zFile
15d70 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20  , zUri, nUri);. 
15d80 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d     zFile[nUri] =
15d90 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65   '\0';.    zFile
15da0 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b  [nUri+1] = '\0';
15db0 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53  .    flags &= ~S
15dc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a  QLITE_OPEN_URI;.
15dd0 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20    }..  *ppVfs = 
15de0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
15df0 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 2a 70  (zVfs);.  if( *p
15e00 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  pVfs==0 ){.    *
15e10 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
15e20 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73  e3_mprintf("no s
15e30 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a 56  uch vfs: %s", zV
15e40 66 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  fs);.    rc = SQ
15e50 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
15e60 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a   parse_uri_out:.
15e70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15e80 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
15e90 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a  e3_free(zFile);.
15ea0 20 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20      zFile = 0;. 
15eb0 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 66   }.  *pFlags = f
15ec0 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20  lags;.  *pzFile 
15ed0 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75 72  = zFile;.  retur
15ee0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
15ef0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
15f00 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70  s the work of op
15f10 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ening a database
15f20 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a   on behalf of.**
15f30 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20   sqlite3_open() 
15f40 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  and sqlite3_open
15f50 31 36 28 29 2e 20 54 68 65 20 64 61 74 61 62 61  16(). The databa
15f60 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69  se filename "zFi
15f70 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20  lename"  .** is 
15f80 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a  UTF-8 encoded..*
15f90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
15fa0 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f 6e  nDatabase(.  con
15fb0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
15fc0 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65 20  me, /* Database 
15fd0 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20 65  filename UTF-8 e
15fe0 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69  ncoded */.  sqli
15ff0 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20  te3 **ppDb,     
16000 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72     /* OUT: Retur
16010 6e 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ned database han
16020 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  dle */.  unsigne
16030 64 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20  d int flags,    
16040 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66  /* Operational f
16050 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
16060 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20  char *zVfs      
16070 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
16080 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b  VFS to use */.){
16090 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160b0 20 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f     /* Store allo
160c0 63 61 74 65 64 20 68 61 6e 64 6c 65 20 68 65 72  cated handle her
160d0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
160e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160f0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
16100 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
16110 73 54 68 72 65 61 64 73 61 66 65 3b 20 20 20 20  sThreadsafe;    
16120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
16130 75 65 20 66 6f 72 20 74 68 72 65 61 64 73 61 66  ue for threadsaf
16140 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  e connections */
16150 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d  .  char *zOpen =
16160 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
16170 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61     /* Filename a
16180 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20  rgument to pass 
16190 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20 2a  to BtreeOpen() *
161a0 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  /.  char *zErrMs
161b0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
161c0 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73      /* Error mes
161d0 73 61 67 65 20 66 72 6f 6d 20 73 71 6c 69 74 65  sage from sqlite
161e0 33 50 61 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a  3ParseUri() */..
161f0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
16200 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
16210 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72   if( ppDb==0 ) r
16220 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
16230 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
16240 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69  .  *ppDb = 0;.#i
16250 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16260 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20  T_AUTOINIT.  rc 
16270 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
16280 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
16290 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
162a0 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20  ndif..  /* Only 
162b0 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63  allow sensible c
162c0 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62  ombinations of b
162d0 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73  its in the flags
162e0 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a   argument.  .  *
162f0 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72  * Throw an error
16300 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73   if any non-sens
16310 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73  e combination is
16320 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20   used.  If we.  
16330 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20  ** do not block 
16340 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74  illegal combinat
16350 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f  ions here, it co
16360 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a  uld trigger.  **
16370 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
16380 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c  ents in deeper l
16390 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65  ayers.  Sensible
163a0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20   combinations.  
163b0 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a  ** are:.  **.  *
163c0 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50  *  1:  SQLITE_OP
163d0 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a  EN_READONLY.  **
163e0 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    2:  SQLITE_OPE
163f0 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a  N_READWRITE.  **
16400 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    6:  SQLITE_OPE
16410 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
16420 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
16430 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
16440 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16450 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b  ONLY  == 0x01 );
16460 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
16470 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
16480 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73   == 0x02 );.  as
16490 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
164a0 4e 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30  N_CREATE    == 0
164b0 78 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73  x04 );.  testcas
164c0 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
164d0 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45  )==0x02 ); /* RE
164e0 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74  ADONLY */.  test
164f0 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73  case( (1<<(flags
16500 26 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a  &7))==0x04 ); /*
16510 20 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20   READWRITE */.  
16520 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
16530 6c 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29  lags&7))==0x40 )
16540 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c  ; /* READWRITE |
16550 20 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28   CREATE */.  if(
16560 20 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29   ((1<<(flags&7))
16570 20 26 20 30 78 34 36 29 3d 3d 30 20 29 7b 0a 20   & 0x46)==0 ){. 
16580 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16590 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 20 20 2f  _MISUSE_BKPT;  /
165a0 2a 20 49 4d 50 3a 20 52 2d 36 35 34 39 37 2d 34  * IMP: R-65497-4
165b0 34 35 39 34 20 2a 2f 0a 20 20 7d 0a 0a 20 20 69  4594 */.  }..  i
165c0 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
165d0 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
165e0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54 68  x==0 ){.    isTh
165f0 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20  readsafe = 0;.  
16600 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
16610 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f  & SQLITE_OPEN_NO
16620 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54  MUTEX ){.    isT
16630 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20  hreadsafe = 0;. 
16640 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
16650 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46   & SQLITE_OPEN_F
16660 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20 20  ULLMUTEX ){.    
16670 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 31  isThreadsafe = 1
16680 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16690 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 73 71  sThreadsafe = sq
166a0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
166b0 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20  g.bFullMutex;.  
166c0 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  }.  if( flags & 
166d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
166e0 41 54 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20  ATECACHE ){.    
166f0 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
16700 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
16710 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  E;.  }else if( s
16720 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16730 69 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e  ig.sharedCacheEn
16740 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61  abled ){.    fla
16750 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45  gs |= SQLITE_OPE
16760 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  N_SHAREDCACHE;. 
16770 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
16780 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f  harmful bits fro
16790 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  m the flags para
167a0 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  meter.  **.  ** 
167b0 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  The SQLITE_OPEN_
167c0 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49  NOMUTEX and SQLI
167d0 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
167e0 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a  X flags were.  *
167f0 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20  * dealt with in 
16800 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
16810 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65  e block.  Beside
16820 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c  s these, the onl
16830 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70  y.  ** valid inp
16840 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c  ut flags for sql
16850 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61  ite3_open_v2() a
16860 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  re SQLITE_OPEN_R
16870 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51  EADONLY,.  ** SQ
16880 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
16890 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ITE, SQLITE_OPEN
168a0 5f 43 52 45 41 54 45 2c 20 53 51 4c 49 54 45 5f  _CREATE, SQLITE_
168b0 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
168c0 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50  ,.  ** SQLITE_OP
168d0 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 2c  EN_PRIVATECACHE,
168e0 20 61 6e 64 20 73 6f 6d 65 20 72 65 73 65 72 76   and some reserv
168f0 65 64 20 62 69 74 73 2e 20 20 53 69 6c 65 6e 74  ed bits.  Silent
16900 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66  ly mask.  ** off
16910 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73   all other flags
16920 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26  ..  */.  flags &
16930 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45  =  ~( SQLITE_OPE
16940 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
16950 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
16960 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
16970 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
16980 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
16990 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20  PEN_MAIN_DB |.  
169a0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
169b0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
169c0 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
169d0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
169e0 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20  RANSIENT_DB | . 
169f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
16a00 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
16a10 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
16a20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
16a30 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
16a40 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  L | .           
16a50 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
16a60 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  SUBJOURNAL | .  
16a70 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
16a80 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
16a90 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20  JOURNAL |.      
16aa0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
16ab0 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20  OPEN_NOMUTEX |. 
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
16ad0 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
16ae0 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEX |.          
16af0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16b00 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  _WAL.           
16b10 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    );..  /* Alloc
16b20 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 20 64  ate the sqlite d
16b30 61 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ata structure */
16b40 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d  .  db = sqlite3M
16b50 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
16b60 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20  f(sqlite3) );.  
16b70 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f  if( db==0 ) goto
16b80 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69   opendb_out;.  i
16b90 66 28 20 69 73 54 68 72 65 61 64 73 61 66 65 20  f( isThreadsafe 
16ba0 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65 78  ){.    db->mutex
16bb0 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
16bc0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
16bd0 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
16be0 20 20 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d    if( db->mutex=
16bf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
16c00 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20  te3_free(db);.  
16c10 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20      db = 0;.    
16c20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
16c30 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  t;.    }.  }.  s
16c40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
16c50 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
16c60 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30   db->errMask = 0
16c70 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  xff;.  db->nDb =
16c80 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20   2;.  db->magic 
16c90 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42  = SQLITE_MAGIC_B
16ca0 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d  USY;.  db->aDb =
16cb0 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a   db->aDbStatic;.
16cc0 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
16cd0 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73  f(db->aLimit)==s
16ce0 69 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d 69 74  izeof(aHardLimit
16cf0 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62  ) );.  memcpy(db
16d00 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c  ->aLimit, aHardL
16d10 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d  imit, sizeof(db-
16d20 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d  >aLimit));.  db-
16d30 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
16d40 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
16d50 41 44 53 5d 20 3d 20 53 51 4c 49 54 45 5f 44 45  ADS] = SQLITE_DE
16d60 46 41 55 4c 54 5f 57 4f 52 4b 45 52 5f 54 48 52  FAULT_WORKER_THR
16d70 45 41 44 53 3b 0a 20 20 64 62 2d 3e 61 75 74 6f  EADS;.  db->auto
16d80 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62  Commit = 1;.  db
16d90 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20  ->nextAutovac = 
16da0 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d 6d 61 70  -1;.  db->szMmap
16db0 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
16dc0 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20  Config.szMmap;. 
16dd0 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a   db->nextPagesiz
16de0 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61  e = 0;.  db->nMa
16df0 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20 30 78  xSorterMmap = 0x
16e00 37 46 46 46 46 46 46 46 3b 0a 20 20 64 62 2d 3e  7FFFFFFF;.  db->
16e10 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
16e20 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20  ShortColNames | 
16e30 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69  SQLITE_EnableTri
16e40 67 67 65 72 20 7c 20 53 51 4c 49 54 45 5f 43 61  gger | SQLITE_Ca
16e50 63 68 65 53 70 69 6c 6c 0a 23 69 66 20 21 64 65  cheSpill.#if !de
16e60 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46  fined(SQLITE_DEF
16e70 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  AULT_AUTOMATIC_I
16e80 4e 44 45 58 29 20 7c 7c 20 53 51 4c 49 54 45 5f  NDEX) || SQLITE_
16e90 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49  DEFAULT_AUTOMATI
16ea0 43 5f 49 4e 44 45 58 0a 20 20 20 20 20 20 20 20  C_INDEX.        
16eb0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
16ec0 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65 6e 64  E_AutoIndex.#end
16ed0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  if.#if SQLITE_DE
16ee0 46 41 55 4c 54 5f 43 4b 50 54 46 55 4c 4c 46 53  FAULT_CKPTFULLFS
16ef0 59 4e 43 0a 20 20 20 20 20 20 20 20 20 20 20 20  YNC.            
16f00 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 6b       | SQLITE_Ck
16f10 70 74 46 75 6c 6c 46 53 79 6e 63 0a 23 65 6e 64  ptFullFSync.#end
16f20 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  if.#if SQLITE_DE
16f30 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41  FAULT_FILE_FORMA
16f40 54 3c 34 0a 20 20 20 20 20 20 20 20 20 20 20 20  T<4.            
16f50 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65       | SQLITE_Le
16f60 67 61 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64  gacyFileFmt.#end
16f70 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
16f80 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54  _ENABLE_LOAD_EXT
16f90 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20  ENSION.         
16fa0 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
16fb0 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23  _LoadExtension.#
16fc0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
16fd0 5f 44 45 46 41 55 4c 54 5f 52 45 43 55 52 53 49  _DEFAULT_RECURSI
16fe0 56 45 5f 54 52 49 47 47 45 52 53 0a 20 20 20 20  VE_TRIGGERS.    
16ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
17000 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65 72  QLITE_RecTrigger
17010 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  s.#endif.#if def
17020 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41  ined(SQLITE_DEFA
17030 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53  ULT_FOREIGN_KEYS
17040 29 20 26 26 20 53 51 4c 49 54 45 5f 44 45 46 41  ) && SQLITE_DEFA
17050 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53  ULT_FOREIGN_KEYS
17060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17070 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72 65 69    | SQLITE_Forei
17080 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a 23 69  gnKeys.#endif.#i
17090 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
170a0 5f 52 45 56 45 52 53 45 5f 55 4e 4f 52 44 45 52  _REVERSE_UNORDER
170b0 45 44 5f 53 45 4c 45 43 54 53 29 0a 20 20 20 20  ED_SELECTS).    
170c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
170d0 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64  QLITE_ReverseOrd
170e0 65 72 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  er.#endif.#if de
170f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
17100 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
17110 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 20 20 20  L_CHECK).       
17120 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
17130 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 0a 23 65  TE_CellSizeCk.#e
17140 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73  ndif.      ;.  s
17150 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
17160 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23  db->aCollSeq);.#
17170 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17180 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
17190 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
171a0 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
171b0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64  .#endif..  /* Ad
171c0 64 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  d the default co
171d0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
171e0 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20   BINARY. BINARY 
171f0 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55  works for both U
17200 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54  TF-8.  ** and UT
17210 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76  F-16, so add a v
17220 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  ersion for each 
17230 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e  to avoid any unn
17240 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f  ecessary.  ** co
17250 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f  nversions. The o
17260 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20 63  nly error that c
17270 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69 73  an occur here is
17280 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
17290 75 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ure..  **.  ** E
172a0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32  VIDENCE-OF: R-52
172b0 37 38 36 2d 34 34 38 37 38 20 53 51 4c 69 74 65  786-44878 SQLite
172c0 20 64 65 66 69 6e 65 73 20 74 68 72 65 65 20 62   defines three b
172d0 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e  uilt-in collatin
172e0 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  g.  ** functions
172f0 3a 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43  :.  */.  createC
17300 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49  ollation(db, "BI
17310 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54  NARY", SQLITE_UT
17320 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75  F8, 0, binCollFu
17330 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
17340 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42  Collation(db, "B
17350 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55  INARY", SQLITE_U
17360 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f  TF16BE, 0, binCo
17370 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
17380 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
17390 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49  , "BINARY", SQLI
173a0 54 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62  TE_UTF16LE, 0, b
173b0 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
173c0 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
173d0 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20  n(db, "NOCASE", 
173e0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
173f0 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46  nocaseCollatingF
17400 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
17410 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
17420 52 54 52 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55  RTRIM", SQLITE_U
17430 54 46 38 2c 20 28 76 6f 69 64 2a 29 31 2c 20 62  TF8, (void*)1, b
17440 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
17450 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
17460 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
17470 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
17480 20 7d 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45   }.  /* EVIDENCE
17490 2d 4f 46 3a 20 52 2d 30 38 33 30 38 2d 31 37 32  -OF: R-08308-172
174a0 32 34 20 54 68 65 20 64 65 66 61 75 6c 74 20 63  24 The default c
174b0 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
174c0 6e 20 66 6f 72 20 61 6c 6c 0a 20 20 2a 2a 20 73  n for all.  ** s
174d0 74 72 69 6e 67 73 20 69 73 20 42 49 4e 41 52 59  trings is BINARY
174e0 2e 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 70 44  . .  */.  db->pD
174f0 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  fltColl = sqlite
17500 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
17510 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 22 42   SQLITE_UTF8, "B
17520 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20 20 61 73  INARY", 0);.  as
17530 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43  sert( db->pDfltC
17540 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  oll!=0 );..  /* 
17550 50 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61  Parse the filena
17560 6d 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 2e  me/URI argument.
17570 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c   */.  db->openFl
17580 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72  ags = flags;.  r
17590 63 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  c = sqlite3Parse
175a0 55 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e  Uri(zVfs, zFilen
175b0 61 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62  ame, &flags, &db
175c0 2d 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20  ->pVfs, &zOpen, 
175d0 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
175e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
175f0 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
17600 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d  LITE_NOMEM ) db-
17610 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
17620 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  1;.    sqlite3Er
17630 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72  rorWithMsg(db, r
17640 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73  c, zErrMsg ? "%s
17650 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b  " : 0, zErrMsg);
17660 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
17670 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
17680 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
17690 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
176a0 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61  the backend data
176b0 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20  base driver */. 
176c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
176d0 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c  eeOpen(db->pVfs,
176e0 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d   zOpen, db, &db-
176f0 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a  >aDb[0].pBt, 0,.
17700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17710 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20          flags | 
17720 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
17730 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  _DB);.  if( rc!=
17740 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17750 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17760 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  IOERR_NOMEM ){. 
17770 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17780 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
17790 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
177a0 62 2c 20 72 63 29 3b 0a 20 20 20 20 67 6f 74 6f  b, rc);.    goto
177b0 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
177c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
177d0 6e 74 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  nter(db->aDb[0].
177e0 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  pBt);.  db->aDb[
177f0 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c  0].pSchema = sql
17800 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62  ite3SchemaGet(db
17810 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  , db->aDb[0].pBt
17820 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  );.  if( !db->ma
17830 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 45 4e 43  llocFailed ) ENC
17840 28 64 62 29 20 3d 20 53 43 48 45 4d 41 5f 45 4e  (db) = SCHEMA_EN
17850 43 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  C(db);.  sqlite3
17860 42 74 72 65 65 4c 65 61 76 65 28 64 62 2d 3e 61  BtreeLeave(db->a
17870 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62  Db[0].pBt);.  db
17880 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
17890 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
178a0 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f  Get(db, 0);..  /
178b0 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 61  * The default sa
178c0 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74  fety_level for t
178d0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
178e0 20 69 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20   is 'full'; for 
178f0 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61  the temp.  ** da
17900 74 61 62 61 73 65 20 69 74 20 69 73 20 27 4e 4f  tabase it is 'NO
17910 4e 45 27 2e 20 54 68 69 73 20 6d 61 74 63 68 65  NE'. This matche
17920 73 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  s the pager laye
17930 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20  r defaults.  .  
17940 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  */.  db->aDb[0].
17950 7a 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a  zName = "main";.
17960 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66    db->aDb[0].saf
17970 65 74 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20  ety_level = 3;. 
17980 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d   db->aDb[1].zNam
17990 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62  e = "temp";.  db
179a0 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f  ->aDb[1].safety_
179b0 6c 65 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62  level = 1;..  db
179c0 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
179d0 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69  _MAGIC_OPEN;.  i
179e0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
179f0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
17a00 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
17a10 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61  .  /* Register a
17a20 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63  ll built-in func
17a30 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f  tions, but do no
17a40 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61  t attempt to rea
17a50 64 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  d the.  ** datab
17a60 61 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20  ase schema yet. 
17a70 54 68 69 73 20 69 73 20 64 65 6c 61 79 65 64 20  This is delayed 
17a80 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
17a90 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73  time the databas
17aa0 65 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73  e.  ** is access
17ab0 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ed..  */.  sqlit
17ac0 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
17ad0 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65  TE_OK);.  sqlite
17ae0 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e  3RegisterBuiltin
17af0 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a  Functions(db);..
17b00 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61    /* Load automa
17b10 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d  tic extensions -
17b20 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74   extensions that
17b30 20 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73   have been regis
17b40 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67  tered.  ** using
17b50 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74   the sqlite3_aut
17b60 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e  omatic_extension
17b70 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 72  () API..  */.  r
17b80 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
17b90 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72  ode(db);.  if( r
17ba0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17bb0 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c      sqlite3AutoL
17bc0 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62  oadExtensions(db
17bd0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
17be0 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
17bf0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
17c00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17c10 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
17c20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
17c30 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17c40 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d  _FTS1.  if( !db-
17c50 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
17c60 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
17c70 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28  sqlite3Fts1Init(
17c80 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72  sqlite3*);.    r
17c90 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49  c = sqlite3Fts1I
17ca0 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
17cb0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
17cc0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20  TE_ENABLE_FTS2. 
17cd0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
17ce0 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
17cf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65  LITE_OK ){.    e
17d00 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
17d10 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65  3Fts2Init(sqlite
17d20 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  3*);.    rc = sq
17d30 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 64 62  lite3Fts2Init(db
17d40 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
17d50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
17d60 42 4c 45 5f 46 54 53 33 20 2f 2a 20 61 75 74 6f  BLE_FTS3 /* auto
17d70 6d 61 74 69 63 61 6c 6c 79 20 64 65 66 69 6e 65  matically define
17d80 64 20 62 79 20 53 51 4c 49 54 45 5f 45 4e 41 42  d by SQLITE_ENAB
17d90 4c 45 5f 46 54 53 34 20 2a 2f 0a 20 20 69 66 28  LE_FTS4 */.  if(
17da0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
17db0 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
17dc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
17dd0 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28  sqlite3Fts3Init(
17de0 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
17df0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17e00 4e 41 42 4c 45 5f 46 54 53 35 0a 20 20 69 66 28  NABLE_FTS5.  if(
17e10 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
17e20 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
17e30 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
17e40 73 71 6c 69 74 65 33 46 74 73 35 49 6e 69 74 28  sqlite3Fts5Init(
17e50 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
17e60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17e70 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20  NABLE_ICU.  if( 
17e80 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
17e90 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
17ea0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
17eb0 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64 62  qlite3IcuInit(db
17ec0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
17ed0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
17ee0 42 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20  BLE_RTREE.  if( 
17ef0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
17f00 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
17f10 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  OK){.    rc = sq
17f20 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74 28 64  lite3RtreeInit(d
17f30 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
17f40 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
17f50 41 42 4c 45 5f 44 42 53 54 41 54 5f 56 54 41 42  ABLE_DBSTAT_VTAB
17f60 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
17f70 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
17f80 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20  SQLITE_OK){.    
17f90 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 73 74  rc = sqlite3Dbst
17fa0 61 74 52 65 67 69 73 74 65 72 28 64 62 29 3b 0a  atRegister(db);.
17fb0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
17fc0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17fd0 5f 4a 53 4f 4e 31 0a 20 20 69 66 28 20 21 64 62  _JSON1.  if( !db
17fe0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
17ff0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc==SQLITE_OK)
18000 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
18010 65 33 4a 73 6f 6e 31 49 6e 69 74 28 64 62 29 3b  e3Json1Init(db);
18020 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
18030 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55  * -DSQLITE_DEFAU
18040 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
18050 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56  1 makes EXCLUSIV
18060 45 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  E the default lo
18070 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e  cking.  ** mode.
18080 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55    -DSQLITE_DEFAU
18090 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
180a0 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68  0 make NORMAL th
180b0 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
180c0 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f  g.  ** mode.  Do
180d0 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61  ing nothing at a
180e0 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f  ll also makes NO
180f0 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74  RMAL the default
18100 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
18110 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
18120 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e  KING_MODE.  db->
18130 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53  dfltLockMode = S
18140 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
18150 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71  CKING_MODE;.  sq
18160 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e  lite3PagerLockin
18170 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72  gMode(sqlite3Btr
18180 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b  eePager(db->aDb[
18190 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20  0].pBt),.       
181a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181b0 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c     SQLITE_DEFAUL
181c0 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b  T_LOCKING_MODE);
181d0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72  .#endif..  if( r
181e0 63 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72  c ) sqlite3Error
181f0 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20  (db, rc);..  /* 
18200 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61  Enable the looka
18210 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73  side-malloc subs
18220 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70  ystem */.  setup
18230 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c  Lookaside(db, 0,
18240 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
18250 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65  nfig.szLookaside
18260 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18270 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
18280 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c  3GlobalConfig.nL
18290 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73 71  ookaside);..  sq
182a0 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
182b0 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c  eckpoint(db, SQL
182c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
182d0 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b  AUTOCHECKPOINT);
182e0 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20  ..opendb_out:.  
182f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70  sqlite3_free(zOp
18300 65 6e 29 3b 0a 20 20 69 66 28 20 64 62 20 29 7b  en);.  if( db ){
18310 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
18320 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73 54  >mutex!=0 || isT
18330 68 72 65 61 64 73 61 66 65 3d 3d 30 0a 20 20 20  hreadsafe==0.   
18340 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
18350 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
18360 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a  FullMutex==0 );.
18370 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
18380 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
18390 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  x);.  }.  rc = s
183a0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
183b0 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  b);.  assert( db
183c0 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  !=0 || rc==SQLIT
183d0 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28  E_NOMEM );.  if(
183e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
183f0 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  M ){.    sqlite3
18400 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20  _close(db);.    
18410 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  db = 0;.  }else 
18420 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18430 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  K ){.    db->mag
18440 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
18450 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70  C_SICK;.  }.  *p
18460 70 44 62 20 3d 20 64 62 3b 0a 23 69 66 64 65 66  pDb = db;.#ifdef
18470 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
18480 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69  QLLOG.  if( sqli
18490 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
184a0 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f  xSqllog ){.    /
184b0 2a 20 4f 70 65 6e 69 6e 67 20 61 20 64 62 20 68  * Opening a db h
184c0 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61  andle. Fourth pa
184d0 72 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65  rameter is passe
184e0 64 20 30 2e 20 2a 2f 0a 20 20 20 20 76 6f 69 64  d 0. */.    void
184f0 20 2a 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33   *pArg = sqlite3
18500 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71  GlobalConfig.pSq
18510 6c 6c 6f 67 41 72 67 3b 0a 20 20 20 20 73 71 6c  llogArg;.    sql
18520 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
18530 2e 78 53 71 6c 6c 6f 67 28 70 41 72 67 2c 20 64  .xSqllog(pArg, d
18540 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29  b, zFilename, 0)
18550 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
18560 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
18570 48 41 53 5f 43 4f 44 45 43 29 0a 20 20 69 66 28  HAS_CODEC).  if(
18580 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18590 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
185a0 20 2a 7a 48 65 78 4b 65 79 20 3d 20 73 71 6c 69   *zHexKey = sqli
185b0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
185c0 72 28 7a 4f 70 65 6e 2c 20 22 68 65 78 6b 65 79  r(zOpen, "hexkey
185d0 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 48 65 78  ");.    if( zHex
185e0 4b 65 79 20 26 26 20 7a 48 65 78 4b 65 79 5b 30  Key && zHexKey[0
185f0 5d 20 29 7b 0a 20 20 20 20 20 20 75 38 20 69 42  ] ){.      u8 iB
18600 79 74 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  yte;.      int i
18610 3b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4b 65  ;.      char zKe
18620 79 5b 34 30 5d 3b 0a 20 20 20 20 20 20 66 6f 72  y[40];.      for
18630 28 69 3d 30 2c 20 69 42 79 74 65 3d 30 3b 20 69  (i=0, iByte=0; i
18640 3c 73 69 7a 65 6f 66 28 7a 4b 65 79 29 2a 32 20  <sizeof(zKey)*2 
18650 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67  && sqlite3Isxdig
18660 69 74 28 7a 48 65 78 4b 65 79 5b 69 5d 29 3b 20  it(zHexKey[i]); 
18670 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 42  i++){.        iB
18680 79 74 65 20 3d 20 28 69 42 79 74 65 3c 3c 34 29  yte = (iByte<<4)
18690 20 2b 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49   + sqlite3HexToI
186a0 6e 74 28 7a 48 65 78 4b 65 79 5b 69 5d 29 3b 0a  nt(zHexKey[i]);.
186b0 20 20 20 20 20 20 20 20 69 66 28 20 28 69 26 31          if( (i&1
186c0 29 21 3d 30 20 29 20 7a 4b 65 79 5b 69 2f 32 5d  )!=0 ) zKey[i/2]
186d0 20 3d 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20   = iByte;.      
186e0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
186f0 6b 65 79 5f 76 32 28 64 62 2c 20 30 2c 20 7a 4b  key_v2(db, 0, zK
18700 65 79 2c 20 69 2f 32 29 3b 0a 20 20 20 20 7d 0a  ey, i/2);.    }.
18710 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
18720 75 72 6e 20 72 63 20 26 20 30 78 66 66 3b 0a 7d  urn rc & 0xff;.}
18730 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
18740 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ew database hand
18750 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
18760 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74  e3_open(.  const
18770 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
18780 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  , .  sqlite3 **p
18790 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e  pDb .){.  return
187a0 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46   openDatabase(zF
187b0 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20  ilename, ppDb,. 
187c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187d0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
187e0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
187f0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
18800 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
18810 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f  e3_open_v2(.  co
18820 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61  nst char *filena
18830 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73  me,   /* Databas
18840 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d  e filename (UTF-
18850 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  8) */.  sqlite3 
18860 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 20  **ppDb,         
18870 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64  /* OUT: SQLite d
18880 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  b handle */.  in
18890 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
188a0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a        /* Flags *
188b0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
188c0 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e  zVfs        /* N
188d0 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c  ame of VFS modul
188e0 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20  e to use */.){. 
188f0 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61   return openData
18900 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70  base(filename, p
18910 70 44 62 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  pDb, (unsigned i
18920 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b  nt)flags, zVfs);
18930 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
18940 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
18950 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64  .** Open a new d
18960 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
18970 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
18980 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76  pen16(.  const v
18990 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  oid *zFilename, 
189a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
189b0 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  b.){.  char cons
189c0 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20  t *zFilename8;  
189d0 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e   /* zFilename en
189e0 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69  coded in UTF-8 i
189f0 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36  nstead of UTF-16
18a00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
18a10 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
18a20 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c   rc;..#ifdef SQL
18a30 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
18a40 52 4d 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d  RMOR.  if( ppDb=
18a50 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
18a60 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
18a70 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d  #endif.  *ppDb =
18a80 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
18a90 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
18aa0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
18ab0 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
18ac0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
18ad0 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  rc;.#endif.  if(
18ae0 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20   zFilename==0 ) 
18af0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22 5c 30 30  zFilename = "\00
18b00 30 5c 30 30 30 22 3b 0a 20 20 70 56 61 6c 20 3d  0\000";.  pVal =
18b10 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
18b20 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  (0);.  sqlite3Va
18b30 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
18b40 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53  -1, zFilename, S
18b50 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
18b60 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  E, SQLITE_STATIC
18b70 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20  );.  zFilename8 
18b80 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
18b90 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f  xt(pVal, SQLITE_
18ba0 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46 69  UTF8);.  if( zFi
18bb0 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72  lename8 ){.    r
18bc0 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73 65  c = openDatabase
18bd0 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44  (zFilename8, ppD
18be0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
18bf0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
18c00 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
18c10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
18c20 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  ATE, 0);.    ass
18c30 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20 72 63  ert( *ppDb || rc
18c40 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
18c50 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
18c60 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62 48 61  LITE_OK && !DbHa
18c70 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44 62 2c  sProperty(*ppDb,
18c80 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61   0, DB_SchemaLoa
18c90 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20 53 43  ded) ){.      SC
18ca0 48 45 4d 41 5f 45 4e 43 28 2a 70 70 44 62 29 20  HEMA_ENC(*ppDb) 
18cb0 3d 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53  = ENC(*ppDb) = S
18cc0 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
18cd0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  E;.    }.  }else
18ce0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
18cf0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73  E_NOMEM;.  }.  s
18d00 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
18d10 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pVal);..  return
18d20 20 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 23 65   rc & 0xff;.}.#e
18d30 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
18d40 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
18d50 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
18d60 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
18d70 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
18d80 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
18d90 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
18da0 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
18db0 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  on(.  sqlite3* d
18dc0 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
18dd0 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
18de0 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
18df0 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
18e00 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
18e10 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
18e20 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  onst void*).){. 
18e30 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
18e40 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
18e50 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65  _v2(db, zName, e
18e60 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  nc, pCtx, xCompa
18e70 72 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  re, 0);.}../*.**
18e80 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
18e90 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
18ea0 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
18eb0 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
18ec0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
18ed0 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
18ee0 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  v2(.  sqlite3* d
18ef0 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b, .  const char
18f00 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20   *zName, .  int 
18f10 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
18f20 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
18f30 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
18f40 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
18f50 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76  onst void*),.  v
18f60 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  oid(*xDel)(void*
18f70 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ).){.  int rc;..
18f80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
18f90 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
18fa0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
18fb0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c  etyCheckOk(db) |
18fc0 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  | zName==0 ) ret
18fd0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
18fe0 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
18ff0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
19000 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
19010 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
19020 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
19030 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c    rc = createCol
19040 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  lation(db, zName
19050 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c  , (u8)enc, pCtx,
19060 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29   xCompare, xDel)
19070 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
19080 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
19090 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
190a0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
190b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
190c0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
190d0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
190e0 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65  ** Register a ne
190f0 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  w collation sequ
19100 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61  ence with the da
19110 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
19120 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19130 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
19140 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  n16(.  sqlite3* 
19150 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69  db, .  const voi
19160 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  d *zName,.  int 
19170 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43  enc, .  void* pC
19180 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
19190 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
191a0 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
191b0 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20  onst void*).){. 
191c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
191d0 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  _OK;.  char *zNa
191e0 6d 65 38 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  me8;..#ifdef SQL
191f0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
19200 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
19210 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
19220 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30  (db) || zName==0
19230 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
19240 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
19250 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
19260 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
19270 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
19280 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
19290 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d  ed );.  zName8 =
192a0 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38   sqlite3Utf16to8
192b0 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  (db, zName, -1, 
192c0 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
192d0 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  VE);.  if( zName
192e0 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72  8 ){.    rc = cr
192f0 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
19300 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e  , zName8, (u8)en
19310 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  c, pCtx, xCompar
19320 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
19330 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
19340 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  me8);.  }.  rc =
19350 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
19360 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
19370 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
19380 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
19390 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
193a0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
193b0 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
193c0 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61  Register a colla
193d0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
193e0 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77  ctory callback w
193f0 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
19400 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52   handle.** db. R
19410 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69  eplace any previ
19420 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20  ously installed 
19430 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
19440 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69  ce factory..*/.i
19450 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61  nt sqlite3_colla
19460 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73  tion_needed(.  s
19470 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76  qlite3 *db, .  v
19480 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64  oid *pCollNeeded
19490 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43  Arg, .  void(*xC
194a0 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a  ollNeeded)(void*
194b0 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54  ,sqlite3*,int eT
194c0 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61  extRep,const cha
194d0 72 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51  r*).){.#ifdef SQ
194e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
194f0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
19500 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
19510 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
19520 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
19530 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
19540 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
19550 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
19560 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20  ->xCollNeeded = 
19570 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64  xCollNeeded;.  d
19580 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  b->xCollNeeded16
19590 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c   = 0;.  db->pCol
195a0 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f  lNeededArg = pCo
195b0 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73  llNeededArg;.  s
195c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
195d0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
195e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
195f0 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
19600 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
19610 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
19620 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
19630 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c  nce factory call
19640 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61  back with the da
19650 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
19660 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79   db. Replace any
19670 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74   previously inst
19680 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  alled collation 
19690 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
196a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
196b0 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
196c0 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  d16(.  sqlite3 *
196d0 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f  db, .  void *pCo
196e0 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20  llNeededArg, .  
196f0 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65  void(*xCollNeede
19700 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74  d16)(void*,sqlit
19710 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70  e3*,int eTextRep
19720 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
19730 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
19740 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
19750 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
19760 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
19770 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
19780 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
19790 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
197a0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
197b0 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  tex);.  db->xCol
197c0 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64  lNeeded = 0;.  d
197d0 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  b->xCollNeeded16
197e0 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36   = xCollNeeded16
197f0 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65  ;.  db->pCollNee
19800 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65  dedArg = pCollNe
19810 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74  ededArg;.  sqlit
19820 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
19830 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
19840 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19850 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
19860 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
19870 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19880 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
19890 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
198a0 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e  ion is now an an
198b0 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73  achronism. It us
198c0 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f  ed to be used to
198d0 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a   recover from a.
198e0 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  ** malloc() fail
198f0 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20  ure, but SQLite 
19900 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20 61 75  now does this au
19910 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a  tomatically..*/.
19920 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62  int sqlite3_glob
19930 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29  al_recover(void)
19940 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  {.  return SQLIT
19950 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
19960 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65  /*.** Test to se
19970 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
19980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
19990 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61  nnection is in a
199a0 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64  utocommit.** mod
199b0 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  e.  Return TRUE 
199c0 69 66 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c  if it is and FAL
199d0 53 45 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f  SE if not.  Auto
199e0 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f  commit mode is o
199f0 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e  n.** by default.
19a00 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20    Autocommit is 
19a10 64 69 73 61 62 6c 65 64 20 62 79 20 61 20 42 45  disabled by a BE
19a20 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  GIN statement an
19a30 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62  d reenabled.** b
19a40 79 20 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49  y the next COMMI
19a50 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a  T or ROLLBACK..*
19a60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65  /.int sqlite3_ge
19a70 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c  t_autocommit(sql
19a80 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65  ite3 *db){.#ifde
19a90 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
19aa0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
19ab0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
19ac0 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
19ad0 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
19ae0 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
19af0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
19b00 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  dif.  return db-
19b10 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a  >autoCommit;.}..
19b20 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
19b30 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ing routines are
19b40 20 73 75 62 73 74 69 74 75 74 65 73 20 66 6f 72   substitutes for
19b50 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54   constants SQLIT
19b60 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51  E_CORRUPT,.** SQ
19b70 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c  LITE_MISUSE, SQL
19b80 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51  ITE_CANTOPEN, SQ
19b90 4c 49 54 45 5f 49 4f 45 52 52 20 61 6e 64 20 70  LITE_IOERR and p
19ba0 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72  ossibly other er
19bb0 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  ror.** constants
19bc0 2e 20 20 54 68 65 79 20 73 65 72 76 65 20 74 77  .  They serve tw
19bd0 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a  o purposes:.**.*
19be0 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20 61 73  *   1.  Serve as
19bf0 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c   a convenient pl
19c00 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65  ace to set a bre
19c10 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62  akpoint in a deb
19c20 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74  ugger.**       t
19c30 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20 76 65  o detect when ve
19c40 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64  rsion error cond
19c50 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a  itions occurs..*
19c60 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b  *.**   2.  Invok
19c70 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  e sqlite3_log() 
19c80 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 73  to provide the s
19c90 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74  ource code locat
19ca0 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20  ion where.**    
19cb0 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65     a low-level e
19cc0 72 72 6f 72 20 69 73 20 66 69 72 73 74 20 64 65  rror is first de
19cd0 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  tected..*/.int s
19ce0 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45 72 72  qlite3CorruptErr
19cf0 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
19d00 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
19d10 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
19d20 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c  xLog!=0 );.  sql
19d30 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
19d40 43 4f 52 52 55 50 54 2c 0a 20 20 20 20 20 20 20  CORRUPT,.       
19d50 20 20 20 20 20 20 20 22 64 61 74 61 62 61 73 65         "database
19d60 20 63 6f 72 72 75 70 74 69 6f 6e 20 61 74 20 6c   corruption at l
19d70 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73  ine %d of [%.10s
19d80 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]",.            
19d90 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c    lineno, 20+sql
19da0 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
19db0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
19dc0 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e 74  E_CORRUPT;.}.int
19dd0 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45 72   sqlite3MisuseEr
19de0 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
19df0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
19e00 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
19e10 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71  .xLog!=0 );.  sq
19e20 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
19e30 5f 4d 49 53 55 53 45 2c 20 0a 20 20 20 20 20 20  _MISUSE, .      
19e40 20 20 20 20 20 20 20 20 22 6d 69 73 75 73 65 20          "misuse 
19e50 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25  at line %d of [%
19e60 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20  .10s]",.        
19e70 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30        lineno, 20
19e80 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69  +sqlite3_sourcei
19e90 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  d());.  return S
19ea0 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a  QLITE_MISUSE;.}.
19eb0 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f  int sqlite3Canto
19ec0 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  penError(int lin
19ed0 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
19ee0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
19ef0 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
19f00 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53  .  sqlite3_log(S
19f10 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20  QLITE_CANTOPEN, 
19f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
19f30 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
19f40 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b   at line %d of [
19f50 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20  %.10s]",.       
19f60 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32         lineno, 2
19f70 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  0+sqlite3_source
19f80 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  id());.  return 
19f90 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
19fa0 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
19fb0 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
19fc0 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  TED./*.** This i
19fd0 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20  s a convenience 
19fe0 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6b  routine that mak
19ff0 65 73 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c  es sure that all
1a000 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63   thread-specific
1a010 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 69  .** data for thi
1a020 73 20 74 68 72 65 61 64 20 68 61 73 20 62 65 65  s thread has bee
1a030 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a  n deallocated..*
1a040 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c  *.** SQLite no l
1a050 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72 65 61  onger uses threa
1a060 64 2d 73 70 65 63 69 66 69 63 20 64 61 74 61 20  d-specific data 
1a070 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  so this routine 
1a080 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f  is now a.** no-o
1a090 70 2e 20 20 49 74 20 69 73 20 72 65 74 61 69 6e  p.  It is retain
1a0a0 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61  ed for historica
1a0b0 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e  l compatibility.
1a0c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1a0d0 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28  _thread_cleanup(
1a0e0 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a  void){.}.#endif.
1a0f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65  ./*.** Return me
1a100 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ta information a
1a110 62 6f 75 74 20 61 20 73 70 65 63 69 66 69 63 20  bout a specific 
1a120 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74 61  column of a data
1a130 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53  base table..** S
1a140 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71  ee comment in sq
1a150 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74 65 2e  lite3.h (sqlite.
1a160 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61 69 6c  h.in) for detail
1a170 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1a180 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
1a190 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74  etadata(.  sqlit
1a1a0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
1a1b0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
1a1c0 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  tion handle */. 
1a1d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1a1e0 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
1a1f0 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72  Database name or
1a200 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
1a210 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d   char *zTableNam
1a220 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  e,     /* Table 
1a230 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  name */.  const 
1a240 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d  char *zColumnNam
1a250 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  e,    /* Column 
1a260 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  name */.  char c
1a270 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70  onst **pzDataTyp
1a280 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  e,    /* OUTPUT:
1a290 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20 74   Declared data t
1a2a0 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ype */.  char co
1a2b0 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c  nst **pzCollSeq,
1a2c0 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
1a2d0 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
1a2e0 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  ce name */.  int
1a2f0 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20   *pNotNull,     
1a300 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
1a310 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20  UT: True if NOT 
1a320 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20  NULL constraint 
1a330 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20  exists */.  int 
1a340 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20  *pPrimaryKey,   
1a350 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
1a360 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
1a370 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a  n part of PK */.
1a380 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20    int *pAutoinc 
1a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a3a0 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
1a3b0 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d   column is auto-
1a3c0 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  increment */.){.
1a3d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
1a3e0 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
1a3f0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
1a400 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
1a410 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
1a420 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
1a430 73 74 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20  st *zDataType = 
1a440 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  0;.  char const 
1a450 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20  *zCollSeq = 0;. 
1a460 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30   int notnull = 0
1a470 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b  ;.  int primaryk
1a480 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75  ey = 0;.  int au
1a490 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 0a 23 69 66  toinc = 0;...#if
1a4a0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1a4b0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1a4c0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1a4d0 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a  CheckOk(db) || z
1a4e0 54 61 62 6c 65 4e 61 6d 65 3d 3d 30 20 29 7b 0a  TableName==0 ){.
1a4f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a500 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
1a510 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1a520 45 6e 73 75 72 65 20 74 68 65 20 64 61 74 61 62  Ensure the datab
1a530 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 62  ase schema has b
1a540 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20  een loaded */.  
1a550 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1a560 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1a570 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1a580 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63  terAll(db);.  rc
1a590 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64   = sqlite3Init(d
1a5a0 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  b, &zErrMsg);.  
1a5b0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
1a5c0 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72  c ){.    goto er
1a5d0 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ror_out;.  }..  
1a5e0 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  /* Locate the ta
1a5f0 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20  ble in question 
1a600 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  */.  pTab = sqli
1a610 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
1a620 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62   zTableName, zDb
1a630 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54  Name);.  if( !pT
1a640 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  ab || pTab->pSel
1a650 65 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20  ect ){.    pTab 
1a660 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72  = 0;.    goto er
1a670 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ror_out;.  }..  
1a680 2f 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75  /* Find the colu
1a690 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66  mn for which inf
1a6a0 6f 20 69 73 20 72 65 71 75 65 73 74 65 64 20 2a  o is requested *
1a6b0 2f 0a 20 20 69 66 28 20 7a 43 6f 6c 75 6d 6e 4e  /.  if( zColumnN
1a6c0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ame==0 ){.    /*
1a6d0 20 51 75 65 72 79 20 66 6f 72 20 65 78 69 73 74   Query for exist
1a6e0 61 6e 63 65 20 6f 66 20 74 61 62 6c 65 20 6f 6e  ance of table on
1a6f0 6c 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ly */.  }else{. 
1a700 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
1a710 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
1a720 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70  iCol++){.      p
1a730 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
1a740 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69  l[iCol];.      i
1a750 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
1a760 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
1a770 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29  , zColumnName) )
1a780 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
1a790 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a7a0 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61     if( iCol==pTa
1a7b0 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
1a7c0 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
1a7d0 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 49 73  ab) && sqlite3Is
1a7e0 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d  Rowid(zColumnNam
1a7f0 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43  e) ){.        iC
1a800 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
1a810 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d  ;.        pCol =
1a820 20 69 43 6f 6c 3e 3d 30 20 3f 20 26 70 54 61 62   iCol>=0 ? &pTab
1a830 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 20 3a 20 30  ->aCol[iCol] : 0
1a840 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1a850 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b         pTab = 0;
1a860 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 72  .        goto er
1a870 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ror_out;.      }
1a880 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1a890 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
1a8a0 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20  lock stores the 
1a8b0 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
1a8c0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
1a8d0 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74  turned.  ** to t
1a8e0 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63  he caller in loc
1a8f0 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61  al variables zDa
1a900 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71  taType, zCollSeq
1a910 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61  , notnull, prima
1a920 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61  rykey.  ** and a
1a930 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20  utoinc. At this 
1a940 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65 20  point there are 
1a950 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65  two possibilitie
1a960 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20  s:.  ** .  **   
1a970 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66 69    1. The specifi
1a980 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77  ed column name w
1a990 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22  as rowid", "oid"
1a9a0 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20   or "_rowid_" . 
1a9b0 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74   **        and t
1a9c0 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69  here is no expli
1a9d0 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49  citly declared I
1a9e0 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a  PK column. .  **
1a9f0 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65  .  **     2. The
1aa00 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20   table is not a 
1aa10 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c  view and the col
1aa20 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66  umn name identif
1aa30 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20  ied an .  **    
1aa40 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64      explicitly d
1aa50 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20  eclared column. 
1aa60 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d  Copy meta inform
1aa70 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c  ation from *pCol
1aa80 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43  ..  */ .  if( pC
1aa90 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54  ol ){.    zDataT
1aaa0 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70  ype = pCol->zTyp
1aab0 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20  e;.    zCollSeq 
1aac0 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20  = pCol->zColl;. 
1aad0 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f     notnull = pCo
1aae0 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20  l->notNull!=0;. 
1aaf0 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d     primarykey  =
1ab00 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73   (pCol->colFlags
1ab10 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b   & COLFLAG_PRIMK
1ab20 45 59 29 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f  EY)!=0;.    auto
1ab30 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  inc = pTab->iPKe
1ab40 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62  y==iCol && (pTab
1ab50 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
1ab60 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d  Autoincrement)!=
1ab70 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1ab80 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54  zDataType = "INT
1ab90 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61  EGER";.    prima
1aba0 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20  rykey = 1;.  }. 
1abb0 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29   if( !zCollSeq )
1abc0 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d  {.    zCollSeq =
1abd0 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a   "BINARY";.  }..
1abe0 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c  error_out:.  sql
1abf0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
1ac00 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65  l(db);..  /* Whe
1ac10 74 68 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f  ther the functio
1ac20 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64  n call succeeded
1ac30 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20   or failed, set 
1ac40 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d  the output param
1ac50 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68  eters.  ** to wh
1ac60 61 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63  atever their loc
1ac70 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20  al counterparts 
1ac80 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65  contain. If an e
1ac90 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a  rror did occur,.
1aca0 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68    ** this has th
1acb0 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f  e effect of zero
1acc0 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70  ing all output p
1acd0 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a  arameters..  */.
1ace0 20 20 69 66 28 20 70 7a 44 61 74 61 54 79 70 65    if( pzDataType
1acf0 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d   ) *pzDataType =
1ad00 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66   zDataType;.  if
1ad10 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70  ( pzCollSeq ) *p
1ad20 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c  zCollSeq = zColl
1ad30 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e  Seq;.  if( pNotN
1ad40 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20  ull ) *pNotNull 
1ad50 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28  = notnull;.  if(
1ad60 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a   pPrimaryKey ) *
1ad70 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72  pPrimaryKey = pr
1ad80 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20  imarykey;.  if( 
1ad90 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74  pAutoinc ) *pAut
1ada0 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a  oinc = autoinc;.
1adb0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1adc0 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20 29 7b  ==rc && !pTab ){
1add0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1ade0 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b  ee(db, zErrMsg);
1adf0 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73  .    zErrMsg = s
1ae00 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1ae10 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
1ae20 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c   column: %s.%s",
1ae30 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20   zTableName,.   
1ae40 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65       zColumnName
1ae50 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
1ae60 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
1ae70 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
1ae80 4d 73 67 28 64 62 2c 20 72 63 2c 20 28 7a 45 72  Msg(db, rc, (zEr
1ae90 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45  rMsg?"%s":0), zE
1aea0 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
1aeb0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
1aec0 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Msg);.  rc = sql
1aed0 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
1aee0 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
1aef0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1af00 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1af10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  rc;.}../*.** Sle
1af20 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
1af30 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
1af40 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
1af50 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20  e slept..*/.int 
1af60 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 69 6e  sqlite3_sleep(in
1af70 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  t ms){.  sqlite3
1af80 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e  _vfs *pVfs;.  in
1af90 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d 20 73  t rc;.  pVfs = s
1afa0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
1afb0 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73 3d 3d  0);.  if( pVfs==
1afc0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
1afd0 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
1afe0 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69  n works in milli
1aff0 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74 68 65  seconds, but the
1b000 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c   underlying OsSl
1b010 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50 49 20  eep() .  ** API 
1b020 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64  uses microsecond
1b030 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31 30 30  s. Hence the 100
1b040 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  0's..  */.  rc =
1b050 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70   (sqlite3OsSleep
1b060 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f  (pVfs, 1000*ms)/
1b070 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  1000);.  return 
1b080 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61  rc;.}../*.** Ena
1b090 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74  ble or disable t
1b0a0 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 73 75  he extended resu
1b0b0 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74  lt codes..*/.int
1b0c0 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
1b0d0 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 73  d_result_codes(s
1b0e0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
1b0f0 6f 6e 6f 66 66 29 7b 0a 23 69 66 64 65 66 20 53  onoff){.#ifdef S
1b100 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
1b110 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
1b120 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
1b130 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
1b140 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1b150 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
1b160 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1b170 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
1b180 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f  b->errMask = ono
1b190 66 66 20 3f 20 30 78 66 66 66 66 66 66 66 66 20  ff ? 0xffffffff 
1b1a0 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65  : 0xff;.  sqlite
1b1b0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1b1c0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1b1d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b1e0 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
1b1f0 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d  e xFileControl m
1b200 65 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69  ethod on a parti
1b210 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a  cular database..
1b220 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  */.int sqlite3_f
1b230 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69  ile_control(sqli
1b240 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
1b250 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e  har *zDbName, in
1b260 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
1b270 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1b280 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 42 74  LITE_ERROR;.  Bt
1b290 72 65 65 20 2a 70 42 74 72 65 65 3b 0a 0a 23 69  ree *pBtree;..#i
1b2a0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1b2b0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1b2c0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1b2d0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
1b2e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1b2f0 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
1b300 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b310 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1b320 29 3b 0a 20 20 70 42 74 72 65 65 20 3d 20 73 71  );.  pBtree = sq
1b330 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72  lite3DbNameToBtr
1b340 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b  ee(db, zDbName);
1b350 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
1b360 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
1b370 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  er;.    sqlite3_
1b380 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 73 71  file *fd;.    sq
1b390 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1b3a0 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70 50 61  pBtree);.    pPa
1b3b0 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
1b3c0 65 65 50 61 67 65 72 28 70 42 74 72 65 65 29 3b  eePager(pBtree);
1b3d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1b3e0 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 66 64  ger!=0 );.    fd
1b3f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
1b400 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ile(pPager);.   
1b410 20 61 73 73 65 72 74 28 20 66 64 21 3d 30 20 29   assert( fd!=0 )
1b420 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 51  ;.    if( op==SQ
1b430 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f  LITE_FCNTL_FILE_
1b440 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20  POINTER ){.     
1b450 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a   *(sqlite3_file*
1b460 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a 20 20 20  *)pArg = fd;.   
1b470 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1b480 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
1b490 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b   fd->pMethods ){
1b4a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1b4b0 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
1b4c0 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a  (fd, op, pArg);.
1b4d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b4e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
1b4f0 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a 20 20 20  FOUND;.    }.   
1b500 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1b510 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
1b520 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1b530 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1b540 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1b550 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  ../*.** Interfac
1b560 65 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67  e to the testing
1b570 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73   logic..*/.int s
1b580 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1b590 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  rol(int op, ...)
1b5a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  {.  int rc = 0;.
1b5b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
1b5c0 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a  IT_BUILTIN_TEST.
1b5d0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1b5e0 45 52 28 6f 70 29 3b 0a 23 65 6c 73 65 0a 20 20  ER(op);.#else.  
1b5f0 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61  va_list ap;.  va
1b600 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a  _start(ap, op);.
1b610 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1b620 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
1b630 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
1b640 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e  state of the PRN
1b650 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  G..    */.    ca
1b660 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1b670 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a  RL_PRNG_SAVE: {.
1b680 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e        sqlite3Prn
1b690 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20  gSaveState();.  
1b6a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b6b0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1b6c0 52 65 73 74 6f 72 65 20 74 68 65 20 73 74 61 74  Restore the stat
1b6d0 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f  e of the PRNG to
1b6e0 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 20   the last state 
1b6f0 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20  saved using.    
1b700 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49  ** PRNG_SAVE.  I
1b710 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20  f PRNG_SAVE has 
1b720 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65  never before bee
1b730 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20  n called, then. 
1b740 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20     ** this verb 
1b750 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52  acts like PRNG_R
1b760 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ESET..    */.   
1b770 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1b780 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f  TCTRL_PRNG_RESTO
1b790 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  RE: {.      sqli
1b7a0 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74  te3PrngRestoreSt
1b7b0 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65  ate();.      bre
1b7c0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1b7d0 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74  *.    ** Reset t
1b7e0 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20  he PRNG back to 
1b7f0 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  its uninitialize
1b800 64 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65  d state.  The ne
1b810 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  xt call.    ** t
1b820 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d  o sqlite3_random
1b830 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65  ness() will rese
1b840 65 64 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e  ed the PRNG usin
1b850 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a  g a single call.
1b860 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52      ** to the xR
1b870 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64  andomness method
1b880 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   of the default 
1b890 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  VFS..    */.    
1b8a0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1b8b0 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a  CTRL_PRNG_RESET:
1b8c0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1b8d0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29  _randomness(0,0)
1b8e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1b8f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1b900 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
1b910 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43  t_control(BITVEC
1b920 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f  _TEST, size, pro
1b930 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20  gram).    **.   
1b940 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61   ** Run a test a
1b950 67 61 69 6e 73 74 20 61 20 42 69 74 76 65 63 20  gainst a Bitvec 
1b960 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20  object of size. 
1b970 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67   The program arg
1b980 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20  ument.    ** is 
1b990 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65  an array of inte
1b9a0 67 65 72 73 20 74 68 61 74 20 64 65 66 69 6e 65  gers that define
1b9b0 73 20 74 68 65 20 74 65 73 74 2e 20 20 52 65 74  s the test.  Ret
1b9c0 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20  urn -1 on a.    
1b9d0 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ** memory alloca
1b9e0 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e  tion error, 0 on
1b9f0 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e   success, or non
1ba00 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72  -zero for an err
1ba10 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74  or..    ** See t
1ba20 68 65 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  he sqlite3Bitvec
1ba30 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f  BuiltinTest() fo
1ba40 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
1ba50 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
1ba60 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ba70 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43  _TESTCTRL_BITVEC
1ba80 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69  _TEST: {.      i
1ba90 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
1baa0 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
1bab0 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61  nt *aProg = va_a
1bac0 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20  rg(ap, int*);.  
1bad0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1bae0 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73  BitvecBuiltinTes
1baf0 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20  t(sz, aProg);.  
1bb00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bb10 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1bb20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1bb30 6e 74 72 6f 6c 28 46 41 55 4c 54 5f 49 4e 53 54  ntrol(FAULT_INST
1bb40 41 4c 4c 2c 20 78 43 61 6c 6c 62 61 63 6b 29 0a  ALL, xCallback).
1bb50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 72      **.    ** Ar
1bb60 72 61 6e 67 65 20 74 6f 20 69 6e 76 6f 6b 65 20  range to invoke 
1bb70 78 43 61 6c 6c 62 61 63 6b 28 29 20 77 68 65 6e  xCallback() when
1bb80 65 76 65 72 20 73 71 6c 69 74 65 33 46 61 75 6c  ever sqlite3Faul
1bb90 74 53 69 6d 28 29 20 69 73 20 63 61 6c 6c 65 64  tSim() is called
1bba0 2c 0a 20 20 20 20 2a 2a 20 69 66 20 78 43 61 6c  ,.    ** if xCal
1bbb0 6c 62 61 63 6b 20 69 73 20 6e 6f 74 20 4e 55 4c  lback is not NUL
1bbc0 4c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  L..    **.    **
1bbd0 20 41 73 20 61 20 74 65 73 74 20 6f 66 20 74 68   As a test of th
1bbe0 65 20 66 61 75 6c 74 20 73 69 6d 75 6c 61 74 6f  e fault simulato
1bbf0 72 20 6d 65 63 68 61 6e 69 73 6d 20 69 74 73 65  r mechanism itse
1bc00 6c 66 2c 20 73 71 6c 69 74 65 33 46 61 75 6c 74  lf, sqlite3Fault
1bc10 53 69 6d 28 30 29 0a 20 20 20 20 2a 2a 20 69 73  Sim(0).    ** is
1bc20 20 63 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74   called immediat
1bc30 65 6c 79 20 61 66 74 65 72 20 69 6e 73 74 61 6c  ely after instal
1bc40 6c 69 6e 67 20 74 68 65 20 6e 65 77 20 63 61 6c  ling the new cal
1bc50 6c 62 61 63 6b 20 61 6e 64 20 74 68 65 20 72 65  lback and the re
1bc60 74 75 72 6e 0a 20 20 20 20 2a 2a 20 76 61 6c 75  turn.    ** valu
1bc70 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 46 61  e from sqlite3Fa
1bc80 75 6c 74 53 69 6d 28 30 29 20 62 65 63 6f 6d 65  ultSim(0) become
1bc90 73 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f  s the return fro
1bca0 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  m.    ** sqlite3
1bcb0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e  _test_control().
1bcc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1bcd0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1bce0 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20  _FAULT_INSTALL: 
1bcf0 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20  {.      /* MSVC 
1bd00 69 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70  is picky about p
1bd10 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73  ulling func ptrs
1bd20 20 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a   from va lists..
1bd30 20 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f        ** http://
1bd40 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66  support.microsof
1bd50 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20  t.com/kb/47961. 
1bd60 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47       ** sqlite3G
1bd70 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73  lobalConfig.xTes
1bd80 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61  tCallback = va_a
1bd90 72 67 28 61 70 2c 20 69 6e 74 28 2a 29 28 69 6e  rg(ap, int(*)(in
1bda0 74 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20  t));.      */.  
1bdb0 20 20 20 20 74 79 70 65 64 65 66 20 69 6e 74 28      typedef int(
1bdc0 2a 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e  *TESTCALLBACKFUN
1bdd0 43 5f 74 29 28 69 6e 74 29 3b 0a 20 20 20 20 20  C_t)(int);.     
1bde0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1bdf0 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61  nfig.xTestCallba
1be00 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ck = va_arg(ap, 
1be10 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43  TESTCALLBACKFUNC
1be20 5f 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  _t);.      rc = 
1be30 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
1be40 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
1be50 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1be60 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
1be70 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49  est_control(BENI
1be80 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c  GN_MALLOC_HOOKS,
1be90 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20   xBegin, xEnd). 
1bea0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67     **.    ** Reg
1beb0 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63  ister hooks to c
1bec0 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65 20  all to indicate 
1bed0 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66  which malloc() f
1bee0 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a 20  ailures .    ** 
1bef0 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20  are benign..    
1bf00 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1bf10 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49  TE_TESTCTRL_BENI
1bf20 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a  GN_MALLOC_HOOKS:
1bf30 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65 66   {.      typedef
1bf40 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e   void (*void_fun
1bf50 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20  ction)(void);.  
1bf60 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f      void_functio
1bf70 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a  n xBenignBegin;.
1bf80 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74        void_funct
1bf90 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a  ion xBenignEnd;.
1bfa0 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65 67        xBenignBeg
1bfb0 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  in = va_arg(ap, 
1bfc0 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a  void_function);.
1bfd0 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e 64        xBenignEnd
1bfe0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
1bff0 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20  id_function);.  
1c000 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69 67      sqlite3Benig
1c010 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65  nMallocHooks(xBe
1c020 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69  nignBegin, xBeni
1c030 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62 72  gnEnd);.      br
1c040 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1c050 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1c060 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1c070 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1c080 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e  PENDING_BYTE, un
1c090 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20 20  signed int X).  
1c0a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20    **.    ** Set 
1c0b0 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
1c0c0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e   to the value in
1c0d0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 69   the argument, i
1c0e0 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61  f X>0..    ** Ma
1c0f0 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66  ke no changes if
1c100 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20 74   X==0.  Return t
1c110 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1c120 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20 20  pending byte.   
1c130 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74 69   ** as it existi
1c140 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ng before this r
1c150 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
1c160 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
1c170 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68 61   IMPORTANT:  Cha
1c180 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e  nging the PENDIN
1c190 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34 30  G byte from 0x40
1c1a0 30 30 30 30 30 30 20 72 65 73 75 6c 74 73 20 69  000000 results i
1c1b0 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f  n.    ** an inco
1c1c0 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62 61 73  mpatible databas
1c1d0 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20  e file format.  
1c1e0 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e  Changing the PEN
1c1f0 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a 2a  DING byte.    **
1c200 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61 62   while any datab
1c210 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ase connection i
1c220 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20 69  s open results i
1c230 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a  n undefined and.
1c240 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 72 69 6f      ** deleterio
1c250 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20  us behavior..   
1c260 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1c270 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e  ITE_TESTCTRL_PEN
1c280 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20  DING_BYTE: {.   
1c290 20 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f     rc = PENDING_
1c2a0 42 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53 51  BYTE;.#ifndef SQ
1c2b0 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20  LITE_OMIT_WSD.  
1c2c0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75 6e      {.        un
1c2d0 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56 61  signed int newVa
1c2e0 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  l = va_arg(ap, u
1c2f0 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
1c300 20 20 20 20 20 20 69 66 28 20 6e 65 77 56 61 6c        if( newVal
1c310 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69 6e   ) sqlite3Pendin
1c320 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a  gByte = newVal;.
1c330 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1c340 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c350 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1c360 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1c370 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1c380 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 69  STCTRL_ASSERT, i
1c390 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
1c3a0 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20   ** This action 
1c3b0 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74  provides a run-t
1c3c0 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20  ime test to see 
1c3d0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20  whether or not. 
1c3e0 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 77     ** assert() w
1c3f0 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  as enabled at co
1c400 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20  mpile-time.  If 
1c410 58 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 73  X is true and as
1c420 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69 73  sert().    ** is
1c430 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74   enabled, then t
1c440 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1c450 69 73 20 74 72 75 65 2e 20 20 49 66 20 58 20 69  is true.  If X i
1c460 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20 2a  s true and.    *
1c470 2a 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  * assert() is di
1c480 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  sabled, then the
1c490 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1c4a0 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73 0a   zero.  If X is.
1c4b0 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64      ** false and
1c4c0 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61   assert() is ena
1c4d0 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 61  bled, then the a
1c4e0 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20 61  ssertion fires a
1c4f0 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72  nd the.    ** pr
1c500 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20 49  ocess aborts.  I
1c510 66 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e 64  f X is false and
1c520 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73   assert() is dis
1c530 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a  abled, then the.
1c540 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61      ** return va
1c550 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20  lue is zero..   
1c560 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1c570 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
1c580 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c  ERT: {.      vol
1c590 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b  atile int x = 0;
1c5a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
1c5b0 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
1c5c0 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  t))!=0 );.      
1c5d0 72 63 20 3d 20 78 3b 0a 20 20 20 20 20 20 62 72  rc = x;.      br
1c5e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20  eak;.    }...   
1c5f0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1c600 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1c610 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1c620 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20 58 29 0a  _ALWAYS, int X).
1c630 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1c640 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64  is action provid
1c650 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65  es a run-time te
1c660 73 74 20 74 6f 20 73 65 65 20 68 6f 77 20 74 68  st to see how th
1c670 65 20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20 20  e ALWAYS and.   
1c680 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f 73   ** NEVER macros
1c690 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 61 74   were defined at
1c6a0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20   compile-time.. 
1c6b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1c6c0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1c6d0 20 41 4c 57 41 59 53 28 58 29 2e 20 20 0a 20 20   ALWAYS(X).  .  
1c6e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1c6f0 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74  recommended test
1c700 20 69 73 20 58 3d 3d 32 2e 20 20 49 66 20 74 68   is X==2.  If th
1c710 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1c720 73 20 32 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a  s 2, that means.
1c730 20 20 20 20 2a 2a 20 41 4c 57 41 59 53 28 29 20      ** ALWAYS() 
1c740 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20  and NEVER() are 
1c750 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d  both no-op pass-
1c760 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20  through macros, 
1c770 77 68 69 63 68 20 69 73 20 74 68 65 0a 20 20 20  which is the.   
1c780 20 2a 2a 20 64 65 66 61 75 6c 74 20 73 65 74 74   ** default sett
1c790 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 65 74  ing.  If the ret
1c7a0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31 2c 20  urn value is 1, 
1c7b0 74 68 65 6e 20 41 4c 57 41 59 53 28 29 20 69 73  then ALWAYS() is
1c7c0 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 68   either.    ** h
1c7d0 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75  ard-coded to tru
1c7e0 65 20 6f 72 20 65 6c 73 65 20 69 74 20 61 73 73  e or else it ass
1c7f0 65 72 74 73 20 69 66 20 69 74 73 20 61 72 67 75  erts if its argu
1c800 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a 20  ment is false.. 
1c810 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20     ** The first 
1c820 62 65 68 61 76 69 6f 72 20 28 68 61 72 64 2d 63  behavior (hard-c
1c830 6f 64 65 64 20 74 6f 20 74 72 75 65 29 20 69 73  oded to true) is
1c840 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20 20   the case if.   
1c850 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43   ** SQLITE_TESTC
1c860 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73  TRL_ASSERT shows
1c870 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20 69   that assert() i
1c880 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20 74  s disabled and t
1c890 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a  he second.    **
1c8a0 20 62 65 68 61 76 69 6f 72 20 28 61 73 73 65 72   behavior (asser
1c8b0 74 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  t if the argumen
1c8c0 74 20 74 6f 20 41 4c 57 41 59 53 28 29 20 69 73  t to ALWAYS() is
1c8d0 20 66 61 6c 73 65 29 20 69 73 20 74 68 65 20 63   false) is the c
1c8e0 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51  ase if.    ** SQ
1c8f0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
1c900 53 45 52 54 20 73 68 6f 77 73 20 74 68 61 74 20  SERT shows that 
1c910 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62  assert() is enab
1c920 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  led..    **.    
1c930 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d 65 20  ** The run-time 
1c940 74 65 73 74 20 70 72 6f 63 65 64 75 72 65 20 6d  test procedure m
1c950 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68  ight look someth
1c960 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  ing like this:. 
1c970 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1c980 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74  if( sqlite3_test
1c990 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1c9a0 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c  TESTCTRL_ALWAYS,
1c9b0 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a   2)==2 ){.    **
1c9c0 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
1c9d0 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72  ) and NEVER() ar
1c9e0 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72  e no-op pass-thr
1c9f0 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20 20 20 20  ough macros.    
1ca00 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  **    }else if( 
1ca10 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1ca20 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1ca30 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 31 29 20  CTRL_ASSERT, 1) 
1ca40 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f  ){.    **      /
1ca50 2f 20 41 4c 57 41 59 53 28 78 29 20 61 73 73 65  / ALWAYS(x) asse
1ca60 72 74 73 20 74 68 61 74 20 78 20 69 73 20 74 72  rts that x is tr
1ca70 75 65 2e 20 4e 45 56 45 52 28 78 29 20 61 73 73  ue. NEVER(x) ass
1ca80 65 72 74 73 20 78 20 69 73 20 66 61 6c 73 65 2e  erts x is false.
1ca90 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65  .    **    }else
1caa0 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
1cab0 20 41 4c 57 41 59 53 28 78 29 20 69 73 20 61 20   ALWAYS(x) is a 
1cac0 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45 56  constant 1.  NEV
1cad0 45 52 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74  ER(x) is a const
1cae0 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20  ant 0..    **   
1caf0 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61   }.    */.    ca
1cb00 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1cb10 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20  RL_ALWAYS: {.   
1cb20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72     int x = va_ar
1cb30 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20  g(ap,int);.     
1cb40 20 72 63 20 3d 20 41 4c 57 41 59 53 28 78 29 3b   rc = ALWAYS(x);
1cb50 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1cb60 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1cb70 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  **   sqlite3_tes
1cb80 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1cb90 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52  _TESTCTRL_BYTEOR
1cba0 44 45 52 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  DER);.    **.   
1cbb0 20 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20   ** The integer 
1cbc0 72 65 74 75 72 6e 65 64 20 72 65 76 65 61 6c 73  returned reveals
1cbd0 20 74 68 65 20 62 79 74 65 2d 6f 72 64 65 72 20   the byte-order 
1cbe0 6f 66 20 74 68 65 20 63 6f 6d 70 75 74 65 72 20  of the computer 
1cbf0 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 2a 2a 20  on which.    ** 
1cc00 53 51 4c 69 74 65 20 69 73 20 72 75 6e 6e 69 6e  SQLite is runnin
1cc10 67 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  g:.    **.    **
1cc20 20 20 20 20 20 20 20 31 20 20 20 20 20 62 69 67         1     big
1cc30 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64 65 74 65  -endian,    dete
1cc40 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69  rmined at run-ti
1cc50 6d 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 31  me.    **      1
1cc60 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64  0     little-end
1cc70 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64 20  ian, determined 
1cc80 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20  at run-time.    
1cc90 2a 2a 20 20 34 33 32 31 30 31 20 20 20 20 20 62  **  432101     b
1cca0 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64 65  ig-endian,    de
1ccb0 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70  termined at comp
1ccc0 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20  ile-time.    ** 
1ccd0 20 31 32 33 34 31 30 20 20 20 20 20 6c 69 74 74   123410     litt
1cce0 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72  le-endian, deter
1ccf0 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  mined at compile
1cd00 2d 74 69 6d 65 0a 20 20 20 20 2a 2f 20 0a 20 20  -time.    */ .  
1cd10 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1cd20 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52  STCTRL_BYTEORDER
1cd30 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  : {.      rc = S
1cd40 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52 2a  QLITE_BYTEORDER*
1cd50 31 30 30 20 2b 20 53 51 4c 49 54 45 5f 4c 49 54  100 + SQLITE_LIT
1cd60 54 4c 45 45 4e 44 49 41 4e 2a 31 30 20 2b 20 53  TLEENDIAN*10 + S
1cd70 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e 3b  QLITE_BIGENDIAN;
1cd80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1cd90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71    }..    /*   sq
1cda0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1cdb0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1cdc0 52 4c 5f 52 45 53 45 52 56 45 2c 20 73 71 6c 69  RL_RESERVE, sqli
1cdd0 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a  te3 *db, int N).
1cde0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65      **.    ** Se
1cdf0 74 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73  t the nReserve s
1ce00 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74 68 65  ize to N for the
1ce10 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f   main database o
1ce20 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  n the database. 
1ce30 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e     ** connection
1ce40 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   db..    */.    
1ce50 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1ce60 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 20 7b 0a  CTRL_RESERVE: {.
1ce70 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1ce80 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
1ce90 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
1cea0 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61  int x = va_arg(a
1ceb0 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  p,int);.      sq
1cec0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1ced0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
1cee0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1cef0 53 65 74 50 61 67 65 53 69 7a 65 28 64 62 2d 3e  SetPageSize(db->
1cf00 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 20 78  aDb[0].pBt, 0, x
1cf10 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
1cf20 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1cf30 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
1cf40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1cf50 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f      /*  sqlite3_
1cf60 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1cf70 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
1cf80 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71 6c 69  IMIZATIONS, sqli
1cf90 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a  te3 *db, int N).
1cfa0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e      **.    ** En
1cfb0 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20  able or disable 
1cfc0 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61  various optimiza
1cfd0 74 69 6f 6e 73 20 66 6f 72 20 74 65 73 74 69 6e  tions for testin
1cfe0 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68 65  g purposes.  The
1cff0 20 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e   .    ** argumen
1d000 74 20 4e 20 69 73 20 61 20 62 69 74 6d 61 73 6b  t N is a bitmask
1d010 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   of optimization
1d020 73 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  s to be disabled
1d030 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20  .  For normal.  
1d040 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 4e    ** operation N
1d050 20 73 68 6f 75 6c 64 20 62 65 20 30 2e 20 20 54   should be 0.  T
1d060 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20  he idea is that 
1d070 61 20 74 65 73 74 20 70 72 6f 67 72 61 6d 20 28  a test program (
1d080 6c 69 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  like the.    ** 
1d090 53 51 4c 20 4c 6f 67 69 63 20 54 65 73 74 20 6f  SQL Logic Test o
1d0a0 72 20 53 4c 54 20 74 65 73 74 20 6d 6f 64 75 6c  r SLT test modul
1d0b0 65 29 20 63 61 6e 20 72 75 6e 20 74 68 65 20 73  e) can run the s
1d0c0 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70 6c 65  ame SQL multiple
1d0d0 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20 77 69   times.    ** wi
1d0e0 74 68 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d  th various optim
1d0f0 69 7a 61 74 69 6f 6e 73 20 64 69 73 61 62 6c 65  izations disable
1d100 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  d to verify that
1d110 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72   the same answer
1d120 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62 74 61 69  .    ** is obtai
1d130 6e 65 64 20 69 6e 20 65 76 65 72 79 20 63 61 73  ned in every cas
1d140 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  e..    */.    ca
1d150 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1d160 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
1d170 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1d180 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61  3 *db = va_arg(a
1d190 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  p, sqlite3*);.  
1d1a0 20 20 20 20 64 62 2d 3e 64 62 4f 70 74 46 6c 61      db->dbOptFla
1d1b0 67 73 20 3d 20 28 75 31 36 29 28 76 61 5f 61 72  gs = (u16)(va_ar
1d1c0 67 28 61 70 2c 20 69 6e 74 29 20 26 20 30 78 66  g(ap, int) & 0xf
1d1d0 66 66 66 29 3b 0a 20 20 20 20 20 20 62 72 65 61  fff);.      brea
1d1e0 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  k;.    }..#ifdef
1d1f0 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
1d200 44 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  D.    /* sqlite3
1d210 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1d220 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53  LITE_TESTCTRL_IS
1d230 4b 45 59 57 4f 52 44 2c 20 63 6f 6e 73 74 20 63  KEYWORD, const c
1d240 68 61 72 20 2a 7a 57 6f 72 64 29 0a 20 20 20 20  har *zWord).    
1d250 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 7a 57 6f  **.    ** If zWo
1d260 72 64 20 69 73 20 61 20 6b 65 79 77 6f 72 64 20  rd is a keyword 
1d270 72 65 63 6f 67 6e 69 7a 65 64 20 62 79 20 74 68  recognized by th
1d280 65 20 70 61 72 73 65 72 2c 20 74 68 65 6e 20 72  e parser, then r
1d290 65 74 75 72 6e 20 74 68 65 0a 20 20 20 20 2a 2a  eturn the.    **
1d2a0 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 77 6f   number of keywo
1d2b0 72 64 73 2e 20 20 4f 72 20 69 66 20 7a 57 6f 72  rds.  Or if zWor
1d2c0 64 20 69 73 20 6e 6f 74 20 61 20 6b 65 79 77 6f  d is not a keywo
1d2d0 72 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  rd, return 0..  
1d2e0 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 54 68 69    ** .    ** Thi
1d2f0 73 20 74 65 73 74 20 66 65 61 74 75 72 65 20 69  s test feature i
1d300 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
1d310 20 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61   in the amalgama
1d320 74 69 6f 6e 20 73 69 6e 63 65 0a 20 20 20 20 2a  tion since.    *
1d330 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 5f 4b  * the SQLITE_N_K
1d340 45 59 57 4f 52 44 20 6d 61 63 72 6f 20 69 73 20  EYWORD macro is 
1d350 6e 6f 74 20 64 65 66 69 6e 65 64 20 69 6e 20 74  not defined in t
1d360 68 69 73 20 66 69 6c 65 20 69 66 20 53 51 4c 69  his file if SQLi
1d370 74 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 75 69  te.    ** is bui
1d380 6c 74 20 75 73 69 6e 67 20 73 65 70 61 72 61 74  lt using separat
1d390 65 20 73 6f 75 72 63 65 20 66 69 6c 65 73 2e 0a  e source files..
1d3a0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1d3b0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1d3c0 49 53 4b 45 59 57 4f 52 44 3a 20 7b 0a 20 20 20  ISKEYWORD: {.   
1d3d0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1d3e0 57 6f 72 64 20 3d 20 76 61 5f 61 72 67 28 61 70  Word = va_arg(ap
1d3f0 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  , const char*);.
1d400 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
1d410 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 57  lite3Strlen30(zW
1d420 6f 72 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ord);.      rc =
1d430 20 28 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64   (sqlite3Keyword
1d440 43 6f 64 65 28 28 75 38 2a 29 7a 57 6f 72 64 2c  Code((u8*)zWord,
1d450 20 6e 29 21 3d 54 4b 5f 49 44 29 20 3f 20 53 51   n)!=TK_ID) ? SQ
1d460 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a  LITE_N_KEYWORD :
1d470 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
1d480 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 0a 0a  .    }.#endif ..
1d490 20 20 20 20 2f 2a 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 53 43 52 41  TE_TESTCTRL_SCRA
1d4c0 54 43 48 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26  TCHMALLOC, sz, &
1d4d0 70 4e 65 77 2c 20 70 46 72 65 65 29 3b 0a 20 20  pNew, pFree);.  
1d4e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 61 73 73    **.    ** Pass
1d4f0 20 70 46 72 65 65 20 69 6e 74 6f 20 73 71 6c 69   pFree into sqli
1d500 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 29  te3ScratchFree()
1d510 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 73 7a 3e  . .    ** If sz>
1d520 30 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  0 then allocate 
1d530 61 20 73 63 72 61 74 63 68 20 62 75 66 66 65 72  a scratch buffer
1d540 20 69 6e 74 6f 20 70 4e 65 77 2e 20 20 0a 20 20   into pNew.  .  
1d550 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1d560 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43  LITE_TESTCTRL_SC
1d570 52 41 54 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  RATCHMALLOC: {. 
1d580 20 20 20 20 20 76 6f 69 64 20 2a 70 46 72 65 65       void *pFree
1d590 2c 20 2a 2a 70 70 4e 65 77 3b 0a 20 20 20 20 20  , **ppNew;.     
1d5a0 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 73   int sz;.      s
1d5b0 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  z = va_arg(ap, i
1d5c0 6e 74 29 3b 0a 20 20 20 20 20 20 70 70 4e 65 77  nt);.      ppNew
1d5d0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
1d5e0 69 64 2a 2a 29 3b 0a 20 20 20 20 20 20 70 46 72  id**);.      pFr
1d5f0 65 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ee = va_arg(ap, 
1d600 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 69 66  void*);.      if
1d610 28 20 73 7a 20 29 20 2a 70 70 4e 65 77 20 3d 20  ( sz ) *ppNew = 
1d620 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61  sqlite3ScratchMa
1d630 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20  lloc(sz);.      
1d640 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
1d650 65 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20  ee(pFree);.     
1d660 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1d670 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1d680 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1d690 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
1d6a0 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e  ALTIME_FAULT, in
1d6b0 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a  t onoff);.    **
1d6c0 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d  .    ** If param
1d6d0 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f  eter onoff is no
1d6e0 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67 75 72  n-zero, configur
1d6f0 65 20 74 68 65 20 77 72 61 70 70 65 72 73 20 73  e the wrappers s
1d700 6f 20 74 68 61 74 20 61 6c 6c 0a 20 20 20 20 2a  o that all.    *
1d710 2a 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * subsequent cal
1d720 6c 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65 28  ls to localtime(
1d730 29 20 61 6e 64 20 76 61 72 69 61 6e 74 73 20 66  ) and variants f
1d740 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69 73  ail. If onoff is
1d750 20 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e   zero,.    ** un
1d760 64 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e  do this setting.
1d770 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1d780 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1d790 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
1d7a0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1d7b0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c  3GlobalConfig.bL
1d7c0 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20  ocaltimeFault = 
1d7d0 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1d7e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d7f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71    }..    /*   sq
1d800 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1d810 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1d820 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54  RL_NEVER_CORRUPT
1d830 2c 20 69 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a 20  , int);.    **. 
1d840 20 20 20 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65     ** Set or cle
1d850 61 72 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  ar a flag that i
1d860 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
1d870 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1d880 69 73 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d 0a  is always well-.
1d890 20 20 20 20 2a 2a 20 66 6f 72 6d 65 64 20 61 6e      ** formed an
1d8a0 64 20 6e 65 76 65 72 20 63 6f 72 72 75 70 74 2e  d never corrupt.
1d8b0 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 63    This flag is c
1d8c0 6c 65 61 72 20 62 79 20 64 65 66 61 75 6c 74 2c  lear by default,
1d8d0 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
1d8e0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
1d8f0 20 66 69 6c 65 73 20 6d 69 67 68 74 20 68 61 76   files might hav
1d900 65 20 61 72 62 69 74 72 61 72 79 20 63 6f 72 72  e arbitrary corr
1d910 75 70 74 69 6f 6e 2e 20 20 53 65 74 74 69 6e 67  uption.  Setting
1d920 20 74 68 65 20 66 6c 61 67 20 64 75 72 69 6e 67   the flag during
1d930 0a 20 20 20 20 2a 2a 20 74 65 73 74 69 6e 67 20  .    ** testing 
1d940 63 61 75 73 65 73 20 63 65 72 74 61 69 6e 20 61  causes certain a
1d950 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1d960 74 73 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74  ts in the code t
1d970 6f 20 62 65 20 61 63 74 69 76 61 74 65 64 0a 20  o be activated. 
1d980 20 20 20 2a 2a 20 74 68 61 74 20 64 65 6d 6f 6e     ** that demon
1d990 73 74 72 61 74 20 69 6e 76 61 72 69 61 6e 74 73  strat invariants
1d9a0 20 6f 6e 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20   on well-formed 
1d9b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a  database files..
1d9c0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1d9d0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1d9e0 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 3a 20 7b  NEVER_CORRUPT: {
1d9f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1da00 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 65 76 65 72  obalConfig.never
1da10 43 6f 72 72 75 70 74 20 3d 20 76 61 5f 61 72 67  Corrupt = va_arg
1da20 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
1da30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a   break;.    }...
1da40 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
1da50 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1da60 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44  LITE_TESTCTRL_VD
1da70 42 45 5f 43 4f 56 45 52 41 47 45 2c 20 78 43 61  BE_COVERAGE, xCa
1da80 6c 6c 62 61 63 6b 2c 20 70 74 72 29 3b 0a 20 20  llback, ptr);.  
1da90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20    **.    ** Set 
1daa0 74 68 65 20 56 44 42 45 20 63 6f 76 65 72 61 67  the VDBE coverag
1dab0 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
1dac0 69 6f 6e 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b  ion to xCallback
1dad0 20 77 69 74 68 20 63 6f 6e 74 65 78 74 20 0a 20   with context . 
1dae0 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 70 74     ** pointer pt
1daf0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  r..    */.    ca
1db00 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1db10 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  RL_VDBE_COVERAGE
1db20 3a 20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  : {.#ifdef SQLIT
1db30 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a  E_VDBE_COVERAGE.
1db40 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
1db50 69 64 20 28 2a 62 72 61 6e 63 68 5f 63 61 6c 6c  id (*branch_call
1db60 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  back)(void*,int,
1db70 75 38 2c 75 38 29 3b 0a 20 20 20 20 20 20 73 71  u8,u8);.      sq
1db80 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1db90 67 2e 78 56 64 62 65 42 72 61 6e 63 68 20 3d 20  g.xVdbeBranch = 
1dba0 76 61 5f 61 72 67 28 61 70 2c 62 72 61 6e 63 68  va_arg(ap,branch
1dbb0 5f 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  _callback);.    
1dbc0 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1dbd0 6f 6e 66 69 67 2e 70 56 64 62 65 42 72 61 6e 63  onfig.pVdbeBranc
1dbe0 68 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70  hArg = va_arg(ap
1dbf0 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a  ,void*);.#endif.
1dc00 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1dc10 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
1dc20 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1dc30 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1dc40 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64  L_SORTER_MMAP, d
1dc50 62 2c 20 6e 4d 61 78 29 3b 20 2a 2f 0a 20 20 20  b, nMax); */.   
1dc60 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1dc70 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41  TCTRL_SORTER_MMA
1dc80 50 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  P: {.      sqlit
1dc90 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
1dca0 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
1dcb0 20 20 20 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72       db->nMaxSor
1dcc0 74 65 72 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67  terMmap = va_arg
1dcd0 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
1dce0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1dcf0 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1dd00 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1dd10 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49  ITE_TESTCTRL_ISI
1dd20 4e 49 54 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  NIT);.    **.   
1dd30 20 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54   ** Return SQLIT
1dd40 45 5f 4f 4b 20 69 66 20 53 51 4c 69 74 65 20 68  E_OK if SQLite h
1dd50 61 73 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  as been initiali
1dd60 7a 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 45  zed and SQLITE_E
1dd70 52 52 4f 52 20 69 66 0a 20 20 20 20 2a 2a 20 6e  RROR if.    ** n
1dd80 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ot..    */.    c
1dd90 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1dda0 54 52 4c 5f 49 53 49 4e 49 54 3a 20 7b 0a 20 20  TRL_ISINIT: {.  
1ddb0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
1ddc0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
1ddd0 69 74 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c  it==0 ) rc = SQL
1dde0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
1ddf0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1de00 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74     /*  sqlite3_t
1de10 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1de20 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
1de30 53 54 45 52 2c 20 64 62 2c 20 64 62 4e 61 6d 65  STER, db, dbName
1de40 2c 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a  , onOff, tnum);.
1de50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1de60 69 73 20 74 65 73 74 20 63 6f 6e 74 72 6f 6c 20  is test control 
1de70 69 73 20 75 73 65 64 20 74 6f 20 63 72 65 61 74  is used to creat
1de80 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65  e imposter table
1de90 73 2e 20 20 22 64 62 22 20 69 73 20 61 20 70 6f  s.  "db" is a po
1dea0 69 6e 74 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20  inter.    ** to 
1deb0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
1dec0 6e 65 63 74 69 6f 6e 2e 20 20 64 62 4e 61 6d 65  nection.  dbName
1ded0 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65   is the database
1dee0 20 6e 61 6d 65 20 28 65 78 3a 20 22 6d 61 69 6e   name (ex: "main
1def0 22 20 6f 72 0a 20 20 20 20 2a 2a 20 22 74 65 6d  " or.    ** "tem
1df00 70 22 29 20 77 68 69 63 68 20 77 69 6c 6c 20 72  p") which will r
1df10 65 63 65 69 76 65 20 74 68 65 20 69 6d 70 6f 73  eceive the impos
1df20 74 65 72 2e 20 20 22 6f 6e 4f 66 66 22 20 74 75  ter.  "onOff" tu
1df30 72 6e 73 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64  rns imposter mod
1df40 65 20 6f 6e 0a 20 20 20 20 2a 2a 20 6f 72 20 6f  e on.    ** or o
1df50 66 66 2e 20 20 22 74 6e 75 6d 22 20 69 73 20 74  ff.  "tnum" is t
1df60 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1df70 74 68 65 20 62 2d 74 72 65 65 20 74 6f 20 77 68  the b-tree to wh
1df80 69 63 68 20 74 68 65 20 69 6d 70 6f 73 74 65 72  ich the imposter
1df90 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 73 68  .    ** table sh
1dfa0 6f 75 6c 64 20 63 6f 6e 6e 65 63 74 2e 0a 20 20  ould connect..  
1dfb0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62    **.    ** Enab
1dfc0 6c 65 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65  le imposter mode
1dfd0 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 20 73   only when the s
1dfe0 63 68 65 6d 61 20 68 61 73 20 61 6c 72 65 61 64  chema has alread
1dff0 79 20 62 65 65 6e 20 70 61 72 73 65 64 2e 20 20  y been parsed.  
1e000 54 68 65 6e 0a 20 20 20 20 2a 2a 20 72 75 6e 20  Then.    ** run 
1e010 61 20 73 69 6e 67 6c 65 20 43 52 45 41 54 45 20  a single CREATE 
1e020 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
1e030 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  to construct the
1e040 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
1e050 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  in.    ** the pa
1e060 72 73 65 64 20 73 63 68 65 6d 61 2e 20 20 54 68  rsed schema.  Th
1e070 65 6e 20 74 75 72 6e 20 69 6d 70 6f 73 74 65 72  en turn imposter
1e080 20 6d 6f 64 65 20 62 61 63 6b 20 6f 66 66 20 61   mode back off a
1e090 67 61 69 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  gain..    **.   
1e0a0 20 2a 2a 20 49 66 20 6f 6e 4f 66 66 3d 3d 30 20   ** If onOff==0 
1e0b0 61 6e 64 20 74 6e 75 6d 3e 30 20 74 68 65 6e 20  and tnum>0 then 
1e0c0 72 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61  reset the schema
1e0d0 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
1e0e0 65 73 2c 20 63 61 75 73 69 6e 67 0a 20 20 20 20  es, causing.    
1e0f0 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
1e100 20 62 65 20 72 65 70 61 72 73 65 64 20 74 68 65   be reparsed the
1e110 20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73   next time it is
1e120 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20 68   needed.  This h
1e130 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 66  as the.    ** ef
1e140 66 65 63 74 20 6f 66 20 65 72 61 73 69 6e 67 20  fect of erasing 
1e150 61 6c 6c 20 69 6d 70 6f 73 74 65 72 20 74 61 62  all imposter tab
1e160 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  les..    */.    
1e170 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1e180 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 3a 20 7b  CTRL_IMPOSTER: {
1e190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
1e1a0 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
1e1b0 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
1e1c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1e1d0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1e1e0 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e  .      db->init.
1e1f0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
1e200 64 44 62 4e 61 6d 65 28 64 62 2c 20 76 61 5f 61  dDbName(db, va_a
1e210 72 67 28 61 70 2c 63 6f 6e 73 74 20 63 68 61 72  rg(ap,const char
1e220 2a 29 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69  *));.      db->i
1e230 6e 69 74 2e 62 75 73 79 20 3d 20 64 62 2d 3e 69  nit.busy = db->i
1e240 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c  nit.imposterTabl
1e250 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  e = va_arg(ap,in
1e260 74 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e  t);.      db->in
1e270 69 74 2e 6e 65 77 54 6e 75 6d 20 3d 20 76 61 5f  it.newTnum = va_
1e280 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20  arg(ap,int);.   
1e290 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e     if( db->init.
1e2a0 62 75 73 79 3d 3d 30 20 26 26 20 64 62 2d 3e 69  busy==0 && db->i
1e2b0 6e 69 74 2e 6e 65 77 54 6e 75 6d 3e 30 20 29 7b  nit.newTnum>0 ){
1e2c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1e2d0 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
1e2e0 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b  fConnection(db);
1e2f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
1e300 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1e310 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
1e320 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e330 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
1e340 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  p);.#endif /* SQ
1e350 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49  LITE_OMIT_BUILTI
1e360 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65 74 75  N_TEST */.  retu
1e370 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e380 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74  This is a utilit
1e390 79 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66 75  y routine, usefu
1e3a0 6c 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65  l to VFS impleme
1e3b0 6e 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20 63  ntations, that c
1e3c0 68 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20  hecks.** to see 
1e3d0 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  if a database fi
1e3e0 6c 65 20 77 61 73 20 61 20 55 52 49 20 74 68 61  le was a URI tha
1e3f0 74 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73 70  t contained a sp
1e400 65 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a 2a  ecific query .**
1e410 20 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64 20   parameter, and 
1e420 69 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74 68  if so obtains th
1e430 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 71  e value of the q
1e440 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
1e450 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e  **.** The zFilen
1e460 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ame argument is 
1e470 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69  the filename poi
1e480 6e 74 65 72 20 70 61 73 73 65 64 20 69 6e 74 6f  nter passed into
1e490 20 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20   the xOpen().** 
1e4a0 6d 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53 20  method of a VFS 
1e4b0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
1e4c0 20 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67 75   The zParam argu
1e4d0 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65  ment is the name
1e4e0 20 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72 79   of the.** query
1e4f0 20 70 61 72 61 6d 65 74 65 72 20 77 65 20 73 65   parameter we se
1e500 65 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ek.  This routin
1e510 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61  e returns the va
1e520 6c 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72 61  lue of the zPara
1e530 6d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  m.** parameter i
1e540 66 20 69 74 20 65 78 69 73 74 73 2e 20 20 49 66  f it exists.  If
1e550 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 64   the parameter d
1e560 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
1e570 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
1e580 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f  eturns a NULL po
1e590 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  inter..*/.const 
1e5a0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75 72  char *sqlite3_ur
1e5b0 69 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e 73  i_parameter(cons
1e5c0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1e5d0 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1e5e0 50 61 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a 46  Param){.  if( zF
1e5f0 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 50  ilename==0 || zP
1e600 61 72 61 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e  aram==0 ) return
1e610 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20   0;.  zFilename 
1e620 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
1e630 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  30(zFilename) + 
1e640 31 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46 69 6c  1;.  while( zFil
1e650 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
1e660 69 6e 74 20 78 20 3d 20 73 74 72 63 6d 70 28 7a  int x = strcmp(z
1e670 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d  Filename, zParam
1e680 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
1e690 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
1e6a0 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  n30(zFilename) +
1e6b0 20 31 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d 30   1;.    if( x==0
1e6c0 20 29 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e   ) return zFilen
1e6d0 61 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  ame;.    zFilena
1e6e0 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  me += sqlite3Str
1e6f0 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
1e700 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   + 1;.  }.  retu
1e710 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
1e720 65 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e 20  eturn a boolean 
1e730 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72  value for a quer
1e740 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a  y parameter..*/.
1e750 69 6e 74 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  int sqlite3_uri_
1e760 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68  boolean(const ch
1e770 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63  ar *zFilename, c
1e780 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
1e790 6d 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a 20  m, int bDflt){. 
1e7a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1e7b0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
1e7c0 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65  ameter(zFilename
1e7d0 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44 66  , zParam);.  bDf
1e7e0 6c 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a 20  lt = bDflt!=0;. 
1e7f0 20 72 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c 69   return z ? sqli
1e800 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c  te3GetBoolean(z,
1e810 20 62 44 66 6c 74 29 20 3a 20 62 44 66 6c 74 3b   bDflt) : bDflt;
1e820 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1e830 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
1e840 72 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75  r value for a qu
1e850 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
1e860 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  /.sqlite3_int64 
1e870 73 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74 36  sqlite3_uri_int6
1e880 34 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  4(.  const char 
1e890 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f  *zFilename,    /
1e8a0 2a 20 46 69 6c 65 6e 61 6d 65 20 61 73 20 70 61  * Filename as pa
1e8b0 73 73 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a 2f  ssed to xOpen */
1e8c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e8d0 50 61 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a 20  Param,       /* 
1e8e0 55 52 49 20 70 61 72 61 6d 65 74 65 72 20 73 6f  URI parameter so
1e8f0 75 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ught */.  sqlite
1e900 33 5f 69 6e 74 36 34 20 62 44 66 6c 74 20 20 20  3_int64 bDflt   
1e910 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 69 66      /* return if
1e920 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6d 69   parameter is mi
1e930 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ssing */.){.  co
1e940 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71  nst char *z = sq
1e950 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
1e960 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  ter(zFilename, z
1e970 50 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74 65  Param);.  sqlite
1e980 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69 66 28  3_int64 v;.  if(
1e990 20 7a 20 26 26 20 73 71 6c 69 74 65 33 44 65 63   z && sqlite3Dec
1e9a0 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26 76  OrHexToI64(z, &v
1e9b0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
1e9c0 20 20 20 20 62 44 66 6c 74 20 3d 20 76 3b 0a 20      bDflt = v;. 
1e9d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 62 44 66 6c   }.  return bDfl
1e9e0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
1e9f0 72 6e 20 74 68 65 20 42 74 72 65 65 20 70 6f 69  rn the Btree poi
1ea00 6e 74 65 72 20 69 64 65 6e 74 69 66 69 65 64 20  nter identified 
1ea10 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20 52 65 74  by zDbName.  Ret
1ea20 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20  urn NULL if not 
1ea30 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65 65 20  found..*/.Btree 
1ea40 2a 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f  *sqlite3DbNameTo
1ea50 42 74 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64  Btree(sqlite3 *d
1ea60 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1ea70 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  DbName){.  int i
1ea80 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
1ea90 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
1eaa0 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d    if( db->aDb[i]
1eab0 2e 70 42 74 0a 20 20 20 20 20 26 26 20 28 7a 44  .pBt.     && (zD
1eac0 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  bName==0 || sqli
1ead0 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 4e 61  te3StrICmp(zDbNa
1eae0 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a  me, db->aDb[i].z
1eaf0 4e 61 6d 65 29 3d 3d 30 29 0a 20 20 20 20 29 7b  Name)==0).    ){
1eb00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 64 62  .      return db
1eb10 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
1eb20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1eb30 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
1eb40 75 72 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  urn the filename
1eb50 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1eb60 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1eb70 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63   a database.** c
1eb80 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f  onnection..*/.co
1eb90 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
1eba0 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71  3_db_filename(sq
1ebb0 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1ebc0 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b   char *zDbName){
1ebd0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23  .  Btree *pBt;.#
1ebe0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1ebf0 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1ec00 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1ec10 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
1ec20 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
1ec30 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
1ec40 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1ec50 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d 20  .#endif.  pBt = 
1ec60 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
1ec70 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65  tree(db, zDbName
1ec80 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20  );.  return pBt 
1ec90 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  ? sqlite3BtreeGe
1eca0 74 46 69 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a  tFilename(pBt) :
1ecb0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
1ecc0 75 72 6e 20 31 20 69 66 20 64 61 74 61 62 61 73  urn 1 if databas
1ecd0 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f  e is read-only o
1ece0 72 20 30 20 69 66 20 72 65 61 64 2f 77 72 69 74  r 0 if read/writ
1ecf0 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  e.  Return -1 if
1ed00 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61 74 61  .** no such data
1ed10 62 61 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a  base exists..*/.
1ed20 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  int sqlite3_db_r
1ed30 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20  eadonly(sqlite3 
1ed40 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1ed50 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72  *zDbName){.  Btr
1ed60 65 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20  ee *pBt;.#ifdef 
1ed70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1ed80 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1ed90 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1eda0 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
1edb0 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
1edc0 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
1edd0 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64  urn -1;.  }.#end
1ede0 69 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74  if.  pBt = sqlit
1edf0 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28  e3DbNameToBtree(
1ee00 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  db, zDbName);.  
1ee10 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c  return pBt ? sql
1ee20 69 74 65 33 42 74 72 65 65 49 73 52 65 61 64 6f  ite3BtreeIsReado
1ee30 6e 6c 79 28 70 42 74 29 20 3a 20 2d 31 3b 0a 7d  nly(pBt) : -1;.}
1ee40 0a                                               .