/ Hex Artifact Content
Login

Artifact 988a73bf14251ab9c4e1ad8743aa651bd713bea2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64  u.h".#endif.#ifd
0320: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0330: 5f 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74  _JSON1.int sqlit
0340: 65 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69  e3Json1Init(sqli
0350: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69  te3*);.#endif.#i
0360: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
0370: 4c 45 5f 46 54 53 35 0a 69 6e 74 20 73 71 6c 69  LE_FTS5.int sqli
0380: 74 65 33 46 74 73 35 49 6e 69 74 28 73 71 6c 69  te3Fts5Init(sqli
0390: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  te3*);.#endif..#
03a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d  ifndef SQLITE_AM
03b0: 41 4c 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d  ALGAMATION./* IM
03c0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
03d0: 20 52 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54   R-46656-45156 T
03e0: 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69  he sqlite3_versi
03f0: 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73  on[] string cons
0400: 74 61 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  tant.** contains
0410: 20 74 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c   the text of SQL
0420: 49 54 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72  ITE_VERSION macr
0430: 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  o. .*/.const cha
0440: 72 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  r sqlite3_versio
0450: 6e 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52  n[] = SQLITE_VER
0460: 53 49 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  SION;.#endif../*
0470: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0480: 4f 46 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37  OF: R-53536-4257
0490: 35 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  5 The sqlite3_li
04a0: 62 76 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74  bversion() funct
04b0: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61  ion returns.** a
04c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
04d0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  to the sqlite3_v
04e0: 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20  ersion[] string 
04f0: 63 6f 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f  constant. .*/.co
0500: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0510: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69  3_libversion(voi
0520: 64 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  d){ return sqlit
0530: 65 33 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f  e3_version; }../
0540: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
0550: 2d 4f 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33  -OF: R-63124-393
0560: 30 30 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73  00 The sqlite3_s
0570: 6f 75 72 63 65 69 64 28 29 20 66 75 6e 63 74 69  ourceid() functi
0580: 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20  on returns a.** 
0590: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
05a0: 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f  ing constant who
05b0: 73 65 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  se value is the 
05c0: 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53  same as the.** S
05d0: 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20  QLITE_SOURCE_ID 
05e0: 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d  C preprocessor m
05f0: 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20  acro. .*/.const 
0600: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f  char *sqlite3_so
0610: 75 72 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65  urceid(void){ re
0620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52  turn SQLITE_SOUR
0630: 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  CE_ID; }../* IMP
0640: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0650: 52 2d 33 35 32 31 30 2d 36 33 35 30 38 20 54 68  R-35210-63508 Th
0660: 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  e sqlite3_libver
0670: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75  sion_number() fu
0680: 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  nction.** return
0690: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75  s an integer equ
06a0: 61 6c 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52  al to SQLITE_VER
06b0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a  SION_NUMBER..*/.
06c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  int sqlite3_libv
06d0: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f  ersion_number(vo
06e0: 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  id){ return SQLI
06f0: 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
0700: 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  R; }../* IMPLEME
0710: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30  NTATION-OF: R-20
0720: 37 39 30 2d 31 34 30 32 35 20 54 68 65 20 73 71  790-14025 The sq
0730: 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65  lite3_threadsafe
0740: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
0750: 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61  rns.** zero if a
0760: 6e 64 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74  nd only if SQLit
0770: 65 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77  e was compiled w
0780: 69 74 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64  ith mutexing cod
0790: 65 20 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f  e omitted due to
07a0: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54  .** the SQLITE_T
07b0: 48 52 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c  HREADSAFE compil
07c0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65  e-time option be
07d0: 69 6e 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f  ing set to 0..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72  .int sqlite3_thr
07f0: 65 61 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72  eadsafe(void){ r
0800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52  eturn SQLITE_THR
0810: 45 41 44 53 41 46 45 3b 20 7d 0a 0a 2f 2a 0a 2a  EADSAFE; }../*.*
0820: 2a 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * When compiling
0830: 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72   the test fixtur
0840: 65 20 6f 72 20 77 69 74 68 20 64 65 62 75 67 67  e or with debugg
0850: 69 6e 67 20 65 6e 61 62 6c 65 64 20 28 6f 6e 20  ing enabled (on 
0860: 57 69 6e 33 32 29 2c 0a 2a 2a 20 74 68 69 73 20  Win32),.** this 
0870: 76 61 72 69 61 62 6c 65 20 62 65 69 6e 67 20 73  variable being s
0880: 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 77  et to non-zero w
0890: 69 6c 6c 20 63 61 75 73 65 20 4f 53 54 52 41 43  ill cause OSTRAC
08a0: 45 20 6d 61 63 72 6f 73 20 74 6f 20 65 6d 69 74  E macros to emit
08b0: 0a 2a 2a 20 65 78 74 72 61 20 64 69 61 67 6e 6f  .** extra diagno
08c0: 73 74 69 63 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  stic information
08d0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
08e0: 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
08f0: 0a 23 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  .# ifndef SQLITE
0900: 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 0a  _DEBUG_OS_TRACE.
0910: 23 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  #   define SQLIT
0920: 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45  E_DEBUG_OS_TRACE
0930: 20 30 0a 23 20 65 6e 64 69 66 0a 20 20 69 6e 74   0.# endif.  int
0940: 20 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 20   sqlite3OSTrace 
0950: 3d 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f  = SQLITE_DEBUG_O
0960: 53 5f 54 52 41 43 45 3b 0a 23 65 6e 64 69 66 0a  S_TRACE;.#endif.
0970: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0980: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
0990: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
09a0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
09b0: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E)./*.** If the 
09c0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
09d0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  on pointer is no
09e0: 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a 2a 2a  t NULL and if.**
09f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
0a00: 4f 54 52 41 43 45 20 69 73 20 65 6e 61 62 6c 65  OTRACE is enable
0a10: 64 2c 20 74 68 65 6e 20 6d 65 73 73 61 67 65 73  d, then messages
0a20: 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20 49   describing.** I
0a30: 2f 4f 20 61 63 74 69 76 65 20 61 72 65 20 77 72  /O active are wr
0a40: 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68 69 73  itten using this
0a50: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 73   function.  Thes
0a60: 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20 61 72  e messages.** ar
0a70: 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 64  e intended for d
0a80: 65 62 75 67 67 69 6e 67 20 61 63 74 69 76 69 74  ebugging activit
0a90: 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53 51 4c 49 54  y only..*/.SQLIT
0aa0: 45 5f 41 50 49 20 76 6f 69 64 20 28 53 51 4c 49  E_API void (SQLI
0ab0: 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74 65  TE_CDECL *sqlite
0ac0: 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20  3IoTrace)(const 
0ad0: 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b  char*, ...) = 0;
0ae0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
0af0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0b00: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
0b10: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
0b20: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  ng which is the.
0b30: 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  ** name of a dir
0b40: 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61  ectory, then tha
0b50: 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  t directory will
0b60: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
0b70: 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66  e.** temporary f
0b80: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  iles..**.** See 
0b90: 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41  also the "PRAGMA
0ba0: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
0bb0: 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61  ctory" SQL comma
0bc0: 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nd..*/.char *sql
0bd0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
0be0: 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ory = 0;../*.** 
0bf0: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0c00: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0c10: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0c20: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0c30: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0c40: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0c50: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0c60: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0c70: 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62 61  re.** all databa
0c80: 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66 69  se files specifi
0c90: 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ed with a relati
0ca0: 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a 0a  ve pathname..**.
0cb0: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  ** See also the 
0cc0: 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f  "PRAGMA data_sto
0cd0: 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53 51  re_directory" SQ
0ce0: 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68  L command..*/.ch
0cf0: 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74 61  ar *sqlite3_data
0d00: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  _directory = 0;.
0d10: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0d20: 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a 2a  e SQLite.  .**.*
0d30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0d40: 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ust be called to
0d50: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
0d60: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
0d70: 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20 6d  n,.** VFS, and m
0d80: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73 20  utex subsystems 
0d90: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61  prior to doing a
0da0: 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b 20  ny serious work 
0db0: 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e 20  with.** SQLite. 
0dc0: 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73 20   But as long as 
0dd0: 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70 69  you do not compi
0de0: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f  le with SQLITE_O
0df0: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a 20  MIT_AUTOINIT.** 
0e00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
0e10: 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74 6f  l be called auto
0e20: 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65 79  matically by key
0e30: 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20 61   routines such a
0e40: 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  s.** sqlite3_ope
0e50: 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  n().  .**.** Thi
0e60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
0e70: 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20 69  o-op except on i
0e80: 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63 61  ts very first ca
0e90: 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63 65  ll for the proce
0ea0: 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74 68  ss,.** or for th
0eb0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66 74  e first call aft
0ec0: 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
0ed0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a 2a  ite3_shutdown..*
0ee0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
0ef0: 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74 68  hread to call th
0f00: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
0f10: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
0f20: 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65 74  on to.** complet
0f30: 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71 75  ion.  If subsequ
0f40: 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c 6c  ent threads call
0f50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
0f60: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  fore the first.*
0f70: 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69 6e  * thread has fin
0f80: 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69 61  ished the initia
0f90: 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73  lization process
0fa0: 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73 65  , then the subse
0fb0: 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64 73  quent.** threads
0fc0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fd0: 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  l the first thre
0fe0: 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74 68  ad finishes with
0ff0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1000: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
1010: 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67 68  irst thread migh
1020: 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  t call this rout
1030: 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79 2e  ine recursively.
1040: 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20 63    Recursive.** c
1050: 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75  alls to this rou
1060: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tine should not 
1070: 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73 65  block, of course
1080: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
1090: 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  .** initializati
10a0: 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c 64  on process would
10b0: 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65 2e   never complete.
10c0: 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65 20  .**.** Let X be 
10d0: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  the first thread
10e0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 72   to enter this r
10f0: 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20 62  outine.  Let Y b
1100: 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  e some other.** 
1110: 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77 68  thread.  Then wh
1120: 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ile the initial 
1130: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  invocation of th
1140: 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58 20  is routine by X 
1150: 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74 65  is.** incomplete
1160: 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65 64  , it is required
1170: 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   that:.**.**    
1180: 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69 73  *  Calls to this
1190: 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59 20   routine from Y 
11a0: 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69 6c  must block until
11b0: 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74 0a   the outer-most.
11c0: 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62 79  **       call by
11d0: 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a 2a   X completes..**
11e0: 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72 73  .**    *  Recurs
11f0: 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68 69  ive calls to thi
1200: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
1210: 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20 69  hread X return i
1220: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
1230: 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f 63      without bloc
1240: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
1250: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1260: 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f 4c  void){.  MUTEX_L
1270: 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
1280: 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20  tex *pMaster; ) 
1290: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
12a0: 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a  n static mutex *
12b0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1300: 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69 6e  _EXTRA_INIT.  in
1310: 74 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20  t bRunExtraInit 
1320: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
1340: 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  tra initializati
1350: 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6e  on needed */.#en
1360: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1370: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63  TE_OMIT_WSD.  rc
1380: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
1390: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
13a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13b0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
13c0: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
13d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 6f 6c  .  /* If the fol
13e0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20  lowing assert() 
13f0: 66 61 69 6c 73 20 6f 6e 20 73 6f 6d 65 20 6f 62  fails on some ob
1400: 73 63 75 72 65 20 70 72 6f 63 65 73 73 6f 72 2f  scure processor/
1410: 63 6f 6d 70 69 6c 65 72 0a 20 20 2a 2a 20 63 6f  compiler.  ** co
1420: 6d 62 69 6e 61 74 69 6f 6e 2c 20 74 68 65 20 77  mbination, the w
1430: 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 74 6f  ork-around is to
1440: 20 73 65 74 20 74 68 65 20 63 6f 72 72 65 63 74   set the correct
1450: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 73 69   pointer.  ** si
1460: 7a 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ze at compile-ti
1470: 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  me using -DSQLIT
1480: 45 5f 50 54 52 53 49 5a 45 3d 6e 20 63 6f 6d 70  E_PTRSIZE=n comp
1490: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
14a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  */.  assert( SQL
14b0: 49 54 45 5f 50 54 52 53 49 5a 45 3d 3d 73 69 7a  ITE_PTRSIZE==siz
14c0: 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 0a 20  eof(char*) );.. 
14d0: 20 2f 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73   /* If SQLite is
14e0: 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c 65 74   already complet
14f0: 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  ely initialized,
1500: 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 0a   then this call.
1510: 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
1520: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 73 68 6f  initialize() sho
1530: 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20  uld be a no-op. 
1540: 20 42 75 74 20 74 68 65 20 69 6e 69 74 69 61 6c   But the initial
1550: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d 75 73  ization.  ** mus
1560: 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e 20 20  t be complete.  
1570: 53 6f 20 69 73 49 6e 69 74 20 6d 75 73 74 20 6e  So isInit must n
1580: 6f 74 20 62 65 20 73 65 74 20 75 6e 74 69 6c 20  ot be set until 
1590: 74 68 65 20 76 65 72 79 20 65 6e 64 0a 20 20 2a  the very end.  *
15a0: 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * of this routin
15b0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  e..  */.  if( sq
15c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15d0: 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72  g.isInit ) retur
15e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
15f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
1600: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
1610: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   is initialized.
1620: 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 0a    If unable to .
1630: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
1640: 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  the mutex subsys
1650: 74 65 6d 2c 20 72 65 74 75 72 6e 20 65 61 72 6c  tem, return earl
1660: 79 20 77 69 74 68 20 74 68 65 20 65 72 72 6f 72  y with the error
1670: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 79  ..  ** If the sy
1680: 73 74 65 6d 20 69 73 20 73 6f 20 73 69 63 6b 20  stem is so sick 
1690: 74 68 61 74 20 77 65 20 61 72 65 20 75 6e 61 62  that we are unab
16a0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  le to allocate a
16b0: 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20 74 68 65   mutex,.  ** the
16c0: 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 53  re is not much S
16d0: 51 4c 69 74 65 20 69 73 20 67 6f 69 6e 67 20 74  QLite is going t
16e0: 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 2e  o be able to do.
16f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d  .  **.  ** The m
1700: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 20 6d  utex subsystem m
1710: 75 73 74 20 74 61 6b 65 20 63 61 72 65 20 6f 66  ust take care of
1720: 20 73 65 72 69 61 6c 69 7a 69 6e 67 20 69 74 73   serializing its
1730: 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69 74 69 61   own.  ** initia
1740: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  lization..  */. 
1750: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 75 74   rc = sqlite3Mut
1760: 65 78 49 6e 69 74 28 29 3b 0a 20 20 69 66 28 20  exInit();.  if( 
1770: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1780: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1790: 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20 73 79   the malloc() sy
17a0: 73 74 65 6d 20 61 6e 64 20 74 68 65 20 72 65 63  stem and the rec
17b0: 75 72 73 69 76 65 20 70 49 6e 69 74 4d 75 74 65  ursive pInitMute
17c0: 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a 20 54 68  x mutex..  ** Th
17d0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  is operation is 
17e0: 70 72 6f 74 65 63 74 65 64 20 62 79 20 74 68 65  protected by the
17f0: 20 53 54 41 54 49 43 5f 4d 41 53 54 45 52 20 6d   STATIC_MASTER m
1800: 75 74 65 78 2e 20 20 4e 6f 74 65 20 74 68 61 74  utex.  Note that
1810: 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c 6c 6f 63  .  ** MutexAlloc
1820: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  () is called for
1830: 20 61 20 73 74 61 74 69 63 20 6d 75 74 65 78 20   a static mutex 
1840: 70 72 69 6f 72 20 74 6f 20 69 6e 69 74 69 61 6c  prior to initial
1850: 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6d  izing the.  ** m
1860: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20  alloc subsystem 
1870: 2d 20 74 68 69 73 20 69 6d 70 6c 69 65 73 20 74  - this implies t
1880: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
1890: 6f 6e 20 6f 66 20 61 20 73 74 61 74 69 63 0a 20  on of a static. 
18a0: 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74 20 6e   ** mutex must n
18b0: 6f 74 20 72 65 71 75 69 72 65 20 73 75 70 70 6f  ot require suppo
18c0: 72 74 20 66 72 6f 6d 20 74 68 65 20 6d 61 6c 6c  rt from the mall
18d0: 6f 63 20 73 75 62 73 79 73 74 65 6d 2e 0a 20 20  oc subsystem..  
18e0: 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  */.  MUTEX_LOGIC
18f0: 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69  ( pMaster = sqli
1900: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
1910: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1920: 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73  C_MASTER); ).  s
1930: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1940: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
1950: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1960: 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d  ig.isMutexInit =
1970: 20 31 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   1;.  if( !sqlit
1980: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1990: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
19a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
19b0: 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a 20 20 7d  allocInit();.  }
19c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
19e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
19f0: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 31  isMallocInit = 1
1a00: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
1a10: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1a20: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1a30: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1a40: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
1a50: 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 73  x =.           s
1a60: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1a70: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
1a80: 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20 20  CURSIVE);.      
1a90: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1aa0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
1ab0: 65 78 20 26 26 20 21 73 71 6c 69 74 65 33 47 6c  ex && !sqlite3Gl
1ac0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1ad0: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
1ae0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1af0: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
1b00: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
1b10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b20: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1b30: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
1b40: 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ex++;.  }.  sqli
1b50: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1b60: 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pMaster);..  /* 
1b70: 49 66 20 72 63 20 69 73 20 6e 6f 74 20 53 51 4c  If rc is not SQL
1b80: 49 54 45 5f 4f 4b 20 61 74 20 74 68 69 73 20 70  ITE_OK at this p
1b90: 6f 69 6e 74 2c 20 74 68 65 6e 20 65 69 74 68 65  oint, then eithe
1ba0: 72 20 74 68 65 20 6d 61 6c 6c 6f 63 0a 20 20 2a  r the malloc.  *
1bb0: 2a 20 73 75 62 73 79 73 74 65 6d 20 63 6f 75 6c  * subsystem coul
1bc0: 64 20 6e 6f 74 20 62 65 20 69 6e 69 74 69 61 6c  d not be initial
1bd0: 69 7a 65 64 20 6f 72 20 74 68 65 20 73 79 73 74  ized or the syst
1be0: 65 6d 20 66 61 69 6c 65 64 20 74 6f 20 61 6c 6c  em failed to all
1bf0: 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70  ocate.  ** the p
1c00: 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65 78 2e  InitMutex mutex.
1c10: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
1c20: 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e   in either case.
1c30: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53    */.  if( rc!=S
1c40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c50: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1c60: 20 20 2f 2a 20 44 6f 20 74 68 65 20 72 65 73 74    /* Do the rest
1c70: 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
1c80: 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20 74 68 65  zation under the
1c90: 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78   recursive mutex
1ca0: 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 77 65   so.  ** that we
1cb0: 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1cc0: 20 68 61 6e 64 6c 65 20 72 65 63 75 72 73 69 76   handle recursiv
1cd0: 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a 20 20 2a  e calls into.  *
1ce0: 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  * sqlite3_initia
1cf0: 6c 69 7a 65 28 29 2e 20 20 54 68 65 20 72 65 63  lize().  The rec
1d00: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6e 6f 72  ursive calls nor
1d10: 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68 72 6f 75  mally come throu
1d20: 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  gh.  ** sqlite3_
1d30: 6f 73 5f 69 6e 69 74 28 29 20 77 68 65 6e 20 69  os_init() when i
1d40: 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65  t invokes sqlite
1d50: 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 29  3_vfs_register()
1d60: 2c 20 62 75 74 20 6f 74 68 65 72 0a 20 20 2a 2a  , but other.  **
1d70: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1d80: 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 70   might also be p
1d90: 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  ossible..  **.  
1da0: 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
1db0: 4e 2d 4f 46 3a 20 52 2d 30 30 31 34 30 2d 33 37  N-OF: R-00140-37
1dc0: 34 34 35 20 53 51 4c 69 74 65 20 61 75 74 6f 6d  445 SQLite autom
1dd0: 61 74 69 63 61 6c 6c 79 20 73 65 72 69 61 6c 69  atically seriali
1de0: 7a 65 73 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 74  zes calls.  ** t
1df0: 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68  o the xInit meth
1e00: 6f 64 2c 20 73 6f 20 74 68 65 20 78 49 6e 69 74  od, so the xInit
1e10: 20 6d 65 74 68 6f 64 20 6e 65 65 64 20 6e 6f 74   method need not
1e20: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2e 0a   be threadsafe..
1e30: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f    **.  ** The fo
1e40: 6c 6c 6f 77 69 6e 67 20 6d 75 74 65 78 20 69 73  llowing mutex is
1e50: 20 77 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73   what serializes
1e60: 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 61   access to the a
1e70: 70 70 64 65 66 20 70 63 61 63 68 65 20 78 49 6e  ppdef pcache xIn
1e80: 69 74 0a 20 20 2a 2a 20 6d 65 74 68 6f 64 73 2e  it.  ** methods.
1e90: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 70 63    The sqlite3_pc
1ea0: 61 63 68 65 5f 6d 65 74 68 6f 64 73 2e 78 49 6e  ache_methods.xIn
1eb0: 69 74 28 29 20 61 6c 6c 20 69 73 20 65 6d 62 65  it() all is embe
1ec0: 64 64 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a  dded in the.  **
1ed0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1ee0: 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65  PcacheInitialize
1ef0: 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ()..  */.  sqlit
1f00: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
1f10: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1f20: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a  ig.pInitMutex);.
1f30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1f40: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
1f50: 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 47 6c  ==0 && sqlite3Gl
1f60: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
1f70: 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20  gress==0 ){.    
1f80: 46 75 6e 63 44 65 66 48 61 73 68 20 2a 70 48 61  FuncDefHash *pHa
1f90: 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28 46 75 6e  sh = &GLOBAL(Fun
1fa0: 63 44 65 66 48 61 73 68 2c 20 73 71 6c 69 74 65  cDefHash, sqlite
1fb0: 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73  3GlobalFunctions
1fc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
1fd0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
1fe0: 67 72 65 73 73 20 3d 20 31 3b 0a 23 69 66 64 65  gress = 1;.#ifde
1ff0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2000: 53 51 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20 20 20  SQLLOG.    {.   
2010: 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 73     extern void s
2020: 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c  qlite3_init_sqll
2030: 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20  og(void);.      
2040: 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c  sqlite3_init_sql
2050: 6c 6f 67 28 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  log();.    }.#en
2060: 64 69 66 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  dif.    memset(p
2070: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
2080: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e  sqlite3GlobalFun
2090: 63 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20 73 71  ctions));.    sq
20a0: 6c 69 74 65 33 52 65 67 69 73 74 65 72 47 6c 6f  lite3RegisterGlo
20b0: 62 61 6c 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a  balFunctions();.
20c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
20d0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
20e0: 61 63 68 65 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  acheInit==0 ){. 
20f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2100: 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a  3PcacheInitializ
2110: 65 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  e();.    }.    i
2120: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2130: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2140: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
2150: 50 43 61 63 68 65 49 6e 69 74 20 3d 20 31 3b 0a  PCacheInit = 1;.
2160: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2170: 65 33 4f 73 49 6e 69 74 28 29 3b 0a 20 20 20 20  e3OsInit();.    
2180: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2190: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21a0: 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 42 75   sqlite3PCacheBu
21b0: 66 66 65 72 53 65 74 75 70 28 20 73 71 6c 69 74  fferSetup( sqlit
21c0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
21d0: 50 61 67 65 2c 20 0a 20 20 20 20 20 20 20 20 20  Page, .         
21e0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
21f0: 6e 66 69 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c  nfig.szPage, sql
2200: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2210: 2e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 73  .nPage);.      s
2220: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2230: 69 67 2e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 23  ig.isInit = 1;.#
2240: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54  ifdef SQLITE_EXT
2250: 52 41 5f 49 4e 49 54 0a 20 20 20 20 20 20 62 52  RA_INIT.      bR
2260: 75 6e 45 78 74 72 61 49 6e 69 74 20 3d 20 31 3b  unExtraInit = 1;
2270: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
2280: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2290: 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73  onfig.inProgress
22a0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
22b0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
22c0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
22d0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b  fig.pInitMutex);
22e0: 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75  ..  /* Go back u
22f0: 6e 64 65 72 20 74 68 65 20 73 74 61 74 69 63 20  nder the static 
2300: 6d 75 74 65 78 20 61 6e 64 20 63 6c 65 61 6e 20  mutex and clean 
2310: 75 70 20 74 68 65 20 72 65 63 75 72 73 69 76 65  up the recursive
2320: 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70  .  ** mutex to p
2330: 72 65 76 65 6e 74 20 61 20 72 65 73 6f 75 72 63  revent a resourc
2340: 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73  e leak..  */.  s
2350: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
2360: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
2370: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2380: 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78  ig.nRefInitMutex
2390: 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  --;.  if( sqlite
23a0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
23b0: 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29  efInitMutex<=0 )
23c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
23d0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
23e0: 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3d  g.nRefInitMutex=
23f0: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
2400: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 73 71 6c  3_mutex_free(sql
2410: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2420: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20  .pInitMutex);.  
2430: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2440: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
2450: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
2460: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2470: 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pMaster);..  /* 
2480: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
2490: 20 6a 75 73 74 20 61 20 73 61 6e 69 74 79 20 63   just a sanity c
24a0: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
24b0: 65 20 53 51 4c 69 74 65 20 68 61 73 0a 20 20 2a  e SQLite has.  *
24c0: 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20  * been compiled 
24d0: 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 74 20 69  correctly.  It i
24e0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72  s important to r
24f0: 75 6e 20 74 68 69 73 20 63 6f 64 65 2c 20 62 75  un this code, bu
2500: 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  t.  ** we don't 
2510: 77 61 6e 74 20 74 6f 20 72 75 6e 20 69 74 20 74  want to run it t
2520: 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61  oo often and soa
2530: 6b 20 75 70 20 43 50 55 20 63 79 63 6c 65 73 20  k up CPU cycles 
2540: 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73  for no.  ** reas
2550: 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75 6e 20 69  on.  So we run i
2560: 74 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 69 6e  t once during in
2570: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
2580: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
2590: 47 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  G.#ifndef SQLITE
25a0: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
25b0: 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69 73 20 73  OINT.  /* This s
25c0: 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73  ection of code's
25d0: 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74 22 20 69   only "output" i
25e0: 73 20 76 69 61 20 61 73 73 65 72 74 28 29 20 73  s via assert() s
25f0: 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  tatements. */.  
2600: 69 66 20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  if ( rc==SQLITE_
2610: 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34 20 78 20  OK ){.    u64 x 
2620: 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 36 33 29  = (((u64)1)<<63)
2630: 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79  -1;.    double y
2640: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73 69 7a  ;.    assert(siz
2650: 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20 20 20 20  eof(x)==8);.    
2660: 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29  assert(sizeof(x)
2670: 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b 0a 20 20  ==sizeof(y));.  
2680: 20 20 6d 65 6d 63 70 79 28 26 79 2c 20 26 78 2c    memcpy(&y, &x,
2690: 20 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   8);.    assert(
26a0: 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 79 29   sqlite3IsNaN(y)
26b0: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   );.  }.#endif.#
26c0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 65  endif..  /* Do e
26d0: 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74  xtra initializat
26e0: 69 6f 6e 20 73 74 65 70 73 20 72 65 71 75 65 73  ion steps reques
26f0: 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ted by the SQLIT
2700: 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 2a  E_EXTRA_INIT.  *
2710: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  * compile-time o
2720: 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  ption..  */.#ifd
2730: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
2740: 49 4e 49 54 0a 20 20 69 66 28 20 62 52 75 6e 45  INIT.  if( bRunE
2750: 78 74 72 61 49 6e 69 74 20 29 7b 0a 20 20 20 20  xtraInit ){.    
2760: 69 6e 74 20 53 51 4c 49 54 45 5f 45 58 54 52 41  int SQLITE_EXTRA
2770: 5f 49 4e 49 54 28 63 6f 6e 73 74 20 63 68 61 72  _INIT(const char
2780: 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  *);.    rc = SQL
2790: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 30  ITE_EXTRA_INIT(0
27a0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
27b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27c0: 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65 20 65 66  *.** Undo the ef
27d0: 66 65 63 74 73 20 6f 66 20 73 71 6c 69 74 65 33  fects of sqlite3
27e0: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20  _initialize().  
27f0: 4d 75 73 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c  Must not be call
2800: 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72  ed while.** ther
2810: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
2820: 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  g database conne
2830: 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79  ctions or memory
2840: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a   allocations or.
2850: 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 70 61 72  ** while any par
2860: 74 20 6f 66 20 53 51 4c 69 74 65 20 69 73 20 6f  t of SQLite is o
2870: 74 68 65 72 77 69 73 65 20 69 6e 20 75 73 65 20  therwise in use 
2880: 69 6e 20 61 6e 79 20 74 68 72 65 61 64 2e 20 20  in any thread.  
2890: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
28a0: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
28b0: 65 2e 20 20 42 75 74 20 69 74 20 69 73 20 73 61  e.  But it is sa
28c0: 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69  fe to invoke thi
28d0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20  s routine.** on 
28e0: 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20 61  when SQLite is a
28f0: 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e  lready shut down
2900: 2e 20 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  .  If SQLite is 
2910: 61 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f 77  already shut dow
2920: 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72  n.** when this r
2930: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
2940: 64 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  d, then this rou
2950: 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65  tine is a harmle
2960: 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74  ss no-op..*/.int
2970: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
2980: 6e 28 76 6f 69 64 29 7b 0a 23 69 66 64 65 66 20  n(void){.#ifdef 
2990: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a  SQLITE_OMIT_WSD.
29a0: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
29b0: 65 33 5f 77 73 64 5f 69 6e 69 74 28 34 30 39 36  e3_wsd_init(4096
29c0: 2c 20 32 34 29 3b 0a 20 20 69 66 28 20 72 63 21  , 24);.  if( rc!
29d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
29f0: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73  .#endif..  if( s
2a00: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2a10: 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a 23 69 66  ig.isInit ){.#if
2a20: 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41  def SQLITE_EXTRA
2a30: 5f 53 48 55 54 44 4f 57 4e 0a 20 20 20 20 76 6f  _SHUTDOWN.    vo
2a40: 69 64 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  id SQLITE_EXTRA_
2a50: 53 48 55 54 44 4f 57 4e 28 76 6f 69 64 29 3b 0a  SHUTDOWN(void);.
2a60: 20 20 20 20 53 51 4c 49 54 45 5f 45 58 54 52 41      SQLITE_EXTRA
2a70: 5f 53 48 55 54 44 4f 57 4e 28 29 3b 0a 23 65 6e  _SHUTDOWN();.#en
2a80: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
2a90: 6f 73 5f 65 6e 64 28 29 3b 0a 20 20 20 20 73 71  os_end();.    sq
2aa0: 6c 69 74 65 33 5f 72 65 73 65 74 5f 61 75 74 6f  lite3_reset_auto
2ab0: 5f 65 78 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20  _extension();.  
2ac0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2ad0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 30  onfig.isInit = 0
2ae0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
2af0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2b00: 69 73 50 43 61 63 68 65 49 6e 69 74 20 29 7b 0a  isPCacheInit ){.
2b10: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2b20: 65 53 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 20  eShutdown();.   
2b30: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2b40: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2b50: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
2b60: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2b70: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
2b80: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2b90: 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 20  MallocEnd();.   
2ba0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2bb0: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
2bc0: 74 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20  t = 0;..#ifndef 
2bd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 55 54  SQLITE_OMIT_SHUT
2be0: 44 4f 57 4e 5f 44 49 52 45 43 54 4f 52 49 45 53  DOWN_DIRECTORIES
2bf0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70  .    /* The heap
2c00: 20 73 75 62 73 79 73 74 65 6d 20 68 61 73 20 6e   subsystem has n
2c10: 6f 77 20 62 65 65 6e 20 73 68 75 74 64 6f 77 6e  ow been shutdown
2c20: 20 61 6e 64 20 74 68 65 73 65 20 76 61 6c 75 65   and these value
2c30: 73 20 61 72 65 20 73 75 70 70 6f 73 65 64 0a 20  s are supposed. 
2c40: 20 20 20 2a 2a 20 74 6f 20 62 65 20 4e 55 4c 4c     ** to be NULL
2c50: 20 6f 72 20 70 6f 69 6e 74 20 74 6f 20 6d 65 6d   or point to mem
2c60: 6f 72 79 20 74 68 61 74 20 77 61 73 20 6f 62 74  ory that was obt
2c70: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
2c80: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 0a 20 20 20  e3_malloc(),.   
2c90: 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20   ** which would 
2ca0: 72 65 6c 79 20 6f 6e 20 74 68 61 74 20 68 65 61  rely on that hea
2cb0: 70 20 73 75 62 73 79 73 74 65 6d 3b 20 74 68 65  p subsystem; the
2cc0: 72 65 66 6f 72 65 2c 20 6d 61 6b 65 20 73 75 72  refore, make sur
2cd0: 65 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 76  e these.    ** v
2ce0: 61 6c 75 65 73 20 63 61 6e 6e 6f 74 20 72 65 66  alues cannot ref
2cf0: 65 72 20 74 6f 20 68 65 61 70 20 6d 65 6d 6f 72  er to heap memor
2d00: 79 20 74 68 61 74 20 77 61 73 20 6a 75 73 74 20  y that was just 
2d10: 69 6e 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e  invalidated when
2d20: 20 74 68 65 0a 20 20 20 20 2a 2a 20 68 65 61 70   the.    ** heap
2d30: 20 73 75 62 73 79 73 74 65 6d 20 77 61 73 20 73   subsystem was s
2d40: 68 75 74 64 6f 77 6e 2e 20 20 54 68 69 73 20 69  hutdown.  This i
2d50: 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 69 66 20 74  s only done if t
2d60: 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 20  he current call 
2d70: 74 6f 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66  to.    ** this f
2d80: 75 6e 63 74 69 6f 6e 20 72 65 73 75 6c 74 65 64  unction resulted
2d90: 20 69 6e 20 74 68 65 20 68 65 61 70 20 73 75 62   in the heap sub
2da0: 73 79 73 74 65 6d 20 61 63 74 75 61 6c 6c 79 20  system actually 
2db0: 62 65 69 6e 67 20 73 68 75 74 64 6f 77 6e 2e 0a  being shutdown..
2dc0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
2dd0: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
2de0: 79 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  y = 0;.    sqlit
2df0: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
2e00: 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  y = 0;.#endif.  
2e10: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2e20: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75  lobalConfig.isMu
2e30: 74 65 78 49 6e 69 74 20 29 7b 0a 20 20 20 20 73  texInit ){.    s
2e40: 71 6c 69 74 65 33 4d 75 74 65 78 45 6e 64 28 29  qlite3MutexEnd()
2e50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
2e60: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65  balConfig.isMute
2e70: 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  xInit = 0;.  }..
2e80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e90: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
2ea0: 73 20 41 50 49 20 61 6c 6c 6f 77 73 20 61 70 70  s API allows app
2eb0: 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64  lications to mod
2ec0: 69 66 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 63  ify the global c
2ed0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a  onfiguration of.
2ee0: 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  ** the SQLite li
2ef0: 62 72 61 72 79 20 61 74 20 72 75 6e 2d 74 69 6d  brary at run-tim
2f00: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
2f10: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
2f20: 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  y be called when
2f30: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
2f40: 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74  tstanding.** dat
2f50: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2f60: 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  s or memory allo
2f70: 63 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 72  cations.  This r
2f80: 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a  outine is not.**
2f90: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 46 61   threadsafe.  Fa
2fa0: 69 6c 75 72 65 20 74 6f 20 68 65 65 64 20 74 68  ilure to heed th
2fb0: 65 73 65 20 77 61 72 6e 69 6e 67 73 20 63 61 6e  ese warnings can
2fc0: 20 6c 65 61 64 20 74 6f 20 75 6e 70 72 65 64 69   lead to unpredi
2fd0: 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69  ctable.** behavi
2fe0: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
2ff0: 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70  e3_config(int op
3000: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
3010: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d  t ap;.  int rc =
3020: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
3030: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  * sqlite3_config
3040: 28 29 20 73 68 61 6c 6c 20 72 65 74 75 72 6e 20  () shall return 
3050: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66  SQLITE_MISUSE if
3060: 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 77   it is invoked w
3070: 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53 51  hile.  ** the SQ
3080: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 69 73 20  Lite library is 
3090: 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28  in use. */.  if(
30a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
30b0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65  nfig.isInit ) re
30c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
30d0: 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76 61 5f 73  SE_BKPT;..  va_s
30e0: 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
30f0: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20  switch( op ){.. 
3100: 20 20 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66     /* Mutex conf
3110: 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
3120: 73 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  s are only avail
3130: 61 62 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64  able in a thread
3140: 73 61 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  safe.    ** comp
3150: 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20  ile..    */.#if 
3160: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
3170: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
3180: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
3190: 30 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 34 34  0  /* IMP: R-544
31a0: 36 36 2d 34 36 37 35 36 20 2a 2f 0a 20 20 20 20  66-46756 */.    
31b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
31c0: 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44 3a  IG_SINGLETHREAD:
31d0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
31e0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 32 37 34 38  ENCE-OF: R-02748
31f0: 2d 31 39 30 39 36 20 54 68 69 73 20 6f 70 74 69  -19096 This opti
3200: 6f 6e 20 73 65 74 73 20 74 68 65 20 74 68 72 65  on sets the thre
3210: 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20  ading mode to.  
3220: 20 20 20 20 2a 2a 20 53 69 6e 67 6c 65 2d 74 68      ** Single-th
3230: 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73  read. */.      s
3240: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3250: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
3260: 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d  0;  /* Disable m
3270: 75 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a  utex on core */.
3280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3290: 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
32a0: 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a 20 44 69  utex = 0;  /* Di
32b0: 73 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63  sable mutex on c
32c0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
32d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
32e0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
32f0: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
3300: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3310: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a  _THREADSAFE>0 /*
3320: 20 49 4d 50 3a 20 52 2d 32 30 35 32 30 2d 35 34   IMP: R-20520-54
3330: 30 38 36 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  086 */.    case 
3340: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55  SQLITE_CONFIG_MU
3350: 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a 20 20 20  LTITHREAD: {.   
3360: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
3370: 46 3a 20 52 2d 31 34 33 37 34 2d 34 32 34 36 38  F: R-14374-42468
3380: 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73 65 74   This option set
3390: 73 20 74 68 65 20 74 68 72 65 61 64 69 6e 67 20  s the threading 
33a0: 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a  mode to.      **
33b0: 20 4d 75 6c 74 69 2d 74 68 72 65 61 64 2e 20 2a   Multi-thread. *
33c0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
33d0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
33e0: 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20  eMutex = 1;  /* 
33f0: 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20  Enable mutex on 
3400: 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  core */.      sq
3410: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3420: 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30  g.bFullMutex = 0
3430: 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75  ;  /* Disable mu
3440: 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f  tex on connectio
3450: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ns */.      brea
3460: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3470: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3480: 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26  TE_THREADSAFE) &
3490: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
34a0: 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  AFE>0 /* IMP: R-
34b0: 35 39 35 39 33 2d 32 31 38 31 30 20 2a 2f 0a 20  59593-21810 */. 
34c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
34d0: 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49 5a 45 44  ONFIG_SERIALIZED
34e0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
34f0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 32 32  DENCE-OF: R-4122
3500: 30 2d 35 31 38 30 30 20 54 68 69 73 20 6f 70 74  0-51800 This opt
3510: 69 6f 6e 20 73 65 74 73 20 74 68 65 20 74 68 72  ion sets the thr
3520: 65 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f 0a 20  eading mode to. 
3530: 20 20 20 20 20 2a 2a 20 53 65 72 69 61 6c 69 7a       ** Serializ
3540: 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ed. */.      sql
3550: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3560: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b  .bCoreMutex = 1;
3570: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65    /* Enable mute
3580: 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20  x on core */.   
3590: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
35a0: 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
35b0: 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62 6c  x = 1;  /* Enabl
35c0: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65  e mutex on conne
35d0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ctions */.      
35e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
35f0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3600: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3610: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3620: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
3630: 3a 20 52 2d 36 33 36 36 36 2d 34 38 37 35 35 20  : R-63666-48755 
3640: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3650: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a  TE_CONFIG_MUTEX:
3660: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63   {.      /* Spec
3670: 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  ify an alternati
3680: 76 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65  ve mutex impleme
3690: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
36a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
36b0: 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61  nfig.mutex = *va
36c0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
36d0: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29  _mutex_methods*)
36e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
36f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
3700: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
3710: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
3720: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
3730: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 34 34 35  0 /* IMP: R-1445
3740: 30 2d 33 37 35 39 37 20 2a 2f 0a 20 20 20 20 63  0-37597 */.    c
3750: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3760: 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b 0a 20 20  G_GETMUTEX: {.  
3770: 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20      /* Retrieve 
3780: 74 68 65 20 63 75 72 72 65 6e 74 20 6d 75 74 65  the current mute
3790: 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  x implementation
37a0: 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72   */.      *va_ar
37b0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75  g(ap, sqlite3_mu
37c0: 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20  tex_methods*) = 
37d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
37e0: 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20 20 20 20  fig.mutex;.     
37f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
3800: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
3810: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c  QLITE_CONFIG_MAL
3820: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
3830: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
3840: 35 35 39 34 2d 32 31 30 33 30 20 54 68 65 20 53  5594-21030 The S
3850: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c  QLITE_CONFIG_MAL
3860: 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73  LOC option takes
3870: 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
3880: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
3890: 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  h is a pointer t
38a0: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
38b0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71   the.      ** sq
38c0: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
38d0: 73 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65  s structure. The
38e0: 20 61 72 67 75 6d 65 6e 74 20 73 70 65 63 69 66   argument specif
38f0: 69 65 73 20 61 6c 74 65 72 6e 61 74 69 76 65 0a  ies alternative.
3900: 20 20 20 20 20 20 2a 2a 20 6c 6f 77 2d 6c 65 76        ** low-lev
3910: 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  el memory alloca
3920: 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 6f  tion routines to
3930: 20 62 65 20 75 73 65 64 20 69 6e 20 70 6c 61 63   be used in plac
3940: 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 0a  e of the memory.
3950: 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
3960: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 62 75 69  ion routines bui
3970: 6c 74 20 69 6e 74 6f 20 53 51 4c 69 74 65 2e 20  lt into SQLite. 
3980: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3990: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d  GlobalConfig.m =
39a0: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
39b0: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
39c0: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
39d0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
39e0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
39f0: 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20  TMALLOC: {.     
3a00: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
3a10: 20 52 2d 35 31 32 31 33 2d 34 36 34 31 34 20 54   R-51213-46414 T
3a20: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
3a30: 5f 47 45 54 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f  _GETMALLOC optio
3a40: 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20  n takes a.      
3a50: 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65  ** single argume
3a60: 6e 74 20 77 68 69 63 68 20 69 73 20 61 20 70 6f  nt which is a po
3a70: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
3a80: 61 6e 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20  ance of the.    
3a90: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d    ** sqlite3_mem
3aa0: 5f 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75  _methods structu
3ab0: 72 65 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f  re. The sqlite3_
3ac0: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75  mem_methods stru
3ad0: 63 74 75 72 65 20 69 73 0a 20 20 20 20 20 20 2a  cture is.      *
3ae0: 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  * filled with th
3af0: 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69  e currently defi
3b00: 6e 65 64 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ned memory alloc
3b10: 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 2e 20  ation routines. 
3b20: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
3b30: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3b40: 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20  .m.xMalloc==0 ) 
3b50: 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66  sqlite3MemSetDef
3b60: 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 2a 76  ault();.      *v
3b70: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
3b80: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 20  3_mem_methods*) 
3b90: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
3ba0: 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20 20 20 62  onfig.m;.      b
3bb0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3bc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3bd0: 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a 20 7b 0a  IG_MEMSTATUS: {.
3be0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3bf0: 45 2d 4f 46 3a 20 52 2d 36 31 32 37 35 2d 33 35  E-OF: R-61275-35
3c00: 31 35 37 20 54 68 65 20 53 51 4c 49 54 45 5f 43  157 The SQLITE_C
3c10: 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 20  ONFIG_MEMSTATUS 
3c20: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a 20 20 20  option takes.   
3c30: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67     ** single arg
3c40: 75 6d 65 6e 74 20 6f 66 20 74 79 70 65 20 69 6e  ument of type in
3c50: 74 2c 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  t, interpreted a
3c60: 73 20 61 20 62 6f 6f 6c 65 61 6e 2c 20 77 68 69  s a boolean, whi
3c70: 63 68 20 65 6e 61 62 6c 65 73 0a 20 20 20 20 20  ch enables.     
3c80: 20 2a 2a 20 6f 72 20 64 69 73 61 62 6c 65 73 20   ** or disables 
3c90: 74 68 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f  the collection o
3ca0: 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  f memory allocat
3cb0: 69 6f 6e 20 73 74 61 74 69 73 74 69 63 73 2e 20  ion statistics. 
3cc0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3cd0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65  GlobalConfig.bMe
3ce0: 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67 28 61  mstat = va_arg(a
3cf0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3d00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3d10: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3d20: 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20 20  IG_SCRATCH: {.  
3d30: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
3d40: 4f 46 3a 20 52 2d 30 38 34 30 34 2d 36 30 38 38  OF: R-08404-6088
3d50: 37 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65  7 There are thre
3d60: 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20  e arguments to. 
3d70: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43       ** SQLITE_C
3d80: 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 41  ONFIG_SCRATCH: A
3d90: 20 70 6f 69 6e 74 65 72 20 61 6e 20 38 2d 62 79   pointer an 8-by
3da0: 74 65 20 61 6c 69 67 6e 65 64 20 6d 65 6d 6f 72  te aligned memor
3db0: 79 20 62 75 66 66 65 72 20 66 72 6f 6d 0a 20 20  y buffer from.  
3dc0: 20 20 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65      ** which the
3dd0: 20 73 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74   scratch allocat
3de0: 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 64 72 61  ions will be dra
3df0: 77 6e 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 20  wn, the size of 
3e00: 65 61 63 68 20 73 63 72 61 74 63 68 0a 20 20 20  each scratch.   
3e10: 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e     ** allocation
3e20: 20 28 73 7a 29 2c 20 61 6e 64 20 74 68 65 20 6d   (sz), and the m
3e30: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
3e40: 20 73 63 72 61 74 63 68 20 61 6c 6c 6f 63 61 74   scratch allocat
3e50: 69 6f 6e 73 20 28 4e 29 2e 20 2a 2f 0a 20 20 20  ions (N). */.   
3e60: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3e70: 43 6f 6e 66 69 67 2e 70 53 63 72 61 74 63 68 20  Config.pScratch 
3e80: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
3e90: 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d*);.      sqlit
3ea0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
3eb0: 7a 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72  zScratch = va_ar
3ec0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3ed0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3ee0: 6f 6e 66 69 67 2e 6e 53 63 72 61 74 63 68 20 3d  onfig.nScratch =
3ef0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
3f00: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3f10: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3f20: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45  LITE_CONFIG_PAGE
3f30: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
3f40: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
3f50: 2d 31 38 37 36 31 2d 33 36 36 30 31 20 54 68 65  -18761-36601 The
3f60: 72 65 20 61 72 65 20 74 68 72 65 65 20 61 72 67  re are three arg
3f70: 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20 20  uments to.      
3f80: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ** SQLITE_CONFIG
3f90: 5f 50 41 47 45 43 41 43 48 45 3a 20 41 20 70 6f  _PAGECACHE: A po
3fa0: 69 6e 74 65 72 20 74 6f 20 38 2d 62 79 74 65 20  inter to 8-byte 
3fb0: 61 6c 69 67 6e 65 64 20 6d 65 6d 6f 72 79 20 28  aligned memory (
3fc0: 70 4d 65 6d 29 2c 0a 20 20 20 20 20 20 2a 2a 20  pMem),.      ** 
3fd0: 74 68 65 20 73 69 7a 65 20 6f 66 20 65 61 63 68  the size of each
3fe0: 20 70 61 67 65 20 63 61 63 68 65 20 6c 69 6e 65   page cache line
3ff0: 20 28 73 7a 29 2c 20 61 6e 64 20 74 68 65 20 6e   (sz), and the n
4000: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 6c  umber of cache l
4010: 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20 28 4e  ines.      ** (N
4020: 29 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ). */.      sqli
4030: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4040: 70 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  pPage = va_arg(a
4050: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
4060: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4070: 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d 20 76 61  nfig.szPage = va
4080: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
4090: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
40a0: 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d  alConfig.nPage =
40b0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
40c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
40d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
40e0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43  LITE_CONFIG_PCAC
40f0: 48 45 5f 48 44 52 53 5a 3a 20 7b 0a 20 20 20 20  HE_HDRSZ: {.    
4100: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
4110: 3a 20 52 2d 33 39 31 30 30 2d 32 37 33 31 37 20  : R-39100-27317 
4120: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
4130: 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 20 6f  G_PCACHE_HDRSZ o
4140: 70 74 69 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20  ption takes.    
4150: 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 70 61    ** a single pa
4160: 72 61 6d 65 74 65 72 20 77 68 69 63 68 20 69 73  rameter which is
4170: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
4180: 20 69 6e 74 65 67 65 72 20 61 6e 64 20 77 72 69   integer and wri
4190: 74 65 73 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a  tes into.      *
41a0: 2a 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 74  * that integer t
41b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 74  he number of ext
41c0: 72 61 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ra bytes per pag
41d0: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 65  e required for e
41e0: 61 63 68 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ach page.      *
41f0: 2a 20 69 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46  * in SQLITE_CONF
4200: 49 47 5f 50 41 47 45 43 41 43 48 45 2e 20 2a 2f  IG_PAGECACHE. */
4210: 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61  .      *va_arg(a
4220: 70 2c 20 69 6e 74 2a 29 20 3d 20 0a 20 20 20 20  p, int*) = .    
4230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 65 61        sqlite3Hea
4240: 64 65 72 53 69 7a 65 42 74 72 65 65 28 29 20 2b  derSizeBtree() +
4250: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4260: 65 33 48 65 61 64 65 72 53 69 7a 65 50 63 61 63  e3HeaderSizePcac
4270: 68 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20 20  he() +.         
4280: 20 73 71 6c 69 74 65 33 48 65 61 64 65 72 53 69   sqlite3HeaderSi
4290: 7a 65 50 63 61 63 68 65 31 28 29 3b 0a 20 20 20  zePcache1();.   
42a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
42b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
42c0: 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 3a 20  _CONFIG_PCACHE: 
42d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70  {.      /* no-op
42e0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
42f0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4300: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
4310: 54 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20  TPCACHE: {.     
4320: 20 2f 2a 20 6e 6f 77 20 61 6e 20 65 72 72 6f 72   /* now an error
4330: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
4340: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
4350: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4360: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4370: 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 3a  _CONFIG_PCACHE2:
4380: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
4390: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 33 32 35  ENCE-OF: R-63325
43a0: 2d 34 38 33 37 38 20 54 68 65 20 53 51 4c 49 54  -48378 The SQLIT
43b0: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 32  E_CONFIG_PCACHE2
43c0: 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a   option takes a.
43d0: 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
43e0: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
43f0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
4400: 6e 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  n sqlite3_pcache
4410: 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20 20 20 20  _methods2.      
4420: 2a 2a 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20  ** object. This 
4430: 6f 62 6a 65 63 74 20 73 70 65 63 69 66 69 65 73  object specifies
4440: 20 74 68 65 20 69 6e 74 65 72 66 61 63 65 20 74   the interface t
4450: 6f 20 61 20 63 75 73 74 6f 6d 20 70 61 67 65 20  o a custom page 
4460: 63 61 63 68 65 0a 20 20 20 20 20 20 2a 2a 20 69  cache.      ** i
4470: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 2a  mplementation. *
4480: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
4490: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63  lobalConfig.pcac
44a0: 68 65 32 20 3d 20 2a 76 61 5f 61 72 67 28 61 70  he2 = *va_arg(ap
44b0: 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  , sqlite3_pcache
44c0: 5f 6d 65 74 68 6f 64 73 32 2a 29 3b 0a 20 20 20  _methods2*);.   
44d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
44e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
44f0: 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45  CONFIG_GETPCACHE
4500: 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  2: {.      /* EV
4510: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 30  IDENCE-OF: R-220
4520: 33 35 2d 34 36 31 38 32 20 54 68 65 20 53 51 4c  35-46182 The SQL
4530: 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43  ITE_CONFIG_GETPC
4540: 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b  ACHE2 option tak
4550: 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69  es a.      ** si
4560: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  ngle argument wh
4570: 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ich is a pointer
4580: 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 70   to an sqlite3_p
4590: 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20  cache_methods2. 
45a0: 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20       ** object. 
45b0: 53 51 4c 69 74 65 20 63 6f 70 69 65 73 20 6f 66  SQLite copies of
45c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
45d0: 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e  e cache implemen
45e0: 74 61 74 69 6f 6e 20 69 6e 74 6f 0a 20 20 20 20  tation into.    
45f0: 20 20 2a 2a 20 74 68 61 74 20 6f 62 6a 65 63 74    ** that object
4600: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  . */.      if( s
4610: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4620: 69 67 2e 70 63 61 63 68 65 32 2e 78 49 6e 69 74  ig.pcache2.xInit
4630: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
4640: 71 6c 69 74 65 33 50 43 61 63 68 65 53 65 74 44  qlite3PCacheSetD
4650: 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20  efault();.      
4660: 7d 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28  }.      *va_arg(
4670: 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63  ap, sqlite3_pcac
4680: 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29 20 3d 20  he_methods2*) = 
4690: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
46a0: 66 69 67 2e 70 63 61 63 68 65 32 3b 0a 20 20 20  fig.pcache2;.   
46b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
46c0: 0a 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  ./* EVIDENCE-OF:
46d0: 20 52 2d 30 36 36 32 36 2d 31 32 39 31 31 20 54   R-06626-12911 T
46e0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
46f0: 5f 48 45 41 50 20 6f 70 74 69 6f 6e 20 69 73 20  _HEAP option is 
4700: 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  only.** availabl
4710: 65 20 69 66 20 53 51 4c 69 74 65 20 69 73 20 63  e if SQLite is c
4720: 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 65 69 74  ompiled with eit
4730: 68 65 72 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  her SQLITE_ENABL
4740: 45 5f 4d 45 4d 53 59 53 33 20 6f 72 0a 2a 2a 20  E_MEMSYS3 or.** 
4750: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
4760: 4d 53 59 53 35 20 61 6e 64 20 72 65 74 75 72 6e  MSYS5 and return
4770: 73 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  s SQLITE_ERROR i
4780: 66 20 69 6e 76 6f 6b 65 64 20 6f 74 68 65 72 77  f invoked otherw
4790: 69 73 65 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69  ise. */.#if defi
47a0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
47b0: 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65  E_MEMSYS3) || de
47c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
47d0: 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20  BLE_MEMSYS5).   
47e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
47f0: 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20  FIG_HEAP: {.    
4800: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
4810: 3a 20 52 2d 31 39 38 35 34 2d 34 32 31 32 36 20  : R-19854-42126 
4820: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
4830: 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
4840: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     ** SQLITE_CON
4850: 46 49 47 5f 48 45 41 50 3a 20 41 6e 20 38 2d 62  FIG_HEAP: An 8-b
4860: 79 74 65 20 61 6c 69 67 6e 65 64 20 70 6f 69 6e  yte aligned poin
4870: 74 65 72 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72  ter to the memor
4880: 79 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  y, the.      ** 
4890: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
48a0: 69 6e 20 74 68 65 20 6d 65 6d 6f 72 79 20 62 75  in the memory bu
48b0: 66 66 65 72 2c 20 61 6e 64 20 74 68 65 20 6d 69  ffer, and the mi
48c0: 6e 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 69 6f 6e  nimum allocation
48d0: 20 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   size..      */.
48e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
48f0: 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20  balConfig.pHeap 
4900: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
4910: 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d*);.      sqlit
4920: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
4930: 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Heap = va_arg(ap
4940: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
4950: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4960: 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67  g.mnReq = va_arg
4970: 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20  (ap, int);..    
4980: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
4990: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c  balConfig.mnReq<
49a0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
49b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
49c0: 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20 20 20 20  .mnReq = 1;.    
49d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
49e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
49f0: 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b  mnReq>(1<<12) ){
4a00: 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 61 70 20  .        /* cap 
4a10: 6d 69 6e 20 72 65 71 75 65 73 74 20 73 69 7a 65  min request size
4a20: 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20   at 2^12 */.    
4a30: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4a40: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
4a50: 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d  (1<<12);.      }
4a60: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
4a70: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4a80: 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20  pHeap==0 ){.    
4a90: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4aa0: 4f 46 3a 20 52 2d 34 39 39 32 30 2d 36 30 31 38  OF: R-49920-6018
4ab0: 39 20 49 66 20 74 68 65 20 66 69 72 73 74 20 70  9 If the first p
4ac0: 6f 69 6e 74 65 72 20 28 74 68 65 20 6d 65 6d 6f  ointer (the memo
4ad0: 72 79 20 70 6f 69 6e 74 65 72 29 0a 20 20 20 20  ry pointer).    
4ae0: 20 20 20 20 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20      ** is NULL, 
4af0: 74 68 65 6e 20 53 51 4c 69 74 65 20 72 65 76 65  then SQLite reve
4b00: 72 74 73 20 74 6f 20 75 73 69 6e 67 20 69 74 73  rts to using its
4b10: 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f 72 79 20   default memory 
4b20: 61 6c 6c 6f 63 61 74 6f 72 0a 20 20 20 20 20 20  allocator.      
4b30: 20 20 2a 2a 20 28 74 68 65 20 73 79 73 74 65 6d    ** (the system
4b40: 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d   malloc() implem
4b50: 65 6e 74 61 74 69 6f 6e 29 2c 20 75 6e 64 6f 69  entation), undoi
4b60: 6e 67 20 61 6e 79 20 70 72 69 6f 72 20 69 6e 76  ng any prior inv
4b70: 6f 63 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20  ocation of.     
4b80: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e     ** SQLITE_CON
4b90: 46 49 47 5f 4d 41 4c 4c 4f 43 2e 0a 20 20 20 20  FIG_MALLOC..    
4ba0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
4bb0: 2a 20 53 65 74 74 69 6e 67 20 73 71 6c 69 74 65  * Setting sqlite
4bc0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20  3GlobalConfig.m 
4bd0: 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 20 77 69 6c  to all zeros wil
4be0: 6c 20 63 61 75 73 65 20 6d 61 6c 6c 6f 63 20 74  l cause malloc t
4bf0: 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 76  o.        ** rev
4c00: 65 72 74 20 74 6f 20 69 74 73 20 64 65 66 61 75  ert to its defau
4c10: 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  lt implementatio
4c20: 6e 20 77 68 65 6e 20 73 71 6c 69 74 65 33 5f 69  n when sqlite3_i
4c30: 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73 20 72  nitialize() is r
4c40: 75 6e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  un.        */.  
4c50: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71        memset(&sq
4c60: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4c70: 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  g.m, 0, sizeof(s
4c80: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4c90: 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65  ig.m));.      }e
4ca0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
4cb0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
4cc0: 31 30 30 36 2d 30 38 39 31 38 20 49 66 20 74 68  1006-08918 If th
4cd0: 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72  e memory pointer
4ce0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
4cf0: 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  n the.        **
4d00: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 65 6d   alternative mem
4d10: 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73  ory allocator is
4d20: 20 65 6e 67 61 67 65 64 20 74 6f 20 68 61 6e 64   engaged to hand
4d30: 6c 65 20 61 6c 6c 20 6f 66 20 53 51 4c 69 74 65  le all of SQLite
4d40: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d  s.        ** mem
4d50: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6e  ory allocation n
4d60: 65 65 64 73 2e 20 2a 2f 0a 23 69 66 64 65 66 20  eeds. */.#ifdef 
4d70: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
4d80: 4d 53 59 53 33 0a 20 20 20 20 20 20 20 20 73 71  MSYS3.        sq
4d90: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4da0: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
4db0: 6d 47 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23  mGetMemsys3();.#
4dc0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
4dd0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4de0: 53 35 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  S5.        sqlit
4df0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4e00: 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65   = *sqlite3MemGe
4e10: 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64  tMemsys5();.#end
4e20: 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
4e30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
4e40: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
4e50: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f  QLITE_CONFIG_LOO
4e60: 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20  KASIDE: {.      
4e70: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4e80: 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20  fig.szLookaside 
4e90: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
4ea0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4eb0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f  GlobalConfig.nLo
4ec0: 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67  okaside = va_arg
4ed0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4ee0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4ef0: 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64    .    /* Record
4f00: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
4f10: 65 20 6c 6f 67 67 65 72 20 66 75 6e 63 74 69 6f  e logger functio
4f20: 6e 20 61 6e 64 20 69 74 73 20 66 69 72 73 74 20  n and its first 
4f30: 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a 2a  argument..    **
4f40: 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
4f50: 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20 69  NULL.  Logging i
4f60: 73 20 64 69 73 61 62 6c 65 64 20 69 66 20 74 68  s disabled if th
4f70: 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  e function point
4f80: 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c  er is.    ** NUL
4f90: 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  L..    */.    ca
4fa0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
4fb0: 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  _LOG: {.      /*
4fc0: 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20 61   MSVC is picky a
4fd0: 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e  bout pulling fun
4fe0: 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c  c ptrs from va l
4ff0: 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68  ists..      ** h
5000: 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69  ttp://support.mi
5010: 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34  crosoft.com/kb/4
5020: 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71  7961.      ** sq
5030: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
5040: 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28  g.xLog = va_arg(
5050: 61 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69 64  ap, void(*)(void
5060: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  *,int,const char
5070: 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20  *));.      */.  
5080: 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64      typedef void
5090: 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69  (*LOGFUNC_t)(voi
50a0: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61  d*,int,const cha
50b0: 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r*);.      sqlit
50c0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
50d0: 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Log = va_arg(ap,
50e0: 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20   LOGFUNC_t);.   
50f0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
5100: 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20 3d  Config.pLogArg =
5110: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
5120: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
5130: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45  .    }..    /* E
5140: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35  VIDENCE-OF: R-55
5150: 35 34 38 2d 33 33 38 31 37 20 54 68 65 20 63 6f  548-33817 The co
5160: 6d 70 69 6c 65 2d 74 69 6d 65 20 73 65 74 74 69  mpile-time setti
5170: 6e 67 20 66 6f 72 20 55 52 49 20 66 69 6c 65 6e  ng for URI filen
5180: 61 6d 65 73 0a 20 20 20 20 2a 2a 20 63 61 6e 20  ames.    ** can 
5190: 62 65 20 63 68 61 6e 67 65 64 20 61 74 20 73 74  be changed at st
51a0: 61 72 74 2d 74 69 6d 65 20 75 73 69 6e 67 20 74  art-time using t
51b0: 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  he.    ** sqlite
51c0: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
51d0: 43 4f 4e 46 49 47 5f 55 52 49 2c 31 29 20 6f 72  CONFIG_URI,1) or
51e0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
51f0: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
5200: 4e 46 49 47 5f 55 52 49 2c 30 29 20 63 6f 6e 66  NFIG_URI,0) conf
5210: 69 67 75 72 61 74 69 6f 6e 20 63 61 6c 6c 73 2e  iguration calls.
5220: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5230: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55   SQLITE_CONFIG_U
5240: 52 49 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  RI: {.      /* E
5250: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35  VIDENCE-OF: R-25
5260: 34 35 31 2d 36 31 31 32 35 20 54 68 65 20 53 51  451-61125 The SQ
5270: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 20  LITE_CONFIG_URI 
5280: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73  option takes a s
5290: 69 6e 67 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61  ingle.      ** a
52a0: 72 67 75 6d 65 6e 74 20 6f 66 20 74 79 70 65 20  rgument of type 
52b0: 69 6e 74 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f  int. If non-zero
52c0: 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64 6c  , then URI handl
52d0: 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a  ing is globally.
52e0: 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64        ** enabled
52f0: 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  . If the paramet
5300: 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  er is zero, then
5310: 20 55 52 49 20 68 61 6e 64 6c 69 6e 67 20 69 73   URI handling is
5320: 20 67 6c 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20   globally.      
5330: 2a 2a 20 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a  ** disabled. */.
5340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5350: 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55  balConfig.bOpenU
5360: 72 69 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ri = va_arg(ap, 
5370: 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
5380: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
5390: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
53a0: 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f  _COVERING_INDEX_
53b0: 53 43 41 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  SCAN: {.      /*
53c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
53d0: 33 36 35 39 32 2d 30 32 37 37 32 20 54 68 65 20  36592-02772 The 
53e0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f  SQLITE_CONFIG_CO
53f0: 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41  VERING_INDEX_SCA
5400: 4e 0a 20 20 20 20 20 20 2a 2a 20 6f 70 74 69 6f  N.      ** optio
5410: 6e 20 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65  n takes a single
5420: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
5430: 74 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  t which is inter
5440: 70 72 65 74 65 64 20 61 73 20 61 0a 20 20 20 20  preted as a.    
5450: 20 20 2a 2a 20 62 6f 6f 6c 65 61 6e 20 69 6e 20    ** boolean in 
5460: 6f 72 64 65 72 20 74 6f 20 65 6e 61 62 6c 65 20  order to enable 
5470: 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 75  or disable the u
5480: 73 65 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69  se of covering i
5490: 6e 64 69 63 65 73 20 66 6f 72 0a 20 20 20 20 20  ndices for.     
54a0: 20 2a 2a 20 66 75 6c 6c 20 74 61 62 6c 65 20 73   ** full table s
54b0: 63 61 6e 73 20 69 6e 20 74 68 65 20 71 75 65 72  cans in the quer
54c0: 79 20 6f 70 74 69 6d 69 7a 65 72 2e 20 2a 2f 0a  y optimizer. */.
54d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
54e0: 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
54f0: 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  s = va_arg(ap, i
5500: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
5510: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
5520: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
5530: 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65 20 53 51  LLOG.    case SQ
5540: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
5550: 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65  OG: {.      type
5560: 64 65 66 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47  def void(*SQLLOG
5570: 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73  FUNC_t)(void*, s
5580: 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63  qlite3*, const c
5590: 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20  har*, int);.    
55a0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
55b0: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20  onfig.xSqllog = 
55c0: 76 61 5f 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f  va_arg(ap, SQLLO
55d0: 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  GFUNC_t);.      
55e0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
55f0: 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d  fig.pSqllogArg =
5600: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
5610: 20 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   *);.      break
5620: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
5630: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5640: 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45  CONFIG_MMAP_SIZE
5650: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
5660: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 36  DENCE-OF: R-5806
5670: 33 2d 33 38 32 35 38 20 53 51 4c 49 54 45 5f 43  3-38258 SQLITE_C
5680: 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 20  ONFIG_MMAP_SIZE 
5690: 74 61 6b 65 73 20 74 77 6f 20 36 34 2d 62 69 74  takes two 64-bit
56a0: 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  .      ** intege
56b0: 72 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  r (sqlite3_int64
56c0: 29 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72  ) values that ar
56d0: 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 6d 6d  e the default mm
56e0: 61 70 20 73 69 7a 65 20 6c 69 6d 69 74 0a 20 20  ap size limit.  
56f0: 20 20 20 20 2a 2a 20 28 74 68 65 20 64 65 66 61      ** (the defa
5700: 75 6c 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20  ult setting for 
5710: 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65  PRAGMA mmap_size
5720: 29 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  ) and the maximu
5730: 6d 20 61 6c 6c 6f 77 65 64 0a 20 20 20 20 20 20  m allowed.      
5740: 2a 2a 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d  ** mmap size lim
5750: 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  it. */.      sql
5760: 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61  ite3_int64 szMma
5770: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  p = va_arg(ap, s
5780: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20  qlite3_int64);. 
5790: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
57a0: 36 34 20 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61  64 mxMmap = va_a
57b0: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69  rg(ap, sqlite3_i
57c0: 6e 74 36 34 29 3b 0a 20 20 20 20 20 20 2f 2a 20  nt64);.      /* 
57d0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
57e0: 33 33 36 37 2d 34 33 31 39 30 20 49 66 20 65 69  3367-43190 If ei
57f0: 74 68 65 72 20 61 72 67 75 6d 65 6e 74 20 74 6f  ther argument to
5800: 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 0a   this option is.
5810: 20 20 20 20 20 20 2a 2a 20 6e 65 67 61 74 69 76        ** negativ
5820: 65 2c 20 74 68 65 6e 20 74 68 61 74 20 61 72 67  e, then that arg
5830: 75 6d 65 6e 74 20 69 73 20 63 68 61 6e 67 65 64  ument is changed
5840: 20 74 6f 20 69 74 73 20 63 6f 6d 70 69 6c 65 2d   to its compile-
5850: 74 69 6d 65 20 64 65 66 61 75 6c 74 2e 0a 20 20  time default..  
5860: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
5870: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
5880: 34 39 39 33 2d 34 35 30 33 31 20 54 68 65 20 6d  4993-45031 The m
5890: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 6d  aximum allowed m
58a0: 6d 61 70 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  map size will be
58b0: 0a 20 20 20 20 20 20 2a 2a 20 73 69 6c 65 6e 74  .      ** silent
58c0: 6c 79 20 74 72 75 6e 63 61 74 65 64 20 69 66 20  ly truncated if 
58d0: 6e 65 63 65 73 73 61 72 79 20 73 6f 20 74 68 61  necessary so tha
58e0: 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  t it does not ex
58f0: 63 65 65 64 20 74 68 65 0a 20 20 20 20 20 20 2a  ceed the.      *
5900: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6d  * compile-time m
5910: 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a 65  aximum mmap size
5920: 20 73 65 74 20 62 79 20 74 68 65 20 53 51 4c 49   set by the SQLI
5930: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
5940: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  .      ** compil
5950: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20  e-time option.. 
5960: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
5970: 28 20 6d 78 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78  ( mxMmap<0 || mx
5980: 4d 6d 61 70 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Mmap>SQLITE_MAX_
5990: 4d 4d 41 50 5f 53 49 5a 45 20 29 7b 0a 20 20 20  MMAP_SIZE ){.   
59a0: 20 20 20 20 20 6d 78 4d 6d 61 70 20 3d 20 53 51       mxMmap = SQ
59b0: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
59c0: 5a 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ZE;.      }.    
59d0: 20 20 69 66 28 20 73 7a 4d 6d 61 70 3c 30 20 29    if( szMmap<0 )
59e0: 20 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45   szMmap = SQLITE
59f0: 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49  _DEFAULT_MMAP_SI
5a00: 5a 45 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  ZE;.      if( sz
5a10: 4d 6d 61 70 3e 6d 78 4d 6d 61 70 29 20 73 7a 4d  Mmap>mxMmap) szM
5a20: 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20  map = mxMmap;.  
5a30: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
5a40: 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 3d  lConfig.mxMmap =
5a50: 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 73   mxMmap;.      s
5a60: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
5a70: 69 67 2e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d  ig.szMmap = szMm
5a80: 61 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ap;.      break;
5a90: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  .    }..#if SQLI
5aa0: 54 45 5f 4f 53 5f 57 49 4e 20 26 26 20 64 65 66  TE_OS_WIN && def
5ab0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5ac0: 32 5f 4d 41 4c 4c 4f 43 29 20 2f 2a 20 49 4d 50  2_MALLOC) /* IMP
5ad0: 3a 20 52 2d 30 34 37 38 30 2d 35 35 38 31 35 20  : R-04780-55815 
5ae0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
5af0: 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e 33 32 5f  TE_CONFIG_WIN32_
5b00: 48 45 41 50 53 49 5a 45 3a 20 7b 0a 20 20 20 20  HEAPSIZE: {.    
5b10: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
5b20: 3a 20 52 2d 33 34 39 32 36 2d 30 33 33 36 30 20  : R-34926-03360 
5b30: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49  SQLITE_CONFIG_WI
5b40: 4e 33 32 5f 48 45 41 50 53 49 5a 45 20 74 61 6b  N32_HEAPSIZE tak
5b50: 65 73 20 61 20 33 32 2d 62 69 74 0a 20 20 20 20  es a 32-bit.    
5b60: 20 20 2a 2a 20 75 6e 73 69 67 6e 65 64 20 69 6e    ** unsigned in
5b70: 74 65 67 65 72 20 76 61 6c 75 65 20 74 68 61 74  teger value that
5b80: 20 73 70 65 63 69 66 69 65 73 20 74 68 65 20 6d   specifies the m
5b90: 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74  aximum size of t
5ba0: 68 65 20 63 72 65 61 74 65 64 0a 20 20 20 20 20  he created.     
5bb0: 20 2a 2a 20 68 65 61 70 2e 20 2a 2f 0a 20 20 20   ** heap. */.   
5bc0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
5bd0: 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76  Config.nHeap = v
5be0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
5bf0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5c00: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63   }.#endif..    c
5c10: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
5c20: 47 5f 50 4d 41 53 5a 3a 20 7b 0a 20 20 20 20 20  G_PMASZ: {.     
5c30: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5c40: 6e 66 69 67 2e 73 7a 50 6d 61 20 3d 20 76 61 5f  nfig.szPma = va_
5c50: 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64  arg(ap, unsigned
5c60: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
5c70: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  ak;.    }..    d
5c80: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5c90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
5ca0: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
5cb0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65      }.  }.  va_e
5cc0: 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e  nd(ap);.  return
5cd0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65   rc;.}../*.** Se
5ce0: 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61 73 69  t up the lookasi
5cf0: 64 65 20 62 75 66 66 65 72 73 20 66 6f 72 20 61  de buffers for a
5d00: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
5d10: 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  tion..** Return 
5d20: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
5d30: 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f  cess.  .** If lo
5d40: 6f 6b 61 73 69 64 65 20 69 73 20 61 6c 72 65 61  okaside is alrea
5d50: 64 79 20 61 63 74 69 76 65 2c 20 72 65 74 75 72  dy active, retur
5d60: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a  n SQLITE_BUSY..*
5d70: 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61 72 61  *.** The sz para
5d80: 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d  meter is the num
5d90: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
5da0: 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65 20 73  each lookaside s
5db0: 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e 74 20  lot..** The cnt 
5dc0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
5dd0: 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73   number of slots
5de0: 2e 20 20 49 66 20 70 53 74 61 72 74 20 69 73 20  .  If pStart is 
5df0: 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70 61 63  NULL the.** spac
5e00: 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b 61 73  e for the lookas
5e10: 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 6f 62  ide memory is ob
5e20: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
5e30: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a  te3_malloc()..**
5e40: 20 49 66 20 70 53 74 61 72 74 20 69 73 20 6e 6f   If pStart is no
5e50: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69  t NULL then it i
5e60: 73 20 73 7a 2a 63 6e 74 20 62 79 74 65 73 20 6f  s sz*cnt bytes o
5e70: 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73 65 20  f memory to use 
5e80: 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61  for.** the looka
5e90: 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  side memory..*/.
5ea0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 75 70  static int setup
5eb0: 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69 74 65  Lookaside(sqlite
5ec0: 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70 42 75  3 *db, void *pBu
5ed0: 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 63  f, int sz, int c
5ee0: 6e 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  nt){.#ifndef SQL
5ef0: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49  ITE_OMIT_LOOKASI
5f00: 44 45 0a 20 20 76 6f 69 64 20 2a 70 53 74 61 72  DE.  void *pStar
5f10: 74 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  t;.  if( db->loo
5f20: 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20  kaside.nOut ){. 
5f30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5f40: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20  _BUSY;.  }.  /* 
5f50: 46 72 65 65 20 61 6e 79 20 65 78 69 73 74 69 6e  Free any existin
5f60: 67 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66  g lookaside buff
5f70: 65 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e 64  er for this hand
5f80: 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  le before.  ** a
5f90: 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
5fa0: 6f 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74 20  one so we don't 
5fb0: 68 61 76 65 20 74 6f 20 68 61 76 65 20 73 70 61  have to have spa
5fc0: 63 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74  ce for .  ** bot
5fd0: 68 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  h at the same ti
5fe0: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  me..  */.  if( d
5ff0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
6000: 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71  lloced ){.    sq
6010: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c  lite3_free(db->l
6020: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29  ookaside.pStart)
6030: 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73  ;.  }.  /* The s
6040: 69 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69  ize of a lookasi
6050: 64 65 20 73 6c 6f 74 20 61 66 74 65 72 20 52 4f  de slot after RO
6060: 55 4e 44 44 4f 57 4e 38 20 6e 65 65 64 73 20 74  UNDDOWN8 needs t
6070: 6f 20 62 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a  o be larger.  **
6080: 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72 20   than a pointer 
6090: 74 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20  to be useful..  
60a0: 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44  */.  sz = ROUNDD
60b0: 4f 57 4e 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d  OWN8(sz);  /* IM
60c0: 50 3a 20 52 2d 33 33 30 33 38 2d 30 39 33 38 32  P: R-33038-09382
60d0: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69   */.  if( sz<=(i
60e0: 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73  nt)sizeof(Lookas
60f0: 69 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d  ideSlot*) ) sz =
6100: 20 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20   0;.  if( cnt<0 
6110: 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  ) cnt = 0;.  if(
6120: 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30   sz==0 || cnt==0
6130: 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a   ){.    sz = 0;.
6140: 20 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a      pStart = 0;.
6150: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66    }else if( pBuf
6160: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
6170: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
6180: 6c 6f 63 28 29 3b 0a 20 20 20 20 70 53 74 61 72  loc();.    pStar
6190: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
61a0: 63 28 20 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a  c( sz*cnt );  /*
61b0: 20 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d 33 35   IMP: R-61949-35
61c0: 37 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  727 */.    sqlit
61d0: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
61e0: 63 28 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74  c();.    if( pSt
61f0: 61 72 74 20 29 20 63 6e 74 20 3d 20 73 71 6c 69  art ) cnt = sqli
6200: 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53  te3MallocSize(pS
6210: 74 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73  tart)/sz;.  }els
6220: 65 7b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20  e{.    pStart = 
6230: 70 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  pBuf;.  }.  db->
6240: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
6250: 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d   = pStart;.  db-
6260: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65  >lookaside.pFree
6270: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b   = 0;.  db->look
6280: 61 73 69 64 65 2e 73 7a 20 3d 20 28 75 31 36 29  aside.sz = (u16)
6290: 73 7a 3b 0a 20 20 69 66 28 20 70 53 74 61 72 74  sz;.  if( pStart
62a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
62b0: 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74     LookasideSlot
62c0: 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28   *p;.    assert(
62d0: 20 73 7a 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f   sz > (int)sizeo
62e0: 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a  f(LookasideSlot*
62f0: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f  ) );.    p = (Lo
6300: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70 53 74  okasideSlot*)pSt
6310: 61 72 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63  art;.    for(i=c
6320: 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  nt-1; i>=0; i--)
6330: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74  {.      p->pNext
6340: 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65   = db->lookaside
6350: 2e 70 46 72 65 65 3b 0a 20 20 20 20 20 20 64 62  .pFree;.      db
6360: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65  ->lookaside.pFre
6370: 65 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 20 3d  e = p;.      p =
6380: 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a   (LookasideSlot*
6390: 29 26 28 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a  )&((u8*)p)[sz];.
63a0: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f      }.    db->lo
63b0: 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 70  okaside.pEnd = p
63c0: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
63d0: 69 64 65 2e 62 44 69 73 61 62 6c 65 20 3d 20 30  ide.bDisable = 0
63e0: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
63f0: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20  ide.bMalloced = 
6400: 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20  pBuf==0 ?1:0;.  
6410: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c  }else{.    db->l
6420: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20  ookaside.pStart 
6430: 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = db;.    db->lo
6440: 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 64  okaside.pEnd = d
6450: 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  b;.    db->looka
6460: 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20 3d 20  side.bDisable = 
6470: 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  1;.    db->looka
6480: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d  side.bMalloced =
6490: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   0;.  }.#endif /
64a0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  * SQLITE_OMIT_LO
64b0: 4f 4b 41 53 49 44 45 20 2a 2f 0a 20 20 72 65 74  OKASIDE */.  ret
64c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
64d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
64e0: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
64f0: 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
6500: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
6510: 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  */.sqlite3_mutex
6520: 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74   *sqlite3_db_mut
6530: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ex(sqlite3 *db){
6540: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6550: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
6560: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
6570: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
6580: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
6590: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
65a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
65b0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
65c0: 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a  rn db->mutex;.}.
65d0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20 61  ./*.** Free up a
65e0: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
65f0: 20 77 65 20 63 61 6e 20 66 72 6f 6d 20 74 68 65   we can from the
6600: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a   given database.
6610: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ** connection..*
6620: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
6630: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
6640: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
6650: 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 53  int i;..#ifdef S
6660: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
6670: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
6680: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
6690: 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
66a0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
66b0: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
66c0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
66d0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
66e0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
66f0: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
6700: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
6710: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
6720: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
6730: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
6740: 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  t ){.      Pager
6750: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
6760: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
6770: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6780: 50 61 67 65 72 53 68 72 69 6e 6b 28 70 50 61 67  PagerShrink(pPag
6790: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
67a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
67b0: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
67c0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
67d0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
67e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
67f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
6800: 61 6e 79 20 64 69 72 74 79 20 70 61 67 65 73 20  any dirty pages 
6810: 69 6e 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  in the pager-cac
6820: 68 65 20 66 6f 72 20 61 6e 79 20 61 74 74 61 63  he for any attac
6830: 68 65 64 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  hed database.** 
6840: 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  to disk..*/.int 
6850: 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65  sqlite3_db_cache
6860: 66 6c 75 73 68 28 73 71 6c 69 74 65 33 20 2a 64  flush(sqlite3 *d
6870: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
6880: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6890: 4b 3b 0a 20 20 69 6e 74 20 62 53 65 65 6e 42 75  K;.  int bSeenBu
68a0: 73 79 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  sy = 0;..#ifdef 
68b0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
68c0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
68d0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
68e0: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
68f0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
6900: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
6910: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6920: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
6930: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
6940: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28  rAll(db);.  for(
6950: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
6960: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
6970: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
6980: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
6990: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
69a0: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74  pBt && sqlite3Bt
69b0: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
69c0: 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65 72  ) ){.      Pager
69d0: 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74   *pPager = sqlit
69e0: 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
69f0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
6a00: 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73 68 28  lite3PagerFlush(
6a10: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
6a20: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
6a30: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 53  SY ){.        bS
6a40: 65 65 6e 42 75 73 79 20 3d 20 31 3b 0a 20 20 20  eenBusy = 1;.   
6a50: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6a60: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
6a70: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
6a80: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
6a90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
6aa0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
6ab0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  ex);.  return ((
6ac0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
6ad0: 20 62 53 65 65 6e 42 75 73 79 29 20 3f 20 53 51   bSeenBusy) ? SQ
6ae0: 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 29 3b  LITE_BUSY : rc);
6af0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
6b00: 75 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73  uration settings
6b10: 20 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75   for an individu
6b20: 61 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  al database conn
6b30: 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71  ection.*/.int sq
6b40: 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
6b50: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
6b60: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
6b70: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
6b80: 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  c;.  va_start(ap
6b90: 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
6ba0: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
6bb0: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
6bc0: 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20  LOOKASIDE: {.   
6bd0: 20 20 20 76 6f 69 64 20 2a 70 42 75 66 20 3d 20     void *pBuf = 
6be0: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
6bf0: 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 38  ); /* IMP: R-268
6c00: 33 35 2d 31 30 39 36 34 20 2a 2f 0a 20 20 20 20  35-10964 */.    
6c10: 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72    int sz = va_ar
6c20: 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20  g(ap, int);     
6c30: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 37 38 37    /* IMP: R-4787
6c40: 31 2d 32 35 39 39 34 20 2a 2f 0a 20 20 20 20 20  1-25994 */.     
6c50: 20 69 6e 74 20 63 6e 74 20 3d 20 76 61 5f 61 72   int cnt = va_ar
6c60: 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20 20 20  g(ap, int);     
6c70: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 34 36 30   /* IMP: R-04460
6c80: 2d 35 33 33 38 36 20 2a 2f 0a 20 20 20 20 20 20  -53386 */.      
6c90: 72 63 20 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73  rc = setupLookas
6ca0: 69 64 65 28 64 62 2c 20 70 42 75 66 2c 20 73 7a  ide(db, pBuf, sz
6cb0: 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , cnt);.      br
6cc0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
6cd0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
6ce0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
6cf0: 75 63 74 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  uct {.        in
6d00: 74 20 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  t op;      /* Th
6d10: 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  e opcode */.    
6d20: 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 20 20 20      u32 mask;   
6d30: 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 68 65 20   /* Mask of the 
6d40: 62 69 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 66  bit in sqlite3.f
6d50: 6c 61 67 73 20 74 6f 20 73 65 74 2f 63 6c 65 61  lags to set/clea
6d60: 72 20 2a 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c  r */.      } aFl
6d70: 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  agOp[] = {.     
6d80: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
6d90: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59  NFIG_ENABLE_FKEY
6da0: 2c 20 20 20 20 53 51 4c 49 54 45 5f 46 6f 72 65  ,    SQLITE_Fore
6db0: 69 67 6e 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20  ignKeys    },.  
6dc0: 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44        { SQLITE_D
6dd0: 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54  BCONFIG_ENABLE_T
6de0: 52 49 47 47 45 52 2c 20 53 51 4c 49 54 45 5f 45  RIGGER, SQLITE_E
6df0: 6e 61 62 6c 65 54 72 69 67 67 65 72 20 20 7d 2c  nableTrigger  },
6e00: 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
6e10: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
6e20: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6e30: 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a  E_ERROR; /* IMP:
6e40: 20 52 2d 34 32 37 39 30 2d 32 33 33 37 32 20 2a   R-42790-23372 *
6e50: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  /.      for(i=0;
6e60: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46 6c   i<ArraySize(aFl
6e70: 61 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  agOp); i++){.   
6e80: 20 20 20 20 20 69 66 28 20 61 46 6c 61 67 4f 70       if( aFlagOp
6e90: 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20  [i].op==op ){.  
6ea0: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66          int onof
6eb0: 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  f = va_arg(ap, i
6ec0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
6ed0: 6e 74 20 2a 70 52 65 73 20 3d 20 76 61 5f 61 72  nt *pRes = va_ar
6ee0: 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20  g(ap, int*);.   
6ef0: 20 20 20 20 20 20 20 69 6e 74 20 6f 6c 64 46 6c         int oldFl
6f00: 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b  ags = db->flags;
6f10: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
6f20: 6e 6f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  noff>0 ){.      
6f30: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
6f40: 7c 3d 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61  |= aFlagOp[i].ma
6f50: 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  sk;.          }e
6f60: 6c 73 65 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30  lse if( onoff==0
6f70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6f80: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46  db->flags &= ~aF
6f90: 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20  lagOp[i].mask;. 
6fa0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6fb0: 20 20 20 20 20 69 66 28 20 6f 6c 64 46 6c 61 67       if( oldFlag
6fc0: 73 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a  s!=db->flags ){.
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6fe0: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
6ff0: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
7000: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7010: 20 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20         if( pRes 
7020: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
7030: 70 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  pRes = (db->flag
7040: 73 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  s & aFlagOp[i].m
7050: 61 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20 20 20  ask)!=0;.       
7060: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
7070: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
7080: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7090: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
70a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
70b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e     }.  }.  va_en
70c0: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
70d0: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
70e0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
70f0: 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31   buffer z[0..n-1
7100: 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73  ] contains all s
7110: 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  paces..*/.static
7120: 20 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28 63   int allSpaces(c
7130: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
7140: 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e  t n){.  while( n
7150: 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20  >0 && z[n-1]==' 
7160: 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65  ' ){ n--; }.  re
7170: 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  turn n==0;.}../*
7180: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
7190: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
71a0: 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  g function named
71b0: 20 22 42 49 4e 41 52 59 22 20 77 68 69 63 68 20   "BINARY" which 
71c0: 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61  is always.** ava
71d0: 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ilable..**.** If
71e0: 20 74 68 65 20 70 61 64 46 6c 61 67 20 61 72 67   the padFlag arg
71f0: 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
7200: 4c 20 74 68 65 6e 20 73 70 61 63 65 20 70 61 64  L then space pad
7210: 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a  ding at the end.
7220: 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69 73  ** of strings is
7230: 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20   ignored.  This 
7240: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 52  implements the R
7250: 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a  TRIM collation..
7260: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69  */.static int bi
7270: 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69  nCollFunc(.  voi
7280: 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e  d *padFlag,.  in
7290: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
72a0: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
72b0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
72c0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
72d0: 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d  int rc, n;.  n =
72e0: 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e   nKey1<nKey2 ? n
72f0: 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20  Key1 : nKey2;.  
7300: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
7310: 52 2d 36 35 30 33 33 2d 32 38 34 34 39 20 54 68  R-65033-28449 Th
7320: 65 20 62 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52  e built-in BINAR
7330: 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 6f 6d 70  Y collation comp
7340: 61 72 65 73 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ares.  ** string
7350: 73 20 62 79 74 65 20 62 79 20 62 79 74 65 20 75  s byte by byte u
7360: 73 69 6e 67 20 74 68 65 20 6d 65 6d 63 6d 70 28  sing the memcmp(
7370: 29 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20  ) function from 
7380: 74 68 65 20 73 74 61 6e 64 61 72 64 20 43 0a 20  the standard C. 
7390: 20 2a 2a 20 6c 69 62 72 61 72 79 2e 20 2a 2f 0a   ** library. */.
73a0: 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b    rc = memcmp(pK
73b0: 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a  ey1, pKey2, n);.
73c0: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
73d0: 20 20 20 69 66 28 20 70 61 64 46 6c 61 67 0a 20     if( padFlag. 
73e0: 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73      && allSpaces
73f0: 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31 29 2b  (((char*)pKey1)+
7400: 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20  n, nKey1-n).    
7410: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
7420: 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20  char*)pKey2)+n, 
7430: 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a  nKey2-n).    ){.
7440: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
7450: 45 2d 4f 46 3a 20 52 2d 33 31 36 32 34 2d 32 34  E-OF: R-31624-24
7460: 37 33 37 20 52 54 52 49 4d 20 69 73 20 6c 69 6b  737 RTRIM is lik
7470: 65 20 42 49 4e 41 52 59 20 65 78 63 65 70 74 20  e BINARY except 
7480: 74 68 61 74 20 65 78 74 72 61 0a 20 20 20 20 20  that extra.     
7490: 20 2a 2a 20 73 70 61 63 65 73 20 61 74 20 74 68   ** spaces at th
74a0: 65 20 65 6e 64 20 6f 66 20 65 69 74 68 65 72 20  e end of either 
74b0: 73 74 72 69 6e 67 20 64 6f 20 6e 6f 74 20 63 68  string do not ch
74c0: 61 6e 67 65 20 74 68 65 20 72 65 73 75 6c 74 2e  ange the result.
74d0: 20 49 6e 20 6f 74 68 65 72 0a 20 20 20 20 20 20   In other.      
74e0: 2a 2a 20 77 6f 72 64 73 2c 20 73 74 72 69 6e 67  ** words, string
74f0: 73 20 77 69 6c 6c 20 63 6f 6d 70 61 72 65 20 65  s will compare e
7500: 71 75 61 6c 20 74 6f 20 6f 6e 65 20 61 6e 6f 74  qual to one anot
7510: 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  her as long as t
7520: 68 65 79 0a 20 20 20 20 20 20 2a 2a 20 64 69 66  hey.      ** dif
7530: 66 65 72 20 6f 6e 6c 79 20 69 6e 20 74 68 65 20  fer only in the 
7540: 6e 75 6d 62 65 72 20 6f 66 20 73 70 61 63 65 73  number of spaces
7550: 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 20 20 20   at the end..   
7560: 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b     */.    }else{
7570: 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79  .      rc = nKey
7580: 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d  1 - nKey2;.    }
7590: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
75a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68  ;.}../*.** Anoth
75b0: 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  er built-in coll
75c0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20  ating sequence: 
75d0: 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54  NOCASE. .**.** T
75e0: 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  his collating se
75f0: 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64  quence is intend
7600: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ed to be used fo
7610: 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64  r "case independ
7620: 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ent.** compariso
7630: 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f  n". SQLite's kno
7640: 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72 20  wledge of upper 
7650: 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65  and lower case e
7660: 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78  quivalents.** ex
7670: 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68  tends only to th
7680: 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73 20  e 26 characters 
7690: 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c  used in the Engl
76a0: 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a  ish language..**
76b0: 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e  .** At the momen
76c0: 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  t there is only 
76d0: 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e  a UTF-8 implemen
76e0: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  tation..*/.stati
76f0: 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c  c int nocaseColl
7700: 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69  atingFunc(.  voi
7710: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
7720: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
7730: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
7740: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
7750: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
7760: 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53  int r = sqlite3S
7770: 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28  trNICmp(.      (
7780: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
7790: 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y1, (const char 
77a0: 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c  *)pKey2, (nKey1<
77b0: 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65  nKey2)?nKey1:nKe
77c0: 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  y2);.  UNUSED_PA
77d0: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
77e0: 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a  ;.  if( 0==r ){.
77f0: 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b      r = nKey1-nK
7800: 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey2;.  }.  retur
7810: 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n r;.}../*.** Re
7820: 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f  turn the ROWID o
7830: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
7840: 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69  t insert.*/.sqli
7850: 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  te_int64 sqlite3
7860: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
7870: 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  id(sqlite3 *db){
7880: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7890: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
78a0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
78b0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
78c0: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
78d0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
78e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
78f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
7900: 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  rn db->lastRowid
7910: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7920: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
7930: 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 6d  changes in the m
7940: 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20  ost recent call 
7950: 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  to sqlite3_exec(
7960: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
7970: 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65  3_changes(sqlite
7980: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
7990: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
79a0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
79b0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
79c0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
79d0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
79e0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
79f0: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
7a00: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
7a10: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
7a20: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
7a30: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
7a40: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
7a50: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
7a60: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
7a70: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
7a80: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
7a90: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7aa0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
7ab0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
7ac0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
7ad0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
7ae0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
7af0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7b00: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
7b10: 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
7b20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
7b30: 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f   all open savepo
7b40: 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74  ints. This funct
7b50: 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c  ion only manipul
7b60: 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66 20 74  ates fields of t
7b70: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  he.** database h
7b80: 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74  andle object, it
7b90: 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20   does not close 
7ba0: 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74  any savepoints t
7bb0: 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a  hat may be open.
7bc0: 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72 65 65  ** at the b-tree
7bd0: 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f  /pager level..*/
7be0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 6f  .void sqlite3Clo
7bf0: 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73 71 6c  seSavepoints(sql
7c00: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77 68 69  ite3 *db){.  whi
7c10: 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f 69  le( db->pSavepoi
7c20: 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65 70 6f  nt ){.    Savepo
7c30: 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e  int *pTmp = db->
7c40: 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20  pSavepoint;.    
7c50: 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d  db->pSavepoint =
7c60: 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   pTmp->pNext;.  
7c70: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7c80: 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20  db, pTmp);.  }. 
7c90: 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20   db->nSavepoint 
7ca0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74  = 0;.  db->nStat
7cb0: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  ement = 0;.  db-
7cc0: 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53 61  >isTransactionSa
7cd0: 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  vepoint = 0;.}..
7ce0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
7cf0: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
7d00: 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20  tion associated 
7d10: 77 69 74 68 20 46 75 6e 63 44 65 66 20 70 2c 20  with FuncDef p, 
7d20: 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a  if any. Except,.
7d30: 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f  ** if this is no
7d40: 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70 79 20  t the last copy 
7d50: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c  of the function,
7d60: 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69   do not invoke i
7d70: 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63  t. Multiple.** c
7d80: 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  opies of a singl
7d90: 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 63  e function are c
7da0: 72 65 61 74 65 64 20 77 68 65 6e 20 63 72 65 61  reated when crea
7db0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20 69 73  te_function() is
7dc0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20   called.** with 
7dd0: 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20 74 68  SQLITE_ANY as th
7de0: 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  e encoding..*/.s
7df0: 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e 63 74  tatic void funct
7e00: 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c 69 74  ionDestroy(sqlit
7e10: 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20  e3 *db, FuncDef 
7e20: 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73 74 72  *p){.  FuncDestr
7e30: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
7e40: 6f 72 20 3d 20 70 2d 3e 70 44 65 73 74 72 75 63  or = p->pDestruc
7e50: 74 6f 72 3b 0a 20 20 69 66 28 20 70 44 65 73 74  tor;.  if( pDest
7e60: 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44  ructor ){.    pD
7e70: 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d  estructor->nRef-
7e80: 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 65 73 74  -;.    if( pDest
7e90: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20  ructor->nRef==0 
7ea0: 29 7b 0a 20 20 20 20 20 20 70 44 65 73 74 72 75  ){.      pDestru
7eb0: 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79 28 70  ctor->xDestroy(p
7ec0: 44 65 73 74 72 75 63 74 6f 72 2d 3e 70 55 73 65  Destructor->pUse
7ed0: 72 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71  rData);.      sq
7ee0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7ef0: 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  pDestructor);.  
7f00: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
7f10: 20 44 69 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20   Disconnect all 
7f20: 73 71 6c 69 74 65 33 5f 76 74 61 62 20 6f 62 6a  sqlite3_vtab obj
7f30: 65 63 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  ects that belong
7f40: 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 6e   to database con
7f50: 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54  nection.** db. T
7f60: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77 68  his is called wh
7f70: 65 6e 20 64 62 20 69 73 20 62 65 69 6e 67 20 63  en db is being c
7f80: 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  losed..*/.static
7f90: 20 76 6f 69 64 20 64 69 73 63 6f 6e 6e 65 63 74   void disconnect
7fa0: 41 6c 6c 56 74 61 62 28 73 71 6c 69 74 65 33 20  AllVtab(sqlite3 
7fb0: 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  *db){.#ifndef SQ
7fc0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
7fd0: 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20 69 3b 0a  LTABLE.  int i;.
7fe0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20    HashElem *p;. 
7ff0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
8000: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72  erAll(db);.  for
8010: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
8020: 20 69 2b 2b 29 7b 0a 20 20 20 20 53 63 68 65 6d   i++){.    Schem
8030: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  a *pSchema = db-
8040: 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b  >aDb[i].pSchema;
8050: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62  .    if( db->aDb
8060: 5b 69 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20  [i].pSchema ){. 
8070: 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74       for(p=sqlit
8080: 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68  eHashFirst(&pSch
8090: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70  ema->tblHash); p
80a0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
80b0: 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 20 20  xt(p)){.        
80c0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54  Table *pTab = (T
80d0: 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73  able *)sqliteHas
80e0: 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20  hData(p);.      
80f0: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
8100: 70 54 61 62 29 20 29 20 73 71 6c 69 74 65 33 56  pTab) ) sqlite3V
8110: 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62  tabDisconnect(db
8120: 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d  , pTab);.      }
8130: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
8140: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
8150: 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  st(&db->aModule)
8160: 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73  ; p; p=sqliteHas
8170: 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 4d  hNext(p)){.    M
8180: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d  odule *pMod = (M
8190: 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61  odule *)sqliteHa
81a0: 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 69  shData(p);.    i
81b0: 66 28 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62  f( pMod->pEpoTab
81c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
81d0: 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28  3VtabDisconnect(
81e0: 64 62 2c 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  db, pMod->pEpoTa
81f0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
8200: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
8210: 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c  kList(db);.  sql
8220: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
8230: 6c 28 64 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55  l(db);.#else.  U
8240: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
8250: 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  db);.#endif.}../
8260: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
8270: 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   if database con
8280: 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 73 20 75  nection db has u
8290: 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61  nfinalized prepa
82a0: 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  red.** statement
82b0: 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20  s or unfinished 
82c0: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f  sqlite3_backup o
82d0: 62 6a 65 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61  bjects.  .*/.sta
82e0: 74 69 63 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69  tic int connecti
82f0: 6f 6e 49 73 42 75 73 79 28 73 71 6c 69 74 65 33  onIsBusy(sqlite3
8300: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a   *db){.  int j;.
8310: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8320: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
8330: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
8340: 20 64 62 2d 3e 70 56 64 62 65 20 29 20 72 65 74   db->pVdbe ) ret
8350: 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30  urn 1;.  for(j=0
8360: 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b  ; j<db->nDb; j++
8370: 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  ){.    Btree *pB
8380: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70  t = db->aDb[j].p
8390: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20  Bt;.    if( pBt 
83a0: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  && sqlite3BtreeI
83b0: 73 49 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29  sInBackup(pBt) )
83c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
83d0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
83e0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69  .** Close an exi
83f0: 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74  sting SQLite dat
8400: 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20  abase.*/.static 
8410: 69 6e 74 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  int sqlite3Close
8420: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
8430: 74 20 66 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a  t forceZombie){.
8440: 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20    if( !db ){.   
8450: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
8460: 20 52 2d 36 33 32 35 37 2d 31 31 37 34 30 20 43   R-63257-11740 C
8470: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 63  alling sqlite3_c
8480: 6c 6f 73 65 28 29 20 6f 72 0a 20 20 20 20 2a 2a  lose() or.    **
8490: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
84a0: 32 28 29 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  2() with a NULL 
84b0: 70 6f 69 6e 74 65 72 20 61 72 67 75 6d 65 6e 74  pointer argument
84c0: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
84d0: 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 20 20 72 65 74  o-op. */.    ret
84e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
84f0: 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
8500: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
8510: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
8520: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
8530: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
8540: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
8550: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
8560: 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69  ..  /* Force xDi
8570: 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f  sconnect calls o
8580: 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61  n all virtual ta
8590: 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e  bles */.  discon
85a0: 6e 65 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b  nectAllVtab(db);
85b0: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e  ..  /* If a tran
85c0: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c  saction is open,
85d0: 20 74 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41   the disconnectA
85e0: 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62  llVtab() call ab
85f0: 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f  ove.  ** will no
8600: 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68  t have called th
8610: 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20  e xDisconnect() 
8620: 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69  method on any vi
8630: 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65  rtual.  ** table
8640: 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54  s in the db->aVT
8650: 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68  rans[] array. Th
8660: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69  e following sqli
8670: 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28  te3VtabRollback(
8680: 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c  ).  ** call will
8690: 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20   do so. We need 
86a0: 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72  to do this befor
86b0: 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20  e the check for 
86c0: 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20  active.  ** SQL 
86d0: 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77  statements below
86e0: 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65  , as the v-table
86f0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
8700: 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20  may be storing. 
8710: 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65   ** some prepare
8720: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74  d statements int
8730: 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ernally..  */.  
8740: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
8750: 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c  ack(db);..  /* L
8760: 65 67 61 63 79 20 62 65 68 61 76 69 6f 72 20 28  egacy behavior (
8770: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20  sqlite3_close() 
8780: 62 65 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20  behavior) is to 
8790: 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49  return.  ** SQLI
87a0: 54 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 63  TE_BUSY if the c
87b0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f  onnection can no
87c0: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
87d0: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
87e0: 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65  if( !forceZombie
87f0: 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73   && connectionIs
8800: 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20  Busy(db) ){.    
8810: 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
8820: 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  Msg(db, SQLITE_B
8830: 55 53 59 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  USY, "unable to 
8840: 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66  close due to unf
8850: 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20 20 20 20  inalized ".     
8860: 20 20 22 73 74 61 74 65 6d 65 6e 74 73 20 6f 72    "statements or
8870: 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61 63 6b   unfinished back
8880: 75 70 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ups");.    sqlit
8890: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
88a0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72  b->mutex);.    r
88b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
88c0: 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  Y;.  }..#ifdef S
88d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
88e0: 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LOG.  if( sqlite
88f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
8900: 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20  qllog ){.    /* 
8910: 43 6c 6f 73 69 6e 67 20 74 68 65 20 68 61 6e 64  Closing the hand
8920: 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d  le. Fourth param
8930: 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74  eter is passed t
8940: 68 65 20 76 61 6c 75 65 20 32 2e 20 2a 2f 0a 20  he value 2. */. 
8950: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
8960: 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 73  Config.xSqllog(s
8970: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
8980: 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 64  ig.pSqllogArg, d
8990: 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d 0a 23 65  b, 0, 2);.  }.#e
89a0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  ndif..  /* Conve
89b0: 72 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  rt the connectio
89c0: 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20  n into a zombie 
89d0: 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69  and then close i
89e0: 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61  t..  */.  db->ma
89f0: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
8a00: 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c  IC_ZOMBIE;.  sql
8a10: 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e  ite3LeaveMutexAn
8a20: 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29  dCloseZombie(db)
8a30: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
8a40: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
8a50: 77 6f 20 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e  wo variations on
8a60: 20 74 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65   the public inte
8a70: 72 66 61 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e  rface for closin
8a80: 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
8a90: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20  connection. The 
8aa0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20  sqlite3_close() 
8ab0: 76 65 72 73 69 6f 6e 20 72 65 74 75 72 6e 73 20  version returns 
8ac0: 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a  SQLITE_BUSY and.
8ad0: 2a 2a 20 6c 65 61 76 65 73 20 74 68 65 20 63 6f  ** leaves the co
8ae0: 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20  nnection option 
8af0: 69 66 20 74 68 65 72 65 20 61 72 65 20 75 6e 66  if there are unf
8b00: 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65  inalized prepare
8b10: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  d.** statements 
8b20: 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71  or unfinished sq
8b30: 6c 69 74 65 33 5f 62 61 63 6b 75 70 73 2e 20 20  lite3_backups.  
8b40: 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  The sqlite3_clos
8b50: 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f  e_v2().** versio
8b60: 6e 20 66 6f 72 63 65 73 20 74 68 65 20 63 6f 6e  n forces the con
8b70: 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d  nection to becom
8b80: 65 20 61 20 7a 6f 6d 62 69 65 20 69 66 20 74 68  e a zombie if th
8b90: 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f  ere are.** unclo
8ba0: 73 65 64 20 72 65 73 6f 75 72 63 65 73 2c 20 61  sed resources, a
8bb0: 6e 64 20 61 72 72 61 6e 67 65 73 20 66 6f 72 20  nd arranges for 
8bc0: 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65  deallocation whe
8bd0: 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72  n the last.** pr
8be0: 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e 74 20  epare statement 
8bf0: 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  or sqlite3_backu
8c00: 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74  p closes..*/.int
8c10: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73   sqlite3_close(s
8c20: 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74  qlite3 *db){ ret
8c30: 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  urn sqlite3Close
8c40: 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71  (db,0); }.int sq
8c50: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73  lite3_close_v2(s
8c60: 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74  qlite3 *db){ ret
8c70: 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65  urn sqlite3Close
8c80: 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a  (db,1); }.../*.*
8c90: 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d 75 74 65  * Close the mute
8ca0: 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 63 6f  x on database co
8cb0: 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a  nnection db..**.
8cc0: 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20  ** Furthermore, 
8cd0: 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  if database conn
8ce0: 65 63 74 69 6f 6e 20 64 62 20 69 73 20 61 20 7a  ection db is a z
8cf0: 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e 67 20 74  ombie (meaning t
8d00: 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 68 61 73  hat there.** has
8d10: 20 62 65 65 6e 20 61 20 70 72 69 6f 72 20 63 61   been a prior ca
8d20: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c  ll to sqlite3_cl
8d30: 6f 73 65 28 64 62 29 20 6f 72 20 73 71 6c 69 74  ose(db) or sqlit
8d40: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29 29  e3_close_v2(db))
8d50: 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79 20 73 71   and.** every sq
8d60: 6c 69 74 65 33 5f 73 74 6d 74 20 68 61 73 20 6e  lite3_stmt has n
8d70: 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65  ow been finalize
8d80: 64 20 61 6e 64 20 65 76 65 72 79 20 73 71 6c 69  d and every sqli
8d90: 74 65 33 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a  te3_backup has.*
8da0: 2a 20 66 69 6e 69 73 68 65 64 2c 20 74 68 65 6e  * finished, then
8db0: 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72   free all resour
8dc0: 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
8dd0: 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e  ite3LeaveMutexAn
8de0: 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c  dCloseZombie(sql
8df0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73  ite3 *db){.  Has
8e00: 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20 20  hElem *i;       
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e20: 48 61 73 68 20 74 61 62 6c 65 20 69 74 65 72 61  Hash table itera
8e30: 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a  tor */.  int j;.
8e40: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
8e50: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 73  re outstanding s
8e60: 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 72 20 73  qlite3_stmt or s
8e70: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62  qlite3_backup ob
8e80: 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66  jects.  ** or if
8e90: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
8ea0: 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
8eb0: 20 63 6c 6f 73 65 64 20 62 79 20 73 71 6c 69 74   closed by sqlit
8ec0: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20  e3_close_v2(),. 
8ed0: 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20 6c 65   ** then just le
8ee0: 61 76 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e  ave the mutex an
8ef0: 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
8f00: 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d   if( db->magic!=
8f10: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d  SQLITE_MAGIC_ZOM
8f20: 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f  BIE || connectio
8f30: 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20  nIsBusy(db) ){. 
8f40: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
8f50: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
8f60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
8f70: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72   }..  /* If we r
8f80: 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
8f90: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
8fa0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
8fb0: 65 63 74 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20  ection has.  ** 
8fc0: 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71 6c 69 74  closed all sqlit
8fd0: 65 33 5f 73 74 6d 74 20 61 6e 64 20 73 71 6c 69  e3_stmt and sqli
8fe0: 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63  te3_backup objec
8ff0: 74 73 20 61 6e 64 20 68 61 73 20 62 65 65 6e 0a  ts and has been.
9000: 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 73    ** passed to s
9010: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65  qlite3_close (me
9020: 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20 69 73  aning that it is
9030: 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65   a zombie).  The
9040: 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20  refore,.  ** go 
9050: 61 68 65 61 64 20 61 6e 64 20 66 72 65 65 20 61  ahead and free a
9060: 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20  ll resources..  
9070: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72  */..  /* If a tr
9080: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
9090: 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  n, roll it back.
90a0: 20 54 68 69 73 20 61 6c 73 6f 20 65 6e 73 75 72   This also ensur
90b0: 65 73 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20  es that if.  ** 
90c0: 61 6e 79 20 64 61 74 61 62 61 73 65 20 73 63 68  any database sch
90d0: 65 6d 61 73 20 68 61 76 65 20 62 65 65 6e 20 6d  emas have been m
90e0: 6f 64 69 66 69 65 64 20 62 79 20 61 6e 20 75 6e  odified by an un
90f0: 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61  committed transa
9100: 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68 65 79 20  ction.  ** they 
9110: 61 72 65 20 72 65 73 65 74 2e 20 41 6e 64 20 74  are reset. And t
9120: 68 61 74 20 74 68 65 20 72 65 71 75 69 72 65 64  hat the required
9130: 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
9140: 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65 0a 20 20   held to make.  
9150: 2a 2a 20 74 68 65 20 70 61 67 65 72 20 72 6f 6c  ** the pager rol
9160: 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61  lback and schema
9170: 20 72 65 73 65 74 20 61 6e 20 61 74 6f 6d 69 63   reset an atomic
9180: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20   operation. */. 
9190: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
91a0: 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
91b0: 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61  K);..  /* Free a
91c0: 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53  ny outstanding S
91d0: 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75  avepoint structu
91e0: 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  res. */.  sqlite
91f0: 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
9200: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  (db);..  /* Clos
9210: 65 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63  e all database c
9220: 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
9230: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e  for(j=0; j<db->n
9240: 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; j++){.    st
9250: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
9260: 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20  db->aDb[j];.    
9270: 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a  if( pDb->pBt ){.
9280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
9290: 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74  eeClose(pDb->pBt
92a0: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42  );.      pDb->pB
92b0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
92c0: 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20   j!=1 ){.       
92d0: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20   pDb->pSchema = 
92e0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
92f0: 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20  .  }.  /* Clear 
9300: 74 68 65 20 54 45 4d 50 20 73 63 68 65 6d 61 20  the TEMP schema 
9310: 73 65 70 61 72 61 74 65 6c 79 20 61 6e 64 20 6c  separately and l
9320: 61 73 74 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ast */.  if( db-
9330: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
9340: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63  ){.    sqlite3Sc
9350: 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44  hemaClear(db->aD
9360: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20  b[1].pSchema);. 
9370: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
9380: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
9390: 0a 20 20 2f 2a 20 46 72 65 65 20 75 70 20 74 68  .  /* Free up th
93a0: 65 20 61 72 72 61 79 20 6f 66 20 61 75 78 69 6c  e array of auxil
93b0: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 2a  iary databases *
93c0: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61  /.  sqlite3Colla
93d0: 70 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79  pseDatabaseArray
93e0: 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20  (db);.  assert( 
93f0: 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20  db->nDb<=2 );.  
9400: 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d  assert( db->aDb=
9410: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
9420: 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65  ;..  /* Tell the
9430: 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e   code in notify.
9440: 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65  c that the conne
9450: 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  ction no longer 
9460: 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c  holds any.  ** l
9470: 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f  ocks and does no
9480: 74 20 72 65 71 75 69 72 65 20 61 6e 79 20 66 75  t require any fu
9490: 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  rther unlock-not
94a0: 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
94b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e   */.  sqlite3Con
94c0: 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62  nectionClosed(db
94d0: 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  );..  for(j=0; j
94e0: 3c 41 72 72 61 79 53 69 7a 65 28 64 62 2d 3e 61  <ArraySize(db->a
94f0: 46 75 6e 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20  Func.a); j++){. 
9500: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 78     FuncDef *pNex
9510: 74 2c 20 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20  t, *pHash, *p;. 
9520: 20 20 20 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75     for(p=db->aFu
9530: 6e 63 2e 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48  nc.a[j]; p; p=pH
9540: 61 73 68 29 7b 0a 20 20 20 20 20 20 70 48 61 73  ash){.      pHas
9550: 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20  h = p->pHash;.  
9560: 20 20 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a      while( p ){.
9570: 20 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e          function
9580: 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a  Destroy(db, p);.
9590: 20 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20          pNext = 
95a0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  p->pNext;.      
95b0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
95c0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
95d0: 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20  p = pNext;.     
95e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   }.    }.  }.  f
95f0: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
9600: 69 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  irst(&db->aCollS
9610: 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65  eq); i; i=sqlite
9620: 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20  HashNext(i)){.  
9630: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
9640: 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71   = (CollSeq *)sq
9650: 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
9660: 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61  .    /* Invoke a
9670: 6e 79 20 64 65 73 74 72 75 63 74 6f 72 73 20 72  ny destructors r
9680: 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 63 6f  egistered for co
9690: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
96a0: 20 75 73 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20   user data. */. 
96b0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b     for(j=0; j<3;
96c0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
96d0: 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29   pColl[j].xDel )
96e0: 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b  {.        pColl[
96f0: 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d  j].xDel(pColl[j]
9700: 2e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 7d  .pUser);.      }
9710: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
9720: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
9730: 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ll);.  }.  sqlit
9740: 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d  e3HashClear(&db-
9750: 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e  >aCollSeq);.#ifn
9760: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9770: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 66  VIRTUALTABLE.  f
9780: 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46  or(i=sqliteHashF
9790: 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  irst(&db->aModul
97a0: 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48  e); i; i=sqliteH
97b0: 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20  ashNext(i)){.   
97c0: 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20   Module *pMod = 
97d0: 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65  (Module *)sqlite
97e0: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
97f0: 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74   if( pMod->xDest
9800: 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f  roy ){.      pMo
9810: 64 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d 6f 64  d->xDestroy(pMod
9820: 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20  ->pAux);.    }. 
9830: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 45 70     sqlite3VtabEp
9840: 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 43 6c 65 61  onymousTableClea
9850: 72 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 20  r(db, pMod);.   
9860: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9870: 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20  b, pMod);.  }.  
9880: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
9890: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a  (&db->aModule);.
98a0: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
98b0: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
98c0: 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f  E_OK); /* Deallo
98d0: 63 61 74 65 73 20 61 6e 79 20 63 61 63 68 65 64  cates any cached
98e0: 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20   error strings. 
98f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  */.  sqlite3Valu
9900: 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29 3b  eFree(db->pErr);
9910: 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 45  .  sqlite3CloseE
9920: 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 23  xtensions(db);.#
9930: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
9940: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20  UTHENTICATION.  
9950: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
9960: 3e 61 75 74 68 2e 7a 41 75 74 68 55 73 65 72 29  >auth.zAuthUser)
9970: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
9980: 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 50  (db->auth.zAuthP
9990: 57 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62  W);.#endif..  db
99a0: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
99b0: 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20  _MAGIC_ERROR;.. 
99c0: 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74   /* The temp-dat
99d0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20  abase schema is 
99e0: 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72  allocated differ
99f0: 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f  ently from the o
9a00: 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a  ther schema.  **
9a10: 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20   objects (using 
9a20: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64  sqliteMalloc() d
9a30: 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64  irectly, instead
9a40: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
9a50: 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20  Schema())..  ** 
9a60: 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  So it needs to b
9a70: 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f  e freed here. To
9a80: 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c  do: Why not roll
9a90: 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61   the temp schema
9aa0: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73   into.  ** the s
9ab0: 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ame sqliteMalloc
9ac0: 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68  () as the one th
9ad0: 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  at allocates the
9ae0: 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20   database .  ** 
9af0: 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a  structure?.  */.
9b00: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9b10: 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  db, db->aDb[1].p
9b20: 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
9b30: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
9b40: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
9b50: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
9b60: 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20  MAGIC_CLOSED;.  
9b70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
9b80: 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ee(db->mutex);. 
9b90: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f   assert( db->loo
9ba0: 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29  kaside.nOut==0 )
9bb0: 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61  ;  /* Fails on a
9bc0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
9bd0: 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20  y leak */.  if( 
9be0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
9bf0: 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73  alloced ){.    s
9c00: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e  qlite3_free(db->
9c10: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
9c20: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
9c30: 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a  _free(db);.}../*
9c40: 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
9c50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
9c60: 20 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73    If tripCode is
9c70: 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20   not SQLITE_OK, 
9c80: 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 77 72 69 74  then.** any writ
9c90: 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  e cursors are in
9ca0: 76 61 6c 69 64 61 74 65 64 20 28 22 74 72 69 70  validated ("trip
9cb0: 70 65 64 22 20 2d 20 61 73 20 69 6e 20 22 74 72  ped" - as in "tr
9cc0: 69 70 70 69 6e 67 20 61 20 63 69 72 63 75 69 74  ipping a circuit
9cd0: 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29 20 61 6e  .** breaker") an
9ce0: 64 20 6d 61 64 65 20 74 6f 20 72 65 74 75 72 6e  d made to return
9cf0: 20 74 72 69 70 43 6f 64 65 20 69 66 20 74 68 65   tripCode if the
9d00: 72 65 20 61 72 65 20 61 6e 79 20 66 75 72 74 68  re are any furth
9d10: 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  er.** attempts t
9d20: 6f 20 75 73 65 20 74 68 61 74 20 63 75 72 73 6f  o use that curso
9d30: 72 2e 20 20 52 65 61 64 20 63 75 72 73 6f 72 73  r.  Read cursors
9d40: 20 72 65 6d 61 69 6e 20 6f 70 65 6e 20 61 6e 64   remain open and
9d50: 20 76 61 6c 69 64 0a 2a 2a 20 62 75 74 20 61 72   valid.** but ar
9d60: 65 20 22 73 61 76 65 64 22 20 69 6e 20 63 61 73  e "saved" in cas
9d70: 65 20 74 68 65 20 74 61 62 6c 65 20 70 61 67 65  e the table page
9d80: 73 20 61 72 65 20 6d 6f 76 65 64 20 61 72 6f 75  s are moved arou
9d90: 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nd..*/.void sqli
9da0: 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73  te3RollbackAll(s
9db0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
9dc0: 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74  tripCode){.  int
9dd0: 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e   i;.  int inTran
9de0: 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 63 68  s = 0;.  int sch
9df0: 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 61 73 73  emaChange;.  ass
9e00: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9e10: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
9e20: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
9e30: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
9e40: 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e  ();..  /* Obtain
9e50: 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d 75 74 65   all b-tree mute
9e60: 78 65 73 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e  xes before makin
9e70: 67 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f 20 42  g any calls to B
9e80: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 2e 20  treeRollback(). 
9e90: 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20 69 6d  .  ** This is im
9ea0: 70 6f 72 74 61 6e 74 20 69 6e 20 63 61 73 65 20  portant in case 
9eb0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
9ec0: 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
9ed0: 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f 64 69 66  k has.  ** modif
9ee0: 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ied the database
9ef0: 20 73 63 68 65 6d 61 2e 20 49 66 20 74 68 65 20   schema. If the 
9f00: 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20 61  b-tree mutexes a
9f10: 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a 20 20 2a  re not taken.  *
9f20: 2a 20 68 65 72 65 2c 20 74 68 65 6e 20 61 6e 6f  * here, then ano
9f30: 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
9f40: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 69 67  e connection mig
9f50: 68 74 20 73 6e 65 61 6b 20 69 6e 20 62 65 74 77  ht sneak in betw
9f60: 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 64 61 74  een.  ** the dat
9f70: 61 62 61 73 65 20 72 6f 6c 6c 62 61 63 6b 20 61  abase rollback a
9f80: 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65 74 2c  nd schema reset,
9f90: 20 77 68 69 63 68 20 63 61 6e 20 63 61 75 73 65   which can cause
9fa0: 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63 6f 72 72   false.  ** corr
9fb0: 75 70 74 69 6f 6e 20 72 65 70 6f 72 74 73 20 69  uption reports i
9fc0: 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e 20 20 2a  n some cases.  *
9fd0: 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
9fe0: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
9ff0: 73 63 68 65 6d 61 43 68 61 6e 67 65 20 3d 20 28  schemaChange = (
a000: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
a010: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
a020: 29 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74  )!=0 && db->init
a030: 2e 62 75 73 79 3d 3d 30 3b 0a 0a 20 20 66 6f 72  .busy==0;..  for
a040: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
a050: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
a060: 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d   *p = db->aDb[i]
a070: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20  .pBt;.    if( p 
a080: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
a090: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
a0a0: 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20  ns(p) ){.       
a0b0: 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20   inTrans = 1;.  
a0c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
a0d0: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
a0e0: 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 21 73  (p, tripCode, !s
a0f0: 63 68 65 6d 61 43 68 61 6e 67 65 29 3b 0a 20 20  chemaChange);.  
a100: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
a110: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62  3VtabRollback(db
a120: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42  );.  sqlite3EndB
a130: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
a140: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
a150: 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  &SQLITE_InternCh
a160: 61 6e 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d  anges)!=0 && db-
a170: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
a180: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
a190: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
a1a0: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71  ents(db);.    sq
a1b0: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
a1c0: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
a1d0: 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  (db);.  }.  sqli
a1e0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
a1f0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20  (db);..  /* Any 
a200: 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
a210: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68  int violations h
a220: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73  ave now been res
a230: 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e  olved. */.  db->
a240: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
a250: 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  0;.  db->nDeferr
a260: 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
a270: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
a280: 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a  QLITE_DeferFKs;.
a290: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73  .  /* If one has
a2a0: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
a2b0: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c  , invoke the rol
a2c0: 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62  lback-hook callb
a2d0: 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ack */.  if( db-
a2e0: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
a2f0: 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c  ck && (inTrans |
a300: 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  | !db->autoCommi
a310: 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52  t) ){.    db->xR
a320: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28  ollbackCallback(
a330: 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
a340: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
a350: 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20  Return a static 
a360: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
a370: 67 20 74 68 65 20 6e 61 6d 65 20 63 6f 72 72 65  g the name corre
a380: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
a390: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70  error code.** sp
a3a0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 61  ecified in the a
a3b0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20  rgument..*/.#if 
a3c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
a3d0: 45 45 44 5f 45 52 52 5f 4e 41 4d 45 29 0a 63 6f  EED_ERR_NAME).co
a3e0: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
a3f0: 33 45 72 72 4e 61 6d 65 28 69 6e 74 20 72 63 29  3ErrName(int rc)
a400: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
a410: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zName = 0;.  int
a420: 20 69 2c 20 6f 72 69 67 52 63 20 3d 20 72 63 3b   i, origRc = rc;
a430: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 20  .  for(i=0; i<2 
a440: 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b  && zName==0; i++
a450: 2c 20 72 63 20 26 3d 20 30 78 66 66 29 7b 0a 20  , rc &= 0xff){. 
a460: 20 20 20 73 77 69 74 63 68 28 20 72 63 20 29 7b     switch( rc ){
a470: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a480: 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20 20  TE_OK:          
a490: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a4a0: 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20  SQLITE_OK";     
a4b0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
a4c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a4d0: 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20  ITE_ERROR:      
a4e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a4f0: 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20  "SQLITE_ERROR"; 
a500: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a510: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a520: 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20  LITE_INTERNAL:  
a530: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
a540: 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41   "SQLITE_INTERNA
a550: 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  L";          bre
a560: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a570: 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20  QLITE_PERM:     
a580: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a590: 3d 20 22 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b  = "SQLITE_PERM";
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
a5b0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a5c0: 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20 20  SQLITE_ABORT:   
a5d0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a5e0: 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54   = "SQLITE_ABORT
a5f0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
a600: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a610: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
a620: 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a 4e 61 6d  LLBACK:     zNam
a630: 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52  e = "SQLITE_ABOR
a640: 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 20 20 20  T_ROLLBACK";    
a650: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a660: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 20  e SQLITE_BUSY:  
a670: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
a680: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53  me = "SQLITE_BUS
a690: 59 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Y";             
a6a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a6b0: 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  se SQLITE_BUSY_R
a6c0: 45 43 4f 56 45 52 59 3a 20 20 20 20 20 20 7a 4e  ECOVERY:      zN
a6d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55  ame = "SQLITE_BU
a6e0: 53 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 20 20  SY_RECOVERY";   
a6f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a700: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  ase SQLITE_BUSY_
a710: 53 4e 41 50 53 48 4f 54 3a 20 20 20 20 20 20 7a  SNAPSHOT:      z
a720: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42  Name = "SQLITE_B
a730: 55 53 59 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20  USY_SNAPSHOT";  
a740: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a750: 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  case SQLITE_LOCK
a760: 45 44 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ED:             
a770: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a780: 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20 20 20  LOCKED";        
a790: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a7a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43   case SQLITE_LOC
a7b0: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3a  KED_SHAREDCACHE:
a7c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a7d0: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
a7e0: 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  CHE";break;.    
a7f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
a800: 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20  MEM:            
a810: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a820: 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20  E_NOMEM";       
a830: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a840: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
a850: 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20  EADONLY:        
a860: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a870: 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20  TE_READONLY";   
a880: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a890: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a8a0: 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52  READONLY_RECOVER
a8b0: 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  Y:  zName = "SQL
a8c0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43  ITE_READONLY_REC
a8d0: 4f 56 45 52 59 22 3b 20 62 72 65 61 6b 3b 0a 20  OVERY"; break;. 
a8e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a8f0: 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f  _READONLY_CANTLO
a900: 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  CK:  zName = "SQ
a910: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41  LITE_READONLY_CA
a920: 4e 54 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  NTLOCK"; break;.
a930: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a940: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42  E_READONLY_ROLLB
a950: 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ACK:  zName = "S
a960: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
a970: 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b  OLLBACK"; break;
a980: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a990: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
a9a0: 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  VED:   zName = "
a9b0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
a9c0: 44 42 4d 4f 56 45 44 22 3b 20 20 62 72 65 61 6b  DBMOVED";  break
a9d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a9e0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20  ITE_INTERRUPT:  
a9f0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
aa00: 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  "SQLITE_INTERRUP
aa10: 54 22 3b 20 20 20 20 20 20 20 20 20 62 72 65 61  T";         brea
aa20: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
aa30: 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20  LITE_IOERR:     
aa40: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
aa50: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b   "SQLITE_IOERR";
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
aa70: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
aa80: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
aa90: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
aaa0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
aab0: 52 45 41 44 22 3b 20 20 20 20 20 20 20 20 62 72  READ";        br
aac0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
aad0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
aae0: 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e 61 6d 65  RT_READ:   zName
aaf0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
ab00: 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b 20 20 62  _SHORT_READ";  b
ab10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ab20: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
ab30: 49 54 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ITE:        zNam
ab40: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
ab50: 52 5f 57 52 49 54 45 22 3b 20 20 20 20 20 20 20  R_WRITE";       
ab60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ab70: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  e SQLITE_IOERR_F
ab80: 53 59 4e 43 3a 20 20 20 20 20 20 20 20 7a 4e 61  SYNC:        zNa
ab90: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
aba0: 52 52 5f 46 53 59 4e 43 22 3b 20 20 20 20 20 20  RR_FSYNC";      
abb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
abc0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
abd0: 44 49 52 5f 46 53 59 4e 43 3a 20 20 20 20 7a 4e  DIR_FSYNC:    zN
abe0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
abf0: 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b 20  ERR_DIR_FSYNC"; 
ac00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ac10: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
ac20: 5f 54 52 55 4e 43 41 54 45 3a 20 20 20 20 20 7a  _TRUNCATE:     z
ac30: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
ac40: 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 22 3b 20  OERR_TRUNCATE"; 
ac50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ac60: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
ac70: 52 5f 46 53 54 41 54 3a 20 20 20 20 20 20 20 20  R_FSTAT:        
ac80: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ac90: 49 4f 45 52 52 5f 46 53 54 41 54 22 3b 20 20 20  IOERR_FSTAT";   
aca0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
acb0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
acc0: 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20  RR_UNLOCK:      
acd0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ace0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20  _IOERR_UNLOCK"; 
acf0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ad00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
ad10: 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20  ERR_RDLOCK:     
ad20: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ad30: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22 3b  E_IOERR_RDLOCK";
ad40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ad50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
ad60: 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20 20 20 20  OERR_DELETE:    
ad70: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ad80: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 22  TE_IOERR_DELETE"
ad90: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
ada0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
adb0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20  IOERR_NOMEM:    
adc0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
add0: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22  ITE_IOERR_NOMEM"
ade0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
adf0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ae00: 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3a 20 20  _IOERR_ACCESS:  
ae10: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ae20: 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
ae30: 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S";      break;.
ae40: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ae50: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
ae60: 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20 20 20 20  ERVEDLOCK:.     
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae80: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
ae90: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
aea0: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
aeb0: 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CK"; break;.    
aec0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
aed0: 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20  ERR_LOCK:       
aee0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
aef0: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20 20  E_IOERR_LOCK";  
af00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
af10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
af20: 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20 20 20 20  OERR_CLOSE:     
af30: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
af40: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 22 3b  TE_IOERR_CLOSE";
af50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
af60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
af70: 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3a  IOERR_DIR_CLOSE:
af80: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
af90: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c  ITE_IOERR_DIR_CL
afa0: 4f 53 45 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  OSE";   break;. 
afb0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
afc0: 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3a 20  _IOERR_SHMOPEN: 
afd0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
afe0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50  LITE_IOERR_SHMOP
aff0: 45 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  EN";     break;.
b000: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b010: 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3a  E_IOERR_SHMSIZE:
b020: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b030: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
b040: 49 5a 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  IZE";     break;
b050: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b060: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b  TE_IOERR_SHMLOCK
b070: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
b080: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b090: 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72 65 61 6b  LOCK";     break
b0a0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b0b0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
b0c0: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
b0d0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
b0e0: 4d 4d 41 50 22 3b 20 20 20 20 20 20 62 72 65 61  MMAP";      brea
b0f0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b100: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 3a  LITE_IOERR_SEEK:
b110: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b120: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
b130: 45 45 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65  EEK";        bre
b140: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b150: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
b160: 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20  TE_NOENT: zName 
b170: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b180: 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b 62 72  DELETE_NOENT";br
b190: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b1a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
b1b0: 50 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  P:         zName
b1c0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b1d0: 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20 20 20 62  _MMAP";        b
b1e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b1f0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45   SQLITE_IOERR_GE
b200: 54 54 45 4d 50 50 41 54 48 3a 20 20 7a 4e 61 6d  TTEMPPATH:  zNam
b210: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b220: 52 5f 47 45 54 54 45 4d 50 50 41 54 48 22 3b 20  R_GETTEMPPATH"; 
b230: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b240: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e SQLITE_IOERR_C
b250: 4f 4e 56 50 41 54 48 3a 20 20 20 20 20 7a 4e 61  ONVPATH:     zNa
b260: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b270: 52 52 5f 43 4f 4e 56 50 41 54 48 22 3b 20 20 20  RR_CONVPATH";   
b280: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b290: 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  se SQLITE_CORRUP
b2a0: 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  T:            zN
b2b0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b2c0: 52 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20  RRUPT";         
b2d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b2e0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ase SQLITE_CORRU
b2f0: 50 54 5f 56 54 41 42 3a 20 20 20 20 20 20 20 7a  PT_VTAB:       z
b300: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b310: 4f 52 52 55 50 54 5f 56 54 41 42 22 3b 20 20 20  ORRUPT_VTAB";   
b320: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b330: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46  case SQLITE_NOTF
b340: 4f 55 4e 44 3a 20 20 20 20 20 20 20 20 20 20 20  OUND:           
b350: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b360: 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20 20 20  NOTFOUND";      
b370: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b380: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c   case SQLITE_FUL
b390: 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L:              
b3a0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b3b0: 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 20  _FULL";         
b3c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b3d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
b3e0: 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20  NTOPEN:         
b3f0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b400: 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20  E_CANTOPEN";    
b410: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b420: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b430: 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49  ANTOPEN_NOTEMPDI
b440: 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  R: zName = "SQLI
b450: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45  TE_CANTOPEN_NOTE
b460: 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b 0a 20 20  MPDIR";break;.  
b470: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b480: 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3a 20  CANTOPEN_ISDIR: 
b490: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b4a0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44  ITE_CANTOPEN_ISD
b4b0: 49 52 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  IR";    break;. 
b4c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b4d0: 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
b4e0: 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  TH:  zName = "SQ
b4f0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
b500: 4c 4c 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a  LLPATH"; break;.
b510: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b520: 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50  E_CANTOPEN_CONVP
b530: 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ATH:  zName = "S
b540: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43  QLITE_CANTOPEN_C
b550: 4f 4e 56 50 41 54 48 22 3b 20 62 72 65 61 6b 3b  ONVPATH"; break;
b560: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b570: 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 20  TE_PROTOCOL:    
b580: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b590: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22  SQLITE_PROTOCOL"
b5a0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
b5b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b5c0: 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20  ITE_EMPTY:      
b5d0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b5e0: 22 53 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20  "SQLITE_EMPTY"; 
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b600: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b610: 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20 20 20  LITE_SCHEMA:    
b620: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b630: 20 22 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 22   "SQLITE_SCHEMA"
b640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
b650: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b660: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20  QLITE_TOOBIG:   
b670: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b680: 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47  = "SQLITE_TOOBIG
b690: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
b6a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b6b0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b6c0: 54 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  T:         zName
b6d0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
b6e0: 52 41 49 4e 54 22 3b 20 20 20 20 20 20 20 20 62  RAINT";        b
b6f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b700: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
b710: 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61 6d  NT_UNIQUE:  zNam
b720: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
b730: 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b 20  TRAINT_UNIQUE"; 
b740: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b750: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
b760: 49 4e 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e 61  INT_TRIGGER: zNa
b770: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
b780: 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52 22  STRAINT_TRIGGER"
b790: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
b7a0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
b7b0: 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3a  AINT_FOREIGNKEY:
b7c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7e0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b7f0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
b800: 49 47 4e 4b 45 59 22 3b 20 20 20 62 72 65 61 6b  IGNKEY";   break
b810: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b820: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
b830: 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d 20  HECK:   zName = 
b840: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
b850: 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62 72 65 61  NT_CHECK";  brea
b860: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b870: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b880: 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20 20  PRIMARYKEY:.    
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b8b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
b8c0: 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
b8d0: 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  Y";   break;.   
b8e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b8f0: 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c  ONSTRAINT_NOTNUL
b900: 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  L: zName = "SQLI
b910: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f  TE_CONSTRAINT_NO
b920: 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20 20  TNULL";break;.  
b930: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b940: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49  CONSTRAINT_COMMI
b950: 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20 20  THOOK:.         
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b980: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b990: 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20  T_COMMITHOOK";  
b9a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b9b0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
b9c0: 41 49 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a 4e  AINT_VTAB:    zN
b9d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b9e0: 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 22 3b 20  NSTRAINT_VTAB"; 
b9f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ba00: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
ba10: 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a  RAINT_FUNCTION:.
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba40: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ba50: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54  CONSTRAINT_FUNCT
ba60: 49 4f 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ION";     break;
ba70: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ba80: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f  TE_CONSTRAINT_RO
ba90: 57 49 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  WID:   zName = "
baa0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
bab0: 54 5f 52 4f 57 49 44 22 3b 20 20 62 72 65 61 6b  T_ROWID";  break
bac0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bad0: 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20  ITE_MISMATCH:   
bae0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
baf0: 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48  "SQLITE_MISMATCH
bb00: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
bb10: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bb20: 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20  LITE_MISUSE:    
bb30: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bb40: 20 22 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22   "SQLITE_MISUSE"
bb50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
bb60: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bb70: 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20  QLITE_NOLFS:    
bb80: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bb90: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22  = "SQLITE_NOLFS"
bba0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
bbb0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bbc0: 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20  SQLITE_AUTH:    
bbd0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bbe0: 20 3d 20 22 53 51 4c 49 54 45 5f 41 55 54 48 22   = "SQLITE_AUTH"
bbf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
bc00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bc10: 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20   SQLITE_FORMAT: 
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
bc30: 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d  e = "SQLITE_FORM
bc40: 41 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  AT";            
bc50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bc60: 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20  e SQLITE_RANGE: 
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
bc80: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e  me = "SQLITE_RAN
bc90: 47 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  GE";            
bca0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bcb0: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  se SQLITE_NOTADB
bcc0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
bcd0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
bce0: 54 41 44 42 22 3b 20 20 20 20 20 20 20 20 20 20  TADB";          
bcf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bd00: 61 73 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20  ase SQLITE_ROW: 
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
bd20: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
bd30: 4f 57 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  OW";            
bd40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bd50: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49  case SQLITE_NOTI
bd60: 43 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  CE:             
bd70: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bd80: 4e 4f 54 49 43 45 22 3b 20 20 20 20 20 20 20 20  NOTICE";        
bd90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bda0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
bdb0: 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 3a  ICE_RECOVER_WAL:
bdc0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bdd0: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
bde0: 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  WAL";break;.    
bdf0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
be00: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c  TICE_RECOVER_ROL
be10: 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20 20 20 20  LBACK:.         
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
be40: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
be50: 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b  COVER_ROLLBACK";
be60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
be70: 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  se SQLITE_WARNIN
be80: 47 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  G:            zN
be90: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41  ame = "SQLITE_WA
bea0: 52 4e 49 4e 47 22 3b 20 20 20 20 20 20 20 20 20  RNING";         
beb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bec0: 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49  ase SQLITE_WARNI
bed0: 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a 20 20 7a  NG_AUTOINDEX:  z
bee0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57  Name = "SQLITE_W
bef0: 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58  ARNING_AUTOINDEX
bf00: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
bf10: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45  case SQLITE_DONE
bf20: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
bf30: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bf40: 44 4f 4e 45 22 3b 20 20 20 20 20 20 20 20 20 20  DONE";          
bf50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bf60: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65  .  }.  if( zName
bf70: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69  ==0 ){.    stati
bf80: 63 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b  c char zBuf[50];
bf90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
bfa0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
bfb0: 66 29 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49 54  f), zBuf, "SQLIT
bfc0: 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c 20  E_UNKNOWN(%d)", 
bfd0: 6f 72 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e 61  origRc);.    zNa
bfe0: 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20  me = zBuf;.  }. 
bff0: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
c000: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
c010: 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73  eturn a static s
c020: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
c030: 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66  ibes the kind of
c040: 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64   error specified
c050: 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d   in the.** argum
c060: 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ent..*/.const ch
c070: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74  ar *sqlite3ErrSt
c080: 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61  r(int rc){.  sta
c090: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20  tic const char* 
c0a0: 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b  const aMsg[] = {
c0b0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  .    /* SQLITE_O
c0c0: 4b 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e  K          */ "n
c0d0: 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20  ot an error",.  
c0e0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f    /* SQLITE_ERRO
c0f0: 52 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20  R       */ "SQL 
c100: 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d  logic error or m
c110: 69 73 73 69 6e 67 20 64 61 74 61 62 61 73 65 22  issing database"
c120: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c130: 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30  INTERNAL    */ 0
c140: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c150: 50 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20 22  PERM        */ "
c160: 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
c170: 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f  n denied",.    /
c180: 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 20  * SQLITE_ABORT  
c190: 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61 63       */ "callbac
c1a0: 6b 20 72 65 71 75 65 73 74 65 64 20 71 75 65 72  k requested quer
c1b0: 79 20 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f 2a  y abort",.    /*
c1c0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20 20   SQLITE_BUSY    
c1d0: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
c1e0: 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20   is locked",.   
c1f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   /* SQLITE_LOCKE
c200: 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  D      */ "datab
c210: 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63  ase table is loc
c220: 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ked",.    /* SQL
c230: 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20  ITE_NOMEM       
c240: 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  */ "out of memor
c250: 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  y",.    /* SQLIT
c260: 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f  E_READONLY    */
c270: 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69   "attempt to wri
c280: 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61  te a readonly da
c290: 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20  tabase",.    /* 
c2a0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
c2b0: 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70 74     */ "interrupt
c2c0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c2d0: 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20 2a  TE_IOERR       *
c2e0: 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f  / "disk I/O erro
c2f0: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
c300: 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a 2f  E_CORRUPT     */
c310: 20 22 64 61 74 61 62 61 73 65 20 64 69 73 6b 20   "database disk 
c320: 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d  image is malform
c330: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
c340: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a  TE_NOTFOUND    *
c350: 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61  / "unknown opera
c360: 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51  tion",.    /* SQ
c370: 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20  LITE_FULL       
c380: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f 72   */ "database or
c390: 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a   disk is full",.
c3a0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41      /* SQLITE_CA
c3b0: 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e  NTOPEN    */ "un
c3c0: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
c3d0: 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20 20  abase file",.   
c3e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f   /* SQLITE_PROTO
c3f0: 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69  COL    */ "locki
c400: 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20  ng protocol",.  
c410: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54    /* SQLITE_EMPT
c420: 59 20 20 20 20 20 20 20 2a 2f 20 22 74 61 62 6c  Y       */ "tabl
c430: 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61  e contains no da
c440: 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ta",.    /* SQLI
c450: 54 45 5f 53 43 48 45 4d 41 20 20 20 20 20 20 2a  TE_SCHEMA      *
c460: 2f 20 22 64 61 74 61 62 61 73 65 20 73 63 68 65  / "database sche
c470: 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64 22 2c  ma has changed",
c480: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54  .    /* SQLITE_T
c490: 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f 20 22 73  OOBIG      */ "s
c4a0: 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f  tring or blob to
c4b0: 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53  o big",.    /* S
c4c0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c4d0: 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74    */ "constraint
c4e0: 20 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a   failed",.    /*
c4f0: 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48   SQLITE_MISMATCH
c500: 20 20 20 20 2a 2f 20 22 64 61 74 61 74 79 70 65      */ "datatype
c510: 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20 20 20   mismatch",.    
c520: 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  /* SQLITE_MISUSE
c530: 20 20 20 20 20 20 2a 2f 20 22 6c 69 62 72 61 72        */ "librar
c540: 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64  y routine called
c550: 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65   out of sequence
c560: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c570: 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20  _NOLFS       */ 
c580: 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70  "large file supp
c590: 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65 64 22  ort is disabled"
c5a0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c5b0: 41 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20 22  AUTH        */ "
c5c0: 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65  authorization de
c5d0: 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  nied",.    /* SQ
c5e0: 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20  LITE_FORMAT     
c5f0: 20 2a 2f 20 22 61 75 78 69 6c 69 61 72 79 20 64   */ "auxiliary d
c600: 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20 65  atabase format e
c610: 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rror",.    /* SQ
c620: 4c 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20 20  LITE_RANGE      
c630: 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c   */ "bind or col
c640: 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66  umn index out of
c650: 20 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20   range",.    /* 
c660: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20 20  SQLITE_NOTADB   
c670: 20 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20 65     */ "file is e
c680: 6e 63 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e  ncrypted or is n
c690: 6f 74 20 61 20 64 61 74 61 62 61 73 65 22 2c 0a  ot a database",.
c6a0: 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61    };.  const cha
c6b0: 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f  r *zErr = "unkno
c6c0: 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73 77 69  wn error";.  swi
c6d0: 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63  tch( rc ){.    c
c6e0: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
c6f0: 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20 20  _ROLLBACK: {.   
c700: 20 20 20 7a 45 72 72 20 3d 20 22 61 62 6f 72 74     zErr = "abort
c710: 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43 4b   due to ROLLBACK
c720: 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";.      break;.
c730: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
c740: 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 26 3d  t: {.      rc &=
c750: 20 30 78 66 66 3b 0a 20 20 20 20 20 20 69 66 28   0xff;.      if(
c760: 20 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20 26   ALWAYS(rc>=0) &
c770: 26 20 72 63 3c 41 72 72 61 79 53 69 7a 65 28 61  & rc<ArraySize(a
c780: 4d 73 67 29 20 26 26 20 61 4d 73 67 5b 72 63 5d  Msg) && aMsg[rc]
c790: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  !=0 ){.        z
c7a0: 45 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a  Err = aMsg[rc];.
c7b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
c7c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
c7d0: 20 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a   return zErr;.}.
c7e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
c7f0: 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61  ine implements a
c800: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74   busy callback t
c810: 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20 74  hat sleeps and t
c820: 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e  ries.** again un
c830: 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76 61  til a timeout va
c840: 6c 75 65 20 69 73 20 72 65 61 63 68 65 64 2e 20  lue is reached. 
c850: 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61 6c   The timeout val
c860: 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65  ue is.** an inte
c870: 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  ger number of mi
c880: 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73 65  lliseconds passe
c890: 64 20 69 6e 20 61 73 20 74 68 65 20 66 69 72 73  d in as the firs
c8a0: 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  t.** argument..*
c8b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
c8c0: 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61  iteDefaultBusyCa
c8d0: 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70  llback(. void *p
c8e0: 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
c8f0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
c900: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74  nnection */. int
c910: 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20 20   count          
c920: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c930: 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68  of times table h
c940: 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a  as been busy */.
c950: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
c960: 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f 55 53 4c  _WIN || HAVE_USL
c970: 45 45 50 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  EEP.  static con
c980: 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d  st u8 delays[] =
c990: 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c  .     { 1, 2, 5,
c9a0: 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c   10, 15, 20, 25,
c9b0: 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20   25,  25,  50,  
c9c0: 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61  50, 100 };.  sta
c9d0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74  tic const u8 tot
c9e0: 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30  als[] =.     { 0
c9f0: 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20  , 1, 3,  8, 18, 
ca00: 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c  33, 53, 78, 103,
ca10: 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d   128, 178, 228 }
ca20: 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41  ;.# define NDELA
ca30: 59 20 41 72 72 61 79 53 69 7a 65 28 64 65 6c 61  Y ArraySize(dela
ca40: 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ys).  sqlite3 *d
ca50: 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70  b = (sqlite3 *)p
ca60: 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75  tr;.  int timeou
ca70: 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d 65  t = db->busyTime
ca80: 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79  out;.  int delay
ca90: 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73 65  , prior;..  asse
caa0: 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a  rt( count>=0 );.
cab0: 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44    if( count < ND
cac0: 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c 61  ELAY ){.    dela
cad0: 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74  y = delays[count
cae0: 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74  ];.    prior = t
caf0: 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20  otals[count];.  
cb00: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61 79  }else{.    delay
cb10: 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59   = delays[NDELAY
cb20: 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  -1];.    prior =
cb30: 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31   totals[NDELAY-1
cb40: 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74  ] + delay*(count
cb50: 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20  -(NDELAY-1));.  
cb60: 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b 20  }.  if( prior + 
cb70: 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74 20  delay > timeout 
cb80: 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 74  ){.    delay = t
cb90: 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a  imeout - prior;.
cba0: 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d 30      if( delay<=0
cbb0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
cbc0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
cbd0: 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61  p(db->pVfs, dela
cbe0: 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  y*1000);.  retur
cbf0: 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  n 1;.#else.  sql
cc00: 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69  ite3 *db = (sqli
cc10: 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74  te3 *)ptr;.  int
cc20: 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73 71 6c   timeout = ((sql
cc30: 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75 73  ite3 *)ptr)->bus
cc40: 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20  yTimeout;.  if( 
cc50: 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e  (count+1)*1000 >
cc60: 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20   timeout ){.    
cc70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
cc80: 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64  sqlite3OsSleep(d
cc90: 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30 30  b->pVfs, 1000000
cca0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  );.  return 1;.#
ccb0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  endif.}../*.** I
ccc0: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
ccd0: 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a  busy handler..**
cce0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ccf0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
cd00: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69  an operation fai
cd10: 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63 6b 2e  led with a lock.
cd20: 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74  .** If this rout
cd30: 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ine returns non-
cd40: 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
cd50: 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20 69  s retried.  If i
cd60: 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c 20  t.** returns 0, 
cd70: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 62  the operation ab
cd80: 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51 4c  orts with an SQL
cd90: 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a  ITE_BUSY error..
cda0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
cdb0: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
cdc0: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 29 7b  BusyHandler *p){
cdd0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
cde0: 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c 7c 20   NEVER(p==0) || 
cdf0: 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20 70  p->xFunc==0 || p
ce00: 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75  ->nBusy<0 ) retu
ce10: 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d 3e  rn 0;.  rc = p->
ce20: 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70  xFunc(p->pArg, p
ce30: 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66 28 20  ->nBusy);.  if( 
ce40: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  rc==0 ){.    p->
ce50: 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65  nBusy = -1;.  }e
ce60: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73  lse{.    p->nBus
ce70: 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  y++;.  }.  retur
ce80: 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n rc; .}../*.** 
ce90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
cea0: 73 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  s the busy callb
ceb0: 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74  ack for an Sqlit
cec0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
ced0: 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62  e.** given callb
cee0: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ack function wit
cef0: 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75  h the given argu
cf00: 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
cf10: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
cf20: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
cf30: 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29  ,.  int (*xBusy)
cf40: 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76  (void*,int),.  v
cf50: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66  oid *pArg.){.#if
cf60: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
cf70: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
cf80: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
cf90: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
cfa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
cfb0: 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
cfc0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
cfd0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
cfe0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
cff0: 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73  ler.xFunc = xBus
d000: 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  y;.  db->busyHan
d010: 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67  dler.pArg = pArg
d020: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
d030: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
d040: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
d050: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
d060: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
d070: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
d080: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
d090: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d0a0: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
d0b0: 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BACK./*.** This 
d0c0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
d0d0: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
d0e0: 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65  ck for an Sqlite
d0f0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65   database to the
d100: 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  .** given callba
d110: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ck function with
d120: 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d   the given argum
d130: 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73  ent. The progres
d140: 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a  s callback will.
d150: 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76  ** be invoked ev
d160: 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73  ery nOps opcodes
d170: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d180: 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  3_progress_handl
d190: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  er(.  sqlite3 *d
d1a0: 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a  b, .  int nOps,.
d1b0: 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73    int (*xProgres
d1c0: 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f  s)(void*), .  vo
d1d0: 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64  id *pArg.){.#ifd
d1e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
d1f0: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
d200: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
d210: 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
d220: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
d230: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
d240: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
d250: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
d260: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
d270: 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e  ex);.  if( nOps>
d280: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72  0 ){.    db->xPr
d290: 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72 65  ogress = xProgre
d2a0: 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f  ss;.    db->nPro
d2b0: 67 72 65 73 73 4f 70 73 20 3d 20 28 75 6e 73 69  gressOps = (unsi
d2c0: 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20 20 20 64  gned)nOps;.    d
d2d0: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20  b->pProgressArg 
d2e0: 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b  = pArg;.  }else{
d2f0: 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65  .    db->xProgre
d300: 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e  ss = 0;.    db->
d310: 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30  nProgressOps = 0
d320: 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72  ;.    db->pProgr
d330: 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a  essArg = 0;.  }.
d340: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d350: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
d360: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
d370: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d380: 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75  installs a defau
d390: 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  lt busy handler 
d3a0: 74 68 61 74 20 77 61 69 74 73 20 66 6f 72 20 74  that waits for t
d3b0: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  he.** specified 
d3c0: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
d3d0: 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65  econds before re
d3e0: 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e  turning 0..*/.in
d3f0: 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74  t sqlite3_busy_t
d400: 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a  imeout(sqlite3 *
d410: 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 23 69 66  db, int ms){.#if
d420: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
d430: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
d440: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
d450: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
d460: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
d470: 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
d480: 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20    if( ms>0 ){.  
d490: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
d4a0: 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74  andler(db, sqlit
d4b0: 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c  eDefaultBusyCall
d4c0: 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29  back, (void*)db)
d4d0: 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69  ;.    db->busyTi
d4e0: 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 7d 65  meout = ms;.  }e
d4f0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
d500: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62  _busy_handler(db
d510: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
d520: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20  .}../*.** Cause 
d540: 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72  any pending oper
d550: 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74  ation to stop at
d560: 20 69 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70   its earliest op
d570: 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f  portunity..*/.vo
d580: 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  id sqlite3_inter
d590: 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62  rupt(sqlite3 *db
d5a0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
d5b0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
d5c0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
d5d0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
d5e0: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
d5f0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
d600: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
d610: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e   }.#endif.  db->
d620: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
d630: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
d640: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
d650: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
d660: 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65  e as sqlite3_cre
d670: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  ate_function(), 
d680: 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69  except.** that i
d690: 74 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  t is designed to
d6a0: 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e   be called by in
d6b0: 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65  ternal code. The
d6c0: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a   difference is.*
d6d0: 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c  * that if a mall
d6e0: 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71  oc() fails in sq
d6f0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
d700: 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f  ction(), an erro
d710: 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74  r code.** is ret
d720: 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61  urned and the ma
d730: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
d740: 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74  cleared. .*/.int
d750: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
d760: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nc(.  sqlite3 *d
d770: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
d780: 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a  *zFunctionName,.
d790: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
d7a0: 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70  t enc,.  void *p
d7b0: 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64  UserData,.  void
d7c0: 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74   (*xSFunc)(sqlit
d7d0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
d7e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
d7f0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
d800: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
d810: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
d820: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
d830: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
d840: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20  te3_context*),. 
d850: 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20   FuncDestructor 
d860: 2a 70 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a  *pDestructor.){.
d870: 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20    FuncDef *p;.  
d880: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74  int nName;.  int
d890: 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20   extraFlags;..  
d8a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d8b0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
d8c0: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a  utex) );.  if( z
d8d0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20  FunctionName==0 
d8e0: 7c 7c 0a 20 20 20 20 20 20 28 78 53 46 75 6e 63  ||.      (xSFunc
d8f0: 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78   && (xFinal || x
d900: 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20  Step)) || .     
d910: 20 28 21 78 53 46 75 6e 63 20 26 26 20 28 78 46   (!xSFunc && (xF
d920: 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29 29  inal && !xStep))
d930: 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 53 46 75   ||.      (!xSFu
d940: 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26  nc && (!xFinal &
d950: 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20  & xStep)) ||.   
d960: 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e     (nArg<-1 || n
d970: 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46  Arg>SQLITE_MAX_F
d980: 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a  UNCTION_ARG) ||.
d990: 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d        (255<(nNam
d9a0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
d9b0: 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  n30( zFunctionNa
d9c0: 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74  me))) ){.    ret
d9d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
d9e0: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 61  E_BKPT;.  }..  a
d9f0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
da00: 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c  NC_CONSTANT==SQL
da10: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
da20: 43 20 29 3b 0a 20 20 65 78 74 72 61 46 6c 61 67  C );.  extraFlag
da30: 73 20 3d 20 65 6e 63 20 26 20 20 53 51 4c 49 54  s = enc &  SQLIT
da40: 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 3b  E_DETERMINISTIC;
da50: 0a 20 20 65 6e 63 20 26 3d 20 28 53 51 4c 49 54  .  enc &= (SQLIT
da60: 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53  E_FUNC_ENCMASK|S
da70: 51 4c 49 54 45 5f 41 4e 59 29 3b 0a 20 20 0a 23  QLITE_ANY);.  .#
da80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
da90: 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66  IT_UTF16.  /* If
daa0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
dab0: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
dac0: 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
dad0: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
dae0: 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
daf0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
db00: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
db10: 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
db20: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
db30: 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
db40: 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
db50: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
db60: 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54  **.  ** If SQLIT
db70: 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66 69  E_ANY is specifi
db80: 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76 65  ed, add three ve
db90: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75  rsions of the fu
dba0: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74  nction.  ** to t
dbb0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20  he hash table.. 
dbc0: 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53   */.  if( enc==S
dbd0: 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20  QLITE_UTF16 ){. 
dbe0: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
dbf0: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
dc00: 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51  else if( enc==SQ
dc10: 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20  LITE_ANY ){.    
dc20: 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  int rc;.    rc =
dc30: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
dc40: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
dc50: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
dc60: 54 45 5f 55 54 46 38 7c 65 78 74 72 61 46 6c 61  TE_UTF8|extraFla
dc70: 67 73 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73  gs,.         pUs
dc80: 65 72 44 61 74 61 2c 20 78 53 46 75 6e 63 2c 20  erData, xSFunc, 
dc90: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70  xStep, xFinal, p
dca0: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
dcb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
dcc0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
dcd0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
dce0: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
dcf0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
dd00: 54 45 5f 55 54 46 31 36 4c 45 7c 65 78 74 72 61  TE_UTF16LE|extra
dd10: 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
dd20: 20 70 55 73 65 72 44 61 74 61 2c 20 78 53 46 75   pUserData, xSFu
dd30: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
dd40: 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b  l, pDestructor);
dd50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
dd60: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
dd70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
dd80: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d  .    }.    enc =
dd90: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b   SQLITE_UTF16BE;
dda0: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63  .  }.#else.  enc
ddb0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
ddc0: 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43  #endif.  .  /* C
ddd0: 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74  heck if an exist
dde0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ing function is 
ddf0: 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e  being overridden
de00: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20   or deleted. If 
de10: 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  so,.  ** and the
de20: 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d  re are active VM
de30: 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53  s, then return S
de40: 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61  QLITE_BUSY. If a
de50: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
de60: 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64  s being overridd
de70: 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74  en/deleted but t
de80: 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69  here are no acti
de90: 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68  ve VMs, allow th
dea0: 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  e.  ** operation
deb0: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74   to continue but
dec0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
ded0: 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  precompiled stat
dee0: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70  ements..  */.  p
def0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
df00: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63  nction(db, zFunc
df10: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  tionName, nName,
df20: 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20   nArg, (u8)enc, 
df30: 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20 28  0);.  if( p && (
df40: 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  p->funcFlags & S
df50: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41  QLITE_FUNC_ENCMA
df60: 53 4b 29 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e  SK)==enc && p->n
df70: 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20  Arg==nArg ){.   
df80: 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63   if( db->nVdbeAc
df90: 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71  tive ){.      sq
dfa0: 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
dfb0: 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  g(db, SQLITE_BUS
dfc0: 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61  Y, .        "una
dfd0: 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f  ble to delete/mo
dfe0: 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74 69  dify user-functi
dff0: 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76 65  on due to active
e000: 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20   statements");. 
e010: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
e020: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e030: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
e040: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
e050: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
e060: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
e070: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
e080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
e090: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
e0a0: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63  nction(db, zFunc
e0b0: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  tionName, nName,
e0c0: 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20   nArg, (u8)enc, 
e0d0: 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c  1);.  assert(p |
e0e0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
e0f0: 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  ed);.  if( !p ){
e100: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e110: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
e120: 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72 20   /* If an older 
e130: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 66  version of the f
e140: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20 63  unction with a c
e150: 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74 72 75  onfigured destru
e160: 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65 69  ctor is.  ** bei
e170: 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76 6f  ng replaced invo
e180: 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
e190: 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e  r function here.
e1a0: 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44 65   */.  functionDe
e1b0: 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a 20  stroy(db, p);.. 
e1c0: 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72   if( pDestructor
e1d0: 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63   ){.    pDestruc
e1e0: 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  tor->nRef++;.  }
e1f0: 0a 20 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f  .  p->pDestructo
e200: 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72 3b  r = pDestructor;
e210: 0a 20 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  .  p->funcFlags 
e220: 3d 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  = (p->funcFlags 
e230: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e  & SQLITE_FUNC_EN
e240: 43 4d 41 53 4b 29 20 7c 20 65 78 74 72 61 46 6c  CMASK) | extraFl
e250: 61 67 73 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ags;.  testcase(
e260: 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20   p->funcFlags & 
e270: 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
e280: 53 54 49 43 20 29 3b 0a 20 20 70 2d 3e 78 53 46  STIC );.  p->xSF
e290: 75 6e 63 20 3d 20 78 53 46 75 6e 63 20 3f 20 78  unc = xSFunc ? x
e2a0: 53 46 75 6e 63 20 3a 20 78 53 74 65 70 3b 0a 20  SFunc : xStep;. 
e2b0: 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20   p->xFinalize = 
e2c0: 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73  xFinal;.  p->pUs
e2d0: 65 72 44 61 74 61 20 3d 20 70 55 73 65 72 44 61  erData = pUserDa
e2e0: 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20  ta;.  p->nArg = 
e2f0: 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72 65 74  (u16)nArg;.  ret
e300: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e310: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e  ../*.** Create n
e320: 65 77 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  ew user function
e330: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
e340: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
e350: 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n(.  sqlite3 *db
e360: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
e370: 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72  zFunc,.  int nAr
e380: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
e390: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
e3a0: 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65  (*xSFunc)(sqlite
e3b0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
e3c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
e3d0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
e3e0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e3f0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
e400: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
e410: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
e420: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a  e3_context*).){.
e430: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
e440: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
e450: 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e  _v2(db, zFunc, n
e460: 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 53 46  Arg, enc, p, xSF
e470: 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20  unc, xStep,.    
e480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69  xFinal, 0);.}..i
e4b0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
e4c0: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20  e_function_v2(. 
e4d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
e4e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
e4f0: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
e500: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
e510: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53   *p,.  void (*xS
e520: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
e530: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
e540: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
e550: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
e560: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
e570: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
e580: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
e590: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
e5a0: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64  ontext*),.  void
e5b0: 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69   (*xDestroy)(voi
e5c0: 64 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d *).){.  int rc
e5d0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
e5e0: 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f  .  FuncDestructo
e5f0: 72 20 2a 70 41 72 67 20 3d 20 30 3b 0a 0a 23 69  r *pArg = 0;..#i
e600: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
e610: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
e620: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
e630: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
e640: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e650: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
e660: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
e670: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
e680: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
e690: 28 20 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  ( xDestroy ){.  
e6a0: 20 20 70 41 72 67 20 3d 20 28 46 75 6e 63 44 65    pArg = (FuncDe
e6b0: 73 74 72 75 63 74 6f 72 20 2a 29 73 71 6c 69 74  structor *)sqlit
e6c0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
e6d0: 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63 44 65  b, sizeof(FuncDe
e6e0: 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20  structor));.    
e6f0: 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20  if( !pArg ){.   
e700: 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a     xDestroy(p);.
e710: 20 20 20 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a        goto out;.
e720: 20 20 20 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e      }.    pArg->
e730: 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74  xDestroy = xDest
e740: 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70  roy;.    pArg->p
e750: 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20  UserData = p;.  
e760: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
e770: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
e780: 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Func, nArg, enc,
e790: 20 70 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65   p, xSFunc, xSte
e7a0: 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41 72 67 29  p, xFinal, pArg)
e7b0: 3b 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20  ;.  if( pArg && 
e7c0: 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  pArg->nRef==0 ){
e7d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
e7e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
e7f0: 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20    xDestroy(p);. 
e800: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
e810: 28 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a  (db, pArg);.  }.
e820: 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73 71  . out:.  rc = sq
e830: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
e840: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
e850: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
e860: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
e870: 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
e880: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
e890: 36 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  6.int sqlite3_cr
e8a0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28  eate_function16(
e8b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
e8c0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46    const void *zF
e8d0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69  unctionName,.  i
e8e0: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
e8f0: 54 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64 20  TextRep,.  void 
e900: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46  *p,.  void (*xSF
e910: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
e920: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
e930: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
e940: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
e950: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
e960: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
e970: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
e980: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
e990: 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  ext*).){.  int r
e9a0: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63  c;.  char *zFunc
e9b0: 38 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  8;..#ifdef SQLIT
e9c0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
e9d0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
e9e0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
e9f0: 62 29 20 7c 7c 20 7a 46 75 6e 63 74 69 6f 6e 4e  b) || zFunctionN
ea00: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ame==0 ) return 
ea10: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
ea20: 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
ea30: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
ea40: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
ea50: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
ea60: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46  ocFailed );.  zF
ea70: 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55 74  unc8 = sqlite3Ut
ea80: 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63  f16to8(db, zFunc
ea90: 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  tionName, -1, SQ
eaa0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
eab0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
eac0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
ead0: 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65 54  zFunc8, nArg, eT
eae0: 65 78 74 52 65 70 2c 20 70 2c 20 78 53 46 75 6e  extRep, p, xSFun
eaf0: 63 2c 78 53 74 65 70 2c 78 46 69 6e 61 6c 2c 30  c,xStep,xFinal,0
eb00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
eb10: 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a  ee(db, zFunc8);.
eb20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
eb30: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
eb40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
eb50: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
eb60: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
eb70: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
eb80: 65 63 6c 61 72 65 20 74 68 61 74 20 61 20 66 75  eclare that a fu
eb90: 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20  nction has been 
eba0: 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20  overloaded by a 
ebb0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
ebc0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63  *.** If the func
ebd0: 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69  tion already exi
ebe0: 73 74 73 20 61 73 20 61 20 72 65 67 75 6c 61 72  sts as a regular
ebf0: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
ec00: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
ec10: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
ec20: 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63 74  p.  If the funct
ec30: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ion does not exi
ec40: 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a  st, then create.
ec50: 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61  ** a new one tha
ec60: 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20  t always throws 
ec70: 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72  a run-time error
ec80: 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76  .  .**.** When v
ec90: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e  irtual tables in
eca0: 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20  tend to provide 
ecb0: 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75  an overloaded fu
ecc0: 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20  nction, they.** 
ecd0: 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73  should call this
ece0: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65   routine to make
ecf0: 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c   sure the global
ed00: 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73   function exists
ed10: 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75  ..** A global fu
ed20: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73  nction must exis
ed30: 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e  t in order for n
ed40: 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74  ame resolution t
ed50: 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72  o work.** proper
ed60: 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
ed70: 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63  e3_overload_func
ed80: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  tion(.  sqlite3 
ed90: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
eda0: 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  r *zName,.  int 
edb0: 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20 6e 4e  nArg.){.  int nN
edc0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
edd0: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20  len30(zName);.  
ede0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
edf0: 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  OK;..#ifdef SQLI
ee00: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
ee10: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
ee20: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
ee30: 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20  db) || zName==0 
ee40: 7c 7c 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20  || nArg<-2 ){.  
ee50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ee60: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
ee70: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
ee80: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
ee90: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
eea0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
eeb0: 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  ion(db, zName, n
eec0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
eed0: 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29  TE_UTF8, 0)==0 )
eee0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
eef0: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
ef00: 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51   zName, nArg, SQ
ef10: 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20  LITE_UTF8,.     
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef30: 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33        0, sqlite3
ef40: 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c  InvalidFunction,
ef50: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 0, 0);.  }. 
ef60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
ef70: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
ef80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ef90: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
efa0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
efb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
efc0: 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  MIT_TRACE./*.** 
efd0: 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65  Register a trace
efe0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
eff0: 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
f000: 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
f010: 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20  red trace.** is 
f020: 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a  returned.  .**.*
f030: 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66  * A NULL trace f
f040: 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  unction means th
f050: 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73  at no tracing is
f060: 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
f070: 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20  n-NULL.** trace 
f080: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
f090: 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
f0a0: 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  is invoked at th
f0b0: 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a  e start of each.
f0c0: 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
f0d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
f0e0: 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33  e3_trace(sqlite3
f0f0: 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72   *db, void (*xTr
f100: 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  ace)(void*,const
f110: 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70   char*), void *p
f120: 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  Arg){.  void *pO
f130: 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ld;..#ifdef SQLI
f140: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
f150: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
f160: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
f170: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
f180: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
f190: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
f1a0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
f1b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
f1c0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
f1d0: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72    pOld = db->pTr
f1e0: 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54  aceArg;.  db->xT
f1f0: 72 61 63 65 20 3d 20 78 54 72 61 63 65 3b 0a 20  race = xTrace;. 
f200: 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d   db->pTraceArg =
f210: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
f220: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
f230: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
f240: 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  n pOld;.}./*.** 
f250: 52 65 67 69 73 74 65 72 20 61 20 70 72 6f 66 69  Register a profi
f260: 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  le function.  Th
f270: 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20  e pArg from the 
f280: 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
f290: 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c  tered .** profil
f2a0: 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  e function is re
f2b0: 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
f2c0: 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66  A NULL profile f
f2d0: 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  unction means th
f2e0: 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20  at no profiling 
f2f0: 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20  is executes.  A 
f300: 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66  non-NULL.** prof
f310: 69 6c 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ile is a pointer
f320: 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
f330: 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  hat is invoked a
f340: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
f350: 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20   of.** each SQL 
f360: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69  statement that i
f370: 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  s run..*/.void *
f380: 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28  sqlite3_profile(
f390: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
f3a0: 20 20 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c    void (*xProfil
f3b0: 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
f3c0: 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74  har*,sqlite_uint
f3d0: 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  64),.  void *pAr
f3e0: 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  g.){.  void *pOl
f3f0: 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d;..#ifdef SQLIT
f400: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
f410: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
f420: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
f430: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
f440: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
f450: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
f460: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
f470: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
f480: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
f490: 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f   pOld = db->pPro
f4a0: 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  fileArg;.  db->x
f4b0: 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69  Profile = xProfi
f4c0: 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69  le;.  db->pProfi
f4d0: 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  leArg = pArg;.  
f4e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f4f0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
f500: 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d    return pOld;.}
f510: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
f520: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a  E_OMIT_TRACE */.
f530: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
f540: 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  a function to be
f550: 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20   invoked when a 
f560: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
f570: 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  its..** If the i
f580: 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20  nvoked function 
f590: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
f5a0: 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69  , then the commi
f5b0: 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72  t becomes a.** r
f5c0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64  ollback..*/.void
f5d0: 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74   *sqlite3_commit
f5e0: 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
f5f0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
f600: 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
f610: 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
f620: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
f630: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
f640: 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f  d*),  /* Functio
f650: 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65  n to invoke on e
f660: 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20  ach commit */.  
f670: 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
f680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
f690: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
f6a0: 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ction */.){.  vo
f6b0: 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65  id *pOld;..#ifde
f6c0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
f6d0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
f6e0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
f6f0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
f700: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
f710: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
f720: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
f730: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
f740: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
f750: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
f760: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20  b->pCommitArg;. 
f770: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
f780: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
f790: 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ;.  db->pCommitA
f7a0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
f7b0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f7c0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
f7d0: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f  eturn pOld;.}../
f7e0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
f7f0: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
f800: 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
f810: 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65   a row is update
f820: 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f  d,.** inserted o
f830: 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  r deleted using 
f840: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
f850: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
f860: 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74  d *sqlite3_updat
f870: 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  e_hook(.  sqlite
f880: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
f890: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
f8a0: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
f8b0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
f8c0: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
f8d0: 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f  oid*,int,char co
f8e0: 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74  nst *,char const
f8f0: 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29   *,sqlite_int64)
f900: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f920: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
f930: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
f940: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23    void *pRet;..#
f950: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f960: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
f970: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
f980: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
f990: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
f9a0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
f9b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f9c0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
f9d0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
f9e0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
f9f0: 20 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72   = db->pUpdateAr
fa00: 67 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65  g;.  db->xUpdate
fa10: 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
fa20: 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64  back;.  db->pUpd
fa30: 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ateArg = pArg;. 
fa40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
fa50: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
fa60: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
fa70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
fa80: 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
fa90: 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
faa0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
fab0: 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20  on is rolled.** 
fac0: 62 61 63 6b 20 62 79 20 74 68 69 73 20 64 61 74  back by this dat
fad0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
fae0: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
faf0: 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b  e3_rollback_hook
fb00: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
fb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fb20: 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
fb30: 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
fb40: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  e */.  void (*xC
fb50: 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c  allback)(void*),
fb60: 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e   /* Callback fun
fb70: 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20  ction */.  void 
fb80: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
fb90: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
fba0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
fbb0: 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
fbc0: 52 65 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  Ret;..#ifdef SQL
fbd0: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
fbe0: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
fbf0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
fc00: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
fc10: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
fc20: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
fc30: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
fc40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
fc50: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
fc60: 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52  .  pRet = db->pR
fc70: 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62  ollbackArg;.  db
fc80: 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62  ->xRollbackCallb
fc90: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
fca0: 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  .  db->pRollback
fcb0: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
fcc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
fcd0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
fce0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
fcf0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
fd00: 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48  ABLE_PREUPDATE_H
fd10: 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  OOK./*.** Regist
fd20: 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
fd30: 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
fd40: 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75   time a row is u
fd50: 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72  pdated,.** inser
fd60: 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75  ted or deleted u
fd70: 73 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61  sing this databa
fd80: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
fd90: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
fda0: 70 72 65 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a  preupdate_hook(.
fdb0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
fdd0: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
fde0: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
fdf0: 2a 2f 0a 20 20 76 6f 69 64 28 2a 78 43 61 6c 6c  */.  void(*xCall
fe00: 62 61 63 6b 29 28 20 20 20 20 20 20 20 20 20 2f  back)(         /
fe10: 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  * Callback funct
fe20: 69 6f 6e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 2a  ion */.    void*
fe30: 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 2c 63 68  ,sqlite3*,int,ch
fe40: 61 72 20 63 6f 6e 73 74 2a 2c 63 68 61 72 20 63  ar const*,char c
fe50: 6f 6e 73 74 2a 2c 73 71 6c 69 74 65 33 5f 69 6e  onst*,sqlite3_in
fe60: 74 36 34 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36  t64,sqlite3_int6
fe70: 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  4),.  void *pArg
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe90: 2f 2a 20 46 69 72 73 74 20 63 61 6c 6c 62 61 63  /* First callbac
fea0: 6b 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  k argument */.){
feb0: 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20  .  void *pRet;. 
fec0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
fed0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
fee0: 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 50  .  pRet = db->pP
fef0: 72 65 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64  reUpdateArg;.  d
ff00: 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c  b->xPreUpdateCal
ff10: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
ff20: 6b 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64  k;.  db->pPreUpd
ff30: 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ateArg = pArg;. 
ff40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
ff50: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
ff60: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
ff70: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ff80: 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
ff90: 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66  ATE_HOOK */..#if
ffa0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ffb0: 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  _WAL./*.** The s
ffc0: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
ffd0: 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73  ) callback regis
ffe0: 74 65 72 65 64 20 62 79 20 73 71 6c 69 74 65 33  tered by sqlite3
fff0: 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
10000 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65  int()..** Invoke
10010 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
10020 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e  ckpoint if the n
10030 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20  umber of frames 
10040 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a  in the log file.
10050 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
10060 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41  an sqlite3.pWalA
10070 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e  rg cast to an in
10080 74 65 67 65 72 20 28 74 68 65 20 76 61 6c 75 65  teger (the value
10090 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a   configured by.*
100a0 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  * wal_autocheckp
100b0 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74  oint())..*/ .int
100c0 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75   sqlite3WalDefau
100d0 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a  ltHook(.  void *
100e0 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20  pClientData,    
100f0 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a   /* Argument */.
10100 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
10110 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e           /* Conn
10120 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73  ection */.  cons
10130 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
10140 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a     /* Database *
10150 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20  /.  int nFrame  
10160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
10170 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a  ze of WAL */.){.
10180 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51    if( nFrame>=SQ
10190 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
101a0 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a  pClientData) ){.
101b0 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
101c0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
101d0 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
101e0 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a  checkpoint(db, z
101f0 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
10200 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
10210 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
10220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
10230 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
10240 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
10250 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71   Configure an sq
10260 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
10270 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74   callback to aut
10280 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b  omatically check
10290 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62  point.** a datab
102a0 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74  ase after commit
102b0 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
102c0 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  on if there are 
102d0 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72  nFrame or.** mor
102e0 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20  e frames in the 
102f0 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e  log file. Passin
10300 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61  g zero or a nega
10310 74 69 76 65 20 76 61 6c 75 65 20 61 73 20 74 68  tive value as th
10320 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61  e.** nFrame para
10330 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73 20 61  meter disables a
10340 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f  utomatic checkpo
10350 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a  ints entirely..*
10360 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63  *.** The callbac
10370 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20  k registered by 
10380 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
10390 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73 74  places any exist
103a0 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  ing callback.** 
103b0 72 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67  registered using
103c0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
103d0 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72  k(). Likewise, r
103e0 65 67 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c  egistering a cal
103f0 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73  lback.** using s
10400 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
10410 29 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61  ) disables the a
10420 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f  utomatic checkpo
10430 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a  int mechanism.**
10440 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74   configured by t
10450 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
10460 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c  .int sqlite3_wal
10470 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
10480 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
10490 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66   nFrame){.#ifdef
104a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
104b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
104c0 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45  TER(db);.  UNUSE
104d0 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61  D_PARAMETER(nFra
104e0 6d 65 29 3b 0a 23 65 6c 73 65 0a 23 69 66 64 65  me);.#else.#ifde
104f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10500 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
10510 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
10520 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
10530 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
10540 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
10550 69 66 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a  if( nFrame>0 ){.
10560 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
10570 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65 33  hook(db, sqlite3
10580 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20  WalDefaultHook, 
10590 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
105a0 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65  R(nFrame));.  }e
105b0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
105c0 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c  _wal_hook(db, 0,
105d0 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
105e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
105f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  OK;.}../*.** Reg
10600 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
10610 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
10620 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73  ach time a trans
10630 61 63 74 69 6f 6e 20 69 73 20 77 72 69 74 74 65  action is writte
10640 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77 72  n.** into the wr
10650 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79  ite-ahead-log by
10660 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
10670 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
10680 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f  id *sqlite3_wal_
10690 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
106a0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
106b0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
106c0 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
106d0 69 73 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a  is db handle */.
106e0 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b    int(*xCallback
106f0 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65  )(void *, sqlite
10700 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c  3*, const char*,
10710 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70   int),.  void *p
10720 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
10730 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
10740 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
10750 64 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29  d to xCallback()
10760 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
10770 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
10780 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 23 69 66   void *pRet;.#if
10790 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
107a0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
107b0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
107c0 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
107d0 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
107e0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
107f0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
10800 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
10810 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
10820 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
10830 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20   db->pWalArg;.  
10840 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b  db->xWalCallback
10850 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20   = xCallback;.  
10860 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70 41  db->pWalArg = pA
10870 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
10880 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
10890 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
108a0 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  Ret;.#else.  ret
108b0 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
108c0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e  ./*.** Checkpoin
108d0 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 0a  t database zDb..
108e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
108f0 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
10900 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
10910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10920 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
10930 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73  handle */.  cons
10940 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20  t char *zDb,    
10950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10960 61 6d 65 20 6f 66 20 61 74 74 61 63 68 65 64 20  ame of attached 
10970 64 61 74 61 62 61 73 65 20 28 6f 72 20 4e 55 4c  database (or NUL
10980 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64  L) */.  int eMod
10990 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
109a0 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
109b0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76  E_CHECKPOINT_* v
109c0 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
109d0 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20 20 20 20  nLog,           
109e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
109f0 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f  : Size of WAL lo
10a00 67 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20  g in frames */. 
10a10 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20 20   int *pnCkpt    
10a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a30 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e   /* OUT: Total n
10a40 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20  umber of frames 
10a50 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a  checkpointed */.
10a60 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
10a70 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74 75  _OMIT_WAL.  retu
10a80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
10a90 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  lse.  int rc;   
10aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ab0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
10ac0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  code */.  int iD
10ad0 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  b = SQLITE_MAX_A
10ae0 54 54 41 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c  TTACHED;  /* sql
10af0 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78  ite3.aDb[] index
10b00 20 6f 66 20 64 62 20 74 6f 20 63 68 65 63 6b 70   of db to checkp
10b10 6f 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20  oint */..#ifdef 
10b20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
10b30 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
10b40 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
10b50 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
10b60 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
10b70 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  KPT;.#endif..  /
10b80 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
10b90 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
10ba0 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20  s to -1 in case 
10bb0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
10bc0 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20   */.  if( pnLog 
10bd0 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20  ) *pnLog = -1;. 
10be0 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70   if( pnCkpt ) *p
10bf0 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61  nCkpt = -1;..  a
10c00 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
10c10 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
10c20 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
10c30 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
10c40 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20  NT_FULL==1 );.  
10c50 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
10c60 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
10c70 54 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74  T==2 );.  assert
10c80 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
10c90 49 4e 54 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20  INT_TRUNCATE==3 
10ca0 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53  );.  if( eMode<S
10cb0 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
10cc0 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64  _PASSIVE || eMod
10cd0 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  e>SQLITE_CHECKPO
10ce0 49 4e 54 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a  INT_TRUNCATE ){.
10cf0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
10d00 4f 46 3a 20 52 2d 30 33 39 39 36 2d 31 32 30 38  OF: R-03996-1208
10d10 38 20 54 68 65 20 4d 20 70 61 72 61 6d 65 74 65  8 The M paramete
10d20 72 20 6d 75 73 74 20 62 65 20 61 20 76 61 6c 69  r must be a vali
10d30 64 20 63 68 65 63 6b 70 6f 69 6e 74 0a 20 20 20  d checkpoint.   
10d40 20 2a 2a 20 6d 6f 64 65 3a 20 2a 2f 0a 20 20 20   ** mode: */.   
10d50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
10d60 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71  ISUSE;.  }..  sq
10d70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
10d80 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
10d90 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62 5b 30  if( zDb && zDb[0
10da0 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 73  ] ){.    iDb = s
10db0 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
10dc0 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20  (db, zDb);.  }. 
10dd0 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20   if( iDb<0 ){.  
10de0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
10df0 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
10e00 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
10e10 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22   SQLITE_ERROR, "
10e20 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
10e30 3a 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d  : %s", zDb);.  }
10e40 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 62 75  else{.    db->bu
10e50 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20  syHandler.nBusy 
10e60 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
10e70 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
10e80 64 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20  db, iDb, eMode, 
10e90 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a  pnLog, pnCkpt);.
10ea0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10eb0 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  (db, rc);.  }.  
10ec0 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
10ed0 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
10ee0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
10ef0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
10f00 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
10f10 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  if.}.../*.** Che
10f20 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65  ckpoint database
10f30 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20   zDb. If zDb is 
10f40 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20  NULL, or if the 
10f50 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74  buffer zDb point
10f60 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73  s.** to contains
10f70 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73   a zero-length s
10f80 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63  tring, all attac
10f90 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72  hed databases ar
10fa0 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74  e .** checkpoint
10fb0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
10fc0 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
10fd0 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  t(sqlite3 *db, c
10fe0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
10ff0 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
11000 46 3a 20 52 2d 34 31 36 31 33 2d 32 30 35 35 33  F: R-41613-20553
11010 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c   The sqlite3_wal
11020 5f 63 68 65 63 6b 70 6f 69 6e 74 28 44 2c 58 29  _checkpoint(D,X)
11030 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
11040 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 77  o.  ** sqlite3_w
11050 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
11060 28 44 2c 58 2c 53 51 4c 49 54 45 5f 43 48 45 43  (D,X,SQLITE_CHEC
11070 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30  KPOINT_PASSIVE,0
11080 2c 30 29 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ,0). */.  return
11090 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
110a0 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 7a 44  ckpoint_v2(db,zD
110b0 62 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  b,SQLITE_CHECKPO
110c0 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30 29  INT_PASSIVE,0,0)
110d0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
110e0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
110f0 2a 2a 20 52 75 6e 20 61 20 63 68 65 63 6b 70 6f  ** Run a checkpo
11100 69 6e 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20  int on database 
11110 69 44 62 2e 20 54 68 69 73 20 69 73 20 61 20 6e  iDb. This is a n
11120 6f 2d 6f 70 20 69 66 20 64 61 74 61 62 61 73 65  o-op if database
11130 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63   iDb is.** not c
11140 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e  urrently open in
11150 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a   WAL mode..**.**
11160 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
11170 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  n is open on the
11180 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
11190 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68  checkpointed, th
111a0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
111b0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c  returns SQLITE_L
111c0 4f 43 4b 45 44 20 61 6e 64 20 61 20 63 68 65 63  OCKED and a chec
111d0 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 74  kpoint is not at
111e0 74 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20  tempted. If .** 
111f0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
11200 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68  while running th
11210 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e  e checkpoint, an
11220 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
11230 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  de is .** return
11240 65 64 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f  ed (i.e. SQLITE_
11250 49 4f 45 52 52 29 2e 20 4f 74 68 65 72 77 69 73  IOERR). Otherwis
11260 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  e, SQLITE_OK..**
11270 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 6e  .** The mutex on
11280 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
11290 20 64 62 20 73 68 6f 75 6c 64 20 62 65 20 68 65   db should be he
112a0 6c 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ld by the caller
112b0 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61  . The mutex.** a
112c0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
112d0 68 65 20 73 70 65 63 69 66 69 63 20 62 2d 74 72  he specific b-tr
112e0 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f  ee being checkpo
112f0 69 6e 74 65 64 20 69 73 20 74 61 6b 65 6e 20 62  inted is taken b
11300 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  y.** this functi
11310 6f 6e 20 77 68 69 6c 65 20 74 68 65 20 63 68 65  on while the che
11320 63 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69  ckpoint is runni
11330 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  ng..**.** If iDb
11340 20 69 73 20 70 61 73 73 65 64 20 53 51 4c 49 54   is passed SQLIT
11350 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 20  E_MAX_ATTACHED, 
11360 74 68 65 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  then all attache
11370 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65 0a  d databases are.
11380 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e  ** checkpointed.
11390 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
113a0 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69  encountered it i
113b0 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64  s returned immed
113c0 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61  iately -.** no a
113d0 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
113e0 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79  o checkpoint any
113f0 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 62   remaining datab
11400 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  ases..**.** Para
11410 6d 65 74 65 72 20 65 4d 6f 64 65 20 69 73 20 6f  meter eMode is o
11420 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45  ne of SQLITE_CHE
11430 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c  CKPOINT_PASSIVE,
11440 20 46 55 4c 4c 20 6f 72 20 52 45 53 54 41 52 54   FULL or RESTART
11450 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11460 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  Checkpoint(sqlit
11470 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
11480 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20   int eMode, int 
11490 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43  *pnLog, int *pnC
114a0 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  kpt){.  int rc =
114b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
114c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
114d0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
114e0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
114f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
11500 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
11510 68 72 6f 75 67 68 20 61 74 74 61 63 68 65 64 20  hrough attached 
11520 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75  dbs */.  int bBu
11530 73 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sy = 0;         
11540 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
11550 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   if SQLITE_BUSY 
11560 68 61 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  has been encount
11570 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ered */..  asser
11580 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11590 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
115a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
115b0 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d  nLog || *pnLog==
115c0 2d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  -1 );.  assert( 
115d0 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b  !pnCkpt || *pnCk
115e0 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72  pt==-1 );..  for
115f0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20  (i=0; i<db->nDb 
11600 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
11610 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
11620 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53  i==iDb || iDb==S
11630 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
11640 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ED ){.      rc =
11650 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 68 65   sqlite3BtreeChe
11660 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b  ckpoint(db->aDb[
11670 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70  i].pBt, eMode, p
11680 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20  nLog, pnCkpt);. 
11690 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a       pnLog = 0;.
116a0 20 20 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30        pnCkpt = 0
116b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
116c0 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
116d0 20 20 20 20 20 20 20 62 42 75 73 79 20 3d 20 31         bBusy = 1
116e0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
116f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
11700 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
11710 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
11720 45 5f 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f  E_OK && bBusy) ?
11730 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72   SQLITE_BUSY : r
11740 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
11750 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
11760 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
11770 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
11780 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f  rue if main-memo
11790 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  ry should be use
117a0 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
117b0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
117c0 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70   for transient p
117d0 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73  ager files and s
117e0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
117f0 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  s..** The value 
11800 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73  returned depends
11810 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
11820 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
11830 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61  (runtime.** para
11840 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65 20 63  meter) and the c
11850 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75  ompile time valu
11860 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  e of SQLITE_TEMP
11870 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66  _STORE. The.** f
11880 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64  ollowing table d
11890 65 73 63 72 69 62 65 73 20 74 68 65 20 72 65 6c  escribes the rel
118a0 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65  ationship betwee
118b0 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75  n these two valu
118c0 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66  es.** and this f
118d0 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
118e0 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  value..**.**   S
118f0 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
11900 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74       db->temp_st
11910 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e  ore     Location
11920 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61   of temporary da
11930 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d  tabase.**   ----
11940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
11950 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
11960 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
11970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11980 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
119a0 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
119b0 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
119c0 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20  urn 0).**   1   
119d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119e0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
119f0 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
11a00 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31  return 0).**   1
11a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
11a30 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
11a40 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
11a50 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
11a60 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
11a70 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
11a80 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
11a90 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
11aa0 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
11ac0 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
11ad0 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  0).**   2       
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b00 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
11b10 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 1).**   2    
11b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b30 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
11b40 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
11b50 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20  eturn 1).**   3 
11b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b70 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
11b80 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
11b90 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69   (return 1).*/.i
11ba0 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  nt sqlite3TempIn
11bb0 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c  Memory(const sql
11bc0 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53  ite3 *db){.#if S
11bd0 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
11be0 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64  ==1.  return ( d
11bf0 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32  b->temp_store==2
11c00 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   );.#endif.#if S
11c10 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
11c20 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64  ==2.  return ( d
11c30 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31  b->temp_store!=1
11c40 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   );.#endif.#if S
11c50 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
11c60 3d 3d 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ==3.  UNUSED_PAR
11c70 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65  AMETER(db);.  re
11c80 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23  turn 1;.#endif.#
11c90 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
11ca0 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45  TORE<1 || SQLITE
11cb0 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20  _TEMP_STORE>3.  
11cc0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
11cd0 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  (db);.  return 0
11ce0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
11cf0 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65  * Return UTF-8 e
11d00 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c  ncoded English l
11d10 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74  anguage explanat
11d20 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
11d30 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e  recent.** error.
11d40 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
11d50 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73  sqlite3_errmsg(s
11d60 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63  qlite3 *db){.  c
11d70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
11d80 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72  if( !db ){.    r
11d90 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
11da0 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  Str(SQLITE_NOMEM
11db0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  );.  }.  if( !sq
11dc0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
11dd0 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
11de0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
11df0 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
11e00 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20  MISUSE_BKPT);.  
11e10 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
11e20 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
11e30 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  x);.  if( db->ma
11e40 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
11e50 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72    z = sqlite3Err
11e60 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  Str(SQLITE_NOMEM
11e70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
11e80 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 70 45  testcase( db->pE
11e90 72 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7a 20 3d  rr==0 );.    z =
11ea0 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
11eb0 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70  value_text(db->p
11ec0 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Err);.    assert
11ed0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
11ee0 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  led );.    if( z
11ef0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  ==0 ){.      z =
11f00 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64   sqlite3ErrStr(d
11f10 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20  b->errCode);.   
11f20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
11f30 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
11f40 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
11f50 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n z;.}..#ifndef 
11f60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
11f70 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55  6./*.** Return U
11f80 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e  TF-16 encoded En
11f90 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
11fa0 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
11fb0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
11fc0 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   error..*/.const
11fd0 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65   void *sqlite3_e
11fe0 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20  rrmsg16(sqlite3 
11ff0 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63  *db){.  static c
12000 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65  onst u16 outOfMe
12010 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c  m[] = {.    'o',
12020 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20   'u', 't', ' ', 
12030 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27  'o', 'f', ' ', '
12040 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f  m', 'e', 'm', 'o
12050 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20  ', 'r', 'y', 0. 
12060 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
12070 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20  st u16 misuse[] 
12080 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69 27  = {.    'l', 'i'
12090 2c 20 27 62 27 2c 20 27 72 27 2c 20 27 61 27 2c  , 'b', 'r', 'a',
120a0 20 27 72 27 2c 20 27 79 27 2c 20 27 20 27 2c 20   'r', 'y', ' ', 
120b0 0a 20 20 20 20 27 72 27 2c 20 27 6f 27 2c 20 27  .    'r', 'o', '
120c0 75 27 2c 20 27 74 27 2c 20 27 69 27 2c 20 27 6e  u', 't', 'i', 'n
120d0 27 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'e', ' ', .  
120e0 20 20 27 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c    'c', 'a', 'l',
120f0 20 27 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c 20   'l', 'e', 'd', 
12100 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27  ' ', .    'o', '
12110 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a 20  u', 't', ' ', . 
12120 20 20 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27     'o', 'f', ' '
12130 2c 20 0a 20 20 20 20 27 73 27 2c 20 27 65 27 2c  , .    's', 'e',
12140 20 27 71 27 2c 20 27 75 27 2c 20 27 65 27 2c 20   'q', 'u', 'e', 
12150 27 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c 20 30  'n', 'c', 'e', 0
12160 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76  .  };..  const v
12170 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64  oid *z;.  if( !d
12180 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
12190 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d  (void *)outOfMem
121a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
121b0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
121c0 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
121d0 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20     return (void 
121e0 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20  *)misuse;.  }.  
121f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
12200 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
12210 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
12220 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20  Failed ){.    z 
12230 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d  = (void *)outOfM
12240 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  em;.  }else{.   
12250 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
12260 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45  ue_text16(db->pE
12270 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  rr);.    if( z==
12280 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
12290 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
122a0 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20  b, db->errCode, 
122b0 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62  sqlite3ErrStr(db
122c0 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20 20 20  ->errCode));.   
122d0 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
122e0 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e  alue_text16(db->
122f0 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pErr);.    }.   
12300 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d   /* A malloc() m
12310 61 79 20 68 61 76 65 20 66 61 69 6c 65 64 20 77  ay have failed w
12320 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74  ithin the call t
12330 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  o sqlite3_value_
12340 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20  text16().    ** 
12350 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69  above. If this i
12360 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
12370 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   the db->mallocF
12380 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73  ailed flag needs
12390 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c   to.    ** be cl
123a0 65 61 72 65 64 20 62 65 66 6f 72 65 20 72 65 74  eared before ret
123b0 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20  urning. Do this 
123c0 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61  directly, instea
123d0 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20  d of via.    ** 
123e0 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 29  sqlite3ApiExit()
123f0 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69  , to avoid setti
12400 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
12410 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73  handle error mes
12420 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sage..    */.   
12430 20 73 71 6c 69 74 65 33 4f 6f 6d 43 6c 65 61 72   sqlite3OomClear
12440 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  (db);.  }.  sqli
12450 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
12460 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
12470 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
12480 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
12490 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
124a0 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  Return the most 
124b0 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  recent error cod
124c0 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
124d0 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65  n SQLite routine
124e0 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20  . If NULL is.** 
124f0 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
12500 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75  unction, we assu
12510 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  me a malloc() fa
12520 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69  iled during sqli
12530 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69  te3_open()..*/.i
12540 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  nt sqlite3_errco
12550 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  de(sqlite3 *db){
12560 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71  .  if( db && !sq
12570 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
12580 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
12590 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
125a0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
125b0 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20   }.  if( !db || 
125c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
125d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
125e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
125f0 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72  .  return db->er
12600 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d  rCode & db->errM
12610 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  ask;.}.int sqlit
12620 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
12630 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ode(sqlite3 *db)
12640 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73  {.  if( db && !s
12650 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
12660 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
12670 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12680 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
12690 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c    }.  if( !db ||
126a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
126b0 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
126c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
126d0 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65  }.  return db->e
126e0 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrCode;.}../*.**
126f0 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   Return a string
12700 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
12710 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f  the kind of erro
12720 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  r specified in t
12730 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  he.** argument. 
12740 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20 73   For now, this s
12750 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74 68 65 20  imply calls the 
12760 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69 74 65 33  internal sqlite3
12770 45 72 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e 63  ErrStr().** func
12780 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  tion..*/.const c
12790 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  har *sqlite3_err
127a0 73 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 72  str(int rc){.  r
127b0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
127c0 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Str(rc);.}../*.*
127d0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
127e0 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
127f0 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 22  n for database "
12800 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65 20 69  db".  The name i
12810 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74  s zName.** and t
12820 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 65  he encoding is e
12830 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nc..*/.static in
12840 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  t createCollatio
12850 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  n(.  sqlite3* db
12860 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
12870 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63  zName, .  u8 enc
12880 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a  ,.  void* pCtx,.
12890 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
128a0 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
128b0 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
128c0 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28   void*),.  void(
128d0 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b  *xDel)(void*).){
128e0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
128f0 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20  l;.  int enc2;. 
12900 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
12910 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
12920 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
12930 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46  /* If SQLITE_UTF
12940 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20  16 is specified 
12950 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  as the encoding 
12960 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20  type, transform 
12970 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65  this.  ** to one
12980 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   of SQLITE_UTF16
12990 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46  LE or SQLITE_UTF
129a0 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20  16BE using the. 
129b0 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36   ** SQLITE_UTF16
129c0 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51  NATIVE macro. SQ
129d0 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f  LITE_UTF16 is no
129e0 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  t used internall
129f0 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d  y..  */.  enc2 =
12a00 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73 65   enc;.  testcase
12a10 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  ( enc2==SQLITE_U
12a20 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63 61  TF16 );.  testca
12a30 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45  se( enc2==SQLITE
12a40 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29  _UTF16_ALIGNED )
12a50 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53 51  ;.  if( enc2==SQ
12a60 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e  LITE_UTF16 || en
12a70 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
12a80 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20 20  _ALIGNED ){.    
12a90 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55 54  enc2 = SQLITE_UT
12aa0 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20  F16NATIVE;.  }. 
12ab0 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54 45   if( enc2<SQLITE
12ac0 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51  _UTF8 || enc2>SQ
12ad0 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b 0a  LITE_UTF16BE ){.
12ae0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12af0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
12b00 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
12b10 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 72  f this call is r
12b20 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c 61  emoving or repla
12b30 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67  cing an existing
12b40 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a   collation .  **
12b50 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73 6f   sequence. If so
12b60 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
12b70 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74 75  active VMs, retu
12b80 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65 72  rn busy. If ther
12b90 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63  e.  ** are no ac
12ba0 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69  tive VMs, invali
12bb0 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d  date any pre-com
12bc0 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
12bd0 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d  ..  */.  pColl =
12be0 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
12bf0 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32  Seq(db, (u8)enc2
12c00 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69  , zName, 0);.  i
12c10 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  f( pColl && pCol
12c20 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69  l->xCmp ){.    i
12c30 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  f( db->nVdbeActi
12c40 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ve ){.      sqli
12c50 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
12c60 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c  db, SQLITE_BUSY,
12c70 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c   .        "unabl
12c80 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69  e to delete/modi
12c90 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  fy collation seq
12ca0 75 65 6e 63 65 20 64 75 65 20 74 6f 20 61 63 74  uence due to act
12cb0 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29  ive statements")
12cc0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
12cd0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
12ce0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
12cf0 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
12d00 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20 20  ments(db);..    
12d10 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20  /* If collation 
12d20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77  sequence pColl w
12d30 61 73 20 63 72 65 61 74 65 64 20 64 69 72 65 63  as created direc
12d40 74 6c 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  tly by a call to
12d50 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
12d60 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
12d70 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61  , and not genera
12d80 74 65 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c  ted by synthColl
12d90 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68  Seq(),.    ** th
12da0 65 6e 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61  en any copies ma
12db0 64 65 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53  de by synthCollS
12dc0 65 71 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20  eq() need to be 
12dd0 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20  invalidated..   
12de0 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74   ** Also, collat
12df0 69 6f 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d  ion destructor -
12e00 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20   CollSeq.xDel() 
12e10 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e  - function may n
12e20 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  eed.    ** to be
12e30 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20   called..    */ 
12e40 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d  .    if( (pColl-
12e50 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55  >enc & ~SQLITE_U
12e60 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65  TF16_ALIGNED)==e
12e70 6e 63 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  nc2 ){.      Col
12e80 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71  lSeq *aColl = sq
12e90 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
12ea0 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61  b->aCollSeq, zNa
12eb0 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  me);.      int j
12ec0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
12ed0 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<3; j++){.    
12ee0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d      CollSeq *p =
12ef0 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20   &aColl[j];.    
12f00 20 20 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d      if( p->enc==
12f10 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20  pColl->enc ){.  
12f20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78          if( p->x
12f30 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Del ){.         
12f40 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55     p->xDel(p->pU
12f50 73 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ser);.          
12f60 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78  }.          p->x
12f70 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Cmp = 0;.       
12f80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
12f90 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  .  }..  pColl = 
12fa0 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
12fb0 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c  eq(db, (u8)enc2,
12fc0 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66   zName, 1);.  if
12fd0 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74  ( pColl==0 ) ret
12fe0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
12ff0 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20  ;.  pColl->xCmp 
13000 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43  = xCompare;.  pC
13010 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74  oll->pUser = pCt
13020 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c  x;.  pColl->xDel
13030 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c   = xDel;.  pColl
13040 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63  ->enc = (u8)(enc
13050 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54  2 | (enc & SQLIT
13060 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
13070 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  );.  sqlite3Erro
13080 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  r(db, SQLITE_OK)
13090 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
130a0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
130b0 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e  This array defin
130c0 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f  es hard upper bo
130d0 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61  unds on limit va
130e0 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e  lues.  The.** in
130f0 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62  itializer must b
13100 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77  e kept in sync w
13110 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c  ith the SQLITE_L
13120 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e  IMIT_*.** #defin
13130 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e  es in sqlite3.h.
13140 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
13150 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b   int aHardLimit[
13160 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d  ] = {.  SQLITE_M
13170 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  AX_LENGTH,.  SQL
13180 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
13190 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
131a0 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54  _COLUMN,.  SQLIT
131b0 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
131c0 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ,.  SQLITE_MAX_C
131d0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a  OMPOUND_SELECT,.
131e0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42    SQLITE_MAX_VDB
131f0 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  E_OP,.  SQLITE_M
13200 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c  AX_FUNCTION_ARG,
13210 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  .  SQLITE_MAX_AT
13220 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45  TACHED,.  SQLITE
13230 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
13240 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  N_LENGTH,.  SQLI
13250 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
13260 4e 55 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a 20  NUMBER,      /* 
13270 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33 32 33  IMP: R-38091-323
13280 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d  52 */.  SQLITE_M
13290 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
132a0 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  ,.  SQLITE_MAX_W
132b0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d  ORKER_THREADS,.}
132c0 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  ;../*.** Make su
132d0 72 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69  re the hard limi
132e0 74 73 20 61 72 65 20 73 65 74 20 74 6f 20 72 65  ts are set to re
132f0 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a  asonable values.
13300 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
13310 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65  X_LENGTH<100.# e
13320 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
13330 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
13340 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64  t least 100.#end
13350 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
13360 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30  X_SQL_LENGTH<100
13370 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
13380 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d  MAX_SQL_LENGTH m
13390 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
133a0 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  100.#endif.#if S
133b0 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
133c0 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  NGTH>SQLITE_MAX_
133d0 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53  LENGTH.# error S
133e0 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
133f0 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65  NGTH must not be
13400 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53 51   greater than SQ
13410 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a  LITE_MAX_LENGTH.
13420 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
13430 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
13440 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20  ELECT<2.# error 
13450 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
13460 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20  UND_SELECT must 
13470 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65  be at least 2.#e
13480 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
13490 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23  MAX_VDBE_OP<40.#
134a0 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
134b0 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62  X_VDBE_OP must b
134c0 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65  e at least 40.#e
134d0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
134e0 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
134f0 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  <0 || SQLITE_MAX
13500 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30  _FUNCTION_ARG>10
13510 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  00.# error SQLIT
13520 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
13530 52 47 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  RG must be betwe
13540 65 6e 20 30 20 61 6e 64 20 31 30 30 30 0a 23 65  en 0 and 1000.#e
13550 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
13560 4d 41 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c  MAX_ATTACHED<0 |
13570 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  | SQLITE_MAX_ATT
13580 41 43 48 45 44 3e 31 32 35 0a 23 20 65 72 72 6f  ACHED>125.# erro
13590 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  r SQLITE_MAX_ATT
135a0 41 43 48 45 44 20 6d 75 73 74 20 62 65 20 62 65  ACHED must be be
135b0 74 77 65 65 6e 20 30 20 61 6e 64 20 31 32 35 0a  tween 0 and 125.
135c0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
135d0 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
135e0 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72  RN_LENGTH<1.# er
135f0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ror SQLITE_MAX_L
13600 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
13610 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
13620 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66  ast 1.#endif.#if
13630 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
13640 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72  MN>32767.# error
13650 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
13660 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65  MN must not exce
13670 65 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a  ed 32767.#endif.
13680 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54  #if SQLITE_MAX_T
13690 52 49 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23  RIGGER_DEPTH<1.#
136a0 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
136b0 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
136c0 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
136d0 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   1.#endif.#if SQ
136e0 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
136f0 54 48 52 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c  THREADS<0 || SQL
13700 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
13710 48 52 45 41 44 53 3e 35 30 0a 23 20 65 72 72 6f  HREADS>50.# erro
13720 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  r SQLITE_MAX_WOR
13730 4b 45 52 5f 54 48 52 45 41 44 53 20 6d 75 73 74  KER_THREADS must
13740 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
13750 64 20 35 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  d 50.#endif.../*
13760 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
13770 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e  alue of a limit.
13780 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64    Report the old
13790 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e   value..** If an
137a0 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69   invalid limit i
137b0 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69 65 64  ndex is supplied
137c0 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20  , report -1..** 
137d0 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
137e0 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74  but still report
137f0 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69   the old value i
13800 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d  f the.** new lim
13810 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
13820 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65  **.** A new lowe
13830 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74  r limit does not
13840 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67   shrink existing
13850 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20   constructs..** 
13860 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e  It merely preven
13870 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74  ts new construct
13880 73 20 74 68 61 74 20 65 78 63 65 65 64 20 74 68  s that exceed th
13890 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20  e limit.** from 
138a0 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  forming..*/.int 
138b0 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71  sqlite3_limit(sq
138c0 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c  lite3 *db, int l
138d0 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c  imitId, int newL
138e0 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64  imit){.  int old
138f0 4c 69 6d 69 74 3b 0a 0a 23 69 66 64 65 66 20 53  Limit;..#ifdef S
13900 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
13910 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
13920 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
13930 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
13940 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
13950 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
13960 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn -1;.  }.#endi
13970 66 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  f..  /* EVIDENCE
13980 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30  -OF: R-30189-540
13990 39 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69  97 For each limi
139a0 74 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54  t category SQLIT
139b0 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a  E_LIMIT_NAME.  *
139c0 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 61 72  * there is a har
139d0 64 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65  d upper bound se
139e0 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t at compile-tim
139f0 65 20 62 79 20 61 20 43 20 70 72 65 70 72 6f 63  e by a C preproc
13a00 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f  essor.  ** macro
13a10 20 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d   called SQLITE_M
13a20 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f  AX_NAME. (The "_
13a30 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e  LIMIT_" in the n
13a40 61 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  ame is changed t
13a50 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29  o.  ** "_MAX_".)
13a60 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
13a70 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
13a80 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d  E_LIMIT_LENGTH]=
13a90 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47  =SQLITE_MAX_LENG
13aa0 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
13ab0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
13ac0 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
13ad0 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
13ae0 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  SQL_LENGTH );.  
13af0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
13b00 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
13b10 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f  COLUMN]==SQLITE_
13b20 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  MAX_COLUMN );.  
13b30 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
13b40 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
13b50 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c  EXPR_DEPTH]==SQL
13b60 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
13b70 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
13b80 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
13b90 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
13ba0 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45  _SELECT]==SQLITE
13bb0 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
13bc0 4c 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28  LECT);.  assert(
13bd0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
13be0 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50  TE_LIMIT_VDBE_OP
13bf0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  ]==SQLITE_MAX_VD
13c00 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72  BE_OP );.  asser
13c10 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
13c20 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54  LITE_LIMIT_FUNCT
13c30 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45  ION_ARG]==SQLITE
13c40 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
13c50 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  G );.  assert( a
13c60 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
13c70 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d  _LIMIT_ATTACHED]
13c80 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  ==SQLITE_MAX_ATT
13c90 41 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72  ACHED );.  asser
13ca0 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
13cb0 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
13cc0 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d  PATTERN_LENGTH]=
13cd0 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d00 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
13d10 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
13d20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
13d30 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
13d40 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
13d50 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  MBER]==SQLITE_MA
13d60 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
13d70 52 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  R);.  assert( aH
13d80 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
13d90 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
13da0 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  PTH]==SQLITE_MAX
13db0 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 29  _TRIGGER_DEPTH )
13dc0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
13dd0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
13de0 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
13df0 44 53 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  DS]==SQLITE_MAX_
13e00 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 29  WORKER_THREADS )
13e10 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
13e20 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
13e30 54 48 52 45 41 44 53 3d 3d 28 53 51 4c 49 54 45  THREADS==(SQLITE
13e40 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a  _N_LIMIT-1) );..
13e50 0a 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30  .  if( limitId<0
13e60 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c   || limitId>=SQL
13e70 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20  ITE_N_LIMIT ){. 
13e80 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
13e90 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64  }.  oldLimit = d
13ea0 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  b->aLimit[limitI
13eb0 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d  d];.  if( newLim
13ec0 69 74 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20  it>=0 ){        
13ed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d             /* IM
13ee0 50 3a 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32  P: R-52476-28732
13ef0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c   */.    if( newL
13f00 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b  imit>aHardLimit[
13f10 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20  limitId] ){.    
13f20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61    newLimit = aHa
13f30 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  rdLimit[limitId]
13f40 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34  ;  /* IMP: R-514
13f50 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20  63-25634 */.    
13f60 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74  }.    db->aLimit
13f70 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c  [limitId] = newL
13f80 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  imit;.  }.  retu
13f90 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20  rn oldLimit;    
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fb0 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31   /* IMP: R-53341
13fc0 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  -35419 */.}../*.
13fd0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
13fe0 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 72 73   is used to pars
13ff0 65 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20  e both URIs and 
14000 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65  non-URI filename
14010 73 20 70 61 73 73 65 64 20 62 79 20 74 68 65 0a  s passed by the.
14020 2a 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20 66  ** user to API f
14030 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33  unctions sqlite3
14040 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74  _open() or sqlit
14050 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e  e3_open_v2(), an
14060 64 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a  d for database.*
14070 2a 20 55 52 49 73 20 73 70 65 63 69 66 69 65 64  * URIs specified
14080 20 61 73 20 70 61 72 74 20 6f 66 20 41 54 54 41   as part of ATTA
14090 43 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CH statements..*
140a0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
140b0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
140c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20  function is the 
140d0 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  name of the VFS 
140e0 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20  to use (or.** a 
140f0 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20  NULL to signify 
14100 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 29  the default VFS)
14110 20 69 66 20 74 68 65 20 55 52 49 20 64 6f 65 73   if the URI does
14120 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22   not contain a "
14130 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72  vfs=xxx".** quer
14140 79 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65  y parameter. The
14150 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
14160 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52   contains the UR
14170 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69  I (or non-URI fi
14180 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c  lename).** itsel
14190 66 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  f. When this fun
141a0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
141b0 74 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69  the *pFlags vari
141c0 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74  able should cont
141d0 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75  ain.** the defau
141e0 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e  lt flags to open
141f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
14200 6e 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76  ndle with. The v
14210 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
14220 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65  * *pFlags may be
14230 20 75 70 64 61 74 65 64 20 62 65 66 6f 72 65 20   updated before 
14240 72 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65  returning if the
14250 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f   URI filename co
14260 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68  ntains .** "cach
14270 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d  e=xxx" or "mode=
14280 78 78 78 22 20 71 75 65 72 79 20 70 61 72 61 6d  xxx" query param
14290 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eters..**.** If 
142a0 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
142b0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
142c0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
142d0 2a 70 70 56 66 73 20 69 73 20 73 65 74 20 74 6f  *ppVfs is set to
142e0 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65   point to.** the
142f0 20 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64   VFS that should
14300 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e   be used to open
14310 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14320 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73  le. *pzFile is s
14330 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74  et to.** point t
14340 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
14350 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f  ining the name o
14360 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70  f the file to op
14370 65 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a  en. It is the .*
14380 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
14390 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
143a0 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c  o eventually cal
143b0 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  l sqlite3_free()
143c0 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74   to release.** t
143d0 68 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  his buffer..**.*
143e0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
143f0 63 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51  curs, then an SQ
14400 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
14410 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
14420 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79  *pzErrMsg.** may
14430 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   be set to point
14440 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
14450 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69  taining an Engli
14460 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f  sh language erro
14470 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49  r .** message. I
14480 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
14490 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
144a0 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
144b0 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74  lly release.** t
144c0 68 69 73 20 62 75 66 66 65 72 20 62 79 20 63 61  his buffer by ca
144d0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  lling sqlite3_fr
144e0 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ee()..*/.int sql
144f0 69 74 65 33 50 61 72 73 65 55 72 69 28 0a 20 20  ite3ParseUri(.  
14500 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66  const char *zDef
14510 61 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20  aultVfs,        
14520 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69 66  /* VFS to use if
14530 20 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75   no "vfs=xxx" qu
14540 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20  ery option */.  
14550 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69  const char *zUri
14560 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14570 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  /* Nul-terminate
14580 64 20 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a  d URI to parse *
14590 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  /.  unsigned int
145a0 20 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20   *pFlags,       
145b0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53      /* IN/OUT: S
145c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
145d0 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lags */.  sqlite
145e0 33 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20  3_vfs **ppVfs,  
145f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
14600 3a 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20  : VFS to use */ 
14610 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65  .  char **pzFile
14620 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14630 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e     /* OUT: Filen
14640 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ame component of
14650 20 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a   URI */.  char *
14660 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20  *pzErrMsg       
14670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
14680 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  : Error message 
14690 28 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  (if rc!=SQLITE_O
146a0 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  K) */.){.  int r
146b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
146c0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c   unsigned int fl
146d0 61 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20  ags = *pFlags;. 
146e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
146f0 73 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b  s = zDefaultVfs;
14700 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  .  char *zFile;.
14710 20 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20    char c;.  int 
14720 6e 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74  nUri = sqlite3St
14730 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20  rlen30(zUri);.. 
14740 20 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d   assert( *pzErrM
14750 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  sg==0 );..  if( 
14760 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ((flags & SQLITE
14770 5f 4f 50 45 4e 5f 55 52 49 29 20 20 20 20 20 20  _OPEN_URI)      
14780 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
14790 2d 34 38 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a  -48725-32206 */.
147a0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
147b0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
147c0 69 67 2e 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20  ig.bOpenUri) /* 
147d0 49 4d 50 3a 20 52 2d 35 31 36 38 39 2d 34 36 35  IMP: R-51689-465
147e0 34 38 20 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69  48 */.   && nUri
147f0 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55  >=5 && memcmp(zU
14800 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d  ri, "file:", 5)=
14810 3d 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38  =0 /* IMP: R-578
14820 38 34 2d 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b  84-37496 */.  ){
14830 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b  .    char *zOpt;
14840 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b  .    int eState;
14850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14860 20 20 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61     /* Parser sta
14870 74 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  te when parsing 
14880 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  URI */.    int i
14890 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  In;             
148a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
148b0 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65  t character inde
148c0 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75  x */.    int iOu
148d0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
148e0 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
148f0 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78   character index
14900 20 2a 2f 0a 20 20 20 20 75 36 34 20 6e 42 79 74   */.    u64 nByt
14910 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20  e = nUri+2;     
14920 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
14930 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63  f space to alloc
14940 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d  ate */..    /* M
14950 61 6b 65 20 73 75 72 65 20 74 68 65 20 53 51 4c  ake sure the SQL
14960 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61  ITE_OPEN_URI fla
14970 67 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69  g is set to indi
14980 63 61 74 65 20 74 6f 20 74 68 65 20 56 46 53 20  cate to the VFS 
14990 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65  xOpen .    ** me
149a0 74 68 6f 64 20 74 68 61 74 20 74 68 65 72 65 20  thod that there 
149b0 6d 61 79 20 62 65 20 65 78 74 72 61 20 70 61 72  may be extra par
149c0 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e  ameters followin
149d0 67 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e  g the file-name.
149e0 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c    */.    flags |
149f0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  = SQLITE_OPEN_UR
14a00 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d  I;..    for(iIn=
14a10 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e  0; iIn<nUri; iIn
14a20 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55  ++) nByte += (zU
14a30 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20  ri[iIn]=='&');. 
14a40 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74     zFile = sqlit
14a50 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74  e3_malloc64(nByt
14a60 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69  e);.    if( !zFi
14a70 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
14a80 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20 20 69  TE_NOMEM;..    i
14a90 49 6e 20 3d 20 35 3b 0a 23 69 66 64 65 66 20 53  In = 5;.#ifdef S
14aa0 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f  QLITE_ALLOW_URI_
14ab0 41 55 54 48 4f 52 49 54 59 0a 20 20 20 20 69 66  AUTHORITY.    if
14ac0 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35  ( strncmp(zUri+5
14ad0 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29  , "///", 3)==0 )
14ae0 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b  {.      iIn = 7;
14af0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  .      /* The fo
14b00 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74 69 6f  llowing conditio
14b10 6e 20 63 61 75 73 65 73 20 55 52 49 73 20 77 69  n causes URIs wi
14b20 74 68 20 66 69 76 65 20 6c 65 61 64 69 6e 67 20  th five leading 
14b30 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20 20 20  / characters.   
14b40 20 20 20 2a 2a 20 6c 69 6b 65 20 66 69 6c 65 3a     ** like file:
14b50 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 20 74  /////host/path t
14b60 6f 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  o be converted i
14b70 6e 74 6f 20 55 4e 43 73 20 6c 69 6b 65 20 2f 2f  nto UNCs like //
14b80 68 6f 73 74 2f 70 61 74 68 2e 0a 20 20 20 20 20  host/path..     
14b90 20 2a 2a 20 54 68 65 20 63 6f 72 72 65 63 74 20   ** The correct 
14ba0 55 52 49 20 66 6f 72 20 74 68 61 74 20 55 4e 43  URI for that UNC
14bb0 20 68 61 73 20 6f 6e 6c 79 20 74 77 6f 20 6f 72   has only two or
14bc0 20 66 6f 75 72 20 6c 65 61 64 69 6e 67 20 2f 20   four leading / 
14bd0 63 68 61 72 61 63 74 65 72 73 0a 20 20 20 20 20  characters.     
14be0 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68 6f 73 74 2f   ** file://host/
14bf0 70 61 74 68 20 6f 72 20 66 69 6c 65 3a 2f 2f 2f  path or file:///
14c00 2f 68 6f 73 74 2f 70 61 74 68 2e 20 20 42 75 74  /host/path.  But
14c10 20 35 20 6c 65 61 64 69 6e 67 20 73 6c 61 73 68   5 leading slash
14c20 65 73 20 69 73 20 61 20 0a 20 20 20 20 20 20 2a  es is a .      *
14c30 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72 6f 72 2c 20  * common error, 
14c40 77 65 20 61 72 65 20 74 6f 6c 64 2c 20 73 6f 20  we are told, so 
14c50 77 65 20 68 61 6e 64 6c 65 20 69 74 20 61 73 20  we handle it as 
14c60 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 2e 20  a special case. 
14c70 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  */.      if( str
14c80 6e 63 6d 70 28 7a 55 72 69 2b 37 2c 20 22 2f 2f  ncmp(zUri+7, "//
14c90 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 20 69 49 6e  /", 3)==0 ){ iIn
14ca0 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20  ++; }.    }else 
14cb0 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69  if( strncmp(zUri
14cc0 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c 68 6f 73 74  +5, "//localhost
14cd0 2f 22 2c 20 31 32 29 3d 3d 30 20 29 7b 0a 20 20  /", 12)==0 ){.  
14ce0 20 20 20 20 69 49 6e 20 3d 20 31 36 3b 0a 20 20      iIn = 16;.  
14cf0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a    }.#else.    /*
14d00 20 44 69 73 63 61 72 64 20 74 68 65 20 73 63 68   Discard the sch
14d10 65 6d 65 20 61 6e 64 20 61 75 74 68 6f 72 69 74  eme and authorit
14d20 79 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 74 68  y segments of th
14d30 65 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66  e URI. */.    if
14d40 28 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26  ( zUri[5]=='/' &
14d50 26 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29  & zUri[6]=='/' )
14d60 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b  {.      iIn = 7;
14d70 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55  .      while( zU
14d80 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b  ri[iIn] && zUri[
14d90 69 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b  iIn]!='/' ) iIn+
14da0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 49 6e  +;.      if( iIn
14db0 21 3d 37 20 26 26 20 28 69 49 6e 21 3d 31 36 20  !=7 && (iIn!=16 
14dc0 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c  || memcmp("local
14dd0 68 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c  host", &zUri[7],
14de0 20 39 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   9)) ){.        
14df0 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69  *pzErrMsg = sqli
14e00 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76  te3_mprintf("inv
14e10 61 6c 69 64 20 75 72 69 20 61 75 74 68 6f 72 69  alid uri authori
14e20 74 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20  ty: %.*s", .    
14e30 20 20 20 20 20 20 20 20 69 49 6e 2d 37 2c 20 26          iIn-7, &
14e40 7a 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20  zUri[7]);.      
14e50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
14e60 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ROR;.        got
14e70 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b  o parse_uri_out;
14e80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
14e90 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f  endif..    /* Co
14ea0 70 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  py the filename 
14eb0 61 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70 61  and any query pa
14ec0 72 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74 68  rameters into th
14ed0 65 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e 20  e zFile buffer. 
14ee0 0a 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20 25  .    ** Decode %
14ef0 48 48 20 65 73 63 61 70 65 20 63 6f 64 65 73 20  HH escape codes 
14f00 61 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20 0a  along the way. .
14f10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69      **.    ** Wi
14f20 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20  thin this loop, 
14f30 76 61 72 69 61 62 6c 65 20 65 53 74 61 74 65 20  variable eState 
14f40 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 30 2c  may be set to 0,
14f50 20 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64 69   1 or 2, dependi
14f60 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ng.    ** on the
14f70 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
14f80 2e 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  . As follows:.  
14f90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a    **.    **   0:
14fa0 20 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61   Parsing file-na
14fb0 6d 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20  me..    **   1: 
14fc0 50 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65 63  Parsing name sec
14fd0 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76  tion of a name=v
14fe0 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d  alue query param
14ff0 65 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32  eter..    **   2
15000 3a 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65 20  : Parsing value 
15010 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d  section of a nam
15020 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61  e=value query pa
15030 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a  rameter..    */.
15040 20 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b 0a      eState = 0;.
15050 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20      while( (c = 
15060 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26  zUri[iIn])!=0 &&
15070 20 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20 20   c!='#' ){.     
15080 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66   iIn++;.      if
15090 28 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20 20  ( c=='%' .      
150a0 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69   && sqlite3Isxdi
150b0 67 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a  git(zUri[iIn]) .
150c0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
150d0 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69  3Isxdigit(zUri[i
150e0 49 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29 7b  In+1]) .      ){
150f0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63 74  .        int oct
15100 65 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65 78  et = (sqlite3Hex
15110 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b  ToInt(zUri[iIn++
15120 5d 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20  ]) << 4);.      
15130 20 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69 74    octet += sqlit
15140 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b  e3HexToInt(zUri[
15150 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20  iIn++]);..      
15160 20 20 61 73 73 65 72 74 28 20 6f 63 74 65 74 3e    assert( octet>
15170 3d 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36 20  =0 && octet<256 
15180 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f  );.        if( o
15190 63 74 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ctet==0 ){.     
151a0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
151b0 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
151c0 6e 20 22 25 30 30 22 20 61 70 70 65 61 72 73 20  n "%00" appears 
151d0 77 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20  within the URI. 
151e0 49 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  In this.        
151f0 20 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e    ** case we ign
15200 6f 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20  ore all text in 
15210 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
15220 20 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20   the path, name 
15230 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  or.          ** 
15240 76 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20  value currently 
15250 62 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f  being parsed. So
15260 20 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72   ignore the curr
15270 65 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20 20  ent character.  
15280 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73          ** and s
15290 6b 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20  kip to the next 
152a0 22 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c  "?", "=" or "&",
152b0 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
152c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68   */.          wh
152d0 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69  ile( (c = zUri[i
152e0 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23  In])!=0 && c!='#
152f0 27 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ' .             
15300 20 26 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c   && (eState!=0 |
15310 7c 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20  | c!='?').      
15320 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
15330 74 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27  te!=1 || (c!='='
15340 20 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20   && c!='&')).   
15350 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65             && (e
15360 53 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27  State!=2 || c!='
15370 26 27 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  &').          ){
15380 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e  .            iIn
15390 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
153a0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
153b0 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
153c0 20 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b        c = octet;
153d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
153e0 20 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63   eState==1 && (c
153f0 3d 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29  =='&' || c=='=')
15400 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
15410 7a 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30  zFile[iOut-1]==0
15420 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
15430 20 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e   An empty option
15440 20 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68   name. Ignore th
15450 69 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65  is option altoge
15460 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ther. */.       
15470 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69     while( zUri[i
15480 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d  In] && zUri[iIn]
15490 21 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49  !='#' && zUri[iI
154a0 6e 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b  n-1]!='&' ) iIn+
154b0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  +;.          con
154c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
154d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
154e0 27 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '&' ){.         
154f0 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
15500 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d   '\0';.        }
15510 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
15520 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20  eState = 2;.    
15530 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20      }.        c 
15540 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
15550 20 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20   if( (eState==0 
15560 26 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65  && c=='?') || (e
15570 53 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27  State==2 && c=='
15580 26 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  &') ){.        c
15590 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53   = 0;.        eS
155a0 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tate = 1;.      
155b0 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f  }.      zFile[iO
155c0 75 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d  ut++] = c;.    }
155d0 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 3d  .    if( eState=
155e0 3d 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b  =1 ) zFile[iOut+
155f0 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a  +] = '\0';.    z
15600 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
15610 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69  \0';.    zFile[i
15620 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a  Out++] = '\0';..
15630 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
15640 74 68 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f  there were any o
15650 70 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64  ptions specified
15660 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
15670 69 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20 20  interpreted .   
15680 20 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e   ** here. Option
15690 73 20 74 68 61 74 20 61 72 65 20 69 6e 74 65 72  s that are inter
156a0 70 72 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c  preted here incl
156b0 75 64 65 20 22 76 66 73 22 20 61 6e 64 20 74 68  ude "vfs" and th
156c0 6f 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ose that.    ** 
156d0 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c  correspond to fl
156e0 61 67 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ags that may be 
156f0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 73 71  passed to the sq
15700 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a  lite3_open_v2().
15710 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a      ** method. *
15720 2f 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46  /.    zOpt = &zF
15730 69 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ile[sqlite3Strle
15740 6e 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20  n30(zFile)+1];. 
15750 20 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30     while( zOpt[0
15760 5d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ] ){.      int n
15770 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Opt = sqlite3Str
15780 6c 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20  len30(zOpt);.   
15790 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20     char *zVal = 
157a0 26 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20  &zOpt[nOpt+1];. 
157b0 20 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20       int nVal = 
157c0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
157d0 7a 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66  zVal);..      if
157e0 28 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d  ( nOpt==3 && mem
157f0 63 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c  cmp("vfs", zOpt,
15800 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   3)==0 ){.      
15810 20 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20    zVfs = zVal;. 
15820 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
15830 20 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d      struct OpenM
15840 6f 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ode {.          
15850 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
15860 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64           int mod
15870 65 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d  e;.        } *aM
15880 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ode = 0;.       
15890 20 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65   char *zModeType
158a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
158b0 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20  t mask = 0;.    
158c0 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20      int limit = 
158d0 30 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  0;..        if( 
158e0 6e 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d  nOpt==5 && memcm
158f0 70 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c  p("cache", zOpt,
15900 20 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   5)==0 ){.      
15910 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63      static struc
15920 74 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68  t OpenMode aCach
15930 65 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  eMode[] = {.    
15940 20 20 20 20 20 20 20 20 7b 20 22 73 68 61 72 65          { "share
15950 64 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  d",  SQLITE_OPEN
15960 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a  _SHAREDCACHE },.
15970 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 70              { "p
15980 72 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  rivate", SQLITE_
15990 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
159a0 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  E },.           
159b0 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20   { 0, 0 }.      
159c0 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20      };..        
159d0 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f    mask = SQLITE_
159e0 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
159f0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49  |SQLITE_OPEN_PRI
15a00 56 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20  VATECACHE;.     
15a10 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61       aMode = aCa
15a20 63 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20  cheMode;.       
15a30 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b     limit = mask;
15a40 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65  .          zMode
15a50 54 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a  Type = "cache";.
15a60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15a70 20 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26    if( nOpt==4 &&
15a80 20 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20   memcmp("mode", 
15a90 7a 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20  zOpt, 4)==0 ){. 
15aa0 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
15ab0 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20  struct OpenMode 
15ac0 61 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a  aOpenMode[] = {.
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72              { "r
15ae0 6f 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e  o",  SQLITE_OPEN
15af0 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20  _READONLY },.   
15b00 20 20 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c           { "rw",
15b10 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
15b20 41 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20  ADWRITE }, .    
15b30 20 20 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c          { "rwc",
15b40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
15b50 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
15b60 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20  OPEN_CREATE },. 
15b70 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d 65             { "me
15b80 6d 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50  mory", SQLITE_OP
15b90 45 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20  EN_MEMORY },.   
15ba0 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20           { 0, 0 
15bb0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a  }.          };..
15bc0 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d            mask =
15bd0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
15be0 44 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f  DONLY | SQLITE_O
15bf0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20  PEN_READWRITE.  
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c10 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
15c20 52 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  REATE | SQLITE_O
15c30 50 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20  PEN_MEMORY;.    
15c40 20 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f        aMode = aO
15c50 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20  penMode;.       
15c60 20 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20     limit = mask 
15c70 26 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  & flags;.       
15c80 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22     zModeType = "
15c90 61 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20 20  access";.       
15ca0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
15cb0 61 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  aMode ){.       
15cc0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
15cd0 20 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30      int mode = 0
15ce0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
15cf0 69 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b  i=0; aMode[i].z;
15d00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
15d10 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
15d20 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20   = aMode[i].z;. 
15d30 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
15d40 56 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  Val==sqlite3Strl
15d50 65 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65  en30(z) && 0==me
15d60 6d 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56  mcmp(zVal, z, nV
15d70 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  al) ){.         
15d80 20 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64       mode = aMod
15d90 65 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20  e[i].mode;.     
15da0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
15db0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
15dc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15dd0 20 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20      if( mode==0 
15de0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
15df0 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
15e00 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73  e3_mprintf("no s
15e10 75 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73 22  uch %s mode: %s"
15e20 2c 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61  , zModeType, zVa
15e30 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
15e40 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
15e50 52 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  R;.            g
15e60 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75  oto parse_uri_ou
15e70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
15e80 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 6f           if( (mo
15e90 64 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  de & ~SQLITE_OPE
15ea0 4e 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20  N_MEMORY)>limit 
15eb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ){.            *
15ec0 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
15ed0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 6d  e3_mprintf("%s m
15ee0 6f 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a  ode not allowed:
15ef0 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d                zM
15f20 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a  odeType, zVal);.
15f30 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
15f40 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
15f50 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
15f60 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20  arse_uri_out;.  
15f70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15f80 20 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c 61      flags = (fla
15f90 67 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f  gs & ~mask) | mo
15fa0 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  de;.        }.  
15fb0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70      }..      zOp
15fc0 74 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31  t = &zVal[nVal+1
15fd0 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73  ];.    }..  }els
15fe0 65 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73  e{.    zFile = s
15ff0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
16000 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66 28  nUri+2);.    if(
16010 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e   !zFile ) return
16020 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
16030 20 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c     memcpy(zFile,
16040 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20   zUri, nUri);.  
16050 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20    zFile[nUri] = 
16060 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
16070 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a  nUri+1] = '\0';.
16080 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
16090 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20  LITE_OPEN_URI;. 
160a0 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20 73   }..  *ppVfs = s
160b0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
160c0 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 2a 70 70  zVfs);.  if( *pp
160d0 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  Vfs==0 ){.    *p
160e0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
160f0 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75  3_mprintf("no su
16100 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a 56 66  ch vfs: %s", zVf
16110 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  s);.    rc = SQL
16120 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
16130 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20  parse_uri_out:. 
16140 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16150 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
16160 33 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20  3_free(zFile);. 
16170 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20     zFile = 0;.  
16180 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c  }.  *pFlags = fl
16190 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d  ags;.  *pzFile =
161a0 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e   zFile;.  return
161b0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
161c0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
161d0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65   the work of ope
161e0 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ning a database 
161f0 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20  on behalf of.** 
16200 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 61  sqlite3_open() a
16210 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  nd sqlite3_open1
16220 36 28 29 2e 20 54 68 65 20 64 61 74 61 62 61 73  6(). The databas
16230 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c  e filename "zFil
16240 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55  ename"  .** is U
16250 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f  TF-8 encoded..*/
16260 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
16270 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f 6e 73  Database(.  cons
16280 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
16290 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66  e, /* Database f
162a0 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e  ilename UTF-8 en
162b0 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  coded */.  sqlit
162c0 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20  e3 **ppDb,      
162d0 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
162e0 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
162f0 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  le */.  unsigned
16300 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 2f   int flags,    /
16310 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c  * Operational fl
16320 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ags */.  const c
16330 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20  har *zVfs       
16340 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 56  /* Name of the V
16350 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a  FS to use */.){.
16360 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
16370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16380 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63    /* Store alloc
16390 61 74 65 64 20 68 61 6e 64 6c 65 20 68 65 72 65  ated handle here
163a0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
163b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163c0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
163d0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  code */.  int is
163e0 54 68 72 65 61 64 73 61 66 65 3b 20 20 20 20 20  Threadsafe;     
163f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
16400 65 20 66 6f 72 20 74 68 72 65 61 64 73 61 66 65  e for threadsafe
16410 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
16420 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20    char *zOpen = 
16430 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
16440 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72    /* Filename ar
16450 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74  gument to pass t
16460 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f  o BtreeOpen() */
16470 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
16480 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
16490 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73     /* Error mess
164a0 61 67 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  age from sqlite3
164b0 50 61 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a 23  ParseUri() */..#
164c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
164d0 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
164e0 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72 65  if( ppDb==0 ) re
164f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
16500 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
16510 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66    *ppDb = 0;.#if
16520 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16530 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
16540 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
16550 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
16560 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
16570 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61  dif..  /* Only a
16580 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63 6f  llow sensible co
16590 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69  mbinations of bi
165a0 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20  ts in the flags 
165b0 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a  argument.  .  **
165c0 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20   Throw an error 
165d0 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65  if any non-sense
165e0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20   combination is 
165f0 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20 2a  used.  If we.  *
16600 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69  * do not block i
16610 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69  llegal combinati
16620 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f 75  ons here, it cou
16630 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 20  ld trigger.  ** 
16640 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
16650 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c 61  nts in deeper la
16660 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65 20  yers.  Sensible 
16670 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a  combinations.  *
16680 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  * are:.  **.  **
16690 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    1:  SQLITE_OPE
166a0 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20  N_READONLY.  ** 
166b0 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   2:  SQLITE_OPEN
166c0 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a 20  _READWRITE.  ** 
166d0 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   6:  SQLITE_OPEN
166e0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
166f0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
16700 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53    */.  assert( S
16710 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
16720 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a  NLY  == 0x01 );.
16730 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
16740 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
16750 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73 73  == 0x02 );.  ass
16760 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
16770 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30 78  _CREATE    == 0x
16780 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  04 );.  testcase
16790 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
167a0 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45 41  ==0x02 ); /* REA
167b0 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63  DONLY */.  testc
167c0 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
167d0 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20  7))==0x04 ); /* 
167e0 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20 74  READWRITE */.  t
167f0 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
16800 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29 3b  ags&7))==0x40 );
16810 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c 20   /* READWRITE | 
16820 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28 20  CREATE */.  if( 
16830 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 20  ((1<<(flags&7)) 
16840 26 20 30 78 34 36 29 3d 3d 30 20 29 7b 0a 20 20  & 0x46)==0 ){.  
16850 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16860 4d 49 53 55 53 45 5f 42 4b 50 54 3b 20 20 2f 2a  MISUSE_BKPT;  /*
16870 20 49 4d 50 3a 20 52 2d 36 35 34 39 37 2d 34 34   IMP: R-65497-44
16880 35 39 34 20 2a 2f 0a 20 20 7d 0a 0a 20 20 69 66  594 */.  }..  if
16890 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
168a0 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
168b0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72  ==0 ){.    isThr
168c0 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d  eadsafe = 0;.  }
168d0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
168e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
168f0 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68  UTEX ){.    isTh
16900 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20  readsafe = 0;.  
16910 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
16920 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  & SQLITE_OPEN_FU
16930 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  LLMUTEX ){.    i
16940 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b  sThreadsafe = 1;
16950 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73  .  }else{.    is
16960 54 68 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c  Threadsafe = sql
16970 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
16980 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d  .bFullMutex;.  }
16990 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
169a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
169b0 54 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66  TECACHE ){.    f
169c0 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
169d0 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
169e0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
169f0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
16a00 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61  g.sharedCacheEna
16a10 62 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67  bled ){.    flag
16a20 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
16a30 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
16a40 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68  }..  /* Remove h
16a50 61 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d  armful bits from
16a60 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
16a70 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  eter.  **.  ** T
16a80 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  he SQLITE_OPEN_N
16a90 4f 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54  OMUTEX and SQLIT
16aa0 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
16ab0 20 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a   flags were.  **
16ac0 20 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74   dealt with in t
16ad0 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
16ae0 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73   block.  Besides
16af0 20 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79   these, the only
16b00 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75  .  ** valid inpu
16b10 74 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69  t flags for sqli
16b20 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72  te3_open_v2() ar
16b30 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  e SQLITE_OPEN_RE
16b40 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c  ADONLY,.  ** SQL
16b50 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
16b60 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  TE, SQLITE_OPEN_
16b70 43 52 45 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f  CREATE, SQLITE_O
16b80 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 2c  PEN_SHAREDCACHE,
16b90 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45  .  ** SQLITE_OPE
16ba0 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 2c 20  N_PRIVATECACHE, 
16bb0 61 6e 64 20 73 6f 6d 65 20 72 65 73 65 72 76 65  and some reserve
16bc0 64 20 62 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c  d bits.  Silentl
16bd0 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20  y mask.  ** off 
16be0 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 2e  all other flags.
16bf0 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d  .  */.  flags &=
16c00 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e    ~( SQLITE_OPEN
16c10 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c  _DELETEONCLOSE |
16c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16c30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
16c40 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20  USIVE |.        
16c50 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
16c60 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20  EN_MAIN_DB |.   
16c70 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
16c80 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
16c90 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
16ca0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52    SQLITE_OPEN_TR
16cb0 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20  ANSIENT_DB | .  
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
16cd0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
16ce0 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20  URNAL | .       
16cf0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
16d00 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
16d10 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
16d20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53     SQLITE_OPEN_S
16d30 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  UBJOURNAL | .   
16d40 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
16d50 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
16d60 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20  OURNAL |.       
16d70 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
16d80 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20  PEN_NOMUTEX |.  
16d90 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
16da0 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
16db0 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EX |.           
16dc0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
16dd0 57 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20  WAL.            
16de0 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
16df0 74 65 20 74 68 65 20 73 71 6c 69 74 65 20 64 61  te the sqlite da
16e00 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ta structure */.
16e10 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61    db = sqlite3Ma
16e20 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
16e30 28 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69  (sqlite3) );.  i
16e40 66 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20  f( db==0 ) goto 
16e50 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66  opendb_out;.  if
16e60 28 20 69 73 54 68 72 65 61 64 73 61 66 65 20 29  ( isThreadsafe )
16e70 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20  {.    db->mutex 
16e80 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
16e90 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
16ea0 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20  _RECURSIVE);.   
16eb0 20 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d   if( db->mutex==
16ec0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
16ed0 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20  e3_free(db);.   
16ee0 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20     db = 0;.     
16ef0 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
16f00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
16f10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
16f20 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
16f30 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78  db->errMask = 0x
16f40 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20  ff;.  db->nDb = 
16f50 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  2;.  db->magic =
16f60 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55   SQLITE_MAGIC_BU
16f70 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20  SY;.  db->aDb = 
16f80 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a  db->aDbStatic;..
16f90 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
16fa0 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69  (db->aLimit)==si
16fb0 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29  zeof(aHardLimit)
16fc0 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d   );.  memcpy(db-
16fd0 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69  >aLimit, aHardLi
16fe0 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e  mit, sizeof(db->
16ff0 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e  aLimit));.  db->
17000 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
17010 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
17020 44 53 5d 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  DS] = SQLITE_DEF
17030 41 55 4c 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  AULT_WORKER_THRE
17040 41 44 53 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43  ADS;.  db->autoC
17050 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d  ommit = 1;.  db-
17060 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d  >nextAutovac = -
17070 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d 6d 61 70 20  1;.  db->szMmap 
17080 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
17090 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20  onfig.szMmap;.  
170a0 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
170b0 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61 78   = 0;.  db->nMax
170c0 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20 30 78 37  SorterMmap = 0x7
170d0 46 46 46 46 46 46 46 3b 0a 20 20 64 62 2d 3e 66  FFFFFFF;.  db->f
170e0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
170f0 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53  hortColNames | S
17100 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67  QLITE_EnableTrig
17110 67 65 72 20 7c 20 53 51 4c 49 54 45 5f 43 61 63  ger | SQLITE_Cac
17120 68 65 53 70 69 6c 6c 0a 23 69 66 20 21 64 65 66  heSpill.#if !def
17130 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41  ined(SQLITE_DEFA
17140 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  ULT_AUTOMATIC_IN
17150 44 45 58 29 20 7c 7c 20 53 51 4c 49 54 45 5f 44  DEX) || SQLITE_D
17160 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43  EFAULT_AUTOMATIC
17170 5f 49 4e 44 45 58 0a 20 20 20 20 20 20 20 20 20  _INDEX.         
17180 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
17190 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65 6e 64 69  _AutoIndex.#endi
171a0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  f.#if SQLITE_DEF
171b0 41 55 4c 54 5f 43 4b 50 54 46 55 4c 4c 46 53 59  AULT_CKPTFULLFSY
171c0 4e 43 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  NC.             
171d0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 6b 70      | SQLITE_Ckp
171e0 74 46 75 6c 6c 46 53 79 6e 63 0a 23 65 6e 64 69  tFullFSync.#endi
171f0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  f.#if SQLITE_DEF
17200 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  AULT_FILE_FORMAT
17210 3c 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  <4.             
17220 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67      | SQLITE_Leg
17230 61 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69  acyFileFmt.#endi
17240 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
17250 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
17260 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20  NSION.          
17270 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
17280 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65  LoadExtension.#e
17290 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
172a0 44 45 46 41 55 4c 54 5f 52 45 43 55 52 53 49 56  DEFAULT_RECURSIV
172b0 45 5f 54 52 49 47 47 45 52 53 0a 20 20 20 20 20  E_TRIGGERS.     
172c0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
172d0 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73  LITE_RecTriggers
172e0 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
172f0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ned(SQLITE_DEFAU
17300 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29  LT_FOREIGN_KEYS)
17310 20 26 26 20 53 51 4c 49 54 45 5f 44 45 46 41 55   && SQLITE_DEFAU
17320 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a  LT_FOREIGN_KEYS.
17330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17340 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67   | SQLITE_Foreig
17350 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a 23 69 66  nKeys.#endif.#if
17360 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
17370 52 45 56 45 52 53 45 5f 55 4e 4f 52 44 45 52 45  REVERSE_UNORDERE
17380 44 5f 53 45 4c 45 43 54 53 29 0a 20 20 20 20 20  D_SELECTS).     
17390 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
173a0 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65  LITE_ReverseOrde
173b0 72 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  r.#endif.#if def
173c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
173d0 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
173e0 5f 43 48 45 43 4b 29 0a 20 20 20 20 20 20 20 20  _CHECK).        
173f0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
17400 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 0a 23 65 6e  E_CellSizeCk.#en
17410 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71  dif.      ;.  sq
17420 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
17430 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69  b->aCollSeq);.#i
17440 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17450 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
17460 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
17470 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a  (&db->aModule);.
17480 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64  #endif..  /* Add
17490 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
174a0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
174b0 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77  BINARY. BINARY w
174c0 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54  orks for both UT
174d0 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46  F-8.  ** and UTF
174e0 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65  -16, so add a ve
174f0 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74  rsion for each t
17500 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65  o avoid any unne
17510 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e  cessary.  ** con
17520 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e  versions. The on
17530 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20 63 61  ly error that ca
17540 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69 73 20  n occur here is 
17550 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  a malloc() failu
17560 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 56  re..  **.  ** EV
17570 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32 37  IDENCE-OF: R-527
17580 38 36 2d 34 34 38 37 38 20 53 51 4c 69 74 65 20  86-44878 SQLite 
17590 64 65 66 69 6e 65 73 20 74 68 72 65 65 20 62 75  defines three bu
175a0 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67  ilt-in collating
175b0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a  .  ** functions:
175c0 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f  .  */.  createCo
175d0 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69  llation(db, sqli
175e0 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51  te3StrBINARY, SQ
175f0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69  LITE_UTF8, 0, bi
17600 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
17610 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
17620 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42  (db, sqlite3StrB
17630 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54  INARY, SQLITE_UT
17640 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c  F16BE, 0, binCol
17650 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
17660 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
17670 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
17680 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  Y, SQLITE_UTF16L
17690 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  E, 0, binCollFun
176a0 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
176b0 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f  ollation(db, "NO
176c0 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54  CASE", SQLITE_UT
176d0 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c  F8, 0, nocaseCol
176e0 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a  latingFunc, 0);.
176f0 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
17700 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53  n(db, "RTRIM", S
17710 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69  QLITE_UTF8, (voi
17720 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  d*)1, binCollFun
17730 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d  c, 0);.  if( db-
17740 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
17750 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
17760 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20 45  _out;.  }.  /* E
17770 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38  VIDENCE-OF: R-08
17780 33 30 38 2d 31 37 32 32 34 20 54 68 65 20 64 65  308-17224 The de
17790 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
177a0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c  function for all
177b0 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 69 73  .  ** strings is
177c0 20 42 49 4e 41 52 59 2e 20 0a 20 20 2a 2f 0a 20   BINARY. .  */. 
177d0 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d   db->pDfltColl =
177e0 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
177f0 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55  Seq(db, SQLITE_U
17800 54 46 38 2c 20 73 71 6c 69 74 65 33 53 74 72 42  TF8, sqlite3StrB
17810 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 61 73 73  INARY, 0);.  ass
17820 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ert( db->pDfltCo
17830 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 50  ll!=0 );..  /* P
17840 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d  arse the filenam
17850 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 2e 20  e/URI argument. 
17860 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61  */.  db->openFla
17870 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63  gs = flags;.  rc
17880 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55   = sqlite3ParseU
17890 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61  ri(zVfs, zFilena
178a0 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d  me, &flags, &db-
178b0 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26  >pVfs, &zOpen, &
178c0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
178d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
178e0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
178f0 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 73 71 6c 69  ITE_NOMEM ) sqli
17900 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
17910 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
17920 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c  rWithMsg(db, rc,
17930 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20   zErrMsg ? "%s" 
17940 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  : 0, zErrMsg);. 
17950 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
17960 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f  zErrMsg);.    go
17970 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
17980 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
17990 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61  e backend databa
179a0 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72  se driver */.  r
179b0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
179c0 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a  Open(db->pVfs, z
179d0 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61  Open, db, &db->a
179e0 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20  Db[0].pBt, 0,.  
179f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a00 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51        flags | SQ
17a10 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
17a20 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  B);.  if( rc!=SQ
17a30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
17a40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
17a50 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ERR_NOMEM ){.   
17a60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
17a70 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
17a80 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
17a90 20 72 63 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f   rc);.    goto o
17aa0 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20  pendb_out;.  }. 
17ab0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
17ac0 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  er(db->aDb[0].pB
17ad0 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d  t);.  db->aDb[0]
17ae0 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  .pSchema = sqlit
17af0 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20  e3SchemaGet(db, 
17b00 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
17b10 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
17b20 6f 63 46 61 69 6c 65 64 20 29 20 45 4e 43 28 64  ocFailed ) ENC(d
17b30 62 29 20 3d 20 53 43 48 45 4d 41 5f 45 4e 43 28  b) = SCHEMA_ENC(
17b40 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  db);.  sqlite3Bt
17b50 72 65 65 4c 65 61 76 65 28 64 62 2d 3e 61 44 62  reeLeave(db->aDb
17b60 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e  [0].pBt);.  db->
17b70 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[1].pSchema =
17b80 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
17b90 74 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  t(db, 0);..  /* 
17ba0 54 68 65 20 64 65 66 61 75 6c 74 20 73 61 66 65  The default safe
17bb0 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65  ty_level for the
17bc0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
17bd0 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68  s 'full'; for th
17be0 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61  e temp.  ** data
17bf0 62 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45  base it is 'NONE
17c00 27 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20  '. This matches 
17c10 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
17c20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f  defaults.  .  */
17c30 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e  .  db->aDb[0].zN
17c40 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  ame = "main";.  
17c50 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74  db->aDb[0].safet
17c60 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20 64  y_level = 3;.  d
17c70 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20  b->aDb[1].zName 
17c80 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e  = "temp";.  db->
17c90 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65  aDb[1].safety_le
17ca0 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e  vel = 1;..  db->
17cb0 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
17cc0 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28  AGIC_OPEN;.  if(
17cd0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
17ce0 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  d ){.    goto op
17cf0 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  endb_out;.  }.. 
17d00 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c   /* Register all
17d10 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69   built-in functi
17d20 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20  ons, but do not 
17d30 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20  attempt to read 
17d40 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
17d50 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68  e schema yet. Th
17d60 69 73 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e  is is delayed un
17d70 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 69  til the first ti
17d80 6d 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  me the database.
17d90 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64    ** is accessed
17da0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
17db0 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
17dc0 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  _OK);.  sqlite3R
17dd0 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75  egisterBuiltinFu
17de0 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20  nctions(db);..  
17df0 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69  /* Load automati
17e00 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65  c extensions - e
17e10 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20 68  xtensions that h
17e20 61 76 65 20 62 65 65 6e 20 72 65 67 69 73 74 65  ave been registe
17e30 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  red.  ** using t
17e40 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d  he sqlite3_autom
17e50 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29  atic_extension()
17e60 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 72 63 20   API..  */.  rc 
17e70 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  = sqlite3_errcod
17e80 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d  e(db);.  if( rc=
17e90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17ea0 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61    sqlite3AutoLoa
17eb0 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b  dExtensions(db);
17ec0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17ed0 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
17ee0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17ef0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
17f00 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
17f10 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66     }.  }..#ifdef
17f20 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
17f30 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS1.  if( !db->m
17f40 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
17f50 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
17f60 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 73 71  lite3Fts1Init(sq
17f70 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20  lite3*);.    rc 
17f80 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69  = sqlite3Fts1Ini
17f90 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
17fa0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
17fb0 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69  _ENABLE_FTS2.  i
17fc0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
17fd0 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
17fe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74  TE_OK ){.    ext
17ff0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46  ern int sqlite3F
18000 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a  ts2Init(sqlite3*
18010 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
18020 74 65 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b  te3Fts2Init(db);
18030 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
18040 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
18050 45 5f 46 54 53 33 20 2f 2a 20 61 75 74 6f 6d 61  E_FTS3 /* automa
18060 74 69 63 61 6c 6c 79 20 64 65 66 69 6e 65 64 20  tically defined 
18070 62 79 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  by SQLITE_ENABLE
18080 5f 46 54 53 34 20 2a 2f 0a 20 20 69 66 28 20 21  _FTS4 */.  if( !
18090 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
180a0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
180b0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
180c0 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28 64 62  lite3Fts3Init(db
180d0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
180e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
180f0 42 4c 45 5f 46 54 53 35 0a 20 20 69 66 28 20 21  BLE_FTS5.  if( !
18100 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18110 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
18120 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
18130 6c 69 74 65 33 46 74 73 35 49 6e 69 74 28 64 62  lite3Fts5Init(db
18140 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
18150 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
18160 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64  BLE_ICU.  if( !d
18170 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18180 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
18190 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
181a0 69 74 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b  ite3IcuInit(db);
181b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
181c0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
181d0 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21 64  E_RTREE.  if( !d
181e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
181f0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
18200 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
18210 74 65 33 52 74 72 65 65 49 6e 69 74 28 64 62 29  te3RtreeInit(db)
18220 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
18230 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
18240 4c 45 5f 44 42 53 54 41 54 5f 56 54 41 42 0a 20  LE_DBSTAT_VTAB. 
18250 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
18260 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
18270 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63  LITE_OK){.    rc
18280 20 3d 20 73 71 6c 69 74 65 33 44 62 73 74 61 74   = sqlite3Dbstat
18290 52 65 67 69 73 74 65 72 28 64 62 29 3b 0a 20 20  Register(db);.  
182a0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
182b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4a   SQLITE_ENABLE_J
182c0 53 4f 4e 31 0a 20 20 69 66 28 20 21 64 62 2d 3e  SON1.  if( !db->
182d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
182e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a  rc==SQLITE_OK){.
182f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18300 4a 73 6f 6e 31 49 6e 69 74 28 64 62 29 3b 0a 20  Json1Init(db);. 
18310 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
18320 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
18330 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20  _LOCKING_MODE=1 
18340 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20  makes EXCLUSIVE 
18350 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  the default lock
18360 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20  ing.  ** mode.  
18370 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
18380 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20  _LOCKING_MODE=0 
18390 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20  make NORMAL the 
183a0 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a  default locking.
183b0 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e    ** mode.  Doin
183c0 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c  g nothing at all
183d0 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d   also makes NORM
183e0 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a  AL the default..
183f0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
18400 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
18410 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66  NG_MODE.  db->df
18420 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c  ltLockMode = SQL
18430 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
18440 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69  ING_MODE;.  sqli
18450 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
18460 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65 65  ode(sqlite3Btree
18470 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d  Pager(db->aDb[0]
18480 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20  .pBt),.         
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184a0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
184b0 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23  LOCKING_MODE);.#
184c0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63 20  endif..  if( rc 
184d0 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64  ) sqlite3Error(d
184e0 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 45 6e  b, rc);..  /* En
184f0 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69  able the lookasi
18500 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  de-malloc subsys
18510 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f  tem */.  setupLo
18520 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73  okaside(db, 0, s
18530 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
18540 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a  ig.szLookaside,.
18550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18560 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
18570 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f  lobalConfig.nLoo
18580 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69  kaside);..  sqli
18590 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63  te3_wal_autochec
185a0 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49 54  kpoint(db, SQLIT
185b0 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55  E_DEFAULT_WAL_AU
185c0 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a  TOCHECKPOINT);..
185d0 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 69 66  opendb_out:.  if
185e0 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65  ( db ){.    asse
185f0 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30  rt( db->mutex!=0
18600 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66 65   || isThreadsafe
18610 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
18620 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  | sqlite3GlobalC
18630 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
18640 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
18650 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
18660 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20  b->mutex);.  }. 
18670 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
18680 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 61 73 73  rcode(db);.  ass
18690 65 72 74 28 20 64 62 21 3d 30 20 7c 7c 20 72 63  ert( db!=0 || rc
186a0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
186b0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
186c0 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
186d0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
186e0 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a 20  );.    db = 0;. 
186f0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
18700 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18710 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
18720 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20  TE_MAGIC_SICK;. 
18730 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64 62 3b   }.  *ppDb = db;
18740 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18750 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69  NABLE_SQLLOG.  i
18760 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
18770 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29  Config.xSqllog )
18780 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69 6e 67  {.    /* Opening
18790 20 61 20 64 62 20 68 61 6e 64 6c 65 2e 20 46 6f   a db handle. Fo
187a0 75 72 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  urth parameter i
187b0 73 20 70 61 73 73 65 64 20 30 2e 20 2a 2f 0a 20  s passed 0. */. 
187c0 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20 3d 20     void *pArg = 
187d0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
187e0 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 3b 0a  fig.pSqllogArg;.
187f0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
18800 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28  lConfig.xSqllog(
18810 70 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c 65 6e  pArg, db, zFilen
18820 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  ame, 0);.  }.#en
18830 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
18840 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
18850 29 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ).  if( rc==SQLI
18860 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e  TE_OK ){.    con
18870 73 74 20 63 68 61 72 20 2a 7a 48 65 78 4b 65 79  st char *zHexKey
18880 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
18890 61 72 61 6d 65 74 65 72 28 7a 4f 70 65 6e 2c 20  arameter(zOpen, 
188a0 22 68 65 78 6b 65 79 22 29 3b 0a 20 20 20 20 69  "hexkey");.    i
188b0 66 28 20 7a 48 65 78 4b 65 79 20 26 26 20 7a 48  f( zHexKey && zH
188c0 65 78 4b 65 79 5b 30 5d 20 29 7b 0a 20 20 20 20  exKey[0] ){.    
188d0 20 20 75 38 20 69 42 79 74 65 3b 0a 20 20 20 20    u8 iByte;.    
188e0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 63    int i;.      c
188f0 68 61 72 20 7a 4b 65 79 5b 34 30 5d 3b 0a 20 20  har zKey[40];.  
18900 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 69 42 79      for(i=0, iBy
18910 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a  te=0; i<sizeof(z
18920 4b 65 79 29 2a 32 20 26 26 20 73 71 6c 69 74 65  Key)*2 && sqlite
18930 33 49 73 78 64 69 67 69 74 28 7a 48 65 78 4b 65  3Isxdigit(zHexKe
18940 79 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  y[i]); i++){.   
18950 20 20 20 20 20 69 42 79 74 65 20 3d 20 28 69 42       iByte = (iB
18960 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69 74 65  yte<<4) + sqlite
18970 33 48 65 78 54 6f 49 6e 74 28 7a 48 65 78 4b 65  3HexToInt(zHexKe
18980 79 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  y[i]);.        i
18990 66 28 20 28 69 26 31 29 21 3d 30 20 29 20 7a 4b  f( (i&1)!=0 ) zK
189a0 65 79 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b  ey[i/2] = iByte;
189b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
189c0 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62  qlite3_key_v2(db
189d0 2c 20 30 2c 20 7a 4b 65 79 2c 20 69 2f 32 29 3b  , 0, zKey, i/2);
189e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
189f0 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  f.  sqlite3_free
18a00 28 7a 4f 70 65 6e 29 3b 0a 20 20 72 65 74 75 72  (zOpen);.  retur
18a10 6e 20 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 0a  n rc & 0xff;.}..
18a20 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
18a30 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
18a40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18a50 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63  _open(.  const c
18a60 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
18a70 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
18a80 62 20 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f  b .){.  return o
18a90 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c  penDatabase(zFil
18aa0 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20  ename, ppDb,.   
18ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ac0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52     SQLITE_OPEN_R
18ad0 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
18ae0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30  E_OPEN_CREATE, 0
18af0 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  );.}.int sqlite3
18b00 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73  _open_v2(.  cons
18b10 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65  t char *filename
18b20 2c 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ,   /* Database 
18b30 66 69 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29  filename (UTF-8)
18b40 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a   */.  sqlite3 **
18b50 70 70 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a  ppDb,         /*
18b60 20 4f 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20   OUT: SQLite db 
18b70 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
18b80 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
18b90 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a      /* Flags */.
18ba0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
18bb0 66 73 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  fs        /* Nam
18bc0 65 20 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20  e of VFS module 
18bd0 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72  to use */.){.  r
18be0 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61  eturn openDataba
18bf0 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44  se(filename, ppD
18c00 62 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  b, (unsigned int
18c10 29 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d  )flags, zVfs);.}
18c20 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
18c30 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
18c40 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
18c50 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
18c60 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
18c70 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69  n16(.  const voi
18c80 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  d *zFilename, . 
18c90 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a   sqlite3 **ppDb.
18ca0 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ){.  char const 
18cb0 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f  *zFilename8;   /
18cc0 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f  * zFilename enco
18cd0 64 65 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73  ded in UTF-8 ins
18ce0 74 65 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a  tead of UTF-16 *
18cf0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
18d00 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72  e *pVal;.  int r
18d10 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  c;..#ifdef SQLIT
18d20 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
18d30 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30  OR.  if( ppDb==0
18d40 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
18d50 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
18d60 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30  ndif.  *ppDb = 0
18d70 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
18d80 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
18d90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e   rc = sqlite3_in
18da0 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66  itialize();.  if
18db0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
18dc0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a  ;.#endif.  if( z
18dd0 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 7a 46  Filename==0 ) zF
18de0 69 6c 65 6e 61 6d 65 20 3d 20 22 5c 30 30 30 5c  ilename = "\000\
18df0 30 30 30 22 3b 0a 20 20 70 56 61 6c 20 3d 20 73  000";.  pVal = s
18e00 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30  qlite3ValueNew(0
18e10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
18e20 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
18e30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c  , zFilename, SQL
18e40 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c  ITE_UTF16NATIVE,
18e50 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
18e60 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20  .  zFilename8 = 
18e70 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
18e80 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54  (pVal, SQLITE_UT
18e90 46 38 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65  F8);.  if( zFile
18ea0 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20  name8 ){.    rc 
18eb0 3d 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a  = openDatabase(z
18ec0 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c  Filename8, ppDb,
18ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18ee0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
18ef0 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
18f00 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
18f10 45 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72  E, 0);.    asser
18f20 74 28 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d  t( *ppDb || rc==
18f30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
18f40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18f50 54 45 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50  TE_OK && !DbHasP
18f60 72 6f 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30  roperty(*ppDb, 0
18f70 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65  , DB_SchemaLoade
18f80 64 29 20 29 7b 0a 20 20 20 20 20 20 53 43 48 45  d) ){.      SCHE
18f90 4d 41 5f 45 4e 43 28 2a 70 70 44 62 29 20 3d 20  MA_ENC(*ppDb) = 
18fa0 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c  ENC(*ppDb) = SQL
18fb0 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
18fc0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
18fd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18fe0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c  NOMEM;.  }.  sql
18ff0 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
19000 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  al);..  return r
19010 63 20 26 20 30 78 66 66 3b 0a 7d 0a 23 65 6e 64  c & 0xff;.}.#end
19020 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
19030 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
19040 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
19050 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
19060 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
19070 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
19080 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
19090 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
190a0 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
190b0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
190c0 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e  zName, .  int en
190d0 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
190e0 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
190f0 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
19100 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
19110 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 72  st void*).){.  r
19120 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72  eturn sqlite3_cr
19130 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
19140 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63  2(db, zName, enc
19150 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
19160 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 0);.}../*.** R
19170 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
19180 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
19190 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
191a0 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
191b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
191c0 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
191d0 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
191e0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
191f0 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e  zName, .  int en
19200 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
19210 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
19220 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
19230 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
19240 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  st void*),.  voi
19250 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a  d(*xDel)(void*).
19260 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  ){.  int rc;..#i
19270 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
19280 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
19290 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
192a0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20  yCheckOk(db) || 
192b0 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
192c0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
192d0 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
192e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
192f0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
19300 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
19310 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
19320 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
19330 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
19340 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78  (u8)enc, pCtx, x
19350 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a  Compare, xDel);.
19360 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
19370 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
19380 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
19390 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
193a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
193b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
193c0 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
193d0 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
193e0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
193f0 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
19400 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
19410 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
19420 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31  reate_collation1
19430 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  6(.  sqlite3* db
19440 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  , .  const void 
19450 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e  *zName,.  int en
19460 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
19470 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
19480 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
19490 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
194a0 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  st void*).){.  i
194b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
194c0 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  K;.  char *zName
194d0 38 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  8;..#ifdef SQLIT
194e0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
194f0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
19500 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
19510 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29  b) || zName==0 )
19520 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
19530 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
19540 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
19550 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
19560 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
19570 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19580 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73   );.  zName8 = s
19590 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
195a0 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  b, zName, -1, SQ
195b0 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
195c0 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20  );.  if( zName8 
195d0 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61  ){.    rc = crea
195e0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
195f0 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c  zName8, (u8)enc,
19600 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
19610 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
19620 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
19630 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  8);.  }.  rc = s
19640 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
19650 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
19660 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
19670 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
19680 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
19690 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
196a0 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
196b0 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69  gister a collati
196c0 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
196d0 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  ory callback wit
196e0 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
196f0 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70  andle.** db. Rep
19700 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75  lace any previou
19710 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f  sly installed co
19720 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
19730 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74   factory..*/.int
19740 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
19750 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c  on_needed(.  sql
19760 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69  ite3 *db, .  voi
19770 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  d *pCollNeededAr
19780 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c  g, .  void(*xCol
19790 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73  lNeeded)(void*,s
197a0 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78  qlite3*,int eTex
197b0 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a  tRep,const char*
197c0 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ).){.#ifdef SQLI
197d0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
197e0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
197f0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
19800 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
19810 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
19820 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
19830 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
19840 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
19850 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43  xCollNeeded = xC
19860 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d  ollNeeded;.  db-
19870 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
19880 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e   0;.  db->pCollN
19890 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
198a0 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
198b0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
198c0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
198d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
198e0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
198f0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
19900 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
19910 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
19920 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
19930 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
19940 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
19950 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
19960 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
19970 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
19980 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
19990 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
199a0 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31  ollation_needed1
199b0 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
199c0 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c  , .  void *pColl
199d0 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f  NeededArg, .  vo
199e0 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31  id(*xCollNeeded1
199f0 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33  6)(void*,sqlite3
19a00 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63  *,int eTextRep,c
19a10 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 23  onst void*).){.#
19a20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
19a30 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
19a40 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
19a50 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
19a60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
19a70 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
19a80 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
19a90 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
19aa0 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  x);.  db->xCollN
19ab0 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d  eeded = 0;.  db-
19ac0 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
19ad0 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a   xCollNeeded16;.
19ae0 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
19af0 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
19b00 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  edArg;.  sqlite3
19b10 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
19b20 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
19b30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
19b40 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
19b50 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23  OMIT_UTF16 */..#
19b60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19b70 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
19b80 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
19b90 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63  n is now an anac
19ba0 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64  hronism. It used
19bb0 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72   to be used to r
19bc0 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a  ecover from a.**
19bd0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
19be0 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f  e, but SQLite no
19bf0 77 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f  w does this auto
19c00 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e  matically..*/.in
19c10 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c  t sqlite3_global
19c20 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a  _recover(void){.
19c30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19c40 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
19c50 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20  .** Test to see 
19c60 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
19c70 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
19c80 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74  ection is in aut
19c90 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e  ocommit.** mode.
19ca0 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
19cb0 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45   it is and FALSE
19cc0 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f   if not.  Autoco
19cd0 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a  mmit mode is on.
19ce0 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ** by default.  
19cf0 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69  Autocommit is di
19d00 73 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49  sabled by a BEGI
19d10 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  N statement and 
19d20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20  reenabled.** by 
19d30 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20  the next COMMIT 
19d40 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a  or ROLLBACK..*/.
19d50 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  int sqlite3_get_
19d60 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74  autocommit(sqlit
19d70 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20  e3 *db){.#ifdef 
19d80 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
19d90 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
19da0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
19db0 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
19dc0 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
19dd0 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
19de0 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
19df0 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61  f.  return db->a
19e00 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a  utoCommit;.}../*
19e10 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
19e20 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73  g routines are s
19e30 75 62 73 74 69 74 75 74 65 73 20 66 6f 72 20 63  ubstitutes for c
19e40 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f  onstants SQLITE_
19e50 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49  CORRUPT,.** SQLI
19e60 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54  TE_MISUSE, SQLIT
19e70 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49  E_CANTOPEN, SQLI
19e80 54 45 5f 49 4f 45 52 52 20 61 6e 64 20 70 6f 73  TE_IOERR and pos
19e90 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f  sibly other erro
19ea0 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20  r.** constants. 
19eb0 20 54 68 65 79 20 73 65 72 76 65 20 74 77 6f 20   They serve two 
19ec0 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20  purposes:.**.** 
19ed0 20 20 31 2e 20 20 53 65 72 76 65 20 61 73 20 61    1.  Serve as a
19ee0 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
19ef0 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
19f00 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67  point in a debug
19f10 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20  ger.**       to 
19f20 64 65 74 65 63 74 20 77 68 65 6e 20 76 65 72 73  detect when vers
19f30 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74  ion error condit
19f40 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  ions occurs..**.
19f50 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20  **   2.  Invoke 
19f60 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f  sqlite3_log() to
19f70 20 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75   provide the sou
19f80 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f  rce code locatio
19f90 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20  n where.**      
19fa0 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72   a low-level err
19fb0 6f 72 20 69 73 20 66 69 72 73 74 20 64 65 74 65  or is first dete
19fc0 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  cted..*/.int sql
19fd0 69 74 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72  ite3CorruptError
19fe0 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20  (int lineno){.  
19ff0 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
1a000 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
1a010 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  og!=0 );.  sqlit
1a020 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f  e3_log(SQLITE_CO
1a030 52 52 55 50 54 2c 0a 20 20 20 20 20 20 20 20 20  RRUPT,.         
1a040 20 20 20 20 20 22 64 61 74 61 62 61 73 65 20 63       "database c
1a050 6f 72 72 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e  orruption at lin
1a060 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22  e %d of [%.10s]"
1a070 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a080 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
1a090 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
1a0a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a0b0 43 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73  CORRUPT;.}.int s
1a0c0 71 6c 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f  qlite3MisuseErro
1a0d0 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
1a0e0 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
1a0f0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
1a100 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Log!=0 );.  sqli
1a110 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d  te3_log(SQLITE_M
1a120 49 53 55 53 45 2c 20 0a 20 20 20 20 20 20 20 20  ISUSE, .        
1a130 20 20 20 20 20 20 22 6d 69 73 75 73 65 20 61 74        "misuse at
1a140 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31   line %d of [%.1
1a150 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  0s]",.          
1a160 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73      lineno, 20+s
1a170 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
1a180 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
1a190 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e  ITE_MISUSE;.}.in
1a1a0 74 20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65  t sqlite3Cantope
1a1b0 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  nError(int linen
1a1c0 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
1a1d0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1a1e0 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
1a1f0 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
1a200 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20  ITE_CANTOPEN, . 
1a210 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61               "ca
1a220 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 20 61  nnot open file a
1a230 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e  t line %d of [%.
1a240 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20  10s]",.         
1a250 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b       lineno, 20+
1a260 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64  sqlite3_sourceid
1a270 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ());.  return SQ
1a280 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d  LITE_CANTOPEN;.}
1a290 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
1a2a0 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
1a2b0 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  D./*.** This is 
1a2c0 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f  a convenience ro
1a2d0 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73  utine that makes
1a2e0 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74   sure that all t
1a2f0 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a  hread-specific.*
1a300 2a 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  * data for this 
1a310 74 68 72 65 61 64 20 68 61 73 20 62 65 65 6e 20  thread has been 
1a320 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  deallocated..**.
1a330 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e  ** SQLite no lon
1a340 67 65 72 20 75 73 65 73 20 74 68 72 65 61 64 2d  ger uses thread-
1a350 73 70 65 63 69 66 69 63 20 64 61 74 61 20 73 6f  specific data so
1a360 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1a370 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e   now a.** no-op.
1a380 20 20 49 74 20 69 73 20 72 65 74 61 69 6e 65 64    It is retained
1a390 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20   for historical 
1a3a0 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a  compatibility..*
1a3b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74  /.void sqlite3_t
1a3c0 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f  hread_cleanup(vo
1a3d0 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  id){.}.#endif../
1a3e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61  *.** Return meta
1a3f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
1a400 75 74 20 61 20 73 70 65 63 69 66 69 63 20 63 6f  ut a specific co
1a410 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61  lumn of a databa
1a420 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65  se table..** See
1a430 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69   comment in sqli
1a440 74 65 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e  te3.h (sqlite.h.
1a450 69 6e 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  in) for details.
1a460 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1a470 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
1a480 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33  adata(.  sqlite3
1a490 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
1a4a0 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1a4b0 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  on handle */.  c
1a4c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1a4d0 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61  me,        /* Da
1a4e0 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e  tabase name or N
1a4f0 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
1a500 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c  har *zTableName,
1a510 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61       /* Table na
1a520 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  me */.  const ch
1a530 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  ar *zColumnName,
1a540 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
1a550 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  me */.  char con
1a560 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c  st **pzDataType,
1a570 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44      /* OUTPUT: D
1a580 65 63 6c 61 72 65 64 20 64 61 74 61 20 74 79 70  eclared data typ
1a590 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73  e */.  char cons
1a5a0 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20  t **pzCollSeq,  
1a5b0 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f     /* OUTPUT: Co
1a5c0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1a5d0 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   name */.  int *
1a5e0 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20  pNotNull,       
1a5f0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
1a600 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55  : True if NOT NU
1a610 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  LL constraint ex
1a620 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ists */.  int *p
1a630 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20 20 20  PrimaryKey,     
1a640 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a        /* OUTPUT:
1a650 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20   True if column 
1a660 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20  part of PK */.  
1a670 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20 20 20  int *pAutoinc   
1a680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1a690 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63  UTPUT: True if c
1a6a0 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e  olumn is auto-in
1a6b0 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  crement */.){.  
1a6c0 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
1a6d0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54  zErrMsg = 0;.  T
1a6e0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a  able *pTab = 0;.
1a6f0 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
1a700 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d   0;.  int iCol =
1a710 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
1a720 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b   *zDataType = 0;
1a730 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
1a740 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69  CollSeq = 0;.  i
1a750 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a  nt notnull = 0;.
1a760 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79    int primarykey
1a770 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f   = 0;.  int auto
1a780 69 6e 63 20 3d 20 30 3b 0a 0a 0a 23 69 66 64 65  inc = 0;...#ifde
1a790 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1a7a0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1a7b0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1a7c0 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 54 61  eckOk(db) || zTa
1a7d0 62 6c 65 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  bleName==0 ){.  
1a7e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a7f0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
1a800 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e  .#endif..  /* En
1a810 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
1a820 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65 65  e schema has bee
1a830 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71  n loaded */.  sq
1a840 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1a850 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
1a860 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1a870 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d  rAll(db);.  rc =
1a880 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c   sqlite3Init(db,
1a890 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66   &zErrMsg);.  if
1a8a0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
1a8b0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  ){.    goto erro
1a8c0 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r_out;.  }..  /*
1a8d0 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
1a8e0 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f  e in question */
1a8f0 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
1a900 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
1a910 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61  TableName, zDbNa
1a920 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62  me);.  if( !pTab
1a930 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
1a940 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20  t ){.    pTab = 
1a950 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  0;.    goto erro
1a960 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r_out;.  }..  /*
1a970 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e   Find the column
1a980 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20   for which info 
1a990 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  is requested */.
1a9a0 20 20 69 66 28 20 7a 43 6f 6c 75 6d 6e 4e 61 6d    if( zColumnNam
1a9b0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 51  e==0 ){.    /* Q
1a9c0 75 65 72 79 20 66 6f 72 20 65 78 69 73 74 61 6e  uery for existan
1a9d0 63 65 20 6f 66 20 74 61 62 6c 65 20 6f 6e 6c 79  ce of table only
1a9e0 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
1a9f0 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
1aa00 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
1aa10 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f  ol++){.      pCo
1aa20 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
1aa30 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28  iCol];.      if(
1aa40 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
1aa50 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  mp(pCol->zName, 
1aa60 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a  zColumnName) ){.
1aa70 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1aa80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1aa90 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d   if( iCol==pTab-
1aaa0 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69  >nCol ){.      i
1aab0 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
1aac0 29 20 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f  ) && sqlite3IsRo
1aad0 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29  wid(zColumnName)
1aae0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c   ){.        iCol
1aaf0 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
1ab00 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 69          pCol = i
1ab10 43 6f 6c 3e 3d 30 20 3f 20 26 70 54 61 62 2d 3e  Col>=0 ? &pTab->
1ab20 61 43 6f 6c 5b 69 43 6f 6c 5d 20 3a 20 30 3b 0a  aCol[iCol] : 0;.
1ab30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ab40 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20       pTab = 0;. 
1ab50 20 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f         goto erro
1ab60 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  r_out;.      }. 
1ab70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
1ab80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
1ab90 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20 6d 65  ck stores the me
1aba0 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ta information t
1abb0 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
1abc0 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65  rned.  ** to the
1abd0 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c   caller in local
1abe0 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61 74 61   variables zData
1abf0 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20  Type, zCollSeq, 
1ac00 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79  notnull, primary
1ac10 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74  key.  ** and aut
1ac20 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20 70 6f  oinc. At this po
1ac30 69 6e 74 20 74 68 65 72 65 20 61 72 65 20 74 77  int there are tw
1ac40 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 3a  o possibilities:
1ac50 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20  .  ** .  **     
1ac60 31 2e 20 54 68 65 20 73 70 65 63 69 66 69 65 64  1. The specified
1ac70 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73   column name was
1ac80 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22 20 6f   rowid", "oid" o
1ac90 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a  r "_rowid_" .  *
1aca0 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65  *        and the
1acb0 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69 63 69  re is no explici
1acc0 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49 50 4b  tly declared IPK
1acd0 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20   column. .  **. 
1ace0 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65 20 74   **     2. The t
1acf0 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69  able is not a vi
1ad00 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d  ew and the colum
1ad10 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66 69 65  n name identifie
1ad20 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20  d an .  **      
1ad30 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63    explicitly dec
1ad40 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f  lared column. Co
1ad50 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  py meta informat
1ad60 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a  ion from *pCol..
1ad70 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c    */ .  if( pCol
1ad80 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70   ){.    zDataTyp
1ad90 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b  e = pCol->zType;
1ada0 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20  .    zCollSeq = 
1adb0 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20  pCol->zColl;.   
1adc0 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d   notnull = pCol-
1add0 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20  >notNull!=0;.   
1ade0 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d 20 28   primarykey  = (
1adf0 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26  pCol->colFlags &
1ae00 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
1ae10 29 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e  )!=0;.    autoin
1ae20 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d  c = pTab->iPKey=
1ae30 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e  =iCol && (pTab->
1ae40 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
1ae50 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b  toincrement)!=0;
1ae60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44  .  }else{.    zD
1ae70 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47  ataType = "INTEG
1ae80 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79  ER";.    primary
1ae90 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  key = 1;.  }.  i
1aea0 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a  f( !zCollSeq ){.
1aeb0 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 73      zCollSeq = s
1aec0 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
1aed0 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a  .  }..error_out:
1aee0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1aef0 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20  eaveAll(db);..  
1af00 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65 20 66  /* Whether the f
1af10 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63  unction call suc
1af20 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65 64  ceeded or failed
1af30 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74  , set the output
1af40 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a   parameters.  **
1af50 20 74 6f 20 77 68 61 74 65 76 65 72 20 74 68 65   to whatever the
1af60 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72  ir local counter
1af70 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49  parts contain. I
1af80 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6f  f an error did o
1af90 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20  ccur,.  ** this 
1afa0 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
1afb0 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75  f zeroing all ou
1afc0 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e  tput parameters.
1afd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61  .  */.  if( pzDa
1afe0 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74 61  taType ) *pzData
1aff0 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70 65  Type = zDataType
1b000 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65  ;.  if( pzCollSe
1b010 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d  q ) *pzCollSeq =
1b020 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28   zCollSeq;.  if(
1b030 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f   pNotNull ) *pNo
1b040 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b  tNull = notnull;
1b050 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72 79 4b  .  if( pPrimaryK
1b060 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b 65  ey ) *pPrimaryKe
1b070 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a  y = primarykey;.
1b080 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20 29    if( pAutoinc )
1b090 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75 74   *pAutoinc = aut
1b0a0 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c  oinc;..  if( SQL
1b0b0 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70  ITE_OK==rc && !p
1b0c0 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
1b0d0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
1b0e0 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d  rMsg);.    zErrM
1b0f0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
1b100 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75 63 68  ntf(db, "no such
1b110 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25   table column: %
1b120 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d  s.%s", zTableNam
1b130 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75  e,.        zColu
1b140 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20  mnName);.    rc 
1b150 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
1b160 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
1b170 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63  orWithMsg(db, rc
1b180 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a  , (zErrMsg?"%s":
1b190 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0), zErrMsg);.  
1b1a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1b1b0 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 63  , zErrMsg);.  rc
1b1c0 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
1b1d0 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
1b1e0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1b1f0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
1b200 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b210 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c  ** Sleep for a l
1b220 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65  ittle while.  Re
1b230 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  turn the amount 
1b240 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a  of time slept..*
1b250 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c  /.int sqlite3_sl
1b260 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73  eep(int ms){.  s
1b270 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1b280 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 56  ;.  int rc;.  pV
1b290 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
1b2a0 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20  _find(0);.  if( 
1b2b0 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72 6e  pVfs==0 ) return
1b2c0 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   0;..  /* This f
1b2d0 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e  unction works in
1b2e0 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62   milliseconds, b
1b2f0 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ut the underlyin
1b300 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20 20 2a  g OsSleep() .  *
1b310 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63 72 6f  * API uses micro
1b320 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74  seconds. Hence t
1b330 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a  he 1000's..  */.
1b340 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4f    rc = (sqlite3O
1b350 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31 30 30  sSleep(pVfs, 100
1b360 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20 72  0*ms)/1000);.  r
1b370 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b380 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  ** Enable or dis
1b390 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64 65  able the extende
1b3a0 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a  d result codes..
1b3b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  */.int sqlite3_e
1b3c0 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
1b3d0 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  odes(sqlite3 *db
1b3e0 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 23 69  , int onoff){.#i
1b3f0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1b400 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1b410 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1b420 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
1b430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1b440 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
1b450 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b460 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1b470 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b  );.  db->errMask
1b480 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66   = onoff ? 0xfff
1b490 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20  fffff : 0xff;.  
1b4a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1b4b0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1b4c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b4d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  OK;.}../*.** Inv
1b4e0 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e  oke the xFileCon
1b4f0 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61  trol method on a
1b500 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
1b510 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
1b520 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
1b530 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  l(sqlite3 *db, c
1b540 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1b550 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  me, int op, void
1b560 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72   *pArg){.  int r
1b570 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1b580 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  ;.  Btree *pBtre
1b590 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e;..#ifdef SQLIT
1b5a0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1b5b0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1b5c0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1b5d0 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
1b5e0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1b5f0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1b600 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1b610 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74 72 65  >mutex);.  pBtre
1b620 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d  e = sqlite3DbNam
1b630 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62  eToBtree(db, zDb
1b640 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 42 74  Name);.  if( pBt
1b650 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ree ){.    Pager
1b660 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71   *pPager;.    sq
1b670 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a  lite3_file *fd;.
1b680 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b690 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
1b6a0 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
1b6b0 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
1b6c0 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72  tree);.    asser
1b6d0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
1b6e0 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74 65 33      fd = sqlite3
1b6f0 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72  PagerFile(pPager
1b700 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 66  );.    assert( f
1b710 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  d!=0 );.    if( 
1b720 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c  op==SQLITE_FCNTL
1b730 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29 7b  _FILE_POINTER ){
1b740 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33  .      *(sqlite3
1b750 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 66  _file**)pArg = f
1b760 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  d;.      rc = SQ
1b770 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1b780 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54  se if( op==SQLIT
1b790 45 5f 46 43 4e 54 4c 5f 56 46 53 5f 50 4f 49 4e  E_FCNTL_VFS_POIN
1b7a0 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73  TER ){.      *(s
1b7b0 71 6c 69 74 65 33 5f 76 66 73 2a 2a 29 70 41 72  qlite3_vfs**)pAr
1b7c0 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  g = sqlite3Pager
1b7d0 56 66 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Vfs(pPager);.   
1b7e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1b7f0 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
1b800 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54   op==SQLITE_FCNT
1b810 4c 5f 4a 4f 55 52 4e 41 4c 5f 50 4f 49 4e 54 45  L_JOURNAL_POINTE
1b820 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c  R ){.      *(sql
1b830 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67  ite3_file**)pArg
1b840 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a   = sqlite3PagerJ
1b850 72 6e 6c 46 69 6c 65 28 70 50 61 67 65 72 29 3b  rnlFile(pPager);
1b860 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1b870 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
1b880 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64   if( fd->pMethod
1b890 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  s ){.      rc = 
1b8a0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
1b8b0 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72  trol(fd, op, pAr
1b8c0 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
1b8d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b8e0 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d  _NOTFOUND;.    }
1b8f0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1b900 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1b910 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1b920 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1b930 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
1b940 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  c;.}../*.** Inte
1b950 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65 73  rface to the tes
1b960 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69  ting logic..*/.i
1b970 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  nt sqlite3_test_
1b980 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20  control(int op, 
1b990 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ...){.  int rc =
1b9a0 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
1b9b0 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54  E_OMIT_BUILTIN_T
1b9c0 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  EST.  UNUSED_PAR
1b9d0 41 4d 45 54 45 52 28 6f 70 29 3b 0a 23 65 6c 73  AMETER(op);.#els
1b9e0 65 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  e.  va_list ap;.
1b9f0 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f    va_start(ap, o
1ba00 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p);.  switch( op
1ba10 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   ){..    /*.    
1ba20 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
1ba30 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
1ba40 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20   PRNG..    */.  
1ba50 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1ba60 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45  STCTRL_PRNG_SAVE
1ba70 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1ba80 33 50 72 6e 67 53 61 76 65 53 74 61 74 65 28 29  3PrngSaveState()
1ba90 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1baa0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1bab0 20 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20   ** Restore the 
1bac0 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e  state of the PRN
1bad0 47 20 74 6f 20 74 68 65 20 6c 61 73 74 20 73 74  G to the last st
1bae0 61 74 65 20 73 61 76 65 64 20 75 73 69 6e 67 0a  ate saved using.
1baf0 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45      ** PRNG_SAVE
1bb00 2e 20 20 49 66 20 50 52 4e 47 5f 53 41 56 45 20  .  If PRNG_SAVE 
1bb10 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65  has never before
1bb20 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68   been called, th
1bb30 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 76  en.    ** this v
1bb40 65 72 62 20 61 63 74 73 20 6c 69 6b 65 20 50 52  erb acts like PR
1bb50 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f  NG_RESET..    */
1bb60 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1bb70 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
1bb80 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20  ESTORE: {.      
1bb90 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 74 6f  sqlite3PrngResto
1bba0 72 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20  reState();.     
1bbb0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1bbc0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73     /*.    ** Res
1bbd0 65 74 20 74 68 65 20 50 52 4e 47 20 62 61 63 6b  et the PRNG back
1bbe0 20 74 6f 20 69 74 73 20 75 6e 69 6e 69 74 69 61   to its uninitia
1bbf0 6c 69 7a 65 64 20 73 74 61 74 65 2e 20 20 54 68  lized state.  Th
1bc00 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20 20  e next call.    
1bc10 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 61  ** to sqlite3_ra
1bc20 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20  ndomness() will 
1bc30 72 65 73 65 65 64 20 74 68 65 20 50 52 4e 47 20  reseed the PRNG 
1bc40 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63  using a single c
1bc50 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  all.    ** to th
1bc60 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65  e xRandomness me
1bc70 74 68 6f 64 20 6f 66 20 74 68 65 20 64 65 66 61  thod of the defa
1bc80 75 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a  ult VFS..    */.
1bc90 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1bca0 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
1bcb0 53 45 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  SET: {.      sql
1bcc0 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
1bcd0 30 2c 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  0,0);.      brea
1bce0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1bcf0 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
1bd00 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49  _test_control(BI
1bd10 54 56 45 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c  TVEC_TEST, size,
1bd20 20 70 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a   program).    **
1bd30 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61 20 74 65  .    ** Run a te
1bd40 73 74 20 61 67 61 69 6e 73 74 20 61 20 42 69 74  st against a Bit
1bd50 76 65 63 20 6f 62 6a 65 63 74 20 6f 66 20 73 69  vec object of si
1bd60 7a 65 2e 20 20 54 68 65 20 70 72 6f 67 72 61 6d  ze.  The program
1bd70 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a   argument.    **
1bd80 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20   is an array of 
1bd90 69 6e 74 65 67 65 72 73 20 74 68 61 74 20 64 65  integers that de
1bda0 66 69 6e 65 73 20 74 68 65 20 74 65 73 74 2e 20  fines the test. 
1bdb0 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a   Return -1 on a.
1bdc0 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c      ** memory al
1bdd0 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20  location error, 
1bde0 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 72  0 on success, or
1bdf0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e   non-zero for an
1be00 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53   error..    ** S
1be10 65 65 20 74 68 65 20 73 71 6c 69 74 65 33 42 69  ee the sqlite3Bi
1be20 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28  tvecBuiltinTest(
1be30 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
1be40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20   information..  
1be50 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1be60 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49  LITE_TESTCTRL_BI
1be70 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20  TVEC_TEST: {.   
1be80 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61     int sz = va_a
1be90 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1bea0 20 20 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20     int *aProg = 
1beb0 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29  va_arg(ap, int*)
1bec0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1bed0 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69  ite3BitvecBuilti
1bee0 6e 54 65 73 74 28 73 7a 2c 20 61 50 72 6f 67 29  nTest(sz, aProg)
1bef0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1bf00 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1bf10 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
1bf20 74 5f 63 6f 6e 74 72 6f 6c 28 46 41 55 4c 54 5f  t_control(FAULT_
1bf30 49 4e 53 54 41 4c 4c 2c 20 78 43 61 6c 6c 62 61  INSTALL, xCallba
1bf40 63 6b 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ck).    **.    *
1bf50 2a 20 41 72 72 61 6e 67 65 20 74 6f 20 69 6e 76  * Arrange to inv
1bf60 6f 6b 65 20 78 43 61 6c 6c 62 61 63 6b 28 29 20  oke xCallback() 
1bf70 77 68 65 6e 65 76 65 72 20 73 71 6c 69 74 65 33  whenever sqlite3
1bf80 46 61 75 6c 74 53 69 6d 28 29 20 69 73 20 63 61  FaultSim() is ca
1bf90 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a 20 69 66 20  lled,.    ** if 
1bfa0 78 43 61 6c 6c 62 61 63 6b 20 69 73 20 6e 6f 74  xCallback is not
1bfb0 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 0a 20 20   NULL..    **.  
1bfc0 20 20 2a 2a 20 41 73 20 61 20 74 65 73 74 20 6f    ** As a test o
1bfd0 66 20 74 68 65 20 66 61 75 6c 74 20 73 69 6d 75  f the fault simu
1bfe0 6c 61 74 6f 72 20 6d 65 63 68 61 6e 69 73 6d 20  lator mechanism 
1bff0 69 74 73 65 6c 66 2c 20 73 71 6c 69 74 65 33 46  itself, sqlite3F
1c000 61 75 6c 74 53 69 6d 28 30 29 0a 20 20 20 20 2a  aultSim(0).    *
1c010 2a 20 69 73 20 63 61 6c 6c 65 64 20 69 6d 6d 65  * is called imme
1c020 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 69 6e  diately after in
1c030 73 74 61 6c 6c 69 6e 67 20 74 68 65 20 6e 65 77  stalling the new
1c040 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68   callback and th
1c050 65 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  e return.    ** 
1c060 76 61 6c 75 65 20 66 72 6f 6d 20 73 71 6c 69 74  value from sqlit
1c070 65 33 46 61 75 6c 74 53 69 6d 28 30 29 20 62 65  e3FaultSim(0) be
1c080 63 6f 6d 65 73 20 74 68 65 20 72 65 74 75 72 6e  comes the return
1c090 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c   from.    ** sql
1c0a0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1c0b0 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  l()..    */.    
1c0c0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1c0d0 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54 41  CTRL_FAULT_INSTA
1c0e0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d  LL: {.      /* M
1c0f0 53 56 43 20 69 73 20 70 69 63 6b 79 20 61 62 6f  SVC is picky abo
1c100 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20  ut pulling func 
1c110 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69 73  ptrs from va lis
1c120 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74 74  ts..      ** htt
1c130 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72  p://support.micr
1c140 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39  osoft.com/kb/479
1c150 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  61.      ** sqli
1c160 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1c170 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20  xTestCallback = 
1c180 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 28 2a  va_arg(ap, int(*
1c190 29 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 2a  )(int));.      *
1c1a0 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20  /.      typedef 
1c1b0 69 6e 74 28 2a 54 45 53 54 43 41 4c 4c 42 41 43  int(*TESTCALLBAC
1c1c0 4b 46 55 4e 43 5f 74 29 28 69 6e 74 29 3b 0a 20  KFUNC_t)(int);. 
1c1d0 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1c1e0 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61  alConfig.xTestCa
1c1f0 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28  llback = va_arg(
1c200 61 70 2c 20 54 45 53 54 43 41 4c 4c 42 41 43 4b  ap, TESTCALLBACK
1c210 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 72  FUNC_t);.      r
1c220 63 20 3d 20 73 71 6c 69 74 65 33 46 61 75 6c 74  c = sqlite3Fault
1c230 53 69 6d 28 30 29 3b 0a 20 20 20 20 20 20 62 72  Sim(0);.      br
1c240 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1c250 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1c260 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1c270 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f  BENIGN_MALLOC_HO
1c280 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e  OKS, xBegin, xEn
1c290 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d).    **.    **
1c2a0 20 52 65 67 69 73 74 65 72 20 68 6f 6f 6b 73 20   Register hooks 
1c2b0 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63  to call to indic
1c2c0 61 74 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63  ate which malloc
1c2d0 28 29 20 66 61 69 6c 75 72 65 73 20 0a 20 20 20  () failures .   
1c2e0 20 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a   ** are benign..
1c2f0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1c300 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1c310 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f  BENIGN_MALLOC_HO
1c320 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74 79 70  OKS: {.      typ
1c330 65 64 65 66 20 76 6f 69 64 20 28 2a 76 6f 69 64  edef void (*void
1c340 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29  _function)(void)
1c350 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e  ;.      void_fun
1c360 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67  ction xBenignBeg
1c370 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66  in;.      void_f
1c380 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45  unction xBenignE
1c390 6e 64 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67  nd;.      xBenig
1c3a0 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61 72 67 28  nBegin = va_arg(
1c3b0 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f  ap, void_functio
1c3c0 6e 29 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67  n);.      xBenig
1c3d0 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67 28 61 70  nEnd = va_arg(ap
1c3e0 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29  , void_function)
1c3f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
1c400 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73  enignMallocHooks
1c410 28 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78  (xBenignBegin, x
1c420 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20  BenignEnd);.    
1c430 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1c440 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1c450 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1c460 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1c470 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45  TRL_PENDING_BYTE
1c480 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 58  , unsigned int X
1c490 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1c4a0 53 65 74 20 74 68 65 20 50 45 4e 44 49 4e 47 20  Set the PENDING 
1c4b0 62 79 74 65 20 74 6f 20 74 68 65 20 76 61 6c 75  byte to the valu
1c4c0 65 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  e in the argumen
1c4d0 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a  t, if X>0..    *
1c4e0 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
1c4f0 73 20 69 66 20 58 3d 3d 30 2e 20 20 52 65 74 75  s if X==0.  Retu
1c500 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
1c510 74 68 65 20 70 65 6e 64 69 6e 67 20 62 79 74 65  the pending byte
1c520 0a 20 20 20 20 2a 2a 20 61 73 20 69 74 20 65 78  .    ** as it ex
1c530 69 73 74 69 6e 67 20 62 65 66 6f 72 65 20 74 68  isting before th
1c540 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
1c550 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  alled..    **.  
1c560 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20    ** IMPORTANT: 
1c570 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45   Changing the PE
1c580 4e 44 49 4e 47 20 62 79 74 65 20 66 72 6f 6d 20  NDING byte from 
1c590 30 78 34 30 30 30 30 30 30 30 20 72 65 73 75 6c  0x40000000 resul
1c5a0 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20  ts in.    ** an 
1c5b0 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64 61 74  incompatible dat
1c5c0 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 6d 61  abase file forma
1c5d0 74 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65  t.  Changing the
1c5e0 20 50 45 4e 44 49 4e 47 20 62 79 74 65 0a 20 20   PENDING byte.  
1c5f0 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 64    ** while any d
1c600 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1c610 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65 73 75 6c  on is open resul
1c620 74 73 20 69 6e 20 75 6e 64 65 66 69 6e 65 64 20  ts in undefined 
1c630 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74  and.    ** delet
1c640 65 72 69 6f 75 73 20 62 65 68 61 76 69 6f 72 2e  erious behavior.
1c650 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1c660 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1c670 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b  _PENDING_BYTE: {
1c680 0a 20 20 20 20 20 20 72 63 20 3d 20 50 45 4e 44  .      rc = PEND
1c690 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65  ING_BYTE;.#ifnde
1c6a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53  f SQLITE_OMIT_WS
1c6b0 44 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  D.      {.      
1c6c0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e    unsigned int n
1c6d0 65 77 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61  ewVal = va_arg(a
1c6e0 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  p, unsigned int)
1c6f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
1c700 77 56 61 6c 20 29 20 73 71 6c 69 74 65 33 50 65  wVal ) sqlite3Pe
1c710 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e 65 77 56  ndingByte = newV
1c720 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  al;.      }.#end
1c730 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  if.      break;.
1c740 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1c750 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
1c760 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1c770 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
1c780 54 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a  T, int X).    **
1c790 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74  .    ** This act
1c7a0 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72  ion provides a r
1c7b0 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20  un-time test to 
1c7c0 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  see whether or n
1c7d0 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74  ot.    ** assert
1c7e0 28 29 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61  () was enabled a
1c7f0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
1c800 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e   If X is true an
1c810 64 20 61 73 73 65 72 74 28 29 0a 20 20 20 20 2a  d assert().    *
1c820 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  * is enabled, th
1c830 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
1c840 6c 75 65 20 69 73 20 74 72 75 65 2e 20 20 49 66  lue is true.  If
1c850 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 0a 20   X is true and. 
1c860 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 69     ** assert() i
1c870 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  s disabled, then
1c880 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
1c890 65 20 69 73 20 7a 65 72 6f 2e 20 20 49 66 20 58  e is zero.  If X
1c8a0 20 69 73 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65   is.    ** false
1c8b0 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69 73   and assert() is
1c8c0 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74   enabled, then t
1c8d0 68 65 20 61 73 73 65 72 74 69 6f 6e 20 66 69 72  he assertion fir
1c8e0 65 73 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  es and the.    *
1c8f0 2a 20 70 72 6f 63 65 73 73 20 61 62 6f 72 74 73  * process aborts
1c900 2e 20 20 49 66 20 58 20 69 73 20 66 61 6c 73 65  .  If X is false
1c910 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69 73   and assert() is
1c920 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
1c930 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  the.    ** retur
1c940 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e  n value is zero.
1c950 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1c960 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1c970 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20 20 20 20  _ASSERT: {.     
1c980 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 78 20   volatile int x 
1c990 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
1c9a0 74 28 20 28 78 20 3d 20 76 61 5f 61 72 67 28 61  t( (x = va_arg(a
1c9b0 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20  p,int))!=0 );.  
1c9c0 20 20 20 20 72 63 20 3d 20 78 3b 0a 20 20 20 20      rc = x;.    
1c9d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1c9e0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1c9f0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1ca00 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1ca10 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74  CTRL_ALWAYS, int
1ca20 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   X).    **.    *
1ca30 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72  * This action pr
1ca40 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d  ovides a run-tim
1ca50 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 68 6f  e test to see ho
1ca60 77 20 74 68 65 20 41 4c 57 41 59 53 20 61 6e 64  w the ALWAYS and
1ca70 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61  .    ** NEVER ma
1ca80 63 72 6f 73 20 77 65 72 65 20 64 65 66 69 6e 65  cros were define
1ca90 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1caa0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
1cab0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
1cac0 65 20 69 73 20 41 4c 57 41 59 53 28 58 29 2e 20  e is ALWAYS(X). 
1cad0 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
1cae0 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20  The recommended 
1caf0 74 65 73 74 20 69 73 20 58 3d 3d 32 2e 20 20 49  test is X==2.  I
1cb00 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
1cb10 75 65 20 69 73 20 32 2c 20 74 68 61 74 20 6d 65  ue is 2, that me
1cb20 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59  ans.    ** ALWAY
1cb30 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20  S() and NEVER() 
1cb40 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70  are both no-op p
1cb50 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72  ass-through macr
1cb60 6f 73 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  os, which is the
1cb70 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  .    ** default 
1cb80 73 65 74 74 69 6e 67 2e 20 20 49 66 20 74 68 65  setting.  If the
1cb90 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1cba0 20 31 2c 20 74 68 65 6e 20 41 4c 57 41 59 53 28   1, then ALWAYS(
1cbb0 29 20 69 73 20 65 69 74 68 65 72 0a 20 20 20 20  ) is either.    
1cbc0 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64 20 74 6f  ** hard-coded to
1cbd0 20 74 72 75 65 20 6f 72 20 65 6c 73 65 20 69 74   true or else it
1cbe0 20 61 73 73 65 72 74 73 20 69 66 20 69 74 73 20   asserts if its 
1cbf0 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73  argument is fals
1cc00 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69  e..    ** The fi
1cc10 72 73 74 20 62 65 68 61 76 69 6f 72 20 28 68 61  rst behavior (ha
1cc20 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65  rd-coded to true
1cc30 29 20 69 73 20 74 68 65 20 63 61 73 65 20 69 66  ) is the case if
1cc40 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54  .    ** SQLITE_T
1cc50 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73  ESTCTRL_ASSERT s
1cc60 68 6f 77 73 20 74 68 61 74 20 61 73 73 65 72 74  hows that assert
1cc70 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 20 61  () is disabled a
1cc80 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20  nd the second.  
1cc90 20 20 2a 2a 20 62 65 68 61 76 69 6f 72 20 28 61    ** behavior (a
1cca0 73 73 65 72 74 20 69 66 20 74 68 65 20 61 72 67  ssert if the arg
1ccb0 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41 59 53 28  ument to ALWAYS(
1ccc0 29 20 69 73 20 66 61 6c 73 65 29 20 69 73 20 74  ) is false) is t
1ccd0 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a  he case if.    *
1cce0 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  * SQLITE_TESTCTR
1ccf0 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74  L_ASSERT shows t
1cd00 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20  hat assert() is 
1cd10 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a  enabled..    **.
1cd20 20 20 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74      ** The run-t
1cd30 69 6d 65 20 74 65 73 74 20 70 72 6f 63 65 64 75  ime test procedu
1cd40 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f  re might look so
1cd50 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69  mething like thi
1cd60 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
1cd70 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
1cd80 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1cd90 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
1cda0 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20  AYS, 2)==2 ){.  
1cdb0 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
1cdc0 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28  AYS() and NEVER(
1cdd0 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73  ) are no-op pass
1cde0 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a  -through macros.
1cdf0 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20      **    }else 
1ce00 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74  if( sqlite3_test
1ce10 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1ce20 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c  TESTCTRL_ASSERT,
1ce30 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20   1) ){.    **   
1ce40 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20     // ALWAYS(x) 
1ce50 61 73 73 65 72 74 73 20 74 68 61 74 20 78 20 69  asserts that x i
1ce60 73 20 74 72 75 65 2e 20 4e 45 56 45 52 28 78 29  s true. NEVER(x)
1ce70 20 61 73 73 65 72 74 73 20 78 20 69 73 20 66 61   asserts x is fa
1ce80 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d  lse..    **    }
1ce90 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20  else{.    **    
1cea0 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 69    // ALWAYS(x) i
1ceb0 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20  s a constant 1. 
1cec0 20 4e 45 56 45 52 28 78 29 20 69 73 20 61 20 63   NEVER(x) is a c
1ced0 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a  onstant 0..    *
1cee0 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20  *    }.    */.  
1cef0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1cf00 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b  STCTRL_ALWAYS: {
1cf10 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76  .      int x = v
1cf20 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
1cf30 20 20 20 20 20 72 63 20 3d 20 41 4c 57 41 59 53       rc = ALWAYS
1cf40 28 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  (x);.      break
1cf50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1cf60 20 20 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33      **   sqlite3
1cf70 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1cf80 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59  LITE_TESTCTRL_BY
1cf90 54 45 4f 52 44 45 52 29 3b 0a 20 20 20 20 2a 2a  TEORDER);.    **
1cfa0 0a 20 20 20 20 2a 2a 20 54 68 65 20 69 6e 74 65  .    ** The inte
1cfb0 67 65 72 20 72 65 74 75 72 6e 65 64 20 72 65 76  ger returned rev
1cfc0 65 61 6c 73 20 74 68 65 20 62 79 74 65 2d 6f 72  eals the byte-or
1cfd0 64 65 72 20 6f 66 20 74 68 65 20 63 6f 6d 70 75  der of the compu
1cfe0 74 65 72 20 6f 6e 20 77 68 69 63 68 0a 20 20 20  ter on which.   
1cff0 20 2a 2a 20 53 51 4c 69 74 65 20 69 73 20 72 75   ** SQLite is ru
1d000 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a 0a 20 20  nning:.    **.  
1d010 20 20 2a 2a 20 20 20 20 20 20 20 31 20 20 20 20    **       1    
1d020 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20   big-endian,    
1d030 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75  determined at ru
1d040 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 20  n-time.    **   
1d050 20 20 20 31 30 20 20 20 20 20 6c 69 74 74 6c 65     10     little
1d060 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69  -endian, determi
1d070 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a  ned at run-time.
1d080 20 20 20 20 2a 2a 20 20 34 33 32 31 30 31 20 20      **  432101  
1d090 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20 20     big-endian,  
1d0a0 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20    determined at 
1d0b0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20  compile-time.   
1d0c0 20 2a 2a 20 20 31 32 33 34 31 30 20 20 20 20 20   **  123410     
1d0d0 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64  little-endian, d
1d0e0 65 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d  etermined at com
1d0f0 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2f  pile-time.    */
1d100 20 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54   .    case SQLIT
1d110 45 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f  E_TESTCTRL_BYTEO
1d120 52 44 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 63  RDER: {.      rc
1d130 20 3d 20 53 51 4c 49 54 45 5f 42 59 54 45 4f 52   = SQLITE_BYTEOR
1d140 44 45 52 2a 31 30 30 20 2b 20 53 51 4c 49 54 45  DER*100 + SQLITE
1d150 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e 2a 31 30  _LITTLEENDIAN*10
1d160 20 2b 20 53 51 4c 49 54 45 5f 42 49 47 45 4e 44   + SQLITE_BIGEND
1d170 49 41 4e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  IAN;.      break
1d180 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1d190 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1d1a0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1d1b0 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20  STCTRL_RESERVE, 
1d1c0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
1d1d0 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   N).    **.    *
1d1e0 2a 20 53 65 74 20 74 68 65 20 6e 52 65 73 65 72  * Set the nReser
1d1f0 76 65 20 73 69 7a 65 20 74 6f 20 4e 20 66 6f 72  ve size to N for
1d200 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
1d210 73 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  se on the databa
1d220 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63  se.    ** connec
1d230 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20 2a 2f 0a  tion db..    */.
1d240 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1d250 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45  TESTCTRL_RESERVE
1d260 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1d270 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61  3 *db = va_arg(a
1d280 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  p, sqlite3*);.  
1d290 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61      int x = va_a
1d2a0 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
1d2b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1d2c0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
1d2d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
1d2e0 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
1d2f0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20  db->aDb[0].pBt, 
1d300 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, x, 0);.      
1d310 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1d320 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1d330 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d340 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69   }..    /*  sqli
1d350 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1d360 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1d370 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20  _OPTIMIZATIONS, 
1d380 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
1d390 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   N).    **.    *
1d3a0 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
1d3b0 62 6c 65 20 76 61 72 69 6f 75 73 20 6f 70 74 69  ble various opti
1d3c0 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72 20 74 65  mizations for te
1d3d0 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20  sting purposes. 
1d3e0 20 54 68 65 20 0a 20 20 20 20 2a 2a 20 61 72 67   The .    ** arg
1d3f0 75 6d 65 6e 74 20 4e 20 69 73 20 61 20 62 69 74  ument N is a bit
1d400 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d 69 7a 61  mask of optimiza
1d410 74 69 6f 6e 73 20 74 6f 20 62 65 20 64 69 73 61  tions to be disa
1d420 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f 72 6d 61  bled.  For norma
1d430 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69  l.    ** operati
1d440 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62 65 20 30  on N should be 0
1d450 2e 20 20 54 68 65 20 69 64 65 61 20 69 73 20 74  .  The idea is t
1d460 68 61 74 20 61 20 74 65 73 74 20 70 72 6f 67 72  hat a test progr
1d470 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a 20 20 20  am (like the.   
1d480 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63 20 54 65   ** SQL Logic Te
1d490 73 74 20 6f 72 20 53 4c 54 20 74 65 73 74 20 6d  st or SLT test m
1d4a0 6f 64 75 6c 65 29 20 63 61 6e 20 72 75 6e 20 74  odule) can run t
1d4b0 68 65 20 73 61 6d 65 20 53 51 4c 20 6d 75 6c 74  he same SQL mult
1d4c0 69 70 6c 65 20 74 69 6d 65 73 0a 20 20 20 20 2a  iple times.    *
1d4d0 2a 20 77 69 74 68 20 76 61 72 69 6f 75 73 20 6f  * with various o
1d4e0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 64 69 73  ptimizations dis
1d4f0 61 62 6c 65 64 20 74 6f 20 76 65 72 69 66 79 20  abled to verify 
1d500 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 61 6e  that the same an
1d510 73 77 65 72 0a 20 20 20 20 2a 2a 20 69 73 20 6f  swer.    ** is o
1d520 62 74 61 69 6e 65 64 20 69 6e 20 65 76 65 72 79  btained in every
1d530 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
1d540 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1d550 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
1d560 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20 20 73 71  IONS: {.      sq
1d570 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
1d580 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
1d590 3b 0a 20 20 20 20 20 20 64 62 2d 3e 64 62 4f 70  ;.      db->dbOp
1d5a0 74 46 6c 61 67 73 20 3d 20 28 75 31 36 29 28 76  tFlags = (u16)(v
1d5b0 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 20 26  a_arg(ap, int) &
1d5c0 20 30 78 66 66 66 66 29 3b 0a 20 20 20 20 20 20   0xffff);.      
1d5d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
1d5e0 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45  fdef SQLITE_N_KE
1d5f0 59 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73 71 6c  YWORD.    /* sql
1d600 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1d610 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1d620 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63 6f 6e  L_ISKEYWORD, con
1d630 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 29 0a  st char *zWord).
1d640 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
1d650 20 7a 57 6f 72 64 20 69 73 20 61 20 6b 65 79 77   zWord is a keyw
1d660 6f 72 64 20 72 65 63 6f 67 6e 69 7a 65 64 20 62  ord recognized b
1d670 79 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68  y the parser, th
1d680 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 20 20  en return the.  
1d690 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 6b    ** number of k
1d6a0 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 69 66 20  eywords.  Or if 
1d6b0 7a 57 6f 72 64 20 69 73 20 6e 6f 74 20 61 20 6b  zWord is not a k
1d6c0 65 79 77 6f 72 64 2c 20 72 65 74 75 72 6e 20 30  eyword, return 0
1d6d0 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
1d6e0 20 54 68 69 73 20 74 65 73 74 20 66 65 61 74 75   This test featu
1d6f0 72 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  re is only avail
1d700 61 62 6c 65 20 69 6e 20 74 68 65 20 61 6d 61 6c  able in the amal
1d710 67 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65 0a 20  gamation since. 
1d720 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45     ** the SQLITE
1d730 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63 72 6f  _N_KEYWORD macro
1d740 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20   is not defined 
1d750 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69 66 20  in this file if 
1d760 53 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20 69 73  SQLite.    ** is
1d770 20 62 75 69 6c 74 20 75 73 69 6e 67 20 73 65 70   built using sep
1d780 61 72 61 74 65 20 73 6f 75 72 63 65 20 66 69 6c  arate source fil
1d790 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  es..    */.    c
1d7a0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1d7b0 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20 7b  TRL_ISKEYWORD: {
1d7c0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1d7d0 72 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f 61 72  r *zWord = va_ar
1d7e0 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g(ap, const char
1d7f0 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  *);.      int n 
1d800 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1d810 30 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20 20 20  0(zWord);.      
1d820 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4b 65 79  rc = (sqlite3Key
1d830 77 6f 72 64 43 6f 64 65 28 28 75 38 2a 29 7a 57  wordCode((u8*)zW
1d840 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44 29 20  ord, n)!=TK_ID) 
1d850 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  ? SQLITE_N_KEYWO
1d860 52 44 20 3a 20 30 3b 0a 20 20 20 20 20 20 62 72  RD : 0;.      br
1d870 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
1d880 66 20 0a 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74  f ..    /* sqlit
1d890 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1d8a0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1d8b0 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 2c 20 73  SCRATCHMALLOC, s
1d8c0 7a 2c 20 26 70 4e 65 77 2c 20 70 46 72 65 65 29  z, &pNew, pFree)
1d8d0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1d8e0 50 61 73 73 20 70 46 72 65 65 20 69 6e 74 6f 20  Pass pFree into 
1d8f0 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
1d900 65 65 28 29 2e 20 0a 20 20 20 20 2a 2a 20 49 66  ee(). .    ** If
1d910 20 73 7a 3e 30 20 74 68 65 6e 20 61 6c 6c 6f 63   sz>0 then alloc
1d920 61 74 65 20 61 20 73 63 72 61 74 63 68 20 62 75  ate a scratch bu
1d930 66 66 65 72 20 69 6e 74 6f 20 70 4e 65 77 2e 20  ffer into pNew. 
1d940 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73   .    */.    cas
1d950 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1d960 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 3a  L_SCRATCHMALLOC:
1d970 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
1d980 46 72 65 65 2c 20 2a 2a 70 70 4e 65 77 3b 0a 20  Free, **ppNew;. 
1d990 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20       int sz;.   
1d9a0 20 20 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61     sz = va_arg(a
1d9b0 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 70  p, int);.      p
1d9c0 70 4e 65 77 20 3d 20 76 61 5f 61 72 67 28 61 70  pNew = va_arg(ap
1d9d0 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20 20 20 20 20  , void**);.     
1d9e0 20 70 46 72 65 65 20 3d 20 76 61 5f 61 72 67 28   pFree = va_arg(
1d9f0 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
1da00 20 20 69 66 28 20 73 7a 20 29 20 2a 70 70 4e 65    if( sz ) *ppNe
1da10 77 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74  w = sqlite3Scrat
1da20 63 68 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20  chMalloc(sz);.  
1da30 20 20 20 20 73 71 6c 69 74 65 33 53 63 72 61 74      sqlite3Scrat
1da40 63 68 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20  chFree(pFree);. 
1da50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1da60 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
1da70 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1da80 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1da90 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
1daa0 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20 20  , int onoff);.  
1dab0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 70    **.    ** If p
1dac0 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20 69  arameter onoff i
1dad0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66  s non-zero, conf
1dae0 69 67 75 72 65 20 74 68 65 20 77 72 61 70 70 65  igure the wrappe
1daf0 72 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 0a 20  rs so that all. 
1db00 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e 74     ** subsequent
1db10 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c 74   calls to localt
1db20 69 6d 65 28 29 20 61 6e 64 20 76 61 72 69 61 6e  ime() and varian
1db30 74 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f 66  ts fail. If onof
1db40 66 20 69 73 20 7a 65 72 6f 2c 0a 20 20 20 20 2a  f is zero,.    *
1db50 2a 20 75 6e 64 6f 20 74 68 69 73 20 73 65 74 74  * undo this sett
1db60 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
1db70 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1db80 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46  CTRL_LOCALTIME_F
1db90 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  AULT: {.      sq
1dba0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1dbb0 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75 6c  g.bLocaltimeFaul
1dbc0 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
1dbd0 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
1dbe0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1dbf0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1dc00 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1dc10 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52  STCTRL_NEVER_COR
1dc20 52 55 50 54 2c 20 69 6e 74 29 3b 0a 20 20 20 20  RUPT, int);.    
1dc30 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 6f 72  **.    ** Set or
1dc40 20 63 6c 65 61 72 20 61 20 66 6c 61 67 20 74 68   clear a flag th
1dc50 61 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  at indicates tha
1dc60 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1dc70 69 6c 65 20 69 73 20 61 6c 77 61 79 73 20 77 65  ile is always we
1dc80 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 65  ll-.    ** forme
1dc90 64 20 61 6e 64 20 6e 65 76 65 72 20 63 6f 72 72  d and never corr
1dca0 75 70 74 2e 20 20 54 68 69 73 20 66 6c 61 67 20  upt.  This flag 
1dcb0 69 73 20 63 6c 65 61 72 20 62 79 20 64 65 66 61  is clear by defa
1dcc0 75 6c 74 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ult, indicating 
1dcd0 74 68 61 74 0a 20 20 20 20 2a 2a 20 64 61 74 61  that.    ** data
1dce0 62 61 73 65 20 66 69 6c 65 73 20 6d 69 67 68 74  base files might
1dcf0 20 68 61 76 65 20 61 72 62 69 74 72 61 72 79 20   have arbitrary 
1dd00 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 53 65 74  corruption.  Set
1dd10 74 69 6e 67 20 74 68 65 20 66 6c 61 67 20 64 75  ting the flag du
1dd20 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74 65 73 74  ring.    ** test
1dd30 69 6e 67 20 63 61 75 73 65 73 20 63 65 72 74 61  ing causes certa
1dd40 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
1dd50 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f  ements in the co
1dd60 64 65 20 74 6f 20 62 65 20 61 63 74 69 76 61 74  de to be activat
1dd70 65 64 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64  ed.    ** that d
1dd80 65 6d 6f 6e 73 74 72 61 74 20 69 6e 76 61 72 69  emonstrat invari
1dd90 61 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d 66 6f 72  ants on well-for
1dda0 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
1ddb0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  es..    */.    c
1ddc0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1ddd0 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50  TRL_NEVER_CORRUP
1dde0 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
1ddf0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
1de00 65 76 65 72 43 6f 72 72 75 70 74 20 3d 20 76 61  everCorrupt = va
1de10 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
1de20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1de30 7d 0a 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c  }...    /*   sql
1de40 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1de50 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1de60 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 2c  L_VDBE_COVERAGE,
1de70 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70 74 72 29   xCallback, ptr)
1de80 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1de90 53 65 74 20 74 68 65 20 56 44 42 45 20 63 6f 76  Set the VDBE cov
1dea0 65 72 61 67 65 20 63 61 6c 6c 62 61 63 6b 20 66  erage callback f
1deb0 75 6e 63 74 69 6f 6e 20 74 6f 20 78 43 61 6c 6c  unction to xCall
1dec0 62 61 63 6b 20 77 69 74 68 20 63 6f 6e 74 65 78  back with contex
1ded0 74 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65  t .    ** pointe
1dee0 72 20 70 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  r ptr..    */.  
1def0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1df00 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45  STCTRL_VDBE_COVE
1df10 52 41 47 45 3a 20 7b 0a 23 69 66 64 65 66 20 53  RAGE: {.#ifdef S
1df20 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52  QLITE_VDBE_COVER
1df30 41 47 45 0a 20 20 20 20 20 20 74 79 70 65 64 65  AGE.      typede
1df40 66 20 76 6f 69 64 20 28 2a 62 72 61 6e 63 68 5f  f void (*branch_
1df50 63 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c  callback)(void*,
1df60 69 6e 74 2c 75 38 2c 75 38 29 3b 0a 20 20 20 20  int,u8,u8);.    
1df70 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1df80 6f 6e 66 69 67 2e 78 56 64 62 65 42 72 61 6e 63  onfig.xVdbeBranc
1df90 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 62 72  h = va_arg(ap,br
1dfa0 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29 3b 0a  anch_callback);.
1dfb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1dfc0 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64 62 65 42  balConfig.pVdbeB
1dfd0 72 61 6e 63 68 41 72 67 20 3d 20 76 61 5f 61 72  ranchArg = va_ar
1dfe0 67 28 61 70 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e  g(ap,void*);.#en
1dff0 64 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  dif.      break;
1e000 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
1e010 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1e020 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1e030 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41  TCTRL_SORTER_MMA
1e040 50 2c 20 64 62 2c 20 6e 4d 61 78 29 3b 20 2a 2f  P, db, nMax); */
1e050 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e060 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52  _TESTCTRL_SORTER
1e070 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20 20 20 73  _MMAP: {.      s
1e080 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
1e090 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
1e0a0 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 4d 61  );.      db->nMa
1e0b0 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20 76 61  xSorterMmap = va
1e0c0 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
1e0d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e0e0 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
1e0f0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1e100 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1e110 5f 49 53 49 4e 49 54 29 3b 0a 20 20 20 20 2a 2a  _ISINIT);.    **
1e120 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 53  .    ** Return S
1e130 51 4c 49 54 45 5f 4f 4b 20 69 66 20 53 51 4c 69  QLITE_OK if SQLi
1e140 74 65 20 68 61 73 20 62 65 65 6e 20 69 6e 69 74  te has been init
1e150 69 61 6c 69 7a 65 64 20 61 6e 64 20 53 51 4c 49  ialized and SQLI
1e160 54 45 5f 45 52 52 4f 52 20 69 66 0a 20 20 20 20  TE_ERROR if.    
1e170 2a 2a 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20  ** not..    */. 
1e180 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1e190 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 3a 20  ESTCTRL_ISINIT: 
1e1a0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
1e1b0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1e1c0 69 73 49 6e 69 74 3d 3d 30 20 29 20 72 63 20 3d  isInit==0 ) rc =
1e1d0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1e1e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e1f0 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71 6c 69 74  }..    /*  sqlit
1e200 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1e210 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e220 49 4d 50 4f 53 54 45 52 2c 20 64 62 2c 20 64 62  IMPOSTER, db, db
1e230 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c 20 74 6e 75  Name, onOff, tnu
1e240 6d 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  m);.    **.    *
1e250 2a 20 54 68 69 73 20 74 65 73 74 20 63 6f 6e 74  * This test cont
1e260 72 6f 6c 20 69 73 20 75 73 65 64 20 74 6f 20 63  rol is used to c
1e270 72 65 61 74 65 20 69 6d 70 6f 73 74 65 72 20 74  reate imposter t
1e280 61 62 6c 65 73 2e 20 20 22 64 62 22 20 69 73 20  ables.  "db" is 
1e290 61 20 70 6f 69 6e 74 65 72 0a 20 20 20 20 2a 2a  a pointer.    **
1e2a0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1e2b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 64 62   connection.  db
1e2c0 4e 61 6d 65 20 69 73 20 74 68 65 20 64 61 74 61  Name is the data
1e2d0 62 61 73 65 20 6e 61 6d 65 20 28 65 78 3a 20 22  base name (ex: "
1e2e0 6d 61 69 6e 22 20 6f 72 0a 20 20 20 20 2a 2a 20  main" or.    ** 
1e2f0 22 74 65 6d 70 22 29 20 77 68 69 63 68 20 77 69  "temp") which wi
1e300 6c 6c 20 72 65 63 65 69 76 65 20 74 68 65 20 69  ll receive the i
1e310 6d 70 6f 73 74 65 72 2e 20 20 22 6f 6e 4f 66 66  mposter.  "onOff
1e320 22 20 74 75 72 6e 73 20 69 6d 70 6f 73 74 65 72  " turns imposter
1e330 20 6d 6f 64 65 20 6f 6e 0a 20 20 20 20 2a 2a 20   mode on.    ** 
1e340 6f 72 20 6f 66 66 2e 20 20 22 74 6e 75 6d 22 20  or off.  "tnum" 
1e350 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
1e360 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 74   of the b-tree t
1e370 6f 20 77 68 69 63 68 20 74 68 65 20 69 6d 70 6f  o which the impo
1e380 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c  ster.    ** tabl
1e390 65 20 73 68 6f 75 6c 64 20 63 6f 6e 6e 65 63 74  e should connect
1e3a0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1e3b0 45 6e 61 62 6c 65 20 69 6d 70 6f 73 74 65 72 20  Enable imposter 
1e3c0 6d 6f 64 65 20 6f 6e 6c 79 20 77 68 65 6e 20 74  mode only when t
1e3d0 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 61 6c  he schema has al
1e3e0 72 65 61 64 79 20 62 65 65 6e 20 70 61 72 73 65  ready been parse
1e3f0 64 2e 20 20 54 68 65 6e 0a 20 20 20 20 2a 2a 20  d.  Then.    ** 
1e400 72 75 6e 20 61 20 73 69 6e 67 6c 65 20 43 52 45  run a single CRE
1e410 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
1e420 65 6e 74 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ent to construct
1e430 20 74 68 65 20 69 6d 70 6f 73 74 65 72 20 74 61   the imposter ta
1e440 62 6c 65 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ble in.    ** th
1e450 65 20 70 61 72 73 65 64 20 73 63 68 65 6d 61 2e  e parsed schema.
1e460 20 20 54 68 65 6e 20 74 75 72 6e 20 69 6d 70 6f    Then turn impo
1e470 73 74 65 72 20 6d 6f 64 65 20 62 61 63 6b 20 6f  ster mode back o
1e480 66 66 20 61 67 61 69 6e 2e 0a 20 20 20 20 2a 2a  ff again..    **
1e490 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 4f 66 66  .    ** If onOff
1e4a0 3d 3d 30 20 61 6e 64 20 74 6e 75 6d 3e 30 20 74  ==0 and tnum>0 t
1e4b0 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 73 63  hen reset the sc
1e4c0 68 65 6d 61 20 66 6f 72 20 61 6c 6c 20 64 61 74  hema for all dat
1e4d0 61 62 61 73 65 73 2c 20 63 61 75 73 69 6e 67 0a  abases, causing.
1e4e0 20 20 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d      ** the schem
1e4f0 61 20 74 6f 20 62 65 20 72 65 70 61 72 73 65 64  a to be reparsed
1e500 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 69   the next time i
1e510 74 20 69 73 20 6e 65 65 64 65 64 2e 20 20 54 68  t is needed.  Th
1e520 69 73 20 68 61 73 20 74 68 65 0a 20 20 20 20 2a  is has the.    *
1e530 2a 20 65 66 66 65 63 74 20 6f 66 20 65 72 61 73  * effect of eras
1e540 69 6e 67 20 61 6c 6c 20 69 6d 70 6f 73 74 65 72  ing all imposter
1e550 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a   tables..    */.
1e560 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e570 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
1e580 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
1e590 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28  e3 *db = va_arg(
1e5a0 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20  ap, sqlite3*);. 
1e5b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
1e5c0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1e5d0 65 78 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69  ex);.      db->i
1e5e0 6e 69 74 2e 69 44 62 20 3d 20 73 71 6c 69 74 65  nit.iDb = sqlite
1e5f0 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
1e600 76 61 5f 61 72 67 28 61 70 2c 63 6f 6e 73 74 20  va_arg(ap,const 
1e610 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 64  char*));.      d
1e620 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 3d 20 64  b->init.busy = d
1e630 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72  b->init.imposter
1e640 54 61 62 6c 65 20 3d 20 76 61 5f 61 72 67 28 61  Table = va_arg(a
1e650 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 64 62  p,int);.      db
1e660 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 3d  ->init.newTnum =
1e670 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b   va_arg(ap,int);
1e680 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 69  .      if( db->i
1e690 6e 69 74 2e 62 75 73 79 3d 3d 30 20 26 26 20 64  nit.busy==0 && d
1e6a0 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3e  b->init.newTnum>
1e6b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
1e6c0 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65  ite3ResetAllSche
1e6d0 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28  masOfConnection(
1e6e0 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  db);.      }.   
1e6f0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1e700 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1e710 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e720 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65      }.  }.  va_e
1e730 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f  nd(ap);.#endif /
1e740 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55  * SQLITE_OMIT_BU
1e750 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f 0a 20 20  ILTIN_TEST */.  
1e760 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e770 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74  .** This is a ut
1e780 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 2c 20 75  ility routine, u
1e790 73 65 66 75 6c 20 74 6f 20 56 46 53 20 69 6d 70  seful to VFS imp
1e7a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68  lementations, th
1e7b0 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f 20  at checks.** to 
1e7c0 73 65 65 20 69 66 20 61 20 64 61 74 61 62 61 73  see if a databas
1e7d0 65 20 66 69 6c 65 20 77 61 73 20 61 20 55 52 49  e file was a URI
1e7e0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 65 64 20   that contained 
1e7f0 61 20 73 70 65 63 69 66 69 63 20 71 75 65 72 79  a specific query
1e800 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c 20   .** parameter, 
1e810 61 6e 64 20 69 66 20 73 6f 20 6f 62 74 61 69 6e  and if so obtain
1e820 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
1e830 68 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  he query paramet
1e840 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46  er..**.** The zF
1e850 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
1e860 20 69 73 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   is the filename
1e870 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20   pointer passed 
1e880 69 6e 74 6f 20 74 68 65 20 78 4f 70 65 6e 28 29  into the xOpen()
1e890 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 61 20  .** method of a 
1e8a0 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
1e8b0 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72 61 6d 20  on.  The zParam 
1e8c0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
1e8d0 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 71  name of the.** q
1e8e0 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 77  uery parameter w
1e8f0 65 20 73 65 65 6b 2e 20 20 54 68 69 73 20 72 6f  e seek.  This ro
1e900 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1e910 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 7a  e value of the z
1e920 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61 6d 65 74  Param.** paramet
1e930 65 72 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  er if it exists.
1e940 20 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74    If the paramet
1e950 65 72 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  er does not exis
1e960 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  t, this routine.
1e970 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 4e 55 4c  ** returns a NUL
1e980 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f  L pointer..*/.co
1e990 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
1e9a0 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
1e9b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1e9c0 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  ename, const cha
1e9d0 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20 20 69 66  r *zParam){.  if
1e9e0 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  ( zFilename==0 |
1e9f0 7c 20 7a 50 61 72 61 6d 3d 3d 30 20 29 20 72 65  | zParam==0 ) re
1ea00 74 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e  turn 0;.  zFilen
1ea10 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  ame += sqlite3St
1ea20 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
1ea30 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  ) + 1;.  while( 
1ea40 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
1ea50 20 20 20 20 69 6e 74 20 78 20 3d 20 73 74 72 63      int x = strc
1ea60 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  mp(zFilename, zP
1ea70 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65  aram);.    zFile
1ea80 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
1ea90 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
1eaa0 65 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20  e) + 1;.    if( 
1eab0 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 46  x==0 ) return zF
1eac0 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69  ilename;.    zFi
1ead0 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65  lename += sqlite
1eae0 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
1eaf0 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20  ame) + 1;.  }.  
1eb00 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1eb10 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c  ** Return a bool
1eb20 65 61 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20  ean value for a 
1eb30 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
1eb40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1eb50 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73  uri_boolean(cons
1eb60 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1eb70 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1eb80 50 61 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74  Param, int bDflt
1eb90 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1eba0 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  *z = sqlite3_uri
1ebb0 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65  _parameter(zFile
1ebc0 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20  name, zParam);. 
1ebd0 20 62 44 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d   bDflt = bDflt!=
1ebe0 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f 20  0;.  return z ? 
1ebf0 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61  sqlite3GetBoolea
1ec00 6e 28 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62 44  n(z, bDflt) : bD
1ec10 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  flt;.}../*.** Re
1ec20 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20 69 6e  turn a 64-bit in
1ec30 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20  teger value for 
1ec40 61 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  a query paramete
1ec50 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e  r..*/.sqlite3_in
1ec60 74 36 34 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  t64 sqlite3_uri_
1ec70 69 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74 20 63  int64(.  const c
1ec80 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1ec90 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61     /* Filename a
1eca0 73 20 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65  s passed to xOpe
1ecb0 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
1ecc0 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20 20  r *zParam,      
1ecd0 20 2f 2a 20 55 52 49 20 70 61 72 61 6d 65 74 65   /* URI paramete
1ece0 72 20 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71  r sought */.  sq
1ecf0 6c 69 74 65 33 5f 69 6e 74 36 34 20 62 44 66 6c  lite3_int64 bDfl
1ed00 74 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72  t       /* retur
1ed10 6e 20 69 66 20 70 61 72 61 6d 65 74 65 72 20 69  n if parameter i
1ed20 73 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a  s missing */.){.
1ed30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
1ed40 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  = sqlite3_uri_pa
1ed50 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d  rameter(zFilenam
1ed60 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71  e, zParam);.  sq
1ed70 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20  lite3_int64 v;. 
1ed80 20 69 66 28 20 7a 20 26 26 20 73 71 6c 69 74 65   if( z && sqlite
1ed90 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a  3DecOrHexToI64(z
1eda0 2c 20 26 76 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  , &v)==SQLITE_OK
1edb0 20 29 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d 20   ){.    bDflt = 
1edc0 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  v;.  }.  return 
1edd0 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  bDflt;.}../*.** 
1ede0 52 65 74 75 72 6e 20 74 68 65 20 42 74 72 65 65  Return the Btree
1edf0 20 70 6f 69 6e 74 65 72 20 69 64 65 6e 74 69 66   pointer identif
1ee00 69 65 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20  ied by zDbName. 
1ee10 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
1ee20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74  not found..*/.Bt
1ee30 72 65 65 20 2a 73 71 6c 69 74 65 33 44 62 4e 61  ree *sqlite3DbNa
1ee40 6d 65 54 6f 42 74 72 65 65 28 73 71 6c 69 74 65  meToBtree(sqlite
1ee50 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1ee60 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69  r *zDbName){.  i
1ee70 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1ee80 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
1ee90 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44  {.    if( db->aD
1eea0 62 5b 69 5d 2e 70 42 74 0a 20 20 20 20 20 26 26  b[i].pBt.     &&
1eeb0 20 28 7a 44 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20   (zDbName==0 || 
1eec0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1eed0 44 62 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b  DbName, db->aDb[
1eee0 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 29 0a 20 20  i].zName)==0).  
1eef0 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
1ef00 6e 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  n db->aDb[i].pBt
1ef10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1ef20 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1ef30 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65   Return the file
1ef40 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
1ef50 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20  base associated 
1ef60 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 0a  with a database.
1ef70 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ** connection..*
1ef80 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1ef90 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d  lite3_db_filenam
1efa0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
1efb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1efc0 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  me){.  Btree *pB
1efd0 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  t;.#ifdef SQLITE
1efe0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1eff0 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1f000 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1f010 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
1f020 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
1f030 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
1f040 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42  .  }.#endif.  pB
1f050 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d  t = sqlite3DbNam
1f060 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62  eToBtree(db, zDb
1f070 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
1f080 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72  pBt ? sqlite3Btr
1f090 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 70 42  eeGetFilename(pB
1f0a0 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  t) : 0;.}../*.**
1f0b0 20 52 65 74 75 72 6e 20 31 20 69 66 20 64 61 74   Return 1 if dat
1f0c0 61 62 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e  abase is read-on
1f0d0 6c 79 20 6f 72 20 30 20 69 66 20 72 65 61 64 2f  ly or 0 if read/
1f0e0 77 72 69 74 65 2e 20 20 52 65 74 75 72 6e 20 2d  write.  Return -
1f0f0 31 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  1 if.** no such 
1f100 64 61 74 61 62 61 73 65 20 65 78 69 73 74 73 2e  database exists.
1f110 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1f120 64 62 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69  db_readonly(sqli
1f130 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
1f140 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20  har *zDbName){. 
1f150 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23 69 66   Btree *pBt;.#if
1f160 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1f170 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
1f180 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
1f190 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
1f1a0 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
1f1b0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
1f1c0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
1f1d0 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d 20 73  #endif.  pBt = s
1f1e0 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
1f1f0 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ree(db, zDbName)
1f200 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f  ;.  return pBt ?
1f210 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52   sqlite3BtreeIsR
1f220 65 61 64 6f 6e 6c 79 28 70 42 74 29 20 3a 20 2d  eadonly(pBt) : -
1f230 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  1;.}..#ifdef SQL
1f240 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53  ITE_ENABLE_SNAPS
1f250 48 4f 54 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e  HOT./*.** Obtain
1f260 20 61 20 73 6e 61 70 73 68 6f 74 20 68 61 6e 64   a snapshot hand
1f270 6c 65 20 66 6f 72 20 74 68 65 20 73 6e 61 70 73  le for the snaps
1f280 68 6f 74 20 6f 66 20 64 61 74 61 62 61 73 65 20  hot of database 
1f290 7a 44 62 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a  zDb currently .*
1f2a0 2a 20 62 65 69 6e 67 20 72 65 61 64 20 62 79 20  * being read by 
1f2b0 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
1f2c0 74 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  t sqlite3_snapsh
1f2d0 6f 74 5f 67 65 74 28 0a 20 20 73 71 6c 69 74 65  ot_get(.  sqlite
1f2e0 33 20 2a 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3 *db, .  const 
1f2f0 63 68 61 72 20 2a 7a 44 62 2c 0a 20 20 73 71 6c  char *zDb,.  sql
1f300 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 2a  ite3_snapshot **
1f310 70 70 53 6e 61 70 73 68 6f 74 0a 29 7b 0a 20 20  ppSnapshot.){.  
1f320 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1f330 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65 66 20 53  ERROR;.#ifndef S
1f340 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
1f350 20 69 6e 74 20 69 44 62 3b 0a 0a 23 69 66 64 65   int iDb;..#ifde
1f360 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1f370 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1f380 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1f390 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
1f3a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1f3b0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
1f3c0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1f3d0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1f3e0 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 69 44 62 20  >mutex);..  iDb 
1f3f0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  = sqlite3FindDbN
1f400 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  ame(db, zDb);.  
1f410 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44  if( iDb==0 || iD
1f420 62 3e 31 20 29 7b 0a 20 20 20 20 42 74 72 65 65  b>1 ){.    Btree
1f430 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
1f440 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  iDb].pBt;.    if
1f450 28 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  ( 0==sqlite3Btre
1f460 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20  eIsInTrans(pBt) 
1f470 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1f480 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
1f490 72 61 6e 73 28 70 42 74 2c 20 30 29 3b 0a 20 20  rans(pBt, 0);.  
1f4a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f4b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f4c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f4d0 65 72 53 6e 61 70 73 68 6f 74 47 65 74 28 73 71  erSnapshotGet(sq
1f4e0 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
1f4f0 70 42 74 29 2c 20 70 70 53 6e 61 70 73 68 6f 74  pBt), ppSnapshot
1f500 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1f510 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
1f520 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1f530 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 20 20  mutex);.#endif  
1f540 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1f550 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  WAL */.  return 
1f560 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
1f570 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
1f580 74 69 6f 6e 20 6f 6e 20 74 68 65 20 73 6e 61 70  tion on the snap
1f590 73 68 6f 74 20 69 64 65 6e 64 69 66 69 65 64 20  shot idendified 
1f5a0 62 79 20 70 53 6e 61 70 73 68 6f 74 2e 0a 2a 2f  by pSnapshot..*/
1f5b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 61  .int sqlite3_sna
1f5c0 70 73 68 6f 74 5f 6f 70 65 6e 28 0a 20 20 73 71  pshot_open(.  sq
1f5d0 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f  lite3 *db, .  co
1f5e0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 0a  nst char *zDb, .
1f5f0 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68    sqlite3_snapsh
1f600 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 0a 29 7b  ot *pSnapshot.){
1f610 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1f620 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64 65  TE_ERROR;.#ifnde
1f630 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1f640 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  L..#ifdef SQLITE
1f650 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1f660 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1f670 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1f680 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1f690 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1f6a0 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  PT;.  }.#endif. 
1f6b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1f6c0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1f6d0 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43  .  if( db->autoC
1f6e0 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
1f6f0 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 69 44 62  int iDb;.    iDb
1f700 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
1f710 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20  Name(db, zDb);. 
1f720 20 20 20 69 66 28 20 69 44 62 3d 3d 30 20 7c 7c     if( iDb==0 ||
1f730 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 20 20   iDb>1 ){.      
1f740 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
1f750 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
1f760 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69       if( 0==sqli
1f770 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61 64  te3BtreeIsInRead
1f780 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20  Trans(pBt) ){.  
1f790 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f7a0 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 4f  e3PagerSnapshotO
1f7b0 70 65 6e 28 73 71 6c 69 74 65 33 42 74 72 65 65  pen(sqlite3Btree
1f7c0 50 61 67 65 72 28 70 42 74 29 2c 20 70 53 6e 61  Pager(pBt), pSna
1f7d0 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pshot);.        
1f7e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f7f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1f800 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1f810 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20  BeginTrans(pBt, 
1f820 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
1f830 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68  lite3PagerSnapsh
1f840 6f 74 4f 70 65 6e 28 73 71 6c 69 74 65 33 42 74  otOpen(sqlite3Bt
1f850 72 65 65 50 61 67 65 72 28 70 42 74 29 2c 20 30  reePager(pBt), 0
1f860 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1f870 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1f880 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1f890 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1f8a0 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53 51  ;.#endif   /* SQ
1f8b0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
1f8c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f8d0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73 6e  ./*.** Free a sn
1f8e0 61 70 73 68 6f 74 20 68 61 6e 64 6c 65 20 6f 62  apshot handle ob
1f8f0 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
1f900 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74  te3_snapshot_get
1f910 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
1f920 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65  te3_snapshot_fre
1f930 65 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  e(sqlite3_snapsh
1f940 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 29 7b 0a  ot *pSnapshot){.
1f950 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1f960 53 6e 61 70 73 68 6f 74 29 3b 0a 7d 0a 23 65 6e  Snapshot);.}.#en
1f970 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
1f980 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f  ABLE_SNAPSHOT */
1f990 0a                                               .