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

Artifact 4888788cd489be591db85d6c66f2930ce789c237:


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 45 6e 61 62 6c 65 64 20 3d 20 31  ide.bEnabled = 1
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 45 6e 61 62 6c 65 64 20 3d 20  side.bEnabled = 
6470: 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  0;.    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 20 20 20 20 20 53 51 4c 49 54 45  ,         SQLITE
6db0: 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20  _ForeignKeys    
6dc0: 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c  },.        { SQL
6dd0: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41  ITE_DBCONFIG_ENA
6de0: 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 20 20 20  BLE_TRIGGER,    
6df0: 20 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54    SQLITE_EnableT
6e00: 72 69 67 67 65 72 20 20 7d 2c 0a 20 20 20 20 20  rigger  },.     
6e10: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
6e20: 4e 46 49 47 5f 52 45 51 55 49 52 45 5f 57 52 49  NFIG_REQUIRE_WRI
6e30: 54 45 5f 54 58 4e 2c 20 20 20 53 51 4c 49 54 45  TE_TXN,   SQLITE
6e40: 5f 52 65 71 75 69 72 65 57 72 54 78 6e 20 20 20  _RequireWrTxn   
6e50: 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  },.      };.    
6e60: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
6e70: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
6e80: 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 49 4d  ITE_ERROR; /* IM
6e90: 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33 37 32  P: R-42790-23372
6ea0: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
6eb0: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
6ec0: 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20  FlagOp); i++){. 
6ed0: 20 20 20 20 20 20 20 69 66 28 20 61 46 6c 61 67         if( aFlag
6ee0: 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b 0a  Op[i].op==op ){.
6ef0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6e            int on
6f00: 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  off = va_arg(ap,
6f10: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20   int);.         
6f20: 20 69 6e 74 20 2a 70 52 65 73 20 3d 20 76 61 5f   int *pRes = va_
6f30: 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20  arg(ap, int*);. 
6f40: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6c 64           int old
6f50: 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67  Flags = db->flag
6f60: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  s;.          if(
6f70: 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20 20 20   onoff>0 ){.    
6f80: 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
6f90: 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69 5d 2e  s |= aFlagOp[i].
6fa0: 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  mask;.          
6fb0: 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66 66 3d  }else if( onoff=
6fc0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6fd0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
6fe0: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b  aFlagOp[i].mask;
6ff0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7000: 20 20 20 20 20 20 20 69 66 28 20 6f 6c 64 46 6c         if( oldFl
7010: 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29  ags!=db->flags )
7020: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
7030: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
7040: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
7050: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
7060: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65           if( pRe
7070: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
7080: 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c   *pRes = (db->fl
7090: 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d  ags & aFlagOp[i]
70a0: 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20  .mask)!=0;.     
70b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
70c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
70d0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
70e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
70f0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7100: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
7110: 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72  end(ap);.  retur
7120: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
7130: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
7140: 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e  he buffer z[0..n
7150: 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  -1] contains all
7160: 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74   spaces..*/.stat
7170: 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63 65 73  ic int allSpaces
7180: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
7190: 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28  int n){.  while(
71a0: 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d   n>0 && z[n-1]==
71b0: 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  ' ' ){ n--; }.  
71c0: 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a  return n==0;.}..
71d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
71e0: 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
71f0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  ing function nam
7200: 65 64 20 22 42 49 4e 41 52 59 22 20 77 68 69 63  ed "BINARY" whic
7210: 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61  h is always.** a
7220: 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
7230: 49 66 20 74 68 65 20 70 61 64 46 6c 61 67 20 61  If the padFlag a
7240: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
7250: 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65 20 70  ULL then space p
7260: 61 64 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e  adding at the en
7270: 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73 20  d.** of strings 
7280: 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  is ignored.  Thi
7290: 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  s implements the
72a0: 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e   RTRIM collation
72b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
72c0: 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76  binCollFunc(.  v
72d0: 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20  oid *padFlag,.  
72e0: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
72f0: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
7300: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
7310: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
7320: 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e    int rc, n;.  n
7330: 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f   = nKey1<nKey2 ?
7340: 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a   nKey1 : nKey2;.
7350: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
7360: 3a 20 52 2d 36 35 30 33 33 2d 32 38 34 34 39 20  : R-65033-28449 
7370: 54 68 65 20 62 75 69 6c 74 2d 69 6e 20 42 49 4e  The built-in BIN
7380: 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 6f  ARY collation co
7390: 6d 70 61 72 65 73 0a 20 20 2a 2a 20 73 74 72 69  mpares.  ** stri
73a0: 6e 67 73 20 62 79 74 65 20 62 79 20 62 79 74 65  ngs byte by byte
73b0: 20 75 73 69 6e 67 20 74 68 65 20 6d 65 6d 63 6d   using the memcm
73c0: 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  p() function fro
73d0: 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 43  m the standard C
73e0: 0a 20 20 2a 2a 20 6c 69 62 72 61 72 79 2e 20 2a  .  ** library. *
73f0: 2f 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28  /.  rc = memcmp(
7400: 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29  pKey1, pKey2, n)
7410: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
7420: 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c 61 67  .    if( padFlag
7430: 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63  .     && allSpac
7440: 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31  es(((char*)pKey1
7450: 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20  )+n, nKey1-n).  
7460: 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28     && allSpaces(
7470: 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e  ((char*)pKey2)+n
7480: 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29  , nKey2-n).    )
7490: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
74a0: 4e 43 45 2d 4f 46 3a 20 52 2d 33 31 36 32 34 2d  NCE-OF: R-31624-
74b0: 32 34 37 33 37 20 52 54 52 49 4d 20 69 73 20 6c  24737 RTRIM is l
74c0: 69 6b 65 20 42 49 4e 41 52 59 20 65 78 63 65 70  ike BINARY excep
74d0: 74 20 74 68 61 74 20 65 78 74 72 61 0a 20 20 20  t that extra.   
74e0: 20 20 20 2a 2a 20 73 70 61 63 65 73 20 61 74 20     ** spaces at 
74f0: 74 68 65 20 65 6e 64 20 6f 66 20 65 69 74 68 65  the end of eithe
7500: 72 20 73 74 72 69 6e 67 20 64 6f 20 6e 6f 74 20  r string do not 
7510: 63 68 61 6e 67 65 20 74 68 65 20 72 65 73 75 6c  change the resul
7520: 74 2e 20 49 6e 20 6f 74 68 65 72 0a 20 20 20 20  t. In other.    
7530: 20 20 2a 2a 20 77 6f 72 64 73 2c 20 73 74 72 69    ** words, stri
7540: 6e 67 73 20 77 69 6c 6c 20 63 6f 6d 70 61 72 65  ngs will compare
7550: 20 65 71 75 61 6c 20 74 6f 20 6f 6e 65 20 61 6e   equal to one an
7560: 6f 74 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73  other as long as
7570: 20 74 68 65 79 0a 20 20 20 20 20 20 2a 2a 20 64   they.      ** d
7580: 69 66 66 65 72 20 6f 6e 6c 79 20 69 6e 20 74 68  iffer only in th
7590: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 70 61 63  e number of spac
75a0: 65 73 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 20  es at the end.. 
75b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73       */.    }els
75c0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b  e{.      rc = nK
75d0: 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20  ey1 - nKey2;.   
75e0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
75f0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f  rc;.}../*.** Ano
7600: 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f  ther built-in co
7610: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
7620: 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a  : NOCASE. .**.**
7630: 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20   This collating 
7640: 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65  sequence is inte
7650: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
7660: 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65  for "case indepe
7670: 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69  ndent.** compari
7680: 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b  son". SQLite's k
7690: 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65  nowledge of uppe
76a0: 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65  r and lower case
76b0: 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20   equivalents.** 
76c0: 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20  extends only to 
76d0: 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72  the 26 character
76e0: 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e  s used in the En
76f0: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a  glish language..
7700: 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d  **.** At the mom
7710: 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  ent there is onl
7720: 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d  y a UTF-8 implem
7730: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
7740: 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f  tic int nocaseCo
7750: 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76  llatingFunc(.  v
7760: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
7770: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
7780: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
7790: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
77a0: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
77b0: 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65    int r = sqlite
77c0: 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20  3StrNICmp(.     
77d0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
77e0: 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  Key1, (const cha
77f0: 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79  r *)pKey2, (nKey
7800: 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e  1<nKey2)?nKey1:n
7810: 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Key2);.  UNUSED_
7820: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
7830: 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29  d);.  if( 0==r )
7840: 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d  {.    r = nKey1-
7850: 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
7860: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
7870: 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44  Return the ROWID
7880: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
7890: 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71  ent insert.*/.sq
78a0: 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74  lite_int64 sqlit
78b0: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
78c0: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
78d0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
78e0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
78f0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
7900: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
7910: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
7920: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
7930: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
7940: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
7950: 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77  turn db->lastRow
7960: 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  id;.}../*.** Ret
7970: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
7980: 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65  f changes in the
7990: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c   most recent cal
79a0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65  l to sqlite3_exe
79b0: 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  c()..*/.int sqli
79c0: 74 65 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69  te3_changes(sqli
79d0: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66  te3 *db){.#ifdef
79e0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
79f0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
7a00: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
7a10: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
7a20: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
7a30: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
7a40: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
7a50: 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  if.  return db->
7a60: 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
7a70: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
7a80: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73  ber of changes s
7a90: 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73  ince the databas
7aa0: 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65  e handle was ope
7ab0: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
7ac0: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
7ad0: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
7ae0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7af0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
7b00: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
7b10: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
7b20: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
7b30: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
7b40: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7b50: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
7b60: 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e  n db->nTotalChan
7b70: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ge;.}../*.** Clo
7b80: 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  se all open save
7b90: 70 6f 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e  points. This fun
7ba0: 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70  ction only manip
7bb0: 75 6c 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66  ulates fields of
7bc0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
7bd0: 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20   handle object, 
7be0: 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73  it does not clos
7bf0: 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73  e any savepoints
7c00: 20 74 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65   that may be ope
7c10: 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72  n.** at the b-tr
7c20: 65 65 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a  ee/pager level..
7c30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
7c40: 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73  loseSavepoints(s
7c50: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77  qlite3 *db){.  w
7c60: 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70  hile( db->pSavep
7c70: 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65  oint ){.    Save
7c80: 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62  point *pTmp = db
7c90: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20  ->pSavepoint;.  
7ca0: 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74    db->pSavepoint
7cb0: 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a   = pTmp->pNext;.
7cc0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7cd0: 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d  e(db, pTmp);.  }
7ce0: 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  .  db->nSavepoin
7cf0: 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74  t = 0;.  db->nSt
7d00: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64  atement = 0;.  d
7d10: 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  b->isTransaction
7d20: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d  Savepoint = 0;.}
7d30: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
7d40: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75  he destructor fu
7d50: 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65  nction associate
7d60: 64 20 77 69 74 68 20 46 75 6e 63 44 65 66 20 70  d with FuncDef p
7d70: 2c 20 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74  , if any. Except
7d80: 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20  ,.** if this is 
7d90: 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70  not the last cop
7da0: 79 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  y of the functio
7db0: 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65  n, do not invoke
7dc0: 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a   it. Multiple.**
7dd0: 20 63 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e   copies of a sin
7de0: 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  gle function are
7df0: 20 63 72 65 61 74 65 64 20 77 68 65 6e 20 63 72   created when cr
7e00: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20  eate_function() 
7e10: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74  is called.** wit
7e20: 68 20 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20  h SQLITE_ANY as 
7e30: 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f  the encoding..*/
7e40: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e  .static void fun
7e50: 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c  ctionDestroy(sql
7e60: 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65  ite3 *db, FuncDe
7e70: 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73  f *p){.  FuncDes
7e80: 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75  tructor *pDestru
7e90: 63 74 6f 72 20 3d 20 70 2d 3e 70 44 65 73 74 72  ctor = p->pDestr
7ea0: 75 63 74 6f 72 3b 0a 20 20 69 66 28 20 70 44 65  uctor;.  if( pDe
7eb0: 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
7ec0: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
7ed0: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 65  f--;.    if( pDe
7ee0: 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d  structor->nRef==
7ef0: 30 20 29 7b 0a 20 20 20 20 20 20 70 44 65 73 74  0 ){.      pDest
7f00: 72 75 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79  ructor->xDestroy
7f10: 28 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 70 55  (pDestructor->pU
7f20: 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20 20 20  serData);.      
7f30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
7f40: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
7f50: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
7f60: 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20 61 6c  ** Disconnect al
7f70: 6c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 6f  l sqlite3_vtab o
7f80: 62 6a 65 63 74 73 20 74 68 61 74 20 62 65 6c 6f  bjects that belo
7f90: 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ng to database c
7fa0: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64 62 2e  onnection.** db.
7fb0: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
7fc0: 77 68 65 6e 20 64 62 20 69 73 20 62 65 69 6e 67  when db is being
7fd0: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
7fe0: 69 63 20 76 6f 69 64 20 64 69 73 63 6f 6e 6e 65  ic void disconne
7ff0: 63 74 41 6c 6c 56 74 61 62 28 73 71 6c 69 74 65  ctAllVtab(sqlite
8000: 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66 20  3 *db){.#ifndef 
8010: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
8020: 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20 69  UALTABLE.  int i
8030: 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b  ;.  HashElem *p;
8040: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
8050: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66  nterAll(db);.  f
8060: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
8070: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 53 63 68  b; i++){.    Sch
8080: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64  ema *pSchema = d
8090: 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d  b->aDb[i].pSchem
80a0: 61 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  a;.    if( db->a
80b0: 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[i].pSchema ){
80c0: 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c  .      for(p=sql
80d0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53  iteHashFirst(&pS
80e0: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
80f0: 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68   p; p=sqliteHash
8100: 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20  Next(p)){.      
8110: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
8120: 28 54 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 48  (Table *)sqliteH
8130: 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20  ashData(p);.    
8140: 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
8150: 6c 28 70 54 61 62 29 20 29 20 73 71 6c 69 74 65  l(pTab) ) sqlite
8160: 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28  3VtabDisconnect(
8170: 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
8180: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   }.    }.  }.  f
8190: 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46  or(p=sqliteHashF
81a0: 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  irst(&db->aModul
81b0: 65 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48  e); p; p=sqliteH
81c0: 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20  ashNext(p)){.   
81d0: 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20   Module *pMod = 
81e0: 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65  (Module *)sqlite
81f0: 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20  HashData(p);.   
8200: 20 69 66 28 20 70 4d 6f 64 2d 3e 70 45 70 6f 54   if( pMod->pEpoT
8210: 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ab ){.      sqli
8220: 74 65 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63  te3VtabDisconnec
8230: 74 28 64 62 2c 20 70 4d 6f 64 2d 3e 70 45 70 6f  t(db, pMod->pEpo
8240: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
8250: 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c    sqlite3VtabUnl
8260: 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73  ockList(db);.  s
8270: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
8280: 41 6c 6c 28 64 62 29 3b 0a 23 65 6c 73 65 0a 20  All(db);.#else. 
8290: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
82a0: 52 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  R(db);.#endif.}.
82b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
82c0: 55 45 20 69 66 20 64 61 74 61 62 61 73 65 20 63  UE if database c
82d0: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 73  onnection db has
82e0: 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65   unfinalized pre
82f0: 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65  pared.** stateme
8300: 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65  nts or unfinishe
8310: 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  d sqlite3_backup
8320: 20 6f 62 6a 65 63 74 73 2e 20 20 0a 2a 2f 0a 73   objects.  .*/.s
8330: 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 6e 65 63  tatic int connec
8340: 74 69 6f 6e 49 73 42 75 73 79 28 73 71 6c 69 74  tionIsBusy(sqlit
8350: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6a  e3 *db){.  int j
8360: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
8370: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
8380: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  b->mutex) );.  i
8390: 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 20 72  f( db->pVdbe ) r
83a0: 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 6a  eturn 1;.  for(j
83b0: 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a  =0; j<db->nDb; j
83c0: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
83d0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d  pBt = db->aDb[j]
83e0: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
83f0: 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  t && sqlite3Btre
8400: 65 49 73 49 6e 42 61 63 6b 75 70 28 70 42 74 29  eIsInBackup(pBt)
8410: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
8420: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
8430: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65  /*.** Close an e
8440: 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64  xisting SQLite d
8450: 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69  atabase.*/.stati
8460: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 43 6c 6f  c int sqlite3Clo
8470: 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  se(sqlite3 *db, 
8480: 69 6e 74 20 66 6f 72 63 65 5a 6f 6d 62 69 65 29  int forceZombie)
8490: 7b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20  {.  if( !db ){. 
84a0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
84b0: 46 3a 20 52 2d 36 33 32 35 37 2d 31 31 37 34 30  F: R-63257-11740
84c0: 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   Calling sqlite3
84d0: 5f 63 6c 6f 73 65 28 29 20 6f 72 0a 20 20 20 20  _close() or.    
84e0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  ** sqlite3_close
84f0: 5f 76 32 28 29 20 77 69 74 68 20 61 20 4e 55 4c  _v2() with a NUL
8500: 4c 20 70 6f 69 6e 74 65 72 20 61 72 67 75 6d 65  L pointer argume
8510: 6e 74 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  nt is a harmless
8520: 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 20 20 72   no-op. */.    r
8530: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8540: 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
8550: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
8560: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
8570: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8580: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
8590: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
85a0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
85b0: 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78  );..  /* Force x
85c0: 44 69 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73  Disconnect calls
85d0: 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c 20   on all virtual 
85e0: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63  tables */.  disc
85f0: 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 64 62  onnectAllVtab(db
8600: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72  );..  /* If a tr
8610: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
8620: 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e 6e 65 63  n, the disconnec
8630: 74 41 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c 20  tAllVtab() call 
8640: 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20  above.  ** will 
8650: 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20  not have called 
8660: 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28  the xDisconnect(
8670: 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20  ) method on any 
8680: 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62  virtual.  ** tab
8690: 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61  les in the db->a
86a0: 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20  VTrans[] array. 
86b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  The following sq
86c0: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
86d0: 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69  k().  ** call wi
86e0: 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65  ll do so. We nee
86f0: 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66  d to do this bef
8700: 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f  ore the check fo
8710: 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51  r active.  ** SQ
8720: 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c  L statements bel
8730: 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62  ow, as the v-tab
8740: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
8750: 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67  n may be storing
8760: 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61  .  ** some prepa
8770: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69  red statements i
8780: 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  nternally..  */.
8790: 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c    sqlite3VtabRol
87a0: 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a  lback(db);..  /*
87b0: 20 4c 65 67 61 63 79 20 62 65 68 61 76 69 6f 72   Legacy behavior
87c0: 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28   (sqlite3_close(
87d0: 29 20 62 65 68 61 76 69 6f 72 29 20 69 73 20 74  ) behavior) is t
87e0: 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  o return.  ** SQ
87f0: 4c 49 54 45 5f 42 55 53 59 20 69 66 20 74 68 65  LITE_BUSY if the
8800: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20   connection can 
8810: 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d  not be closed im
8820: 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  mediately..  */.
8830: 20 20 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62    if( !forceZomb
8840: 69 65 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e  ie && connection
8850: 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20  IsBusy(db) ){.  
8860: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
8870: 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45  thMsg(db, SQLITE
8880: 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c 65 20 74  _BUSY, "unable t
8890: 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75  o close due to u
88a0: 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20 20  nfinalized ".   
88b0: 20 20 20 20 22 73 74 61 74 65 6d 65 6e 74 73 20      "statements 
88c0: 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61  or unfinished ba
88d0: 63 6b 75 70 73 22 29 3b 0a 20 20 20 20 73 71 6c  ckups");.    sql
88e0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
88f0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
8900: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
8910: 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  USY;.  }..#ifdef
8920: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
8930: 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69  QLLOG.  if( sqli
8940: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
8950: 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f  xSqllog ){.    /
8960: 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65 20 68 61  * Closing the ha
8970: 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72  ndle. Fourth par
8980: 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64  ameter is passed
8990: 20 74 68 65 20 76 61 6c 75 65 20 32 2e 20 2a 2f   the value 2. */
89a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
89b0: 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
89c0: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  (sqlite3GlobalCo
89d0: 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c  nfig.pSqllogArg,
89e0: 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d 0a   db, 0, 2);.  }.
89f0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e  #endif..  /* Con
8a00: 76 65 72 74 20 74 68 65 20 63 6f 6e 6e 65 63 74  vert the connect
8a10: 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62 69  ion into a zombi
8a20: 65 20 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73 65  e and then close
8a30: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e   it..  */.  db->
8a40: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
8a50: 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73  AGIC_ZOMBIE;.  s
8a60: 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78  qlite3LeaveMutex
8a70: 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 64  AndCloseZombie(d
8a80: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  b);.  return SQL
8a90: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
8aa0: 20 54 77 6f 20 76 61 72 69 61 74 69 6f 6e 73 20   Two variations 
8ab0: 6f 6e 20 74 68 65 20 70 75 62 6c 69 63 20 69 6e  on the public in
8ac0: 74 65 72 66 61 63 65 20 66 6f 72 20 63 6c 6f 73  terface for clos
8ad0: 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ing a database.*
8ae0: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68  * connection. Th
8af0: 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  e sqlite3_close(
8b00: 29 20 76 65 72 73 69 6f 6e 20 72 65 74 75 72 6e  ) version return
8b10: 73 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  s SQLITE_BUSY an
8b20: 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74 68 65 20  d.** leaves the 
8b30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69 6f  connection optio
8b40: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 75  n if there are u
8b50: 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61  nfinalized prepa
8b60: 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  red.** statement
8b70: 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20  s or unfinished 
8b80: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 73 2e  sqlite3_backups.
8b90: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c    The sqlite3_cl
8ba0: 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72 73  ose_v2().** vers
8bb0: 69 6f 6e 20 66 6f 72 63 65 73 20 74 68 65 20 63  ion forces the c
8bc0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 63  onnection to bec
8bd0: 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20 69 66 20  ome a zombie if 
8be0: 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e 63  there are.** unc
8bf0: 6c 6f 73 65 64 20 72 65 73 6f 75 72 63 65 73 2c  losed resources,
8c00: 20 61 6e 64 20 61 72 72 61 6e 67 65 73 20 66 6f   and arranges fo
8c10: 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 77  r deallocation w
8c20: 68 65 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  hen the last.** 
8c30: 70 72 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e  prepare statemen
8c40: 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63  t or sqlite3_bac
8c50: 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69  kup closes..*/.i
8c60: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  nt sqlite3_close
8c70: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72  (sqlite3 *db){ r
8c80: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f  eturn sqlite3Clo
8c90: 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74 20  se(db,0); }.int 
8ca0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
8cb0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72  (sqlite3 *db){ r
8cc0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f  eturn sqlite3Clo
8cd0: 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a  se(db,1); }.../*
8ce0: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d 75  .** Close the mu
8cf0: 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20  tex on database 
8d00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 2a  connection db..*
8d10: 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65  *.** Furthermore
8d20: 2c 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f  , if database co
8d30: 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20 61  nnection db is a
8d40: 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e 67   zombie (meaning
8d50: 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 68   that there.** h
8d60: 61 73 20 62 65 65 6e 20 61 20 70 72 69 6f 72 20  as been a prior 
8d70: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
8d80: 63 6c 6f 73 65 28 64 62 29 20 6f 72 20 73 71 6c  close(db) or sql
8d90: 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62  ite3_close_v2(db
8da0: 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79 20  )) and.** every 
8db0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 61 73  sqlite3_stmt has
8dc0: 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c 69   now been finali
8dd0: 7a 65 64 20 61 6e 64 20 65 76 65 72 79 20 73 71  zed and every sq
8de0: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 68 61 73  lite3_backup has
8df0: 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20 74 68  .** finished, th
8e00: 65 6e 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f  en free all reso
8e10: 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  urces..*/.void s
8e20: 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78  qlite3LeaveMutex
8e30: 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 73  AndCloseZombie(s
8e40: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48  qlite3 *db){.  H
8e50: 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20  ashElem *i;     
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8e70: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69 74 65  * Hash table ite
8e80: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a  rator */.  int j
8e90: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
8ea0: 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
8eb0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 72   sqlite3_stmt or
8ec0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
8ed0: 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72 20  objects.  ** or 
8ee0: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
8ef0: 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  n has not yet be
8f00: 65 6e 20 63 6c 6f 73 65 64 20 62 79 20 73 71 6c  en closed by sql
8f10: 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 2c  ite3_close_v2(),
8f20: 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20  .  ** then just 
8f30: 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65 78 20  leave the mutex 
8f40: 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
8f50: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63  .  if( db->magic
8f60: 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a  !=SQLITE_MAGIC_Z
8f70: 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63 74  OMBIE || connect
8f80: 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b  ionIsBusy(db) ){
8f90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
8fa0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
8fb0: 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ex);.    return;
8fc0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
8fd0: 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
8fe0: 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
8ff0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
9000: 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a 20 20 2a  nnection has.  *
9010: 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71 6c  * closed all sql
9020: 69 74 65 33 5f 73 74 6d 74 20 61 6e 64 20 73 71  ite3_stmt and sq
9030: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a  lite3_backup obj
9040: 65 63 74 73 20 61 6e 64 20 68 61 73 20 62 65 65  ects and has bee
9050: 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f  n.  ** passed to
9060: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28   sqlite3_close (
9070: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20  meaning that it 
9080: 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20 54  is a zombie).  T
9090: 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20 67  herefore,.  ** g
90a0: 6f 20 61 68 65 61 64 20 61 6e 64 20 66 72 65 65  o ahead and free
90b0: 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a   all resources..
90c0: 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 20    */..  /* If a 
90d0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
90e0: 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61 63  pen, roll it bac
90f0: 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20 65 6e 73  k. This also ens
9100: 75 72 65 73 20 74 68 61 74 20 69 66 0a 20 20 2a  ures that if.  *
9110: 2a 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 73  * any database s
9120: 63 68 65 6d 61 73 20 68 61 76 65 20 62 65 65 6e  chemas have been
9130: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 61 6e 20   modified by an 
9140: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e  uncommitted tran
9150: 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68 65  saction.  ** the
9160: 79 20 61 72 65 20 72 65 73 65 74 2e 20 41 6e 64  y are reset. And
9170: 20 74 68 61 74 20 74 68 65 20 72 65 71 75 69 72   that the requir
9180: 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  ed b-tree mutex 
9190: 69 73 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65 0a  is held to make.
91a0: 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 72    ** the pager r
91b0: 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65  ollback and sche
91c0: 6d 61 20 72 65 73 65 74 20 61 6e 20 61 74 6f 6d  ma reset an atom
91d0: 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f  ic operation. */
91e0: 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  .  sqlite3Rollba
91f0: 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
9200: 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  _OK);..  /* Free
9210: 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   any outstanding
9220: 20 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63   Savepoint struc
9230: 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  tures. */.  sqli
9240: 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
9250: 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c  ts(db);..  /* Cl
9260: 6f 73 65 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ose all database
9270: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
9280: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d    for(j=0; j<db-
9290: 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nDb; j++){.    
92a0: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
92b0: 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20   &db->aDb[j];.  
92c0: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
92d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
92e0: 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70  treeClose(pDb->p
92f0: 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  Bt);.      pDb->
9300: 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  pBt = 0;.      i
9310: 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20  f( j!=1 ){.     
9320: 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20     pDb->pSchema 
9330: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
9340: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65 61   }.  }.  /* Clea
9350: 72 20 74 68 65 20 54 45 4d 50 20 73 63 68 65 6d  r the TEMP schem
9360: 61 20 73 65 70 61 72 61 74 65 6c 79 20 61 6e 64  a separately and
9370: 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66 28 20 64   last */.  if( d
9380: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
9390: 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  a ){.    sqlite3
93a0: 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e  SchemaClear(db->
93b0: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
93c0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74  .  }.  sqlite3Vt
93d0: 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29  abUnlockList(db)
93e0: 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 75 70 20  ;..  /* Free up 
93f0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 61 75 78  the array of aux
9400: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
9410: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   */.  sqlite3Col
9420: 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72  lapseDatabaseArr
9430: 61 79 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74  ay(db);.  assert
9440: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a  ( db->nDb<=2 );.
9450: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
9460: 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63  b==db->aDbStatic
9470: 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74   );..  /* Tell t
9480: 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66  he code in notif
9490: 79 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e  y.c that the con
94a0: 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65  nection no longe
94b0: 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a  r holds any.  **
94c0: 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20   locks and does 
94d0: 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20  not require any 
94e0: 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e  further unlock-n
94f0: 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e  otify callbacks.
9500: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  .  */.  sqlite3C
9510: 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28  onnectionClosed(
9520: 64 62 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  db);..  for(j=0;
9530: 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 64 62 2d   j<ArraySize(db-
9540: 3e 61 46 75 6e 63 2e 61 29 3b 20 6a 2b 2b 29 7b  >aFunc.a); j++){
9550: 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 4e  .    FuncDef *pN
9560: 65 78 74 2c 20 2a 70 48 61 73 68 2c 20 2a 70 3b  ext, *pHash, *p;
9570: 0a 20 20 20 20 66 6f 72 28 70 3d 64 62 2d 3e 61  .    for(p=db->a
9580: 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70 3b 20 70 3d  Func.a[j]; p; p=
9590: 70 48 61 73 68 29 7b 0a 20 20 20 20 20 20 70 48  pHash){.      pH
95a0: 61 73 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a  ash = p->pHash;.
95b0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20 29        while( p )
95c0: 7b 0a 20 20 20 20 20 20 20 20 66 75 6e 63 74 69  {.        functi
95d0: 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29  onDestroy(db, p)
95e0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 20  ;.        pNext 
95f0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
9600: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9610: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
9620: 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20    p = pNext;.   
9630: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
9640: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
9650: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c  hFirst(&db->aCol
9660: 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69  lSeq); i; i=sqli
9670: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
9680: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
9690: 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29  ll = (CollSeq *)
96a0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
96b0: 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65  );.    /* Invoke
96c0: 20 61 6e 79 20 64 65 73 74 72 75 63 74 6f 72 73   any destructors
96d0: 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20   registered for 
96e0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
96f0: 63 65 20 75 73 65 72 20 64 61 74 61 2e 20 2a 2f  ce user data. */
9700: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
9710: 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  3; j++){.      i
9720: 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c  f( pColl[j].xDel
9730: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
9740: 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b  l[j].xDel(pColl[
9750: 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20 20 20 20  j].pUser);.     
9760: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
9770: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
9780: 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Coll);.  }.  sql
9790: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
97a0: 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69  b->aCollSeq);.#i
97b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
97c0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
97d0: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
97e0: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64  hFirst(&db->aMod
97f0: 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ule); i; i=sqlit
9800: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
9810: 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20     Module *pMod 
9820: 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69  = (Module *)sqli
9830: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
9840: 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65     if( pMod->xDe
9850: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 70  stroy ){.      p
9860: 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d  Mod->xDestroy(pM
9870: 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d  od->pAux);.    }
9880: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
9890: 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 43 6c  EponymousTableCl
98a0: 65 61 72 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20  ear(db, pMod);. 
98b0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
98c0: 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a  (db, pMod);.  }.
98d0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
98e0: 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  ar(&db->aModule)
98f0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
9900: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
9910: 49 54 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61 6c  ITE_OK); /* Deal
9920: 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63 68  locates any cach
9930: 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73  ed error strings
9940: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 61  . */.  sqlite3Va
9950: 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72  lueFree(db->pErr
9960: 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73  );.  sqlite3Clos
9970: 65 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b  eExtensions(db);
9980: 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
9990: 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
99a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
99b0: 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 55 73 65  b->auth.zAuthUse
99c0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
99d0: 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74  ee(db->auth.zAut
99e0: 68 50 57 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  hPW);.#endif..  
99f0: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
9a00: 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a  TE_MAGIC_ERROR;.
9a10: 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64  .  /* The temp-d
9a20: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69  atabase schema i
9a30: 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66  s allocated diff
9a40: 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65  erently from the
9a50: 20 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20   other schema.  
9a60: 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e  ** objects (usin
9a70: 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  g sqliteMalloc()
9a80: 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65   directly, inste
9a90: 61 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  ad of sqlite3Btr
9aa0: 65 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a  eeSchema())..  *
9ab0: 2a 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  * So it needs to
9ac0: 20 62 65 20 66 72 65 65 64 20 68 65 72 65 2e 20   be freed here. 
9ad0: 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f  Todo: Why not ro
9ae0: 6c 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68 65  ll the temp sche
9af0: 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  ma into.  ** the
9b00: 20 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c   same sqliteMall
9b10: 6f 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20  oc() as the one 
9b20: 74 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74  that allocates t
9b30: 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a  he database .  *
9b40: 2a 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a  * structure?.  *
9b50: 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  /.  sqlite3DbFre
9b60: 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d  e(db, db->aDb[1]
9b70: 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c  .pSchema);.  sql
9b80: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9b90: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
9ba0: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
9bb0: 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a  E_MAGIC_CLOSED;.
9bc0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9bd0: 66 72 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  free(db->mutex);
9be0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c  .  assert( db->l
9bf0: 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30  ookaside.nOut==0
9c00: 20 29 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e   );  /* Fails on
9c10: 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d   a lookaside mem
9c20: 6f 72 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66  ory leak */.  if
9c30: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
9c40: 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20  bMalloced ){.   
9c50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
9c60: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61  ->lookaside.pSta
9c70: 72 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  rt);.  }.  sqlit
9c80: 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a  e3_free(db);.}..
9c90: 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
9ca0: 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ll database file
9cb0: 73 2e 20 20 49 66 20 74 72 69 70 43 6f 64 65 20  s.  If tripCode 
9cc0: 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
9cd0: 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 77 72  , then.** any wr
9ce0: 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
9cf0: 69 6e 76 61 6c 69 64 61 74 65 64 20 28 22 74 72  invalidated ("tr
9d00: 69 70 70 65 64 22 20 2d 20 61 73 20 69 6e 20 22  ipped" - as in "
9d10: 74 72 69 70 70 69 6e 67 20 61 20 63 69 72 63 75  tripping a circu
9d20: 69 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29 20  it.** breaker") 
9d30: 61 6e 64 20 6d 61 64 65 20 74 6f 20 72 65 74 75  and made to retu
9d40: 72 6e 20 74 72 69 70 43 6f 64 65 20 69 66 20 74  rn tripCode if t
9d50: 68 65 72 65 20 61 72 65 20 61 6e 79 20 66 75 72  here are any fur
9d60: 74 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73  ther.** attempts
9d70: 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 75 72   to use that cur
9d80: 73 6f 72 2e 20 20 52 65 61 64 20 63 75 72 73 6f  sor.  Read curso
9d90: 72 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e 20 61  rs remain open a
9da0: 6e 64 20 76 61 6c 69 64 0a 2a 2a 20 62 75 74 20  nd valid.** but 
9db0: 61 72 65 20 22 73 61 76 65 64 22 20 69 6e 20 63  are "saved" in c
9dc0: 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 70 61  ase the table pa
9dd0: 67 65 73 20 61 72 65 20 6d 6f 76 65 64 20 61 72  ges are moved ar
9de0: 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ound..*/.void sq
9df0: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
9e00: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
9e10: 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69  t tripCode){.  i
9e20: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72  nt i;.  int inTr
9e30: 61 6e 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73  ans = 0;.  int s
9e40: 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 61  chemaChange;.  a
9e50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9e60: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
9e70: 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
9e80: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
9e90: 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61  oc();..  /* Obta
9ea0: 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d 75  in all b-tree mu
9eb0: 74 65 78 65 73 20 62 65 66 6f 72 65 20 6d 61 6b  texes before mak
9ec0: 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f  ing any calls to
9ed0: 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
9ee0: 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  . .  ** This is 
9ef0: 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63 61 73  important in cas
9f00: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
9f10: 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  n being rolled b
9f20: 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f 64  ack has.  ** mod
9f30: 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61  ified the databa
9f40: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 74 68  se schema. If th
9f50: 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73  e b-tree mutexes
9f60: 20 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a 20   are not taken. 
9f70: 20 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e 20 61   ** here, then a
9f80: 6e 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61  nother shared-ca
9f90: 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  che connection m
9fa0: 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 20 62 65  ight sneak in be
9fb0: 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 64  tween.  ** the d
9fc0: 61 74 61 62 61 73 65 20 72 6f 6c 6c 62 61 63 6b  atabase rollback
9fd0: 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65   and schema rese
9fe0: 74 2c 20 77 68 69 63 68 20 63 61 6e 20 63 61 75  t, which can cau
9ff0: 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63 6f  se false.  ** co
a000: 72 72 75 70 74 69 6f 6e 20 72 65 70 6f 72 74 73  rruption reports
a010: 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e 20   in some cases. 
a020: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
a030: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
a040: 20 20 73 63 68 65 6d 61 43 68 61 6e 67 65 20 3d    schemaChange =
a050: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
a060: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
a070: 65 73 29 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e  es)!=0 && db->in
a080: 69 74 2e 62 75 73 79 3d 3d 30 3b 0a 0a 20 20 66  it.busy==0;..  f
a090: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
a0a0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; i++){.    Btr
a0b0: 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b  ee *p = db->aDb[
a0c0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
a0d0: 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  p ){.      if( s
a0e0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
a0f0: 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20  rans(p) ){.     
a100: 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a     inTrans = 1;.
a110: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
a120: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
a130: 63 6b 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20  ck(p, tripCode, 
a140: 21 73 63 68 65 6d 61 43 68 61 6e 67 65 29 3b 0a  !schemaChange);.
a150: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
a160: 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28  te3VtabRollback(
a170: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e  db);.  sqlite3En
a180: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
a190: 0a 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61  ..  if( (db->fla
a1a0: 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  gs&SQLITE_Intern
a1b0: 43 68 61 6e 67 65 73 29 21 3d 30 20 26 26 20 64  Changes)!=0 && d
a1c0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
a1d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
a1e0: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
a1f0: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
a200: 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53  sqlite3ResetAllS
a210: 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69  chemasOfConnecti
a220: 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71  on(db);.  }.  sq
a230: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
a240: 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e  ll(db);..  /* An
a250: 79 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  y deferred const
a260: 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73  raint violations
a270: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
a280: 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62  esolved. */.  db
a290: 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
a2a0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65  = 0;.  db->nDefe
a2b0: 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b  rredImmCons = 0;
a2c0: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
a2d0: 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73  ~SQLITE_DeferFKs
a2e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68  ;..  /* If one h
a2f0: 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72  as been configur
a300: 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72  ed, invoke the r
a310: 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c  ollback-hook cal
a320: 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64  lback */.  if( d
a330: 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c  b->xRollbackCall
a340: 62 61 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73  back && (inTrans
a350: 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d   || !db->autoCom
a360: 6d 69 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e  mit) ){.    db->
a370: 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
a380: 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41  k(db->pRollbackA
a390: 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  rg);.  }.}../*.*
a3a0: 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69  * Return a stati
a3b0: 63 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  c string contain
a3c0: 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 63 6f 72  ing the name cor
a3d0: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
a3e0: 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  e error code.** 
a3f0: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
a400: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69   argument..*/.#i
a410: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
a420: 5f 4e 45 45 44 5f 45 52 52 5f 4e 41 4d 45 29 0a  _NEED_ERR_NAME).
a430: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
a440: 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 20 72  te3ErrName(int r
a450: 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  c){.  const char
a460: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *zName = 0;.  i
a470: 6e 74 20 69 2c 20 6f 72 69 67 52 63 20 3d 20 72  nt i, origRc = r
a480: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
a490: 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69  2 && zName==0; i
a4a0: 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66 66 29 7b  ++, rc &= 0xff){
a4b0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 72 63 20  .    switch( rc 
a4c0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  ){.      case SQ
a4d0: 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20  LITE_OK:        
a4e0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
a4f0: 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20   "SQLITE_OK";   
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
a510: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a520: 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20  QLITE_ERROR:    
a530: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a540: 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22  = "SQLITE_ERROR"
a550: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
a560: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a570: 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a  SQLITE_INTERNAL:
a580: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a590: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52   = "SQLITE_INTER
a5a0: 4e 41 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62  NAL";          b
a5b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a5c0: 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20   SQLITE_PERM:   
a5d0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
a5e0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45 52 4d  e = "SQLITE_PERM
a5f0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
a600: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a610: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20  e SQLITE_ABORT: 
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
a630: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f  me = "SQLITE_ABO
a640: 52 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  RT";            
a650: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a660: 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  se SQLITE_ABORT_
a670: 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a 4e  ROLLBACK:     zN
a680: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42  ame = "SQLITE_AB
a690: 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 20  ORT_ROLLBACK";  
a6a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a6b0: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a  ase SQLITE_BUSY:
a6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
a6d0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42  Name = "SQLITE_B
a6e0: 55 53 59 22 3b 20 20 20 20 20 20 20 20 20 20 20  USY";           
a6f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a700: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59  case SQLITE_BUSY
a710: 5f 52 45 43 4f 56 45 52 59 3a 20 20 20 20 20 20  _RECOVERY:      
a720: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a730: 42 55 53 59 5f 52 45 43 4f 56 45 52 59 22 3b 20  BUSY_RECOVERY"; 
a740: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a750: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53   case SQLITE_BUS
a760: 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20 20 20  Y_SNAPSHOT:     
a770: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a780: 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 22 3b  _BUSY_SNAPSHOT";
a790: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a7a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f    case SQLITE_LO
a7b0: 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20 20 20  CKED:           
a7c0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a7d0: 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20  E_LOCKED";      
a7e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a7f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
a800: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
a810: 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  E: zName = "SQLI
a820: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
a830: 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20  CACHE";break;.  
a840: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a850: 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 20  NOMEM:          
a860: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a870: 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20  ITE_NOMEM";     
a880: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a890: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a8a0: 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20  _READONLY:      
a8b0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a8c0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20  LITE_READONLY"; 
a8d0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a8e0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a8f0: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56  E_READONLY_RECOV
a900: 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ERY:  zName = "S
a910: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
a920: 45 43 4f 56 45 52 59 22 3b 20 62 72 65 61 6b 3b  ECOVERY"; break;
a930: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a940: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54  TE_READONLY_CANT
a950: 4c 4f 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  LOCK:  zName = "
a960: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
a970: 43 41 4e 54 4c 4f 43 4b 22 3b 20 62 72 65 61 6b  CANTLOCK"; break
a980: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a990: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c  ITE_READONLY_ROL
a9a0: 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20  LBACK:  zName = 
a9b0: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
a9c0: 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61  _ROLLBACK"; brea
a9d0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a9e0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
a9f0: 4d 4f 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20 3d  MOVED:   zName =
aa00: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
aa10: 59 5f 44 42 4d 4f 56 45 44 22 3b 20 20 62 72 65  Y_DBMOVED";  bre
aa20: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
aa30: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a  QLITE_INTERRUPT:
aa40: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
aa50: 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  = "SQLITE_INTERR
aa60: 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 62 72  UPT";         br
aa70: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
aa80: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20  SQLITE_IOERR:   
aa90: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
aaa0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
aab0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
aac0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
aad0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
aae0: 41 44 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  AD:         zNam
aaf0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
ab00: 52 5f 52 45 41 44 22 3b 20 20 20 20 20 20 20 20  R_READ";        
ab10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ab20: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
ab30: 48 4f 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e 61  HORT_READ:   zNa
ab40: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
ab50: 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b 20  RR_SHORT_READ"; 
ab60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ab70: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
ab80: 57 52 49 54 45 3a 20 20 20 20 20 20 20 20 7a 4e  WRITE:        zN
ab90: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
aba0: 45 52 52 5f 57 52 49 54 45 22 3b 20 20 20 20 20  ERR_WRITE";     
abb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
abc0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
abd0: 5f 46 53 59 4e 43 3a 20 20 20 20 20 20 20 20 7a  _FSYNC:        z
abe0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
abf0: 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20 20 20 20  OERR_FSYNC";    
ac00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ac10: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
ac20: 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20 20 20  R_DIR_FSYNC:    
ac30: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ac40: 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 22  IOERR_DIR_FSYNC"
ac50: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
ac60: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
ac70: 52 52 5f 54 52 55 4e 43 41 54 45 3a 20 20 20 20  RR_TRUNCATE:    
ac80: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ac90: 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 22  _IOERR_TRUNCATE"
aca0: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
acb0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
acc0: 45 52 52 5f 46 53 54 41 54 3a 20 20 20 20 20 20  ERR_FSTAT:      
acd0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ace0: 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 22 3b 20  E_IOERR_FSTAT"; 
acf0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ad00: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
ad10: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20  OERR_UNLOCK:    
ad20: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
ad30: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22  TE_IOERR_UNLOCK"
ad40: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
ad50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ad60: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20 20  IOERR_RDLOCK:   
ad70: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ad80: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
ad90: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
ada0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
adb0: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20 20  _IOERR_DELETE:  
adc0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
add0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
ade0: 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  E";      break;.
adf0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ae00: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20  E_IOERR_NOMEM:  
ae10: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ae20: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
ae30: 4d 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  M";       break;
ae40: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ae50: 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3a  TE_IOERR_ACCESS:
ae60: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ae70: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
ae80: 45 53 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b  ESS";      break
ae90: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
aea0: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
aeb0: 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20 20  ESERVEDLOCK:.   
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
aee0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
aef0: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
af00: 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LOCK"; break;.  
af10: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
af20: 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20 20  IOERR_LOCK:     
af30: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
af40: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b  ITE_IOERR_LOCK";
af50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
af60: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
af70: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20 20  _IOERR_CLOSE:   
af80: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
af90: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
afa0: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
afb0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
afc0: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
afd0: 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  E:    zName = "S
afe0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
aff0: 43 4c 4f 53 45 22 3b 20 20 20 62 72 65 61 6b 3b  CLOSE";   break;
b000: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b010: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
b020: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
b030: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b040: 4f 50 45 4e 22 3b 20 20 20 20 20 62 72 65 61 6b  OPEN";     break
b050: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b060: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
b070: 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  E:      zName = 
b080: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
b090: 4d 53 49 5a 45 22 3b 20 20 20 20 20 62 72 65 61  MSIZE";     brea
b0a0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b0b0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f  LITE_IOERR_SHMLO
b0c0: 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  CK:      zName =
b0d0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
b0e0: 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72 65  HMLOCK";     bre
b0f0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b100: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
b110: 41 50 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  AP:       zName 
b120: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b130: 53 48 4d 4d 41 50 22 3b 20 20 20 20 20 20 62 72  SHMMAP";      br
b140: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b150: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
b160: 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  K:         zName
b170: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b180: 5f 53 45 45 4b 22 3b 20 20 20 20 20 20 20 20 62  _SEEK";        b
b190: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b1a0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
b1b0: 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d  LETE_NOENT: zNam
b1c0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b1d0: 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b  R_DELETE_NOENT";
b1e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b1f0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  e SQLITE_IOERR_M
b200: 4d 41 50 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  MAP:         zNa
b210: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b220: 52 52 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20 20  RR_MMAP";       
b230: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b240: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b250: 47 45 54 54 45 4d 50 50 41 54 48 3a 20 20 7a 4e  GETTEMPPATH:  zN
b260: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b270: 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 22  ERR_GETTEMPPATH"
b280: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
b290: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b2a0: 5f 43 4f 4e 56 50 41 54 48 3a 20 20 20 20 20 7a  _CONVPATH:     z
b2b0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b2c0: 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 22 3b 20  OERR_CONVPATH"; 
b2d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b2e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52  case SQLITE_CORR
b2f0: 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  UPT:            
b300: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b310: 43 4f 52 52 55 50 54 22 3b 20 20 20 20 20 20 20  CORRUPT";       
b320: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b330: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52   case SQLITE_COR
b340: 52 55 50 54 5f 56 54 41 42 3a 20 20 20 20 20 20  RUPT_VTAB:      
b350: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b360: 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 22 3b 20  _CORRUPT_VTAB"; 
b370: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b380: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
b390: 54 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20 20  TFOUND:         
b3a0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b3b0: 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20  E_NOTFOUND";    
b3c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b3d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
b3e0: 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20  ULL:            
b3f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b400: 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20 20  TE_FULL";       
b410: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b420: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b430: 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20 20  CANTOPEN:       
b440: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b450: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20  ITE_CANTOPEN";  
b460: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b470: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b480: 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50  _CANTOPEN_NOTEMP
b490: 44 49 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  DIR: zName = "SQ
b4a0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f  LITE_CANTOPEN_NO
b4b0: 54 45 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b 0a  TEMPDIR";break;.
b4c0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b4d0: 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
b4e0: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
b4f0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
b500: 53 44 49 52 22 3b 20 20 20 20 62 72 65 61 6b 3b  SDIR";    break;
b510: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b520: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
b530: 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  PATH:  zName = "
b540: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
b550: 46 55 4c 4c 50 41 54 48 22 3b 20 62 72 65 61 6b  FULLPATH"; break
b560: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b570: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e  ITE_CANTOPEN_CON
b580: 56 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20  VPATH:  zName = 
b590: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
b5a0: 5f 43 4f 4e 56 50 41 54 48 22 3b 20 62 72 65 61  _CONVPATH"; brea
b5b0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b5c0: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20  LITE_PROTOCOL:  
b5d0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b5e0: 20 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f   "SQLITE_PROTOCO
b5f0: 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  L";          bre
b600: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b610: 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20  QLITE_EMPTY:    
b620: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b630: 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59 22  = "SQLITE_EMPTY"
b640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
b650: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b660: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20  SQLITE_SCHEMA:  
b670: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b680: 20 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45 4d   = "SQLITE_SCHEM
b690: 41 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  A";            b
b6a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b6b0: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20   SQLITE_TOOBIG: 
b6c0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b6d0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42  e = "SQLITE_TOOB
b6e0: 49 47 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  IG";            
b6f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b700: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
b710: 49 4e 54 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  INT:         zNa
b720: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
b730: 53 54 52 41 49 4e 54 22 3b 20 20 20 20 20 20 20  STRAINT";       
b740: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b750: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
b760: 41 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a 4e  AINT_UNIQUE:  zN
b770: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b780: 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 22  NSTRAINT_UNIQUE"
b790: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
b7a0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
b7b0: 52 41 49 4e 54 5f 54 52 49 47 47 45 52 3a 20 7a  RAINT_TRIGGER: z
b7c0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b7d0: 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45  ONSTRAINT_TRIGGE
b7e0: 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  R";break;.      
b7f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
b800: 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
b810: 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:.             
b820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b830: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b840: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
b850: 52 45 49 47 4e 4b 45 59 22 3b 20 20 20 62 72 65  REIGNKEY";   bre
b860: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b870: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b880: 5f 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65 20  _CHECK:   zName 
b890: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
b8a0: 41 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62 72  AINT_CHECK";  br
b8b0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b8c0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b8d0: 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20  T_PRIMARYKEY:.  
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
b900: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b910: 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
b920: 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  KEY";   break;. 
b930: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b940: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e  _CONSTRAINT_NOTN
b950: 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  ULL: zName = "SQ
b960: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b970: 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a  NOTNULL";break;.
b980: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b990: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d  E_CONSTRAINT_COM
b9a0: 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20 20  MITHOOK:.       
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9c0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b9d0: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
b9e0: 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b  INT_COMMITHOOK";
b9f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ba00: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
ba10: 54 52 41 49 4e 54 5f 56 54 41 42 3a 20 20 20 20  TRAINT_VTAB:    
ba20: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ba30: 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 22  CONSTRAINT_VTAB"
ba40: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
ba50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
ba60: 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e  STRAINT_FUNCTION
ba70: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
baa0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e  E_CONSTRAINT_FUN
bab0: 43 54 49 4f 4e 22 3b 20 20 20 20 20 62 72 65 61  CTION";     brea
bac0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bad0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
bae0: 52 4f 57 49 44 3a 20 20 20 7a 4e 61 6d 65 20 3d  ROWID:   zName =
baf0: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
bb00: 49 4e 54 5f 52 4f 57 49 44 22 3b 20 20 62 72 65  INT_ROWID";  bre
bb10: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bb20: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20  QLITE_MISMATCH: 
bb30: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bb40: 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  = "SQLITE_MISMAT
bb50: 43 48 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  CH";          br
bb60: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bb70: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20  SQLITE_MISUSE:  
bb80: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bb90: 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 55 53   = "SQLITE_MISUS
bba0: 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  E";            b
bbb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bbc0: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20   SQLITE_NOLFS:  
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
bbe0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46  e = "SQLITE_NOLF
bbf0: 53 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  S";             
bc00: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bc10: 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20  e SQLITE_AUTH:  
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
bc30: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55 54  me = "SQLITE_AUT
bc40: 48 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  H";             
bc50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bc60: 73 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  se SQLITE_FORMAT
bc70: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
bc80: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f  ame = "SQLITE_FO
bc90: 52 4d 41 54 22 3b 20 20 20 20 20 20 20 20 20 20  RMAT";          
bca0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bcb0: 61 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45  ase SQLITE_RANGE
bcc0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
bcd0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
bce0: 41 4e 47 45 22 3b 20 20 20 20 20 20 20 20 20 20  ANGE";          
bcf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bd00: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41  case SQLITE_NOTA
bd10: 44 42 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  DB:             
bd20: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bd30: 4e 4f 54 41 44 42 22 3b 20 20 20 20 20 20 20 20  NOTADB";        
bd40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bd50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f 57   case SQLITE_ROW
bd60: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
bd70: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bd80: 5f 52 4f 57 22 3b 20 20 20 20 20 20 20 20 20 20  _ROW";          
bd90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bda0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
bdb0: 54 49 43 45 3a 20 20 20 20 20 20 20 20 20 20 20  TICE:           
bdc0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bdd0: 45 5f 4e 4f 54 49 43 45 22 3b 20 20 20 20 20 20  E_NOTICE";      
bde0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bdf0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
be00: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41  OTICE_RECOVER_WA
be10: 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  L: zName = "SQLI
be20: 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
be30: 52 5f 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20 20  R_WAL";break;.  
be40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
be50: 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52  NOTICE_RECOVER_R
be60: 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20 20  OLLBACK:.       
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be80: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
be90: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f   "SQLITE_NOTICE_
bea0: 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b  RECOVER_ROLLBACK
beb0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
bec0: 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e  case SQLITE_WARN
bed0: 49 4e 47 3a 20 20 20 20 20 20 20 20 20 20 20 20  ING:            
bee0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bef0: 57 41 52 4e 49 4e 47 22 3b 20 20 20 20 20 20 20  WARNING";       
bf00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bf10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52   case SQLITE_WAR
bf20: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a 20  NING_AUTOINDEX: 
bf30: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bf40: 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44  _WARNING_AUTOIND
bf50: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
bf60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f    case SQLITE_DO
bf70: 4e 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  NE:             
bf80: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bf90: 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20 20  E_DONE";        
bfa0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bfb0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61   }.  }.  if( zNa
bfc0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  me==0 ){.    sta
bfd0: 74 69 63 20 63 68 61 72 20 7a 42 75 66 5b 35 30  tic char zBuf[50
bfe0: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
bff0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
c000: 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 53 51 4c  Buf), zBuf, "SQL
c010: 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29 22  ITE_UNKNOWN(%d)"
c020: 2c 20 6f 72 69 67 52 63 29 3b 0a 20 20 20 20 7a  , origRc);.    z
c030: 4e 61 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20 7d  Name = zBuf;.  }
c040: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
c050: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
c060: 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63   Return a static
c070: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
c080: 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20  cribes the kind 
c090: 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69  of error specifi
c0a0: 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67  ed in the.** arg
c0b0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ument..*/.const 
c0c0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72  char *sqlite3Err
c0d0: 53 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 73  Str(int rc){.  s
c0e0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c0f0: 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d  * const aMsg[] =
c100: 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45   {.    /* SQLITE
c110: 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f 20  _OK          */ 
c120: 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a  "not an error",.
c130: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52      /* SQLITE_ER
c140: 52 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53 51  ROR       */ "SQ
c150: 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72  L logic error or
c160: 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61 73   missing databas
c170: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
c180: 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f  E_INTERNAL    */
c190: 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54   0,.    /* SQLIT
c1a0: 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a 2f  E_PERM        */
c1b0: 20 22 61 63 63 65 73 73 20 70 65 72 6d 69 73 73   "access permiss
c1c0: 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20  ion denied",.   
c1d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54   /* SQLITE_ABORT
c1e0: 20 20 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62         */ "callb
c1f0: 61 63 6b 20 72 65 71 75 65 73 74 65 64 20 71 75  ack requested qu
c200: 65 72 79 20 61 62 6f 72 74 22 2c 0a 20 20 20 20  ery abort",.    
c210: 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20  /* SQLITE_BUSY  
c220: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
c230: 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20  se is locked",. 
c240: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43     /* SQLITE_LOC
c250: 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74  KED      */ "dat
c260: 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c  abase table is l
c270: 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ocked",.    /* S
c280: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20  QLITE_NOMEM     
c290: 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d    */ "out of mem
c2a0: 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ory",.    /* SQL
c2b0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20  ITE_READONLY    
c2c0: 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77  */ "attempt to w
c2d0: 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20  rite a readonly 
c2e0: 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f  database",.    /
c2f0: 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  * SQLITE_INTERRU
c300: 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75  PT   */ "interru
c310: 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  pted",.    /* SQ
c320: 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20  LITE_IOERR      
c330: 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72   */ "disk I/O er
c340: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
c350: 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20  ITE_CORRUPT     
c360: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64 69 73  */ "database dis
c370: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
c380: 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rmed",.    /* SQ
c390: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20  LITE_NOTFOUND   
c3a0: 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65   */ "unknown ope
c3b0: 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20  ration",.    /* 
c3c0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20  SQLITE_FULL     
c3d0: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
c3e0: 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22  or disk is full"
c3f0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c400: 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22  CANTOPEN    */ "
c410: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
c420: 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20  atabase file",. 
c430: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f     /* SQLITE_PRO
c440: 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63  TOCOL    */ "loc
c450: 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a  king protocol",.
c460: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d      /* SQLITE_EM
c470: 50 54 59 20 20 20 20 20 20 20 2a 2f 20 22 74 61  PTY       */ "ta
c480: 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  ble contains no 
c490: 64 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51  data",.    /* SQ
c4a0: 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20 20  LITE_SCHEMA     
c4b0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73 63   */ "database sc
c4c0: 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64  hema has changed
c4d0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c4e0: 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f 20  _TOOBIG      */ 
c4f0: 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20  "string or blob 
c500: 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a  too big",.    /*
c510: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
c520: 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69  NT  */ "constrai
c530: 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20 20  nt failed",.    
c540: 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  /* SQLITE_MISMAT
c550: 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74 79  CH    */ "dataty
c560: 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20  pe mismatch",.  
c570: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55    /* SQLITE_MISU
c580: 53 45 20 20 20 20 20 20 2a 2f 20 22 6c 69 62 72  SE      */ "libr
c590: 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c  ary routine call
c5a0: 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e  ed out of sequen
c5b0: 63 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ce",.    /* SQLI
c5c0: 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a  TE_NOLFS       *
c5d0: 2f 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75  / "large file su
c5e0: 70 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65  pport is disable
c5f0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
c600: 45 5f 41 55 54 48 20 20 20 20 20 20 20 20 2a 2f  E_AUTH        */
c610: 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20   "authorization 
c620: 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20  denied",.    /* 
c630: 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20 20  SQLITE_FORMAT   
c640: 20 20 20 2a 2f 20 22 61 75 78 69 6c 69 61 72 79     */ "auxiliary
c650: 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74   database format
c660: 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20   error",.    /* 
c670: 53 51 4c 49 54 45 5f 52 41 4e 47 45 20 20 20 20  SQLITE_RANGE    
c680: 20 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63     */ "bind or c
c690: 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20  olumn index out 
c6a0: 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f  of range",.    /
c6b0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20  * SQLITE_NOTADB 
c6c0: 20 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69 73       */ "file is
c6d0: 20 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69 73   encrypted or is
c6e0: 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65 22   not a database"
c6f0: 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63  ,.  };.  const c
c700: 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b  har *zErr = "unk
c710: 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73  nown error";.  s
c720: 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20  witch( rc ){.   
c730: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f   case SQLITE_ABO
c740: 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20  RT_ROLLBACK: {. 
c750: 20 20 20 20 20 7a 45 72 72 20 3d 20 22 61 62 6f       zErr = "abo
c760: 72 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41  rt due to ROLLBA
c770: 43 4b 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  CK";.      break
c780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
c790: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  ult: {.      rc 
c7a0: 26 3d 20 30 78 66 66 3b 0a 20 20 20 20 20 20 69  &= 0xff;.      i
c7b0: 66 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30 29  f( ALWAYS(rc>=0)
c7c0: 20 26 26 20 72 63 3c 41 72 72 61 79 53 69 7a 65   && rc<ArraySize
c7d0: 28 61 4d 73 67 29 20 26 26 20 61 4d 73 67 5b 72  (aMsg) && aMsg[r
c7e0: 63 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  c]!=0 ){.       
c7f0: 20 7a 45 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d   zErr = aMsg[rc]
c800: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c810: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
c820: 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a  .  return zErr;.
c830: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
c840: 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
c850: 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b   a busy callback
c860: 20 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64   that sleeps and
c870: 20 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20   tries.** again 
c880: 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20  until a timeout 
c890: 76 61 6c 75 65 20 69 73 20 72 65 61 63 68 65 64  value is reached
c8a0: 2e 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76  .  The timeout v
c8b0: 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e  alue is.** an in
c8c0: 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  teger number of 
c8d0: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73  milliseconds pas
c8e0: 73 65 64 20 69 6e 20 61 73 20 74 68 65 20 66 69  sed in as the fi
c8f0: 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  rst.** argument.
c900: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
c910: 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79  qliteDefaultBusy
c920: 43 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20  Callback(. void 
c930: 2a 70 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  *ptr,           
c940: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
c950: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69  connection */. i
c960: 6e 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20  nt count        
c970: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c980: 72 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65  r of times table
c990: 20 68 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a   has been busy *
c9a0: 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  /.){.#if SQLITE_
c9b0: 4f 53 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f 55  OS_WIN || HAVE_U
c9c0: 53 4c 45 45 50 0a 20 20 73 74 61 74 69 63 20 63  SLEEP.  static c
c9d0: 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d  onst u8 delays[]
c9e0: 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20   =.     { 1, 2, 
c9f0: 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32  5, 10, 15, 20, 2
ca00: 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c  5, 25,  25,  50,
ca10: 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73    50, 100 };.  s
ca20: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74  tatic const u8 t
ca30: 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  otals[] =.     {
ca40: 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38   0, 1, 3,  8, 18
ca50: 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30  , 33, 53, 78, 10
ca60: 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38  3, 128, 178, 228
ca70: 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45   };.# define NDE
ca80: 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28 64 65  LAY ArraySize(de
ca90: 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20  lays).  sqlite3 
caa0: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
cab0: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65  )ptr;.  int time
cac0: 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69  out = db->busyTi
cad0: 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c  meout;.  int del
cae0: 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73  ay, prior;..  as
caf0: 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29  sert( count>=0 )
cb00: 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20  ;.  if( count < 
cb10: 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65  NDELAY ){.    de
cb20: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75  lay = delays[cou
cb30: 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  nt];.    prior =
cb40: 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a   totals[count];.
cb50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c    }else{.    del
cb60: 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c  ay = delays[NDEL
cb70: 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72  AY-1];.    prior
cb80: 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59   = totals[NDELAY
cb90: 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75  -1] + delay*(cou
cba0: 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a  nt-(NDELAY-1));.
cbb0: 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20    }.  if( prior 
cbc0: 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75  + delay > timeou
cbd0: 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  t ){.    delay =
cbe0: 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72   timeout - prior
cbf0: 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c  ;.    if( delay<
cc00: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
cc10: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c   }.  sqlite3OsSl
cc20: 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65  eep(db->pVfs, de
cc30: 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74  lay*1000);.  ret
cc40: 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73  urn 1;.#else.  s
cc50: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71  qlite3 *db = (sq
cc60: 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69  lite3 *)ptr;.  i
cc70: 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73  nt timeout = ((s
cc80: 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62  qlite3 *)ptr)->b
cc90: 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66  usyTimeout;.  if
cca0: 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30  ( (count+1)*1000
ccb0: 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20   > timeout ){.  
ccc0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
ccd0: 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70    sqlite3OsSleep
cce0: 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30  (db->pVfs, 10000
ccf0: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  00);.  return 1;
cd00: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
cd10: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
cd20: 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a  n busy handler..
cd30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
cd40: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
cd50: 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66  n an operation f
cd60: 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63  ailed with a loc
cd70: 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  k..** If this ro
cd80: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f  utine returns no
cd90: 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
cda0: 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66   is retried.  If
cdb0: 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30   it.** returns 0
cdc0: 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  , the operation 
cdd0: 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53  aborts with an S
cde0: 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
cdf0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ce00: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
ce10: 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  r(BusyHandler *p
ce20: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
ce30: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c  f( NEVER(p==0) |
ce40: 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c  | p->xFunc==0 ||
ce50: 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65   p->nBusy<0 ) re
ce60: 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70  turn 0;.  rc = p
ce70: 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c  ->xFunc(p->pArg,
ce80: 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66   p->nBusy);.  if
ce90: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc==0 ){.    p
cea0: 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20  ->nBusy = -1;.  
ceb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42  }else{.    p->nB
cec0: 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  usy++;.  }.  ret
ced0: 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  urn rc; .}../*.*
cee0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
cef0: 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c  ets the busy cal
cf00: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
cf10: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
cf20: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
cf30: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
cf40: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
cf50: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
cf60: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
cf70: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
cf80: 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73  db,.  int (*xBus
cf90: 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20  y)(void*,int),. 
cfa0: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23   void *pArg.){.#
cfb0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
cfc0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
cfd0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
cfe0: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
cff0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
d000: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
d010: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
d020: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
d030: 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  x);.  db->busyHa
d040: 6e 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42  ndler.xFunc = xB
d050: 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  usy;.  db->busyH
d060: 61 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41  andler.pArg = pA
d070: 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  rg;.  db->busyHa
d080: 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b  ndler.nBusy = 0;
d090: 0a 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f  .  db->busyTimeo
d0a0: 75 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ut = 0;.  sqlite
d0b0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
d0c0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
d0d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d0e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d0f0: 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41  OMIT_PROGRESS_CA
d100: 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69  LLBACK./*.** Thi
d110: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
d120: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
d130: 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69  back for an Sqli
d140: 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74  te database to t
d150: 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c  he.** given call
d160: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69  back function wi
d170: 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67  th the given arg
d180: 75 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72  ument. The progr
d190: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c  ess callback wil
d1a0: 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20  l.** be invoked 
d1b0: 65 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64  every nOps opcod
d1c0: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
d1d0: 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
d1e0: 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20  dler(.  sqlite3 
d1f0: 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73  *db, .  int nOps
d200: 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72  ,.  int (*xProgr
d210: 65 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20  ess)(void*), .  
d220: 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69  void *pArg.){.#i
d230: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d240: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
d250: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
d260: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
d270: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
d280: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
d290: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
d2a0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
d2b0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
d2c0: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70  utex);.  if( nOp
d2d0: 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78  s>0 ){.    db->x
d2e0: 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67  Progress = xProg
d2f0: 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50  ress;.    db->nP
d300: 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 28 75 6e  rogressOps = (un
d310: 73 69 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20 20  signed)nOps;.   
d320: 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72   db->pProgressAr
d330: 67 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73  g = pArg;.  }els
d340: 65 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67  e{.    db->xProg
d350: 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62  ress = 0;.    db
d360: 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d  ->nProgressOps =
d370: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f   0;.    db->pPro
d380: 67 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20  gressArg = 0;.  
d390: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
d3a0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
d3b0: 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  x);.}.#endif.../
d3c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d3d0: 65 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66  e installs a def
d3e0: 61 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65  ault busy handle
d3f0: 72 20 74 68 61 74 20 77 61 69 74 73 20 66 6f 72  r that waits for
d400: 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65   the.** specifie
d410: 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  d number of mill
d420: 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20  iseconds before 
d430: 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a  returning 0..*/.
d440: 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79  int sqlite3_busy
d450: 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33  _timeout(sqlite3
d460: 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 23   *db, int ms){.#
d470: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d480: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
d490: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
d4a0: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
d4b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
d4c0: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
d4d0: 66 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a  f.  if( ms>0 ){.
d4e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
d4f0: 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c  _handler(db, sql
d500: 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61  iteDefaultBusyCa
d510: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64  llback, (void*)d
d520: 62 29 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79  b);.    db->busy
d530: 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20  Timeout = ms;.  
d540: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
d550: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
d560: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  db, 0, 0);.  }. 
d570: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d580: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73  K;.}../*.** Caus
d590: 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70  e any pending op
d5a0: 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20  eration to stop 
d5b0: 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74 20  at its earliest 
d5c0: 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a  opportunity..*/.
d5d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74  void sqlite3_int
d5e0: 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a  errupt(sqlite3 *
d5f0: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
d600: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
d610: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
d620: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
d630: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
d640: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
d650: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
d660: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 64 62  .  }.#endif.  db
d670: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
d680: 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ed = 1;.}.../*.*
d690: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d6a0: 69 73 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  is exactly the s
d6b0: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63  ame as sqlite3_c
d6c0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29  reate_function()
d6d0: 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74  , except.** that
d6e0: 20 69 74 20 69 73 20 64 65 73 69 67 6e 65 64 20   it is designed 
d6f0: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20  to be called by 
d700: 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54  internal code. T
d710: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73  he difference is
d720: 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61  .** that if a ma
d730: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20  lloc() fails in 
d740: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
d750: 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72  unction(), an er
d760: 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72  ror code.** is r
d770: 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
d780: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
d790: 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69  g cleared. .*/.i
d7a0: 6e 74 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  nt sqlite3Create
d7b0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20  Func(.  sqlite3 
d7c0: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
d7d0: 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  r *zFunctionName
d7e0: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
d7f0: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
d800: 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f  *pUserData,.  vo
d810: 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c  id (*xSFunc)(sql
d820: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
d830: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
d840: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
d850: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
d860: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
d870: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
d880: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
d890: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c  lite3_context*),
d8a0: 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f  .  FuncDestructo
d8b0: 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 0a 29  r *pDestructor.)
d8c0: 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a  {.  FuncDef *p;.
d8d0: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69    int nName;.  i
d8e0: 6e 74 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 0a  nt extraFlags;..
d8f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d900: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
d910: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
d920: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d   zFunctionName==
d930: 30 20 7c 7c 0a 20 20 20 20 20 20 28 78 53 46 75  0 ||.      (xSFu
d940: 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c  nc && (xFinal ||
d950: 20 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20   xStep)) || .   
d960: 20 20 20 28 21 78 53 46 75 6e 63 20 26 26 20 28     (!xSFunc && (
d970: 78 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70  xFinal && !xStep
d980: 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 53  )) ||.      (!xS
d990: 46 75 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c  Func && (!xFinal
d9a0: 20 26 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20   && xStep)) ||. 
d9b0: 20 20 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c       (nArg<-1 ||
d9c0: 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58   nArg>SQLITE_MAX
d9d0: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c  _FUNCTION_ARG) |
d9e0: 7c 0a 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e  |.      (255<(nN
d9f0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
da00: 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e  len30( zFunction
da10: 4e 61 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72  Name))) ){.    r
da20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
da30: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  USE_BKPT;.  }.. 
da40: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
da50: 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53  FUNC_CONSTANT==S
da60: 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53  QLITE_DETERMINIS
da70: 54 49 43 20 29 3b 0a 20 20 65 78 74 72 61 46 6c  TIC );.  extraFl
da80: 61 67 73 20 3d 20 65 6e 63 20 26 20 20 53 51 4c  ags = enc &  SQL
da90: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
daa0: 43 3b 0a 20 20 65 6e 63 20 26 3d 20 28 53 51 4c  C;.  enc &= (SQL
dab0: 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b  ITE_FUNC_ENCMASK
dac0: 7c 53 51 4c 49 54 45 5f 41 4e 59 29 3b 0a 20 20  |SQLITE_ANY);.  
dad0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
dae0: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20  OMIT_UTF16.  /* 
daf0: 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  If SQLITE_UTF16 
db00: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
db10: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70  the encoding typ
db20: 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69  e, transform thi
db30: 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66  s.  ** to one of
db40: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
db50: 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  or SQLITE_UTF16B
db60: 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  E using the.  **
db70: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
db80: 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54  IVE macro. SQLIT
db90: 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75  E_UTF16 is not u
dba0: 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  sed internally..
dbb0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c    **.  ** If SQL
dbc0: 49 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69  ITE_ANY is speci
dbd0: 66 69 65 64 2c 20 61 64 64 20 74 68 72 65 65 20  fied, add three 
dbe0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
dbf0: 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f  function.  ** to
dc00: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
dc10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d  .  */.  if( enc=
dc20: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b  =SQLITE_UTF16 ){
dc30: 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  .    enc = SQLIT
dc40: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
dc50: 20 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d   }else if( enc==
dc60: 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20  SQLITE_ANY ){.  
dc70: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63    int rc;.    rc
dc80: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
dc90: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69  Func(db, zFuncti
dca0: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51  onName, nArg, SQ
dcb0: 4c 49 54 45 5f 55 54 46 38 7c 65 78 74 72 61 46  LITE_UTF8|extraF
dcc0: 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 70  lags,.         p
dcd0: 55 73 65 72 44 61 74 61 2c 20 78 53 46 75 6e 63  UserData, xSFunc
dce0: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  , xStep, xFinal,
dcf0: 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20   pDestructor);. 
dd00: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
dd10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
dd20: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
dd30: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69  Func(db, zFuncti
dd40: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51  onName, nArg, SQ
dd50: 4c 49 54 45 5f 55 54 46 31 36 4c 45 7c 65 78 74  LITE_UTF16LE|ext
dd60: 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  raFlags,.       
dd70: 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 53     pUserData, xS
dd80: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
dd90: 6e 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72  nal, pDestructor
dda0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
ddb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ddc0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
ddd0: 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63  c;.    }.    enc
dde0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42   = SQLITE_UTF16B
ddf0: 45 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65  E;.  }.#else.  e
de00: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
de10: 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a  ;.#endif.  .  /*
de20: 20 43 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69   Check if an exi
de30: 73 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69  sting function i
de40: 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64  s being overridd
de50: 65 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49  en or deleted. I
de60: 66 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74  f so,.  ** and t
de70: 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20  here are active 
de80: 56 4d 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  VMs, then return
de90: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66   SQLITE_BUSY. If
dea0: 20 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a   a function.  **
deb0: 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69   is being overri
dec0: 64 64 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74  dden/deleted but
ded0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63   there are no ac
dee0: 74 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20  tive VMs, allow 
def0: 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  the.  ** operati
df00: 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62  on to continue b
df10: 75 74 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  ut invalidate al
df20: 6c 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74  l precompiled st
df30: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
df40: 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64   p = sqlite3Find
df50: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75  Function(db, zFu
df60: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d  nctionName, nNam
df70: 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63  e, nArg, (u8)enc
df80: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26  , 0);.  if( p &&
df90: 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26   (p->funcFlags &
dfa0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43   SQLITE_FUNC_ENC
dfb0: 4d 41 53 4b 29 3d 3d 65 6e 63 20 26 26 20 70 2d  MASK)==enc && p-
dfc0: 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20  >nArg==nArg ){. 
dfd0: 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65     if( db->nVdbe
dfe0: 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20  Active ){.      
dff0: 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
e000: 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  Msg(db, SQLITE_B
e010: 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75  USY, .        "u
e020: 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f  nable to delete/
e030: 6d 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63  modify user-func
e040: 74 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69  tion due to acti
e050: 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b  ve statements");
e060: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
e070: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e080: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
e090: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
e0a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
e0b0: 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
e0c0: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
e0d0: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  b);.    }.  }.. 
e0e0: 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64   p = sqlite3Find
e0f0: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75  Function(db, zFu
e100: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d  nctionName, nNam
e110: 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63  e, nArg, (u8)enc
e120: 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70  , 1);.  assert(p
e130: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
e140: 69 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20  iled);.  if( !p 
e150: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
e160: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
e170: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65  .  /* If an olde
e180: 72 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  r version of the
e190: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61   function with a
e1a0: 20 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74   configured dest
e1b0: 72 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62  ructor is.  ** b
e1c0: 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e  eing replaced in
e1d0: 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63  voke the destruc
e1e0: 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72  tor function her
e1f0: 65 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e  e. */.  function
e200: 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a  Destroy(db, p);.
e210: 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74  .  if( pDestruct
e220: 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72  or ){.    pDestr
e230: 75 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  uctor->nRef++;. 
e240: 20 7d 0a 20 20 70 2d 3e 70 44 65 73 74 72 75 63   }.  p->pDestruc
e250: 74 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f  tor = pDestructo
e260: 72 3b 0a 20 20 70 2d 3e 66 75 6e 63 46 6c 61 67  r;.  p->funcFlag
e270: 73 20 3d 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67  s = (p->funcFlag
e280: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
e290: 45 4e 43 4d 41 53 4b 29 20 7c 20 65 78 74 72 61  ENCMASK) | extra
e2a0: 46 6c 61 67 73 3b 0a 20 20 74 65 73 74 63 61 73  Flags;.  testcas
e2b0: 65 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  e( p->funcFlags 
e2c0: 26 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  & SQLITE_DETERMI
e2d0: 4e 49 53 54 49 43 20 29 3b 0a 20 20 70 2d 3e 78  NISTIC );.  p->x
e2e0: 53 46 75 6e 63 20 3d 20 78 53 46 75 6e 63 20 3f  SFunc = xSFunc ?
e2f0: 20 78 53 46 75 6e 63 20 3a 20 78 53 74 65 70 3b   xSFunc : xStep;
e300: 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20  .  p->xFinalize 
e310: 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70  = xFinal;.  p->p
e320: 55 73 65 72 44 61 74 61 20 3d 20 70 55 73 65 72  UserData = pUser
e330: 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20  Data;.  p->nArg 
e340: 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72  = (u16)nArg;.  r
e350: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e360: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
e370: 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63 74 69   new user functi
e380: 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
e390: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
e3a0: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
e3b0: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
e3c0: 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   *zFunc,.  int n
e3d0: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
e3e0: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
e3f0: 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69  d (*xSFunc)(sqli
e400: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
e410: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
e420: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
e430: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
e440: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
e450: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
e460: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
e470: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
e480: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
e490: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
e4a0: 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c  on_v2(db, zFunc,
e4b0: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
e4c0: 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20  SFunc, xStep,.  
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4f0: 20 20 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a    xFinal, 0);.}.
e500: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
e510: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
e520: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
e530: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
e540: 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  unc,.  int nArg,
e550: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
e560: 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a  id *p,.  void (*
e570: 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  xSFunc)(sqlite3_
e580: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
e590: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
e5a0: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
e5b0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
e5c0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
e5d0: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
e5e0: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
e5f0: 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f  _context*),.  vo
e600: 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76  id (*xDestroy)(v
e610: 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  oid *).){.  int 
e620: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
e630: 52 3b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63  R;.  FuncDestruc
e640: 74 6f 72 20 2a 70 41 72 67 20 3d 20 30 3b 0a 0a  tor *pArg = 0;..
e650: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e660: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
e670: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
e680: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
e690: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
e6a0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
e6b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
e6c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
e6d0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
e6e0: 69 66 28 20 78 44 65 73 74 72 6f 79 20 29 7b 0a  if( xDestroy ){.
e6f0: 20 20 20 20 70 41 72 67 20 3d 20 28 46 75 6e 63      pArg = (Func
e700: 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73 71 6c  Destructor *)sql
e710: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
e720: 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63  (db, sizeof(Func
e730: 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20  Destructor));.  
e740: 20 20 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20    if( !pArg ){. 
e750: 20 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29       xDestroy(p)
e760: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 75 74  ;.      goto out
e770: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72 67  ;.    }.    pArg
e780: 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65  ->xDestroy = xDe
e790: 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d  stroy;.    pArg-
e7a0: 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a  >pUserData = p;.
e7b0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
e7c0: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
e7d0: 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e   zFunc, nArg, en
e7e0: 63 2c 20 70 2c 20 78 53 46 75 6e 63 2c 20 78 53  c, p, xSFunc, xS
e7f0: 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41 72  tep, xFinal, pAr
e800: 67 29 3b 0a 20 20 69 66 28 20 70 41 72 67 20 26  g);.  if( pArg &
e810: 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20  & pArg->nRef==0 
e820: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
e830: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
e840: 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b      xDestroy(p);
e850: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
e860: 65 65 28 64 62 2c 20 70 41 72 67 29 3b 0a 20 20  ee(db, pArg);.  
e870: 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20  }.. out:.  rc = 
e880: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
e890: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
e8a0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
e8b0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
e8c0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
e8d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
e8e0: 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  F16.int sqlite3_
e8f0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31  create_function1
e900: 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
e910: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
e920: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20  zFunctionName,. 
e930: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
e940: 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f 69   eTextRep,.  voi
e950: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
e960: 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  SFunc)(sqlite3_c
e970: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
e980: 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20  te3_value**),.  
e990: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
e9a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
e9b0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
e9c0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
e9d0: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
e9e0: 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74  ntext*).){.  int
e9f0: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75   rc;.  char *zFu
ea00: 6e 63 38 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  nc8;..#ifdef SQL
ea10: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
ea20: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
ea30: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
ea40: 28 64 62 29 20 7c 7c 20 7a 46 75 6e 63 74 69 6f  (db) || zFunctio
ea50: 6e 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  nName==0 ) retur
ea60: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
ea70: 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
ea80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
ea90: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
eaa0: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
eab0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
eac0: 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33  zFunc8 = sqlite3
ead0: 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75  Utf16to8(db, zFu
eae0: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20  nctionName, -1, 
eaf0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
eb00: 56 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  VE);.  rc = sqli
eb10: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
eb20: 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20  , zFunc8, nArg, 
eb30: 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78 53 46  eTextRep, p, xSF
eb40: 75 6e 63 2c 78 53 74 65 70 2c 78 46 69 6e 61 6c  unc,xStep,xFinal
eb50: 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ,0);.  sqlite3Db
eb60: 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29  Free(db, zFunc8)
eb70: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
eb80: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
eb90: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
eba0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
ebb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
ebc0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
ebd0: 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20   Declare that a 
ebe0: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
ebf0: 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20  n overloaded by 
ec00: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
ec10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75  .**.** If the fu
ec20: 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65  nction already e
ec30: 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c  xists as a regul
ec40: 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  ar global functi
ec50: 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  on, then.** this
ec60: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
ec70: 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e  -op.  If the fun
ec80: 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
ec90: 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74  xist, then creat
eca0: 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74  e.** a new one t
ecb0: 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77  hat always throw
ecc0: 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72  s a run-time err
ecd0: 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  or.  .**.** When
ece0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
ecf0: 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64  intend to provid
ed00: 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20  e an overloaded 
ed10: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a  function, they.*
ed20: 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68  * should call th
ed30: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  is routine to ma
ed40: 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62  ke sure the glob
ed50: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  al function exis
ed60: 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ts..** A global 
ed70: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78  function must ex
ed80: 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  ist in order for
ed90: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
eda0: 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70   to work.** prop
edb0: 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  erly..*/.int sql
edc0: 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
edd0: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
ede0: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
edf0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
ee00: 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20  t nArg.){.  int 
ee10: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
ee20: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
ee30: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
ee40: 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20 53 51  E_OK;..#ifdef SQ
ee50: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
ee60: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
ee70: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
ee80: 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d  k(db) || zName==
ee90: 30 20 7c 7c 20 6e 41 72 67 3c 2d 32 20 29 7b 0a  0 || nArg<-2 ){.
eea0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
eeb0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
eec0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
eed0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
eee0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
eef0: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  ( sqlite3FindFun
ef00: 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c  ction(db, zName,
ef10: 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51   nName, nArg, SQ
ef20: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30  LITE_UTF8, 0)==0
ef30: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
ef40: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
ef50: 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  b, zName, nArg, 
ef60: 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20  SQLITE_UTF8,.   
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef80: 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74          0, sqlit
ef90: 65 33 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f  e3InvalidFunctio
efa0: 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  n, 0, 0, 0);.  }
efb0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
efc0: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
efd0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
efe0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
eff0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
f000: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f010: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _OMIT_TRACE./*.*
f020: 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 72 61  * Register a tra
f030: 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ce function.  Th
f040: 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20  e pArg from the 
f050: 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
f060: 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69  tered trace.** i
f070: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
f080: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65  .** A NULL trace
f090: 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20   function means 
f0a0: 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20  that no tracing 
f0b0: 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20  is executes.  A 
f0c0: 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63  non-NULL.** trac
f0d0: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
f0e0: 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  o a function tha
f0f0: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20  t is invoked at 
f100: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
f110: 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65  h.** SQL stateme
f120: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  nt..*/.void *sql
f130: 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74  ite3_trace(sqlit
f140: 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78  e3 *db, void (*x
f150: 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  Trace)(void*,con
f160: 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20  st char*), void 
f170: 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a  *pArg){.  void *
f180: 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51  pOld;..#ifdef SQ
f190: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
f1a0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
f1b0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
f1c0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
f1d0: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
f1e0: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
f1f0: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
f200: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f210: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
f220: 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70  ;.  pOld = db->p
f230: 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e  TraceArg;.  db->
f240: 78 54 72 61 63 65 20 3d 20 78 54 72 61 63 65 3b  xTrace = xTrace;
f250: 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67  .  db->pTraceArg
f260: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
f270: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
f280: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
f290: 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a  urn pOld;.}./*.*
f2a0: 2a 20 52 65 67 69 73 74 65 72 20 61 20 70 72 6f  * Register a pro
f2b0: 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20  file function.  
f2c0: 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68  The pArg from th
f2d0: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  e previously reg
f2e0: 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66  istered .** prof
f2f0: 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ile function is 
f300: 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a  returned.  .**.*
f310: 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65  * A NULL profile
f320: 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20   function means 
f330: 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e  that no profilin
f340: 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20  g is executes.  
f350: 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72  A non-NULL.** pr
f360: 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69 6e 74  ofile is a point
f370: 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
f380: 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64   that is invoked
f390: 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
f3a0: 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51  on of.** each SQ
f3b0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  L statement that
f3c0: 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64   is run..*/.void
f3d0: 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c   *sqlite3_profil
f3e0: 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
f3f0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72 6f 66  ,.  void (*xProf
f400: 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  ile)(void*,const
f410: 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69   char*,sqlite_ui
f420: 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70  nt64),.  void *p
f430: 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70  Arg.){.  void *p
f440: 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  Old;..#ifdef SQL
f450: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
f460: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
f470: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
f480: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
f490: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
f4a0: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
f4b0: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
f4c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
f4d0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
f4e0: 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50  .  pOld = db->pP
f4f0: 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d  rofileArg;.  db-
f500: 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f  >xProfile = xPro
f510: 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f  file;.  db->pPro
f520: 66 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  fileArg = pArg;.
f530: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f540: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
f550: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b  ;.  return pOld;
f560: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
f570: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a  ITE_OMIT_TRACE *
f580: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  /../*.** Registe
f590: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  r a function to 
f5a0: 62 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20  be invoked when 
f5b0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  a transaction co
f5c0: 6d 6d 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65  mmits..** If the
f5d0: 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f   invoked functio
f5e0: 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  n returns non-ze
f5f0: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d  ro, then the com
f600: 6d 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a  mit becomes a.**
f610: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f   rollback..*/.vo
f620: 69 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d  id *sqlite3_comm
f630: 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  it_hook(.  sqlit
f640: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
f650: 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
f660: 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
f670: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
f680: 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  t (*xCallback)(v
f690: 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74  oid*),  /* Funct
f6a0: 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e  ion to invoke on
f6b0: 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a   each commit */.
f6c0: 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
f6e0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
f6f0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
f700: 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66  void *pOld;..#if
f710: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
f720: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
f730: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
f740: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
f750: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
f760: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
f770: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
f780: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
f790: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
f7a0: 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d  mutex);.  pOld =
f7b0: 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b   db->pCommitArg;
f7c0: 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  .  db->xCommitCa
f7d0: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
f7e0: 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69  ck;.  db->pCommi
f7f0: 74 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  tArg = pArg;.  s
f800: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f810: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f820: 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
f830: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
f840: 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
f850: 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
f860: 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70 64 61  me a row is upda
f870: 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64  ted,.** inserted
f880: 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e   or deleted usin
f890: 67 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  g this database 
f8a0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
f8b0: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64  oid *sqlite3_upd
f8c0: 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  ate_hook(.  sqli
f8d0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
f8e0: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
f8f0: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
f900: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76   database */.  v
f910: 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  oid (*xCallback)
f920: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20  (void*,int,char 
f930: 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e  const *,char con
f940: 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36  st *,sqlite_int6
f950: 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  4),.  void *pArg
f960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f970: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74  /* Argument to t
f980: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  he function */.)
f990: 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  {.  void *pRet;.
f9a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
f9b0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
f9c0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
f9d0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
f9e0: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
f9f0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
fa00: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
fa10: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
fa20: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
fa30: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52  db->mutex);.  pR
fa40: 65 74 20 3d 20 64 62 2d 3e 70 55 70 64 61 74 65  et = db->pUpdate
fa50: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61  Arg;.  db->xUpda
fa60: 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  teCallback = xCa
fa70: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55  llback;.  db->pU
fa80: 70 64 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b  pdateArg = pArg;
fa90: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
faa0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
fab0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
fac0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
fad0: 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
fae0: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
faf0: 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63  h time a transac
fb00: 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a  tion is rolled.*
fb10: 2a 20 62 61 63 6b 20 62 79 20 74 68 69 73 20 64  * back by this d
fb20: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
fb30: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
fb40: 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f  ite3_rollback_ho
fb50: 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
fb60: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
fb70: 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f  /* Attach the ho
fb80: 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62  ok to this datab
fb90: 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ase */.  void (*
fba0: 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  xCallback)(void*
fbb0: 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66  ), /* Callback f
fbc0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69  unction */.  voi
fbd0: 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
fbe0: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
fbf0: 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
fc00: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  on */.){.  void 
fc10: 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66 20 53  *pRet;..#ifdef S
fc20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
fc30: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
fc40: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
fc50: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
fc60: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
fc70: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
fc80: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
fc90: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
fca0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
fcb0: 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
fcc0: 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20  pRollbackArg;.  
fcd0: 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
fce0: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
fcf0: 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61  k;.  db->pRollba
fd00: 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  ckArg = pArg;.  
fd10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
fd20: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
fd30: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
fd40: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
fd50: 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
fd60: 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  The sqlite3_wal_
fd70: 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20  hook() callback 
fd80: 72 65 67 69 73 74 65 72 65 64 20 62 79 20 73 71  registered by sq
fd90: 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
fda0: 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49  eckpoint()..** I
fdb0: 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77 61  nvoke sqlite3_wa
fdc0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20  l_checkpoint if 
fdd0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
fde0: 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20  ames in the log 
fdf0: 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74  file.** is great
fe00: 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33 2e  er than sqlite3.
fe10: 70 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f 20  pWalArg cast to 
fe20: 61 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65 20  an integer (the 
fe30: 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64  value configured
fe40: 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63   by.** wal_autoc
fe50: 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f  heckpoint())..*/
fe60: 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c   .int sqlite3Wal
fe70: 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76  DefaultHook(.  v
fe80: 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61  oid *pClientData
fe90: 2c 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e  ,     /* Argumen
fea0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
feb0: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db,           /*
fec0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   Connection */. 
fed0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
fee0: 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ,       /* Datab
fef0: 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ase */.  int nFr
ff00: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
ff10: 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a  /* Size of WAL *
ff20: 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d  /.){.  if( nFram
ff30: 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  e>=SQLITE_PTR_TO
ff40: 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74 61  _INT(pClientData
ff50: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
ff60: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
ff70: 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c();.    sqlite3
ff80: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
ff90: 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73 71  db, zDb);.    sq
ffa0: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
ffb0: 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65  lloc();.  }.  re
ffc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ffd0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ffe0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
fff0: 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
10000 61 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68  an sqlite3_wal_h
10010 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 74  ook() callback t
10020 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  o automatically 
10030 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20  checkpoint.** a 
10040 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 63  database after c
10050 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e  ommitting a tran
10060 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65  saction if there
10070 20 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a   are nFrame or.*
10080 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69 6e  * more frames in
10090 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50   the log file. P
100a0 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61  assing zero or a
100b0 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20   negative value 
100c0 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65  as the.** nFrame
100d0 20 70 61 72 61 6d 65 74 65 72 20 64 69 73 61 62   parameter disab
100e0 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63 68  les automatic ch
100f0 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72 65  eckpoints entire
10100 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ly..**.** The ca
10110 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65  llback registere
10120 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
10130 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79 20  on replaces any 
10140 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61 63  existing callbac
10150 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20  k.** registered 
10160 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61  using sqlite3_wa
10170 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69  l_hook(). Likewi
10180 73 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67 20  se, registering 
10190 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73  a callback.** us
101a0 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  ing sqlite3_wal_
101b0 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73 20  hook() disables 
101c0 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63 68  the automatic ch
101d0 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69  eckpoint mechani
101e0 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  sm.** configured
101f0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
10200 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
10210 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
10220 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  oint(sqlite3 *db
10230 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23  , int nFrame){.#
10240 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
10250 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50  T_WAL.  UNUSED_P
10260 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20  ARAMETER(db);.  
10270 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
10280 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65 0a  (nFrame);.#else.
10290 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
102a0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
102b0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
102c0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
102d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
102e0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
102f0 69 66 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e  if.  if( nFrame>
10300 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
10310 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71  _wal_hook(db, sq
10320 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48  lite3WalDefaultH
10330 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f  ook, SQLITE_INT_
10340 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29 29 3b  TO_PTR(nFrame));
10350 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
10360 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64  lite3_wal_hook(d
10370 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  b, 0, 0);.  }.#e
10380 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
10390 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
103a0 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
103b0 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
103c0 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
103d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 77  transaction is w
103e0 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74  ritten.** into t
103f0 68 65 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c  he write-ahead-l
10400 6f 67 20 62 79 20 74 68 69 73 20 64 61 74 61 62  og by this datab
10410 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
10420 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
10430 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  _wal_hook(.  sql
10440 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10460 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
10470 74 6f 20 74 68 69 73 20 64 62 20 68 61 6e 64 6c  to this db handl
10480 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c  e */.  int(*xCal
10490 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73  lback)(void *, s
104a0 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63  qlite3*, const c
104b0 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f  har*, int),.  vo
104c0 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
104e0 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
104f0 70 61 73 73 65 64 20 74 6f 20 78 43 61 6c 6c 62  passed to xCallb
10500 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e  ack() */.){.#ifn
10510 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10520 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  WAL.  void *pRet
10530 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
10540 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
10550 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
10560 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
10570 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
10580 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
10590 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
105a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
105b0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
105c0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
105d0 52 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72  Ret = db->pWalAr
105e0 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c  g;.  db->xWalCal
105f0 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
10600 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67  k;.  db->pWalArg
10610 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
10620 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
10630 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
10640 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a  urn pRet;.#else.
10650 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64    return 0;.#end
10660 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  if.}../*.** Chec
10670 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20  kpoint database 
10680 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  zDb..*/.int sqli
10690 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
106a0 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  nt_v2(.  sqlite3
106b0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
106c0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
106d0 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
106e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
106f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10700 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61   /* Name of atta
10710 63 68 65 64 20 64 61 74 61 62 61 73 65 20 28 6f  ched database (o
10720 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74  r NULL) */.  int
10730 20 65 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20   eMode,         
10740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10750 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
10760 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  T_* value */.  i
10770 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20  nt *pnLog,      
10780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10790 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57  * OUT: Size of W
107a0 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73  AL log in frames
107b0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70   */.  int *pnCkp
107c0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
107d0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f        /* OUT: To
107e0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  tal number of fr
107f0 61 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65  ames checkpointe
10800 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53  d */.){.#ifdef S
10810 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
10820 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10830 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  K;.#else.  int r
10840 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
10850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10860 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
10870 6e 74 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f  nt iDb = SQLITE_
10880 4d 41 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f  MAX_ATTACHED;  /
10890 2a 20 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20  * sqlite3.aDb[] 
108a0 69 6e 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63  index of db to c
108b0 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 23 69  heckpoint */..#i
108c0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
108d0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
108e0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
108f0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
10900 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
10910 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
10920 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
10930 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  e the output var
10940 69 61 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e 20  iables to -1 in 
10950 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
10960 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70  curs. */.  if( p
10970 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d 20  nLog ) *pnLog = 
10980 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70 74  -1;.  if( pnCkpt
10990 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31 3b   ) *pnCkpt = -1;
109a0 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
109b0 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
109c0 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20 61 73  SSIVE==0 );.  as
109d0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
109e0 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20  CKPOINT_FULL==1 
109f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
10a00 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52  ITE_CHECKPOINT_R
10a10 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a 20 20 61  ESTART==2 );.  a
10a20 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
10a30 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54  ECKPOINT_TRUNCAT
10a40 45 3d 3d 33 20 29 3b 0a 20 20 69 66 28 20 65 4d  E==3 );.  if( eM
10a50 6f 64 65 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b  ode<SQLITE_CHECK
10a60 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 7c 7c  POINT_PASSIVE ||
10a70 20 65 4d 6f 64 65 3e 53 51 4c 49 54 45 5f 43 48   eMode>SQLITE_CH
10a80 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54  ECKPOINT_TRUNCAT
10a90 45 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  E ){.    /* EVID
10aa0 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 39 39 36  ENCE-OF: R-03996
10ab0 2d 31 32 30 38 38 20 54 68 65 20 4d 20 70 61 72  -12088 The M par
10ac0 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65 20 61  ameter must be a
10ad0 20 76 61 6c 69 64 20 63 68 65 63 6b 70 6f 69 6e   valid checkpoin
10ae0 74 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 3a 20 2a  t.    ** mode: *
10af0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
10b00 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a  ITE_MISUSE;.  }.
10b10 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10b20 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
10b30 29 3b 0a 20 20 69 66 28 20 7a 44 62 20 26 26 20  );.  if( zDb && 
10b40 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44  zDb[0] ){.    iD
10b50 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
10b60 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a  bName(db, zDb);.
10b70 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 30 20    }.  if( iDb<0 
10b80 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
10b90 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
10ba0 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
10bb0 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52  g(db, SQLITE_ERR
10bc0 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74  OR, "unknown dat
10bd0 61 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62 29  abase: %s", zDb)
10be0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
10bf0 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e  b->busyHandler.n
10c00 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  Busy = 0;.    rc
10c10 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70   = sqlite3Checkp
10c20 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20 65 4d  oint(db, iDb, eM
10c30 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b  ode, pnLog, pnCk
10c40 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pt);.    sqlite3
10c50 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20  Error(db, rc);. 
10c60 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
10c70 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
10c80 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
10c90 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
10ca0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
10cb0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
10cc0 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74  * Checkpoint dat
10cd0 61 62 61 73 65 20 7a 44 62 2e 20 49 66 20 7a 44  abase zDb. If zD
10ce0 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66  b is NULL, or if
10cf0 20 74 68 65 20 62 75 66 66 65 72 20 7a 44 62 20   the buffer zDb 
10d00 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e  points.** to con
10d10 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e  tains a zero-len
10d20 67 74 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20  gth string, all 
10d30 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
10d40 65 73 20 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b  es are .** check
10d50 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  pointed..*/.int 
10d60 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
10d70 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a  kpoint(sqlite3 *
10d80 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
10d90 7a 44 62 29 7b 0a 20 20 2f 2a 20 45 56 49 44 45  zDb){.  /* EVIDE
10da0 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 36 31 33 2d  NCE-OF: R-41613-
10db0 32 30 35 35 33 20 54 68 65 20 73 71 6c 69 74 65  20553 The sqlite
10dc0 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
10dd0 28 44 2c 58 29 20 69 73 20 65 71 75 69 76 61 6c  (D,X) is equival
10de0 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69  ent to.  ** sqli
10df0 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
10e00 6e 74 5f 76 32 28 44 2c 58 2c 53 51 4c 49 54 45  nt_v2(D,X,SQLITE
10e10 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
10e20 49 56 45 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20 72  IVE,0,0). */.  r
10e30 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 77 61  eturn sqlite3_wa
10e40 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
10e50 64 62 2c 7a 44 62 2c 53 51 4c 49 54 45 5f 43 48  db,zDb,SQLITE_CH
10e60 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
10e70 2c 30 2c 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  ,0,0);.}..#ifnde
10e80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
10e90 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68  L./*.** Run a ch
10ea0 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61  eckpoint on data
10eb0 62 61 73 65 20 69 44 62 2e 20 54 68 69 73 20 69  base iDb. This i
10ec0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74  s a no-op if dat
10ed0 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a 20  abase iDb is.** 
10ee0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  not currently op
10ef0 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a  en in WAL mode..
10f00 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
10f10 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f  action is open o
10f20 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
10f30 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65  eing checkpointe
10f40 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  d, this .** func
10f50 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
10f60 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61  ITE_LOCKED and a
10f70 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e   checkpoint is n
10f80 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49 66  ot attempted. If
10f90 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63   .** an error oc
10fa0 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69  curs while runni
10fb0 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  ng the checkpoin
10fc0 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  t, an SQLite err
10fd0 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
10fe0 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53 51  eturned (i.e. SQ
10ff0 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68  LITE_IOERR). Oth
11000 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
11010 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  K..**.** The mut
11020 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ex on database h
11030 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64 20  andle db should 
11040 62 65 20 68 65 6c 64 20 62 79 20 74 68 65 20 63  be held by the c
11050 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65 78  aller. The mutex
11060 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
11070 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 63  ith the specific
11080 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63 68   b-tree being ch
11090 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74 61  eckpointed is ta
110a0 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20 66  ken by.** this f
110b0 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68  unction while th
110c0 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  e checkpoint is 
110d0 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  running..**.** I
110e0 66 20 69 44 62 20 69 73 20 70 61 73 73 65 64 20  f iDb is passed 
110f0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
11100 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74  HED, then all at
11110 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
11120 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69   are.** checkpoi
11130 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  nted. If an erro
11140 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
11150 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20   it is returned 
11160 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a  immediately -.**
11170 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   no attempt is m
11180 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e  ade to checkpoin
11190 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20  t any remaining 
111a0 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a  databases..**.**
111b0 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
111c0 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   is one of SQLIT
111d0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
111e0 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20 52 45  SIVE, FULL or RE
111f0 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  START..*/.int sq
11200 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
11210 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
11220 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c   iDb, int eMode,
11230 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74   int *pnLog, int
11240 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74   *pnCkpt){.  int
11250 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11270 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
11280 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112a0 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
112b0 61 74 65 20 74 68 72 6f 75 67 68 20 61 74 74 61  ate through atta
112c0 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e  ched dbs */.  in
112d0 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20 20  t bBusy = 0;    
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
112f0 20 54 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f   True if SQLITE_
11300 42 55 53 59 20 68 61 73 20 62 65 65 6e 20 65 6e  BUSY has been en
11310 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20  countered */..  
11320 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11330 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
11340 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
11350 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e  t( !pnLog || *pn
11360 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73  Log==-1 );.  ass
11370 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20  ert( !pnCkpt || 
11380 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a  *pnCkpt==-1 );..
11390 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
113a0 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c 49  >nDb && rc==SQLI
113b0 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
113c0 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69   if( i==iDb || i
113d0 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41  Db==SQLITE_MAX_A
113e0 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20 20  TTACHED ){.     
113f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
11400 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d  eeCheckpoint(db-
11410 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f  >aDb[i].pBt, eMo
11420 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70  de, pnLog, pnCkp
11430 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20  t);.      pnLog 
11440 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70  = 0;.      pnCkp
11450 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
11460 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
11470 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75 73   ){.        bBus
11480 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  y = 1;.        r
11490 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
114a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
114b0 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
114c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42 75  SQLITE_OK && bBu
114d0 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  sy) ? SQLITE_BUS
114e0 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  Y : rc;.}.#endif
114f0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
11500 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  WAL */../*.** Th
11510 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
11520 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69 6e  rns true if main
11530 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62  -memory should b
11540 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  e used instead o
11550 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  f.** a temporary
11560 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73 69   file for transi
11570 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73 20  ent pager files 
11580 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  and statement jo
11590 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76  urnals..** The v
115a0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64 65  alue returned de
115b0 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
115c0 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73  ue of db->temp_s
115d0 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a  tore (runtime.**
115e0 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64 20   parameter) and 
115f0 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  the compile time
11600 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45   value of SQLITE
11610 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65  _TEMP_STORE. The
11620 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  .** following ta
11630 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
11640 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62  e relationship b
11650 65 74 77 65 65 6e 20 74 68 65 73 65 20 74 77 6f  etween these two
11660 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74   values.** and t
11670 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  his functions re
11680 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  turn value..**.*
11690 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  *   SQLITE_TEMP_
116a0 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65  STORE     db->te
116b0 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63  mp_store     Loc
116c0 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61  ation of tempora
116d0 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  ry database.**  
116e0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
116f0 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
11700 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
11710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11720 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20  --------.**   0 
11730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11740 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
11750 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
11760 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
11770 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
11780 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
11790 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
117a0 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
117b0 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
117c0 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
117d0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
117e0 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
117f0 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
11810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11820 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
11830 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 0).**   2     
11840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11850 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
11860 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
11870 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20  turn 0).**   2  
11880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11890 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
118a0 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
118b0 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
118c0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
118d0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
118e0 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
118f0 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
11900 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
11910 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20           any    
11920 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
11930 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
11940 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
11950 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73  empInMemory(cons
11960 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t sqlite3 *db){.
11970 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
11980 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75 72  STORE==1.  retur
11990 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
119a0 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a  re==2 );.#endif.
119b0 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
119c0 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75 72  STORE==2.  retur
119d0 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
119e0 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a  re!=1 );.#endif.
119f0 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
11a00 53 54 4f 52 45 3d 3d 33 0a 20 20 55 4e 55 53 45  STORE==3.  UNUSE
11a10 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b  D_PARAMETER(db);
11a20 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
11a30 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  dif.#if SQLITE_T
11a40 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53  EMP_STORE<1 || S
11a50 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
11a60 3e 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  >3.  UNUSED_PARA
11a70 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65 74  METER(db);.  ret
11a80 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
11a90 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
11aa0 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c  F-8 encoded Engl
11ab0 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
11ac0 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  lanation of the 
11ad0 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65  most recent.** e
11ae0 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  rror..*/.const c
11af0 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  har *sqlite3_err
11b00 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29  msg(sqlite3 *db)
11b10 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
11b20 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
11b30 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
11b40 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
11b50 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66  NOMEM);.  }.  if
11b60 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
11b70 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
11b80 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
11b90 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
11ba0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
11bb0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
11bc0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
11bd0 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64  >mutex);.  if( d
11be0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11bf0 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  ){.    z = sqlit
11c00 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
11c10 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b  NOMEM);.  }else{
11c20 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64  .    testcase( d
11c30 62 2d 3e 70 45 72 72 3d 3d 30 20 29 3b 0a 20 20  b->pErr==0 );.  
11c40 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c    z = (char*)sql
11c50 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
11c60 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 61  db->pErr);.    a
11c70 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
11c80 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
11c90 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
11ca0 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72    z = sqlite3Err
11cb0 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29  Str(db->errCode)
11cc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
11cd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
11ce0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
11cf0 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66  return z;.}..#if
11d00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11d10 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74  _UTF16./*.** Ret
11d20 75 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64  urn UTF-16 encod
11d30 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  ed English langu
11d40 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20  age explanation 
11d50 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
11d60 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a  nt.** error..*/.
11d70 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
11d80 74 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c  te3_errmsg16(sql
11d90 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61  ite3 *db){.  sta
11da0 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6f 75  tic const u16 ou
11db0 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20  tOfMem[] = {.   
11dc0 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20   'o', 'u', 't', 
11dd0 27 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27  ' ', 'o', 'f', '
11de0 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d   ', 'm', 'e', 'm
11df0 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27 79 27  ', 'o', 'r', 'y'
11e00 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69  , 0.  };.  stati
11e10 63 20 63 6f 6e 73 74 20 75 31 36 20 6d 69 73 75  c const u16 misu
11e20 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27  se[] = {.    'l'
11e30 2c 20 27 69 27 2c 20 27 62 27 2c 20 27 72 27 2c  , 'i', 'b', 'r',
11e40 20 27 61 27 2c 20 27 72 27 2c 20 27 79 27 2c 20   'a', 'r', 'y', 
11e50 27 20 27 2c 20 0a 20 20 20 20 27 72 27 2c 20 27  ' ', .    'r', '
11e60 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 69  o', 'u', 't', 'i
11e70 27 2c 20 27 6e 27 2c 20 27 65 27 2c 20 27 20 27  ', 'n', 'e', ' '
11e80 2c 20 0a 20 20 20 20 27 63 27 2c 20 27 61 27 2c  , .    'c', 'a',
11e90 20 27 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20   'l', 'l', 'e', 
11ea0 27 64 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'd', ' ', .    '
11eb0 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20  o', 'u', 't', ' 
11ec0 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 66 27  ', .    'o', 'f'
11ed0 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 73 27 2c  , ' ', .    's',
11ee0 20 27 65 27 2c 20 27 71 27 2c 20 27 75 27 2c 20   'e', 'q', 'u', 
11ef0 27 65 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27  'e', 'n', 'c', '
11f00 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f  e', 0.  };..  co
11f10 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69  nst void *z;.  i
11f20 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65  f( !db ){.    re
11f30 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74  turn (void *)out
11f40 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28  OfMem;.  }.  if(
11f50 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
11f60 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
11f70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
11f80 76 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20  void *)misuse;. 
11f90 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
11fa0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
11fb0 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ex);.  if( db->m
11fc0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
11fd0 20 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f     z = (void *)o
11fe0 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65  utOfMem;.  }else
11ff0 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  {.    z = sqlite
12000 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64  3_value_text16(d
12010 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66  b->pErr);.    if
12020 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( z==0 ){.      
12030 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
12040 4d 73 67 28 64 62 2c 20 64 62 2d 3e 65 72 72 43  Msg(db, db->errC
12050 6f 64 65 2c 20 73 71 6c 69 74 65 33 45 72 72 53  ode, sqlite3ErrS
12060 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 29  tr(db->errCode))
12070 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  ;.      z = sqli
12080 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
12090 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20  (db->pErr);.    
120a0 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f  }.    /* A mallo
120b0 63 28 29 20 6d 61 79 20 68 61 76 65 20 66 61 69  c() may have fai
120c0 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63  led within the c
120d0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  all to sqlite3_v
120e0 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20  alue_text16().  
120f0 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74    ** above. If t
12100 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
12110 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61   then the db->ma
12120 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
12130 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
12140 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
12150 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20  e returning. Do 
12160 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69  this directly, i
12170 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20  nstead of via.  
12180 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45    ** sqlite3ApiE
12190 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20  xit(), to avoid 
121a0 73 65 74 74 69 6e 67 20 74 68 65 20 64 61 74 61  setting the data
121b0 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f  base handle erro
121c0 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a  r message..    *
121d0 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  /.    db->malloc
121e0 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  Failed = 0;.  }.
121f0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12200 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
12210 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
12220 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
12230 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
12240 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
12250 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72   most recent err
12260 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  or code generate
12270 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72  d by an SQLite r
12280 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20  outine. If NULL 
12290 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  is.** passed to 
122a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77  this function, w
122b0 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f  e assume a mallo
122c0 63 28 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e  c() failed durin
122d0 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  g sqlite3_open()
122e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
122f0 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33  _errcode(sqlite3
12300 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20   *db){.  if( db 
12310 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  && !sqlite3Safet
12320 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
12330 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
12340 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
12350 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  KPT;.  }.  if( !
12360 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  db || db->malloc
12370 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
12380 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12390 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
123a0 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62  db->errCode & db
123b0 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74  ->errMask;.}.int
123c0 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
123d0 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65  d_errcode(sqlite
123e0 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
123f0 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65   && !sqlite3Safe
12400 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
12410 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
12420 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
12430 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
12440 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !db || db->mallo
12450 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
12460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
12470 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  EM;.  }.  return
12480 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a   db->errCode;.}.
12490 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
124a0 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
124b0 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f  ribes the kind o
124c0 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65  f error specifie
124d0 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75  d in the.** argu
124e0 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20  ment.  For now, 
124f0 74 68 69 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c  this simply call
12500 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  s the internal s
12510 71 6c 69 74 65 33 45 72 72 53 74 72 28 29 0a 2a  qlite3ErrStr().*
12520 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  * function..*/.c
12530 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
12540 65 33 5f 65 72 72 73 74 72 28 69 6e 74 20 72 63  e3_errstr(int rc
12550 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
12560 74 65 33 45 72 72 53 74 72 28 72 63 29 3b 0a 7d  te3ErrStr(rc);.}
12570 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
12580 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66   new collating f
12590 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61  unction for data
125a0 62 61 73 65 20 22 64 62 22 2e 20 20 54 68 65 20  base "db".  The 
125b0 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a  name is zName.**
125c0 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e   and the encodin
125d0 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61  g is enc..*/.sta
125e0 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f  tic int createCo
125f0 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  llation(.  sqlit
12600 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3* db,.  const 
12610 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
12620 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20  u8 enc,.  void* 
12630 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
12640 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
12650 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
12660 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20  ,const void*),. 
12670 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69   void(*xDel)(voi
12680 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  d*).){.  CollSeq
12690 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65   *pColl;.  int e
126a0 6e 63 32 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  nc2;.  .  assert
126b0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
126c0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
126d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49  );..  /* If SQLI
126e0 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63  TE_UTF16 is spec
126f0 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63  ified as the enc
12700 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e  oding type, tran
12710 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20  sform this.  ** 
12720 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  to one of SQLITE
12730 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49  _UTF16LE or SQLI
12740 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67  TE_UTF16BE using
12750 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
12760 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63  _UTF16NATIVE mac
12770 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ro. SQLITE_UTF16
12780 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74   is not used int
12790 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ernally..  */.  
127a0 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65  enc2 = enc;.  te
127b0 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51  stcase( enc2==SQ
127c0 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a 20 20  LITE_UTF16 );.  
127d0 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d  testcase( enc2==
127e0 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
127f0 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20 65 6e  GNED );.  if( en
12800 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
12810 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45   || enc2==SQLITE
12820 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29  _UTF16_ALIGNED )
12830 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c  {.    enc2 = SQL
12840 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
12850 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c  .  }.  if( enc2<
12860 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65  SQLITE_UTF8 || e
12870 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46 31 36  nc2>SQLITE_UTF16
12880 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  BE ){.    return
12890 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
128a0 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  KPT;.  }..  /* C
128b0 68 65 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c  heck if this cal
128c0 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72  l is removing or
128d0 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78   replacing an ex
128e0 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e  isting collation
128f0 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e   .  ** sequence.
12900 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72   If so, and ther
12910 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73  e are active VMs
12920 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49  , return busy. I
12930 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65  f there.  ** are
12940 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
12950 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70  invalidate any p
12960 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  re-compiled stat
12970 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70  ements..  */.  p
12980 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
12990 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75  ndCollSeq(db, (u
129a0 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30  8)enc2, zName, 0
129b0 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26  );.  if( pColl &
129c0 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b  & pColl->xCmp ){
129d0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64  .    if( db->nVd
129e0 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20  beActive ){.    
129f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
12a00 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45  thMsg(db, SQLITE
12a10 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20  _BUSY, .        
12a20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74  "unable to delet
12a30 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69  e/modify collati
12a40 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65 20  on sequence due 
12a50 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  to active statem
12a60 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65  ents");.      re
12a70 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
12a80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
12a90 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
12aa0 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
12ab0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c  ..    /* If coll
12ac0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70  ation sequence p
12ad0 43 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64  Coll was created
12ae0 20 64 69 72 65 63 74 6c 79 20 62 79 20 61 20 63   directly by a c
12af0 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
12b00 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
12b10 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20  lation, and not 
12b20 67 65 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e  generated by syn
12b30 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20  thCollSeq(),.   
12b40 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70   ** then any cop
12b50 69 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74  ies made by synt
12b60 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20  hCollSeq() need 
12b70 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  to be invalidate
12b80 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  d..    ** Also, 
12b90 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75  collation destru
12ba0 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78  ctor - CollSeq.x
12bb0 44 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e  Del() - function
12bc0 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a   may need.    **
12bd0 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20   to be called.. 
12be0 20 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28     */ .    if( (
12bf0 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51  pColl->enc & ~SQ
12c00 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
12c10 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20  ED)==enc2 ){.   
12c20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c     CollSeq *aCol
12c30 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  l = sqlite3HashF
12c40 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ind(&db->aCollSe
12c50 71 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  q, zName);.     
12c60 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
12c70 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29  r(j=0; j<3; j++)
12c80 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
12c90 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d  q *p = &aColl[j]
12ca0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
12cb0 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63  >enc==pColl->enc
12cc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
12cd0 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20  ( p->xDel ){.   
12ce0 20 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c           p->xDel
12cf0 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20  (p->pUser);.    
12d00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12d10 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20    p->xCmp = 0;. 
12d20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12d30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43  .    }.  }..  pC
12d40 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
12d50 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38  dCollSeq(db, (u8
12d60 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29  )enc2, zName, 1)
12d70 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30  ;.  if( pColl==0
12d80 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
12d90 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d  _NOMEM;.  pColl-
12da0 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65  >xCmp = xCompare
12db0 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  ;.  pColl->pUser
12dc0 20 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c   = pCtx;.  pColl
12dd0 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20  ->xDel = xDel;. 
12de0 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75   pColl->enc = (u
12df0 38 29 28 65 6e 63 32 20 7c 20 28 65 6e 63 20 26  8)(enc2 | (enc &
12e00 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c   SQLITE_UTF16_AL
12e10 49 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c 69 74  IGNED));.  sqlit
12e20 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
12e30 54 45 5f 4f 4b 29 3b 0a 20 20 72 65 74 75 72 6e  TE_OK);.  return
12e40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
12e50 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72 61 79  /*.** This array
12e60 20 64 65 66 69 6e 65 73 20 68 61 72 64 20 75 70   defines hard up
12e70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69  per bounds on li
12e80 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54 68 65  mit values.  The
12e90 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  .** initializer 
12ea0 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e 20  must be kept in 
12eb0 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 53 51  sync with the SQ
12ec0 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20  LITE_LIMIT_*.** 
12ed0 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71 6c 69  #defines in sqli
12ee0 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  te3.h..*/.static
12ef0 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61 72 64   const int aHard
12f00 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51  Limit[] = {.  SQ
12f10 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c  LITE_MAX_LENGTH,
12f20 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  .  SQLITE_MAX_SQ
12f30 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  L_LENGTH,.  SQLI
12f40 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20  TE_MAX_COLUMN,. 
12f50 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
12f60 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45  _DEPTH,.  SQLITE
12f70 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
12f80 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  LECT,.  SQLITE_M
12f90 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51  AX_VDBE_OP,.  SQ
12fa0 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
12fb0 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f  N_ARG,.  SQLITE_
12fc0 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a 20 20  MAX_ATTACHED,.  
12fd0 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
12fe0 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a  PATTERN_LENGTH,.
12ff0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52    SQLITE_MAX_VAR
13000 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 20 20 20  IABLE_NUMBER,   
13010 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 38 30     /* IMP: R-380
13020 39 31 2d 33 32 33 35 32 20 2a 2f 0a 20 20 53 51  91-32352 */.  SQ
13030 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
13040 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45  _DEPTH,.  SQLITE
13050 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
13060 41 44 53 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d  ADS,.};../*.** M
13070 61 6b 65 20 73 75 72 65 20 74 68 65 20 68 61 72  ake sure the har
13080 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65 74  d limits are set
13090 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20 76   to reasonable v
130a0 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c  alues.*/.#if SQL
130b0 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31  ITE_MAX_LENGTH<1
130c0 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  00.# error SQLIT
130d0 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73  E_MAX_LENGTH mus
130e0 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30  t be at least 10
130f0 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
13100 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
13110 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53  TH<100.# error S
13120 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
13130 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
13140 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66  least 100.#endif
13150 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
13160 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54  SQL_LENGTH>SQLIT
13170 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65  E_MAX_LENGTH.# e
13180 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
13190 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  SQL_LENGTH must 
131a0 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72 20 74  not be greater t
131b0 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  han SQLITE_MAX_L
131c0 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69 66  ENGTH.#endif.#if
131d0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
131e0 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20  OUND_SELECT<2.# 
131f0 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
13200 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
13210 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
13220 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 2.#endif.#if S
13230 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
13240 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  P<40.# error SQL
13250 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20  ITE_MAX_VDBE_OP 
13260 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
13270 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   40.#endif.#if S
13280 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
13290 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49  ON_ARG<0 || SQLI
132a0 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
132b0 41 52 47 3e 31 30 30 30 0a 23 20 65 72 72 6f 72  ARG>1000.# error
132c0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
132d0 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65  TION_ARG must be
132e0 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31   between 0 and 1
132f0 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  000.#endif.#if S
13300 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
13310 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  ED<0 || SQLITE_M
13320 41 58 5f 41 54 54 41 43 48 45 44 3e 31 32 35 0a  AX_ATTACHED>125.
13330 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
13340 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74  AX_ATTACHED must
13350 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
13360 64 20 31 32 35 0a 23 65 6e 64 69 66 0a 23 69 66  d 125.#endif.#if
13370 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
13380 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c  _PATTERN_LENGTH<
13390 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  1.# error SQLITE
133a0 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
133b0 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65  N_LENGTH must be
133c0 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64   at least 1.#end
133d0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
133e0 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23  X_COLUMN>32767.#
133f0 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
13400 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f  X_COLUMN must no
13410 74 20 65 78 63 65 65 64 20 33 32 37 36 37 0a 23  t exceed 32767.#
13420 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
13430 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
13440 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c  TH<1.# error SQL
13450 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
13460 44 45 50 54 48 20 6d 75 73 74 20 62 65 20 61 74  DEPTH must be at
13470 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a   least 1.#endif.
13480 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  #if SQLITE_MAX_W
13490 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3c 30 20  ORKER_THREADS<0 
134a0 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  || SQLITE_MAX_WO
134b0 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 35 30 0a  RKER_THREADS>50.
134c0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
134d0 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
134e0 53 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  S must be betwee
134f0 6e 20 30 20 61 6e 64 20 35 30 0a 23 65 6e 64 69  n 0 and 50.#endi
13500 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  f.../*.** Change
13510 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
13520 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20 74  limit.  Report t
13530 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a  he old value..**
13540 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c   If an invalid l
13550 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73 75  imit index is su
13560 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20 2d  pplied, report -
13570 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  1..** Make no ch
13580 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c 20  anges but still 
13590 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76  report the old v
135a0 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e  alue if the.** n
135b0 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61  ew limit is nega
135c0 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  tive..**.** A ne
135d0 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f  w lower limit do
135e0 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78  es not shrink ex
135f0 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63 74  isting construct
13600 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20  s..** It merely 
13610 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e  prevents new con
13620 73 74 72 75 63 74 73 20 74 68 61 74 20 65 78 63  structs that exc
13630 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a  eed the limit.**
13640 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a   from forming..*
13650 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69  /.int sqlite3_li
13660 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
13670 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e   int limitId, in
13680 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69  t newLimit){.  i
13690 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 23 69  nt oldLimit;..#i
136a0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
136b0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
136c0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
136d0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
136e0 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
136f0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
13700 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
13710 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 56  .#endif..  /* EV
13720 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31  IDENCE-OF: R-301
13730 38 39 2d 35 34 30 39 37 20 46 6f 72 20 65 61 63  89-54097 For eac
13740 68 20 6c 69 6d 69 74 20 63 61 74 65 67 6f 72 79  h limit category
13750 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41   SQLITE_LIMIT_NA
13760 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  ME.  ** there is
13770 20 61 20 68 61 72 64 20 75 70 70 65 72 20 62 6f   a hard upper bo
13780 75 6e 64 20 73 65 74 20 61 74 20 63 6f 6d 70 69  und set at compi
13790 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43 20 70  le-time by a C p
137a0 72 65 70 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a  reprocessor.  **
137b0 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20 53 51   macro called SQ
137c0 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28  LITE_MAX_NAME. (
137d0 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e  The "_LIMIT_" in
137e0 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63 68 61   the name is cha
137f0 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d  nged to.  ** "_M
13800 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73  AX_".).  */.  as
13810 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
13820 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
13830 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  NGTH]==SQLITE_MA
13840 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  X_LENGTH );.  as
13850 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
13860 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51  [SQLITE_LIMIT_SQ
13870 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54  L_LENGTH]==SQLIT
13880 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
13890 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
138a0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
138b0 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53  LIMIT_COLUMN]==S
138c0 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
138d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
138e0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
138f0 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48  LIMIT_EXPR_DEPTH
13900 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  ]==SQLITE_MAX_EX
13910 50 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  PR_DEPTH );.  as
13920 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
13930 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
13940 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d  MPOUND_SELECT]==
13950 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
13960 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61  UND_SELECT);.  a
13970 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
13980 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
13990 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f  DBE_OP]==SQLITE_
139a0 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20  MAX_VDBE_OP );. 
139b0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
139c0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
139d0 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d  _FUNCTION_ARG]==
139e0 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
139f0 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61 73 73  ION_ARG );.  ass
13a00 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
13a10 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54  SQLITE_LIMIT_ATT
13a20 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ACHED]==SQLITE_M
13a30 41 58 5f 41 54 54 41 43 48 45 44 20 29 3b 0a 20  AX_ATTACHED );. 
13a40 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
13a50 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
13a60 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
13a70 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20  NGTH]==.        
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13aa0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41         SQLITE_MA
13ab0 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
13ac0 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72  ENGTH );.  asser
13ad0 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
13ae0 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
13af0 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c  BLE_NUMBER]==SQL
13b00 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
13b10 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73 73 65  _NUMBER);.  asse
13b20 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
13b30 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47  QLITE_LIMIT_TRIG
13b40 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49  GER_DEPTH]==SQLI
13b50 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
13b60 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
13b70 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
13b80 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
13b90 5f 54 48 52 45 41 44 53 5d 3d 3d 53 51 4c 49 54  _THREADS]==SQLIT
13ba0 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
13bb0 45 41 44 53 20 29 3b 0a 20 20 61 73 73 65 72 74  EADS );.  assert
13bc0 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57  ( SQLITE_LIMIT_W
13bd0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3d 3d 28  ORKER_THREADS==(
13be0 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31  SQLITE_N_LIMIT-1
13bf0 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d  ) );...  if( lim
13c00 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49  itId<0 || limitI
13c10 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49  d>=SQLITE_N_LIMI
13c20 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
13c30 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d  -1;.  }.  oldLim
13c40 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  it = db->aLimit[
13c50 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28 20  limitId];.  if( 
13c60 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20  newLimit>=0 ){  
13c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c80 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34 37 36   /* IMP: R-52476
13c90 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20 20 69 66  -28732 */.    if
13ca0 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72 64  ( newLimit>aHard
13cb0 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29  Limit[limitId] )
13cc0 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74  {.      newLimit
13cd0 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69   = aHardLimit[li
13ce0 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a  mitId];  /* IMP:
13cf0 20 52 2d 35 31 34 36 33 2d 32 35 36 33 34 20 2a   R-51463-25634 *
13d00 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  /.    }.    db->
13d10 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20  aLimit[limitId] 
13d20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a  = newLimit;.  }.
13d30 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69    return oldLimi
13d40 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
13d50 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
13d60 2d 35 33 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a  -53341-35419 */.
13d70 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
13d80 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
13d90 6f 20 70 61 72 73 65 20 62 6f 74 68 20 55 52 49  o parse both URI
13da0 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20 66 69  s and non-URI fi
13db0 6c 65 6e 61 6d 65 73 20 70 61 73 73 65 64 20 62  lenames passed b
13dc0 79 20 74 68 65 0a 2a 2a 20 75 73 65 72 20 74 6f  y the.** user to
13dd0 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20 73   API functions s
13de0 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 6f 72  qlite3_open() or
13df0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
13e00 28 29 2c 20 61 6e 64 20 66 6f 72 20 64 61 74 61  (), and for data
13e10 62 61 73 65 0a 2a 2a 20 55 52 49 73 20 73 70 65  base.** URIs spe
13e20 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f  cified as part o
13e30 66 20 41 54 54 41 43 48 20 73 74 61 74 65 6d 65  f ATTACH stateme
13e40 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  nts..**.** The f
13e50 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
13e60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
13e70 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
13e80 65 20 56 46 53 20 74 6f 20 75 73 65 20 28 6f 72  e VFS to use (or
13e90 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20 73 69  .** a NULL to si
13ea0 67 6e 69 66 79 20 74 68 65 20 64 65 66 61 75 6c  gnify the defaul
13eb0 74 20 56 46 53 29 20 69 66 20 74 68 65 20 55 52  t VFS) if the UR
13ec0 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  I does not conta
13ed0 69 6e 20 61 20 22 76 66 73 3d 78 78 78 22 0a 2a  in a "vfs=xxx".*
13ee0 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  * query paramete
13ef0 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  r. The second ar
13f00 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20  gument contains 
13f10 74 68 65 20 55 52 49 20 28 6f 72 20 6e 6f 6e 2d  the URI (or non-
13f20 55 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a  URI filename).**
13f30 20 69 74 73 65 6c 66 2e 20 57 68 65 6e 20 74 68   itself. When th
13f40 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
13f50 61 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c 61 67  alled the *pFlag
13f60 73 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c  s variable shoul
13f70 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68 65  d contain.** the
13f80 20 64 65 66 61 75 6c 74 20 66 6c 61 67 73 20 74   default flags t
13f90 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62  o open the datab
13fa0 61 73 65 20 68 61 6e 64 6c 65 20 77 69 74 68 2e  ase handle with.
13fb0 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   The value store
13fc0 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73 20  d in.** *pFlags 
13fd0 6d 61 79 20 62 65 20 75 70 64 61 74 65 64 20 62  may be updated b
13fe0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
13ff0 69 66 20 74 68 65 20 55 52 49 20 66 69 6c 65 6e  if the URI filen
14000 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a  ame contains .**
14010 20 22 63 61 63 68 65 3d 78 78 78 22 20 6f 72 20   "cache=xxx" or 
14020 22 6d 6f 64 65 3d 78 78 78 22 20 71 75 65 72 79  "mode=xxx" query
14030 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a   parameters..**.
14040 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
14050 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
14060 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
14070 20 63 61 73 65 20 2a 70 70 56 66 73 20 69 73 20   case *ppVfs is 
14080 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  set to point to.
14090 2a 2a 20 74 68 65 20 56 46 53 20 74 68 61 74 20  ** the VFS that 
140a0 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74  should be used t
140b0 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62  o open the datab
140c0 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46 69 6c  ase file. *pzFil
140d0 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70  e is set to.** p
140e0 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
140f0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
14100 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  name of the file
14110 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69 73 20   to open. It is 
14120 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
14130 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
14140 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
14150 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  ly call sqlite3_
14160 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65 61 73  free() to releas
14170 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72  e.** this buffer
14180 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
14190 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
141a0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
141b0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
141c0 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67 0a  d and *pzErrMsg.
141d0 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  ** may be set to
141e0 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
141f0 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e  er containing an
14200 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
14210 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73  e error .** mess
14220 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  age. It is the r
14230 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
14240 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
14250 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73  ventually releas
14260 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72  e.** this buffer
14270 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
14280 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69  te3_free()..*/.i
14290 6e 74 20 73 71 6c 69 74 65 33 50 61 72 73 65 55  nt sqlite3ParseU
142a0 72 69 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ri(.  const char
142b0 20 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c 20 20   *zDefaultVfs,  
142c0 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20        /* VFS to 
142d0 75 73 65 20 69 66 20 6e 6f 20 22 76 66 73 3d 78  use if no "vfs=x
142e0 78 78 22 20 71 75 65 72 79 20 6f 70 74 69 6f 6e  xx" query option
142f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
14300 20 2a 7a 55 72 69 2c 20 20 20 20 20 20 20 20 20   *zUri,         
14310 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72        /* Nul-ter
14320 6d 69 6e 61 74 65 64 20 55 52 49 20 74 6f 20 70  minated URI to p
14330 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  arse */.  unsign
14340 65 64 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20  ed int *pFlags, 
14350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
14360 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e  OUT: SQLITE_OPEN
14370 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
14380 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a 70 70  sqlite3_vfs **pp
14390 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Vfs,            
143a0 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f 20 75  /* OUT: VFS to u
143b0 73 65 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a 2a  se */ .  char **
143c0 70 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  pzFile,         
143d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
143e0 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e   Filename compon
143f0 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a 20 20  ent of URI */.  
14400 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20  char **pzErrMsg 
14410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14420 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65  /* OUT: Error me
14430 73 73 61 67 65 20 28 69 66 20 72 63 21 3d 53 51  ssage (if rc!=SQ
14440 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20  LITE_OK) */.){. 
14450 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14460 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  _OK;.  unsigned 
14470 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70 46 6c  int flags = *pFl
14480 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ags;.  const cha
14490 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66 61 75  r *zVfs = zDefau
144a0 6c 74 56 66 73 3b 0a 20 20 63 68 61 72 20 2a 7a  ltVfs;.  char *z
144b0 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 63 3b 0a  File;.  char c;.
144c0 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 73 71 6c    int nUri = sql
144d0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 72  ite3Strlen30(zUr
144e0 69 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a  i);..  assert( *
144f0 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a  pzErrMsg==0 );..
14500 20 20 69 66 28 20 28 28 66 6c 61 67 73 20 26 20    if( ((flags & 
14510 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
14520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14530 49 4d 50 3a 20 52 2d 34 38 37 32 35 2d 33 32 32  IMP: R-48725-322
14540 30 36 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  06 */.          
14550 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62    || sqlite3Glob
14560 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72  alConfig.bOpenUr
14570 69 29 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 36  i) /* IMP: R-516
14580 38 39 2d 34 36 35 34 38 20 2a 2f 0a 20 20 20 26  89-46548 */.   &
14590 26 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d  & nUri>=5 && mem
145a0 63 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a  cmp(zUri, "file:
145b0 22 2c 20 35 29 3d 3d 30 20 2f 2a 20 49 4d 50 3a  ", 5)==0 /* IMP:
145c0 20 52 2d 35 37 38 38 34 2d 33 37 34 39 36 20 2a   R-57884-37496 *
145d0 2f 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20  /.  ){.    char 
145e0 2a 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20 65  *zOpt;.    int e
145f0 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  State;          
14600 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
14610 65 72 20 73 74 61 74 65 20 77 68 65 6e 20 70 61  er state when pa
14620 72 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20 20  rsing URI */.   
14630 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 20 20 20   int iIn;       
14640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14650 2a 20 49 6e 70 75 74 20 63 68 61 72 61 63 74 65  * Input characte
14660 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  r index */.    i
14670 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20 20  nt iOut = 0;    
14680 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14690 4f 75 74 70 75 74 20 63 68 61 72 61 63 74 65 72  Output character
146a0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 75 36   index */.    u6
146b0 34 20 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b 32  4 nByte = nUri+2
146c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
146d0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f  ytes of space to
146e0 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20   allocate */..  
146f0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
14700 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  he SQLITE_OPEN_U
14710 52 49 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  RI flag is set t
14720 6f 20 69 6e 64 69 63 61 74 65 20 74 6f 20 74 68  o indicate to th
14730 65 20 56 46 53 20 78 4f 70 65 6e 20 0a 20 20 20  e VFS xOpen .   
14740 20 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61 74 20   ** method that 
14750 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 78 74  there may be ext
14760 72 61 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f  ra parameters fo
14770 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  llowing the file
14780 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 66  -name.  */.    f
14790 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
147a0 50 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66 6f  PEN_URI;..    fo
147b0 72 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72  r(iIn=0; iIn<nUr
147c0 69 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65 20  i; iIn++) nByte 
147d0 2b 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27  += (zUri[iIn]=='
147e0 26 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d  &');.    zFile =
147f0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
14800 34 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  4(nByte);.    if
14810 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72  ( !zFile ) retur
14820 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
14830 0a 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69  .    iIn = 5;.#i
14840 66 64 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f  fdef SQLITE_ALLO
14850 57 5f 55 52 49 5f 41 55 54 48 4f 52 49 54 59 0a  W_URI_AUTHORITY.
14860 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
14870 7a 55 72 69 2b 35 2c 20 22 2f 2f 2f 22 2c 20 33  zUri+5, "///", 3
14880 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 49  )==0 ){.      iI
14890 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20 2f 2a 20  n = 7;.      /* 
148a0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
148b0 6e 64 69 74 69 6f 6e 20 63 61 75 73 65 73 20 55  ndition causes U
148c0 52 49 73 20 77 69 74 68 20 66 69 76 65 20 6c 65  RIs with five le
148d0 61 64 69 6e 67 20 2f 20 63 68 61 72 61 63 74 65  ading / characte
148e0 72 73 0a 20 20 20 20 20 20 2a 2a 20 6c 69 6b 65  rs.      ** like
148f0 20 66 69 6c 65 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f   file://///host/
14900 70 61 74 68 20 74 6f 20 62 65 20 63 6f 6e 76 65  path to be conve
14910 72 74 65 64 20 69 6e 74 6f 20 55 4e 43 73 20 6c  rted into UNCs l
14920 69 6b 65 20 2f 2f 68 6f 73 74 2f 70 61 74 68 2e  ike //host/path.
14930 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 63 6f  .      ** The co
14940 72 72 65 63 74 20 55 52 49 20 66 6f 72 20 74 68  rrect URI for th
14950 61 74 20 55 4e 43 20 68 61 73 20 6f 6e 6c 79 20  at UNC has only 
14960 74 77 6f 20 6f 72 20 66 6f 75 72 20 6c 65 61 64  two or four lead
14970 69 6e 67 20 2f 20 63 68 61 72 61 63 74 65 72 73  ing / characters
14980 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 3a 2f  .      ** file:/
14990 2f 68 6f 73 74 2f 70 61 74 68 20 6f 72 20 66 69  /host/path or fi
149a0 6c 65 3a 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68  le:////host/path
149b0 2e 20 20 42 75 74 20 35 20 6c 65 61 64 69 6e 67  .  But 5 leading
149c0 20 73 6c 61 73 68 65 73 20 69 73 20 61 20 0a 20   slashes is a . 
149d0 20 20 20 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65       ** common e
149e0 72 72 6f 72 2c 20 77 65 20 61 72 65 20 74 6f 6c  rror, we are tol
149f0 64 2c 20 73 6f 20 77 65 20 68 61 6e 64 6c 65 20  d, so we handle 
14a00 69 74 20 61 73 20 61 20 73 70 65 63 69 61 6c 20  it as a special 
14a10 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  case. */.      i
14a20 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b  f( strncmp(zUri+
14a30 37 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20  7, "///", 3)==0 
14a40 29 7b 20 69 49 6e 2b 2b 3b 20 7d 0a 20 20 20 20  ){ iIn++; }.    
14a50 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
14a60 70 28 7a 55 72 69 2b 35 2c 20 22 2f 2f 6c 6f 63  p(zUri+5, "//loc
14a70 61 6c 68 6f 73 74 2f 22 2c 20 31 32 29 3d 3d 30  alhost/", 12)==0
14a80 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20   ){.      iIn = 
14a90 31 36 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  16;.    }.#else.
14aa0 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
14ab0 68 65 20 73 63 68 65 6d 65 20 61 6e 64 20 61 75  he scheme and au
14ac0 74 68 6f 72 69 74 79 20 73 65 67 6d 65 6e 74 73  thority segments
14ad0 20 6f 66 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a   of the URI. */.
14ae0 20 20 20 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d      if( zUri[5]=
14af0 3d 27 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d  ='/' && zUri[6]=
14b00 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 49  ='/' ){.      iI
14b10 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20 77 68 69  n = 7;.      whi
14b20 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26  le( zUri[iIn] &&
14b30 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20   zUri[iIn]!='/' 
14b40 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69  ) iIn++;.      i
14b50 66 28 20 69 49 6e 21 3d 37 20 26 26 20 28 69 49  f( iIn!=7 && (iI
14b60 6e 21 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28  n!=16 || memcmp(
14b70 22 6c 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55  "localhost", &zU
14b80 72 69 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20  ri[7], 9)) ){.  
14b90 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
14ba0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
14bb0 66 28 22 69 6e 76 61 6c 69 64 20 75 72 69 20 61  f("invalid uri a
14bc0 75 74 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c  uthority: %.*s",
14bd0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49   .            iI
14be0 6e 2d 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a  n-7, &zUri[7]);.
14bf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
14c00 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
14c10 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72     goto parse_ur
14c20 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  i_out;.      }. 
14c30 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
14c40 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c   /* Copy the fil
14c50 65 6e 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75  ename and any qu
14c60 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 69  ery parameters i
14c70 6e 74 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75  nto the zFile bu
14c80 66 66 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65  ffer. .    ** De
14c90 63 6f 64 65 20 25 48 48 20 65 73 63 61 70 65 20  code %HH escape 
14ca0 63 6f 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20  codes along the 
14cb0 77 61 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  way. .    **.   
14cc0 20 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20   ** Within this 
14cd0 6c 6f 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65  loop, variable e
14ce0 53 74 61 74 65 20 6d 61 79 20 62 65 20 73 65 74  State may be set
14cf0 20 74 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64   to 0, 1 or 2, d
14d00 65 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20  epending.    ** 
14d10 6f 6e 20 74 68 65 20 70 61 72 73 69 6e 67 20 63  on the parsing c
14d20 6f 6e 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f  ontext. As follo
14d30 77 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ws:.    **.    *
14d40 2a 20 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66  *   0: Parsing f
14d50 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a  ile-name..    **
14d60 20 20 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61     1: Parsing na
14d70 6d 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20  me section of a 
14d80 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79  name=value query
14d90 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20   parameter..    
14da0 2a 2a 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20  **   2: Parsing 
14db0 76 61 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66  value section of
14dc0 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75   a name=value qu
14dd0 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20  ery parameter.. 
14de0 20 20 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65     */.    eState
14df0 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
14e00 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29   (c = zUri[iIn])
14e10 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b  !=0 && c!='#' ){
14e20 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20  .      iIn++;.  
14e30 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a      if( c=='%' .
14e40 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
14e50 33 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69  3Isxdigit(zUri[i
14e60 49 6e 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20  In]) .       && 
14e70 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
14e80 7a 55 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20  zUri[iIn+1]) .  
14e90 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
14ea0 6e 74 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69  nt octet = (sqli
14eb0 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69  te3HexToInt(zUri
14ec0 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a  [iIn++]) << 4);.
14ed0 20 20 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d          octet +=
14ee0 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74   sqlite3HexToInt
14ef0 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a  (zUri[iIn++]);..
14f00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
14f10 6f 63 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65  octet>=0 && octe
14f20 74 3c 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20  t<256 );.       
14f30 20 69 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b   if( octet==0 ){
14f40 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
14f50 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
14f60 65 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61 70  en when "%00" ap
14f70 70 65 61 72 73 20 77 69 74 68 69 6e 20 74 68 65  pears within the
14f80 20 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20   URI. In this.  
14f90 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
14fa0 77 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65  we ignore all te
14fb0 78 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e  xt in the remain
14fc0 64 65 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c  der of the path,
14fd0 20 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20   name or.       
14fe0 20 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72     ** value curr
14ff0 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73  ently being pars
15000 65 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68  ed. So ignore th
15010 65 20 63 75 72 72 65 6e 74 20 63 68 61 72 61 63  e current charac
15020 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ter.          **
15030 20 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65   and skip to the
15040 20 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f   next "?", "=" o
15050 72 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70  r "&", as approp
15060 72 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20  riate. */.      
15070 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20      while( (c = 
15080 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26  zUri[iIn])!=0 &&
15090 20 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20   c!='#' .       
150a0 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
150b0 65 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a  e!=0 || c!='?').
150c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
150d0 20 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28   (eState!=1 || (
150e0 63 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27  c!='=' && c!='&'
150f0 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
15100 20 26 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c   && (eState!=2 |
15110 7c 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20  | c!='&').      
15120 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
15130 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20     iIn++;.      
15140 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15150 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
15160 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20    }.        c = 
15170 6f 63 74 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c  octet;.      }el
15180 73 65 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31  se if( eState==1
15190 20 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63   && (c=='&' || c
151a0 3d 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20  =='=') ){.      
151b0 20 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74    if( zFile[iOut
151c0 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1]==0 ){.      
151d0 20 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20      /* An empty 
151e0 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e  option name. Ign
151f0 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20  ore this option 
15200 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20  altogether. */. 
15210 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
15220 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72  zUri[iIn] && zUr
15230 69 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a  i[iIn]!='#' && z
15240 55 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20  Uri[iIn-1]!='&' 
15250 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20  ) iIn++;.       
15260 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
15270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
15280 66 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20  f( c=='&' ){.   
15290 20 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75         zFile[iOu
152a0 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  t++] = '\0';.   
152b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
152c0 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 32        eState = 2
152d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
152e0 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20      c = 0;.     
152f0 20 7d 65 6c 73 65 20 69 66 28 20 28 65 53 74 61   }else if( (eSta
15300 74 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29  te==0 && c=='?')
15310 20 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32 20 26   || (eState==2 &
15320 26 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20  & c=='&') ){.   
15330 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
15340 20 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b 0a      eState = 1;.
15350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46        }.      zF
15360 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b  ile[iOut++] = c;
15370 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
15380 53 74 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65  State==1 ) zFile
15390 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
153a0 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b  .    zFile[iOut+
153b0 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a  +] = '\0';.    z
153c0 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
153d0 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  \0';..    /* Che
153e0 63 6b 20 69 66 20 74 68 65 72 65 20 77 65 72 65  ck if there were
153f0 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70 65   any options spe
15400 63 69 66 69 65 64 20 74 68 61 74 20 73 68 6f 75  cified that shou
15410 6c 64 20 62 65 20 69 6e 74 65 72 70 72 65 74 65  ld be interprete
15420 64 20 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e 20  d .    ** here. 
15430 4f 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65  Options that are
15440 20 69 6e 74 65 72 70 72 65 74 65 64 20 68 65 72   interpreted her
15450 65 20 69 6e 63 6c 75 64 65 20 22 76 66 73 22 20  e include "vfs" 
15460 61 6e 64 20 74 68 6f 73 65 20 74 68 61 74 0a 20  and those that. 
15470 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64     ** correspond
15480 20 74 6f 20 66 6c 61 67 73 20 74 68 61 74 20 6d   to flags that m
15490 61 79 20 62 65 20 70 61 73 73 65 64 20 74 6f 20  ay be passed to 
154a0 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  the sqlite3_open
154b0 5f 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74  _v2().    ** met
154c0 68 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74  hod. */.    zOpt
154d0 20 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65   = &zFile[sqlite
154e0 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
154f0 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  +1];.    while( 
15500 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20  zOpt[0] ){.     
15510 20 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69   int nOpt = sqli
15520 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74  te3Strlen30(zOpt
15530 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  );.      char *z
15540 56 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74  Val = &zOpt[nOpt
15550 2b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  +1];.      int n
15560 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Val = sqlite3Str
15570 6c 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20  len30(zVal);..  
15580 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20      if( nOpt==3 
15590 26 26 20 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c  && memcmp("vfs",
155a0 20 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a   zOpt, 3)==0 ){.
155b0 20 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20 7a          zVfs = z
155c0 56 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Val;.      }else
155d0 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
155e0 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20   OpenMode {.    
155f0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
15600 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 69   *z;.          i
15610 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  nt mode;.       
15620 20 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20   } *aMode = 0;. 
15630 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f         char *zMo
15640 64 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  deType = 0;.    
15650 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30      int mask = 0
15660 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 69  ;.        int li
15670 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  mit = 0;..      
15680 20 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26    if( nOpt==5 &&
15690 20 6d 65 6d 63 6d 70 28 22 63 61 63 68 65 22 2c   memcmp("cache",
156a0 20 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a   zOpt, 5)==0 ){.
156b0 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
156c0 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
156d0 20 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20   aCacheMode[] = 
156e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  {.            { 
156f0 22 73 68 61 72 65 64 22 2c 20 20 53 51 4c 49 54  "shared",  SQLIT
15700 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
15710 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  HE },.          
15720 20 20 7b 20 22 70 72 69 76 61 74 65 22 2c 20 53    { "private", S
15730 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
15740 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20  TECACHE },.     
15750 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a         { 0, 0 }.
15760 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20            };..  
15770 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53          mask = S
15780 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
15790 44 43 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50  DCACHE|SQLITE_OP
157a0 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 3b  EN_PRIVATECACHE;
157b0 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65  .          aMode
157c0 20 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20   = aCacheMode;. 
157d0 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d           limit =
157e0 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20   mask;.         
157f0 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 63 61   zModeType = "ca
15800 63 68 65 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  che";.        }.
15810 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74          if( nOpt
15820 3d 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d  ==4 && memcmp("m
15830 6f 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d  ode", zOpt, 4)==
15840 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
15850 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65  tatic struct Ope
15860 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b  nMode aOpenMode[
15870 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
15880 20 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49 54    { "ro",  SQLIT
15890 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
158a0 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
158b0 20 22 72 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f   "rw",  SQLITE_O
158c0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c  PEN_READWRITE },
158d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20   .            { 
158e0 22 72 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50  "rwc", SQLITE_OP
158f0 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
15900 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
15910 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  E },.           
15920 20 7b 20 22 6d 65 6d 6f 72 79 22 2c 20 53 51 4c   { "memory", SQL
15930 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20  ITE_OPEN_MEMORY 
15940 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  },.            {
15950 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20   0, 0 }.        
15960 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20    };..          
15970 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50  mask = SQLITE_OP
15980 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 53 51  EN_READONLY | SQ
15990 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
159a0 49 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20  ITE.            
159b0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
159c0 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51  OPEN_CREATE | SQ
159d0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
159e0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64  ;.          aMod
159f0 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20  e = aOpenMode;. 
15a00 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d           limit =
15a10 20 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20   mask & flags;. 
15a20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79           zModeTy
15a30 70 65 20 3d 20 22 61 63 63 65 73 73 22 3b 0a 20  pe = "access";. 
15a40 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
15a50 20 20 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20    if( aMode ){. 
15a60 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a           int i;.
15a70 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f            int mo
15a80 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
15a90 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65    for(i=0; aMode
15aa0 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20  [i].z; i++){.   
15ab0 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
15ac0 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69  har *z = aMode[i
15ad0 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ].z;.           
15ae0 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74   if( nVal==sqlit
15af0 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 26 26  e3Strlen30(z) &&
15b00 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c   0==memcmp(zVal,
15b10 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20   z, nVal) ){.   
15b20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 20             mode 
15b30 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b  = aMode[i].mode;
15b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
15b50 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
15b60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
15b70 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 6f            if( mo
15b80 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  de==0 ){.       
15b90 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
15ba0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
15bb0 28 22 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f 64  ("no such %s mod
15bc0 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70  e: %s", zModeTyp
15bd0 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20  e, zVal);.      
15be0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15bf0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
15c00 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f       goto parse_
15c10 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  uri_out;.       
15c20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
15c30 66 28 20 28 6d 6f 64 65 20 26 20 7e 53 51 4c 49  f( (mode & ~SQLI
15c40 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e  TE_OPEN_MEMORY)>
15c50 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  limit ){.       
15c60 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
15c70 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
15c80 28 22 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c  ("%s mode not al
15c90 6c 6f 77 65 64 3a 20 25 73 22 2c 0a 20 20 20 20  lowed: %s",.    
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cc0 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a      zModeType, z
15cd0 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Val);.          
15ce0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 45    rc = SQLITE_PE
15cf0 52 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  RM;.            
15d00 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f  goto parse_uri_o
15d10 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ut;.          }.
15d20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
15d30 3d 20 28 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b  = (flags & ~mask
15d40 29 20 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20  ) | mode;.      
15d50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
15d60 20 20 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c 5b     zOpt = &zVal[
15d70 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a  nVal+1];.    }..
15d80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69    }else{.    zFi
15d90 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  le = sqlite3_mal
15da0 6c 6f 63 36 34 28 6e 55 72 69 2b 32 29 3b 0a 20  loc64(nUri+2);. 
15db0 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20     if( !zFile ) 
15dc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
15dd0 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  MEM;.    memcpy(
15de0 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72  zFile, zUri, nUr
15df0 69 29 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55  i);.    zFile[nU
15e00 72 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ri] = '\0';.    
15e10 7a 46 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20  zFile[nUri+1] = 
15e20 27 5c 30 27 3b 0a 20 20 20 20 66 6c 61 67 73 20  '\0';.    flags 
15e30 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  &= ~SQLITE_OPEN_
15e40 55 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56  URI;.  }..  *ppV
15e50 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
15e60 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69  _find(zVfs);.  i
15e70 66 28 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a  f( *ppVfs==0 ){.
15e80 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
15e90 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
15ea0 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73  "no such vfs: %s
15eb0 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 72 63  ", zVfs);.    rc
15ec0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
15ed0 0a 20 20 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f  .  }. parse_uri_
15ee0 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
15ef0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15f00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 69  sqlite3_free(zFi
15f10 6c 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d  le);.    zFile =
15f20 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67   0;.  }.  *pFlag
15f30 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a  s = flags;.  *pz
15f40 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20  File = zFile;.  
15f50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
15f60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15f70 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20  e does the work 
15f80 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74  of opening a dat
15f90 61 62 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20  abase on behalf 
15fa0 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70  of.** sqlite3_op
15fb0 65 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  en() and sqlite3
15fc0 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64  _open16(). The d
15fd0 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
15fe0 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a   "zFilename"  .*
15ff0 2a 20 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64  * is UTF-8 encod
16000 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
16010 74 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a  t openDatabase(.
16020 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
16030 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61  ilename, /* Data
16040 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54  base filename UT
16050 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20  F-8 encoded */. 
16060 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c   sqlite3 **ppDb,
16070 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
16080 52 65 74 75 72 6e 65 64 20 64 61 74 61 62 61 73  Returned databas
16090 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e  e handle */.  un
160a0 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73  signed int flags
160b0 2c 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f  ,    /* Operatio
160c0 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63  nal flags */.  c
160d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
160e0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
160f0 20 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20   the VFS to use 
16100 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
16110 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
16120 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
16130 20 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c   allocated handl
16140 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
16150 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
16160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16170 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
16180 69 6e 74 20 69 73 54 68 72 65 61 64 73 61 66 65  int isThreadsafe
16190 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
161a0 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 68 72 65  /* True for thre
161b0 61 64 73 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f  adsafe connectio
161c0 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f  ns */.  char *zO
161d0 70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pen = 0;        
161e0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e          /* Filen
161f0 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ame argument to 
16200 70 61 73 73 20 74 6f 20 42 74 72 65 65 4f 70 65  pass to BtreeOpe
16210 6e 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  n() */.  char *z
16220 45 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20 20  ErrMsg = 0;     
16230 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
16240 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 73  r message from s
16250 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 29  qlite3ParseUri()
16260 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
16270 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
16280 4d 4f 52 0a 20 20 69 66 28 20 70 70 44 62 3d 3d  MOR.  if( ppDb==
16290 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
162a0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
162b0 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20 3d 20  endif.  *ppDb = 
162c0 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
162d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
162e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69    rc = sqlite3_i
162f0 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69  nitialize();.  i
16300 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
16310 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  c;.#endif..  /* 
16320 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69  Only allow sensi
16330 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ble combinations
16340 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20   of bits in the 
16350 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 2e 20  flags argument. 
16360 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20   .  ** Throw an 
16370 65 72 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e  error if any non
16380 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69  -sense combinati
16390 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 49 66 20  on is used.  If 
163a0 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62  we.  ** do not b
163b0 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d  lock illegal com
163c0 62 69 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c 20  binations here, 
163d0 69 74 20 63 6f 75 6c 64 20 74 72 69 67 67 65 72  it could trigger
163e0 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 73  .  ** assert() s
163f0 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 64 65 65  tatements in dee
16400 70 65 72 20 6c 61 79 65 72 73 2e 20 20 53 65 6e  per layers.  Sen
16410 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f  sible combinatio
16420 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a  ns.  ** are:.  *
16430 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49  *.  **  1:  SQLI
16440 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
16450 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54  .  **  2:  SQLIT
16460 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
16470 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54  .  **  6:  SQLIT
16480 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
16490 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
164a0 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20 61 73 73  REATE.  */.  ass
164b0 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
164c0 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78  _READONLY  == 0x
164d0 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  01 );.  assert( 
164e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
164f0 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20 29 3b  WRITE == 0x02 );
16500 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
16510 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 20 20  E_OPEN_CREATE   
16520 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20 74 65   == 0x04 );.  te
16530 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61  stcase( (1<<(fla
16540 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29 3b 20  gs&7))==0x02 ); 
16550 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20  /* READONLY */. 
16560 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28   testcase( (1<<(
16570 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 34 20  flags&7))==0x04 
16580 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20  ); /* READWRITE 
16590 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  */.  testcase( (
165a0 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
165b0 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44 57 52  x40 ); /* READWR
165c0 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a  ITE | CREATE */.
165d0 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c 61 67    if( ((1<<(flag
165e0 73 26 37 29 29 20 26 20 30 78 34 36 29 3d 3d 30  s&7)) & 0x46)==0
165f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
16600 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
16610 54 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 35  T;  /* IMP: R-65
16620 34 39 37 2d 34 34 35 39 34 20 2a 2f 0a 20 20 7d  497-44594 */.  }
16630 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  ..  if( sqlite3G
16640 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
16650 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  eMutex==0 ){.   
16660 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
16670 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  0;.  }else if( f
16680 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
16690 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20  EN_NOMUTEX ){.  
166a0 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
166b0 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
166c0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
166d0 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b  PEN_FULLMUTEX ){
166e0 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
166f0 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 1;.  }else{.
16700 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
16710 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
16720 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
16730 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  x;.  }.  if( fla
16740 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
16750 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 29 7b  _PRIVATECACHE ){
16760 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53  .    flags &= ~S
16770 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
16780 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20  DCACHE;.  }else 
16790 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
167a0 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61  lConfig.sharedCa
167b0 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20  cheEnabled ){.  
167c0 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
167d0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
167e0 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  HE;.  }..  /* Re
167f0 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74  move harmful bit
16800 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73  s from the flags
16810 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a   parameter.  **.
16820 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f    ** The SQLITE_
16830 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64  OPEN_NOMUTEX and
16840 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
16850 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65 72  LMUTEX flags wer
16860 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74  e.  ** dealt wit
16870 68 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  h in the previou
16880 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42  s code block.  B
16890 65 73 69 64 65 73 20 74 68 65 73 65 2c 20 74 68  esides these, th
168a0 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69  e only.  ** vali
168b0 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f  d input flags fo
168c0 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
168d0 32 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f  2() are SQLITE_O
168e0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20  PEN_READONLY,.  
168f0 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ** SQLITE_OPEN_R
16900 45 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45  EADWRITE, SQLITE
16910 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51  _OPEN_CREATE, SQ
16920 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
16930 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49  CACHE,.  ** SQLI
16940 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
16950 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72  ACHE, and some r
16960 65 73 65 72 76 65 64 20 62 69 74 73 2e 20 20 53  eserved bits.  S
16970 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a  ilently mask.  *
16980 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20  * off all other 
16990 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c  flags..  */.  fl
169a0 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54  ags &=  ~( SQLIT
169b0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
169c0 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
169d0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
169e0 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20  N_EXCLUSIVE |.  
169f0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
16a00 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
16a10 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
16a20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
16a30 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20  MP_DB | .       
16a40 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
16a50 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
16a60 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
16a70 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
16a80 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  AIN_JOURNAL | . 
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
16aa0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
16ab0 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
16ac0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
16ad0 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
16ae0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
16af0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
16b00 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20  STER_JOURNAL |. 
16b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
16b20 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
16b30 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X |.            
16b40 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46     SQLITE_OPEN_F
16b50 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20  ULLMUTEX |.     
16b60 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
16b70 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20  _OPEN_WAL.      
16b80 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20         );..  /* 
16b90 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
16ba0 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ite data structu
16bb0 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c  re */.  db = sql
16bc0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
16bd0 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20  sizeof(sqlite3) 
16be0 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29  );.  if( db==0 )
16bf0 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
16c00 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65 61 64  ;.  if( isThread
16c10 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e  safe ){.    db->
16c20 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
16c30 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
16c40 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
16c50 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
16c60 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
16c70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
16c80 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b  );.      db = 0;
16c90 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
16ca0 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  db_out;.    }.  
16cb0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
16cc0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
16cd0 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73  x);.  db->errMas
16ce0 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e  k = 0xff;.  db->
16cf0 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d  nDb = 2;.  db->m
16d00 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
16d10 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e  GIC_BUSY;.  db->
16d20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61  aDb = db->aDbSta
16d30 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  tic;..  assert( 
16d40 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69  sizeof(db->aLimi
16d50 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64  t)==sizeof(aHard
16d60 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63  Limit) );.  memc
16d70 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61  py(db->aLimit, a
16d80 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f  HardLimit, sizeo
16d90 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a  f(db->aLimit));.
16da0 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c    db->aLimit[SQL
16db0 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
16dc0 5f 54 48 52 45 41 44 53 5d 20 3d 20 53 51 4c 49  _THREADS] = SQLI
16dd0 54 45 5f 44 45 46 41 55 4c 54 5f 57 4f 52 4b 45  TE_DEFAULT_WORKE
16de0 52 5f 54 48 52 45 41 44 53 3b 0a 20 20 64 62 2d  R_THREADS;.  db-
16df0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
16e00 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76  .  db->nextAutov
16e10 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73  ac = -1;.  db->s
16e20 7a 4d 6d 61 70 20 3d 20 73 71 6c 69 74 65 33 47  zMmap = sqlite3G
16e30 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
16e40 61 70 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61  ap;.  db->nextPa
16e50 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62  gesize = 0;.  db
16e60 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70  ->nMaxSorterMmap
16e70 20 3d 20 30 78 37 46 46 46 46 46 46 46 3b 0a 20   = 0x7FFFFFFF;. 
16e80 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
16e90 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
16ea0 65 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62  es | SQLITE_Enab
16eb0 6c 65 54 72 69 67 67 65 72 20 7c 20 53 51 4c 49  leTrigger | SQLI
16ec0 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a 23 69  TE_CacheSpill.#i
16ed0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
16ee0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41  E_DEFAULT_AUTOMA
16ef0 54 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51  TIC_INDEX) || SQ
16f00 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
16f10 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20  OMATIC_INDEX.   
16f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
16f30 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78  SQLITE_AutoIndex
16f40 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
16f50 54 45 5f 44 45 46 41 55 4c 54 5f 43 4b 50 54 46  TE_DEFAULT_CKPTF
16f60 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20 20 20 20  ULLFSYNC.       
16f70 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
16f80 54 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63  TE_CkptFullFSync
16f90 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
16fa0 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
16fb0 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20  FORMAT<4.       
16fc0 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
16fd0 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
16fe0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
16ff0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41  QLITE_ENABLE_LOA
17000 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
17020 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73  QLITE_LoadExtens
17030 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  ion.#endif.#if S
17040 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45  QLITE_DEFAULT_RE
17050 43 55 52 53 49 56 45 5f 54 52 49 47 47 45 52 53  CURSIVE_TRIGGERS
17060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17070 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54 72    | SQLITE_RecTr
17080 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69  iggers.#endif.#i
17090 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
170a0 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e  _DEFAULT_FOREIGN
170b0 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54 45  _KEYS) && SQLITE
170c0 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e  _DEFAULT_FOREIGN
170d0 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20 20  _KEYS.          
170e0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
170f0 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64  ForeignKeys.#end
17100 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
17110 51 4c 49 54 45 5f 52 45 56 45 52 53 45 5f 55 4e  QLITE_REVERSE_UN
17120 4f 52 44 45 52 45 44 5f 53 45 4c 45 43 54 53 29  ORDERED_SELECTS)
17130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17140 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 76 65 72    | SQLITE_Rever
17150 73 65 4f 72 64 65 72 0a 23 65 6e 64 69 66 0a 23  seOrder.#endif.#
17160 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
17170 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
17180 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
17190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
171a0 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65   SQLITE_CellSize
171b0 43 6b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  Ck.#endif.      
171c0 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  ;.  sqlite3HashI
171d0 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  nit(&db->aCollSe
171e0 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  q);.#ifndef SQLI
171f0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
17200 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61  ABLE.  sqlite3Ha
17210 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64  shInit(&db->aMod
17220 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ule);.#endif..  
17230 2f 2a 20 41 64 64 20 74 68 65 20 64 65 66 61 75  /* Add the defau
17240 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  lt collation seq
17250 75 65 6e 63 65 20 42 49 4e 41 52 59 2e 20 42 49  uence BINARY. BI
17260 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f 72 20 62  NARY works for b
17270 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61  oth UTF-8.  ** a
17280 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f 20 61 64  nd UTF-16, so ad
17290 64 20 61 20 76 65 72 73 69 6f 6e 20 66 6f 72 20  d a version for 
172a0 65 61 63 68 20 74 6f 20 61 76 6f 69 64 20 61 6e  each to avoid an
172b0 79 20 75 6e 6e 65 63 65 73 73 61 72 79 0a 20 20  y unnecessary.  
172c0 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20  ** conversions. 
172d0 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74  The only error t
172e0 68 61 74 20 63 61 6e 20 6f 63 63 75 72 20 68 65  hat can occur he
172f0 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29  re is a malloc()
17300 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a 2a 0a 20   failure..  **. 
17310 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
17320 20 52 2d 35 32 37 38 36 2d 34 34 38 37 38 20 53   R-52786-44878 S
17330 51 4c 69 74 65 20 64 65 66 69 6e 65 73 20 74 68  QLite defines th
17340 72 65 65 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c  ree built-in col
17350 6c 61 74 69 6e 67 0a 20 20 2a 2a 20 66 75 6e 63  lating.  ** func
17360 74 69 6f 6e 73 3a 0a 20 20 2a 2f 0a 20 20 63 72  tions:.  */.  cr
17370 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
17380 2c 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41  , sqlite3StrBINA
17390 52 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  RY, SQLITE_UTF8,
173a0 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c   0, binCollFunc,
173b0 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
173c0 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74  lation(db, sqlit
173d0 65 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51 4c  e3StrBINARY, SQL
173e0 49 54 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20  ITE_UTF16BE, 0, 
173f0 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
17400 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
17410 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74  on(db, sqlite3St
17420 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f  rBINARY, SQLITE_
17430 55 54 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e 43  UTF16LE, 0, binC
17440 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
17450 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
17460 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c  b, "NOCASE", SQL
17470 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63  ITE_UTF8, 0, noc
17480 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63  aseCollatingFunc
17490 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
174a0 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52  llation(db, "RTR
174b0 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  IM", SQLITE_UTF8
174c0 2c 20 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43  , (void*)1, binC
174d0 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69  ollFunc, 0);.  i
174e0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
174f0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
17500 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
17510 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
17520 3a 20 52 2d 30 38 33 30 38 2d 31 37 32 32 34 20  : R-08308-17224 
17530 54 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  The default coll
17540 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66  ating function f
17550 6f 72 20 61 6c 6c 0a 20 20 2a 2a 20 73 74 72 69  or all.  ** stri
17560 6e 67 73 20 69 73 20 42 49 4e 41 52 59 2e 20 0a  ngs is BINARY. .
17570 20 20 2a 2f 0a 20 20 64 62 2d 3e 70 44 66 6c 74    */.  db->pDflt
17580 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
17590 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51  ndCollSeq(db, SQ
175a0 4c 49 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74  LITE_UTF8, sqlit
175b0 65 33 53 74 72 42 49 4e 41 52 59 2c 20 30 29 3b  e3StrBINARY, 0);
175c0 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
175d0 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a  DfltColl!=0 );..
175e0 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 66    /* Parse the f
175f0 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61 72 67 75  ilename/URI argu
17600 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6f  ment. */.  db->o
17610 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  penFlags = flags
17620 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
17630 50 61 72 73 65 55 72 69 28 7a 56 66 73 2c 20 7a  ParseUri(zVfs, z
17640 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c 61 67 73  Filename, &flags
17650 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20 26 7a 4f  , &db->pVfs, &zO
17660 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  pen, &zErrMsg);.
17670 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17680 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
17690 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
176a0 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ) db->mallocFail
176b0 65 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69  ed = 1;.    sqli
176c0 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
176d0 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67 20  db, rc, zErrMsg 
176e0 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a 45 72 72  ? "%s" : 0, zErr
176f0 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
17700 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
17710 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
17720 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
17730 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64  Open the backend
17740 20 64 61 74 61 62 61 73 65 20 64 72 69 76 65 72   database driver
17750 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
17760 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e  e3BtreeOpen(db->
17770 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c  pVfs, zOpen, db,
17780 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74   &db->aDb[0].pBt
17790 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6c 61               fla
177b0 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs | SQLITE_OPEN
177c0 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28  _MAIN_DB);.  if(
177d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
177e0 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
177f0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
17800 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
17810 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
17820 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
17830 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 20  ror(db, rc);.   
17840 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
17850 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
17860 74 72 65 65 45 6e 74 65 72 28 64 62 2d 3e 61 44  treeEnter(db->aD
17870 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d  b[0].pBt);.  db-
17880 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20  >aDb[0].pSchema 
17890 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47  = sqlite3SchemaG
178a0 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30  et(db, db->aDb[0
178b0 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28 20 21 64  ].pBt);.  if( !d
178c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
178d0 29 20 45 4e 43 28 64 62 29 20 3d 20 53 43 48 45  ) ENC(db) = SCHE
178e0 4d 41 5f 45 4e 43 28 64 62 29 3b 0a 20 20 73 71  MA_ENC(db);.  sq
178f0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17900 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
17910 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  .  db->aDb[1].pS
17920 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53  chema = sqlite3S
17930 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b  chemaGet(db, 0);
17940 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75  ..  /* The defau
17950 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  lt safety_level 
17960 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
17970 61 62 61 73 65 20 69 73 20 27 66 75 6c 6c 27 3b  abase is 'full';
17980 20 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20   for the temp.  
17990 2a 2a 20 64 61 74 61 62 61 73 65 20 69 74 20 69  ** database it i
179a0 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69 73 20 6d  s 'NONE'. This m
179b0 61 74 63 68 65 73 20 74 68 65 20 70 61 67 65 72  atches the pager
179c0 20 6c 61 79 65 72 20 64 65 66 61 75 6c 74 73 2e   layer defaults.
179d0 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44    .  */.  db->aD
179e0 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61  b[0].zName = "ma
179f0 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30  in";.  db->aDb[0
17a00 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ].safety_level =
17a10 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d   3;.  db->aDb[1]
17a20 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b  .zName = "temp";
17a30 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61  .  db->aDb[1].sa
17a40 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a  fety_level = 1;.
17a50 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
17a60 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e  QLITE_MAGIC_OPEN
17a70 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
17a80 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
17a90 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
17aa0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73  .  }..  /* Regis
17ab0 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e  ter all built-in
17ac0 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20   functions, but 
17ad0 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  do not attempt t
17ae0 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20  o read the.  ** 
17af0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
17b00 79 65 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c  yet. This is del
17b10 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66  ayed until the f
17b20 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 64 61  irst time the da
17b30 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61  tabase.  ** is a
17b40 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  ccessed..  */.  
17b50 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
17b60 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73   SQLITE_OK);.  s
17b70 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 42 75  qlite3RegisterBu
17b80 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64  iltinFunctions(d
17b90 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61  b);..  /* Load a
17ba0 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69  utomatic extensi
17bb0 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73  ons - extensions
17bc0 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
17bd0 72 65 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20  registered.  ** 
17be0 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
17bf0 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65  3_automatic_exte
17c00 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a  nsion() API..  *
17c10 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
17c20 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
17c30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17c40 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
17c50 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f  AutoLoadExtensio
17c60 6e 73 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d  ns(db);.    rc =
17c70 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
17c80 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63  (db);.    if( rc
17c90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17ca0 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62       goto opendb
17cb0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
17cc0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17cd0 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20 69 66 28  NABLE_FTS1.  if(
17ce0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
17cf0 65 64 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  ed ){.    extern
17d00 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 31   int sqlite3Fts1
17d10 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a  Init(sqlite3*);.
17d20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17d30 46 74 73 31 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts1Init(db);.  
17d40 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
17d50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
17d60 54 53 32 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TS2.  if( !db->m
17d70 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
17d80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
17d90 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
17da0 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 73  qlite3Fts2Init(s
17db0 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63  qlite3*);.    rc
17dc0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e   = sqlite3Fts2In
17dd0 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
17de0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
17df0 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 20 2f 2a  E_ENABLE_FTS3 /*
17e00 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
17e10 65 66 69 6e 65 64 20 62 79 20 53 51 4c 49 54 45  efined by SQLITE
17e20 5f 45 4e 41 42 4c 45 5f 46 54 53 34 20 2a 2f 0a  _ENABLE_FTS4 */.
17e30 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
17e40 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
17e50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17e60 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33  rc = sqlite3Fts3
17e70 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
17e80 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
17e90 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a  ITE_ENABLE_FTS5.
17ea0 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
17eb0 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
17ec0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17ed0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
17ee0 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
17ef0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
17f00 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20  ITE_ENABLE_ICU. 
17f10 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
17f20 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
17f30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
17f40 63 20 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e  c = sqlite3IcuIn
17f50 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
17f60 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
17f70 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20  E_ENABLE_RTREE. 
17f80 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
17f90 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
17fa0 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63  LITE_OK){.    rc
17fb0 20 3d 20 73 71 6c 69 74 65 33 52 74 72 65 65 49   = sqlite3RtreeI
17fc0 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
17fd0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
17fe0 54 45 5f 45 4e 41 42 4c 45 5f 44 42 53 54 41 54  TE_ENABLE_DBSTAT
17ff0 5f 56 54 41 42 0a 20 20 69 66 28 20 21 64 62 2d  _VTAB.  if( !db-
18000 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
18010 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b   rc==SQLITE_OK){
18020 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18030 33 44 62 73 74 61 74 52 65 67 69 73 74 65 72 28  3DbstatRegister(
18040 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
18050 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18060 4e 41 42 4c 45 5f 4a 53 4f 4e 31 0a 20 20 69 66  NABLE_JSON1.  if
18070 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
18080 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
18090 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20  E_OK){.    rc = 
180a0 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74  sqlite3Json1Init
180b0 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
180c0 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f  ..  /* -DSQLITE_
180d0 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
180e0 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43  MODE=1 makes EXC
180f0 4c 55 53 49 56 45 20 74 68 65 20 64 65 66 61 75  LUSIVE the defau
18100 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20  lt locking.  ** 
18110 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f  mode.  -DSQLITE_
18120 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
18130 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d  MODE=0 make NORM
18140 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c  AL the default l
18150 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65  ocking.  ** mode
18160 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67  .  Doing nothing
18170 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b   at all also mak
18180 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65  es NORMAL the de
18190 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64  fault..  */.#ifd
181a0 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
181b0 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20  T_LOCKING_MODE. 
181c0 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64   db->dfltLockMod
181d0 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
181e0 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b  LT_LOCKING_MODE;
181f0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  .  sqlite3PagerL
18200 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74  ockingMode(sqlit
18210 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d  e3BtreePager(db-
18220 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20  >aDb[0].pBt),.  
18230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18240 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
18250 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
18260 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ODE);.#endif..  
18270 69 66 28 20 72 63 20 29 20 73 71 6c 69 74 65 33  if( rc ) sqlite3
18280 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 0a  Error(db, rc);..
18290 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20    /* Enable the 
182a0 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63  lookaside-malloc
182b0 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20   subsystem */.  
182c0 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64  setupLookaside(d
182d0 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f  b, 0, sqlite3Glo
182e0 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b  balConfig.szLook
182f0 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  aside,.         
18300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
18310 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
18320 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a  ig.nLookaside);.
18330 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61  .  sqlite3_wal_a
18340 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62  utocheckpoint(db
18350 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
18360 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f  _WAL_AUTOCHECKPO
18370 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75  INT);..opendb_ou
18380 74 3a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20  t:.  if( db ){. 
18390 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
183a0 75 74 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72  utex!=0 || isThr
183b0 65 61 64 73 61 66 65 3d 3d 30 0a 20 20 20 20 20  eadsafe==0.     
183c0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
183d0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
183e0 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20  llMutex==0 );.  
183f0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
18400 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
18410 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
18420 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
18430 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
18440 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
18450 4e 4f 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20 72  NOMEM );.  if( r
18460 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
18470 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
18480 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62  lose(db);.    db
18490 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
184a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
184b0 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  ){.    db->magic
184c0 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
184d0 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44  SICK;.  }.  *ppD
184e0 62 20 3d 20 64 62 3b 0a 23 69 66 64 65 66 20 53  b = db;.#ifdef S
184f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
18500 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65  LOG.  if( sqlite
18510 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
18520 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20  qllog ){.    /* 
18530 4f 70 65 6e 69 6e 67 20 61 20 64 62 20 68 61 6e  Opening a db han
18540 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61  dle. Fourth para
18550 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20  meter is passed 
18560 30 2e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a  0. */.    void *
18570 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 47 6c  pArg = sqlite3Gl
18580 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
18590 6f 67 41 72 67 3b 0a 20 20 20 20 73 71 6c 69 74  ogArg;.    sqlit
185a0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
185b0 53 71 6c 6c 6f 67 28 70 41 72 67 2c 20 64 62 2c  Sqllog(pArg, db,
185c0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a   zFilename, 0);.
185d0 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
185e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
185f0 53 5f 43 4f 44 45 43 29 0a 20 20 69 66 28 20 72  S_CODEC).  if( r
18600 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18610 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
18620 7a 48 65 78 4b 65 79 20 3d 20 73 71 6c 69 74 65  zHexKey = sqlite
18630 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
18640 7a 4f 70 65 6e 2c 20 22 68 65 78 6b 65 79 22 29  zOpen, "hexkey")
18650 3b 0a 20 20 20 20 69 66 28 20 7a 48 65 78 4b 65  ;.    if( zHexKe
18660 79 20 26 26 20 7a 48 65 78 4b 65 79 5b 30 5d 20  y && zHexKey[0] 
18670 29 7b 0a 20 20 20 20 20 20 75 38 20 69 42 79 74  ){.      u8 iByt
18680 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e;.      int i;.
18690 20 20 20 20 20 20 63 68 61 72 20 7a 4b 65 79 5b        char zKey[
186a0 34 30 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  40];.      for(i
186b0 3d 30 2c 20 69 42 79 74 65 3d 30 3b 20 69 3c 73  =0, iByte=0; i<s
186c0 69 7a 65 6f 66 28 7a 4b 65 79 29 2a 32 20 26 26  izeof(zKey)*2 &&
186d0 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74   sqlite3Isxdigit
186e0 28 7a 48 65 78 4b 65 79 5b 69 5d 29 3b 20 69 2b  (zHexKey[i]); i+
186f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 42 79 74  +){.        iByt
18700 65 20 3d 20 28 69 42 79 74 65 3c 3c 34 29 20 2b  e = (iByte<<4) +
18710 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74   sqlite3HexToInt
18720 28 7a 48 65 78 4b 65 79 5b 69 5d 29 3b 0a 20 20  (zHexKey[i]);.  
18730 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29 21        if( (i&1)!
18740 3d 30 20 29 20 7a 4b 65 79 5b 69 2f 32 5d 20 3d  =0 ) zKey[i/2] =
18750 20 69 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a   iByte;.      }.
18760 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65        sqlite3_ke
18770 79 5f 76 32 28 64 62 2c 20 30 2c 20 7a 4b 65 79  y_v2(db, 0, zKey
18780 2c 20 69 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20  , i/2);.    }.  
18790 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
187a0 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b 0a  e3_free(zOpen);.
187b0 20 20 72 65 74 75 72 6e 20 72 63 20 26 20 30 78    return rc & 0x
187c0 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  ff;.}../*.** Ope
187d0 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
187e0 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
187f0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20  sqlite3_open(.  
18800 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
18810 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65  ename, .  sqlite
18820 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72  3 **ppDb .){.  r
18830 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61  eturn openDataba
18840 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70  se(zFilename, pp
18850 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
18860 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
18870 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
18880 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
18890 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  EATE, 0);.}.int 
188a0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
188b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
188c0 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61  ilename,   /* Da
188d0 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
188e0 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c  (UTF-8) */.  sql
188f0 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20  ite3 **ppDb,    
18900 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c       /* OUT: SQL
18910 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f  ite db handle */
18920 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
18930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
18940 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ags */.  const c
18950 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20  har *zVfs       
18960 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20   /* Name of VFS 
18970 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f  module to use */
18980 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  .){.  return ope
18990 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e 61  nDatabase(filena
189a0 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e 73 69 67  me, ppDb, (unsig
189b0 6e 65 64 20 69 6e 74 29 66 6c 61 67 73 2c 20 7a  ned int)flags, z
189c0 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Vfs);.}..#ifndef
189d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
189e0 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  16./*.** Open a 
189f0 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e  new database han
18a00 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
18a10 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f  te3_open16(.  co
18a20 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e  nst void *zFilen
18a30 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20  ame, .  sqlite3 
18a40 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61 72  **ppDb.){.  char
18a50 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d   const *zFilenam
18a60 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61  e8;   /* zFilena
18a70 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54  me encoded in UT
18a80 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20 55  F-8 instead of U
18a90 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74  TF-16 */.  sqlit
18aa0 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
18ab0 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65    int rc;..#ifde
18ac0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
18ad0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
18ae0 70 70 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  ppDb==0 ) return
18af0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
18b00 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70  KPT;.#endif.  *p
18b10 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  pDb = 0;.#ifndef
18b20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
18b30 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c  OINIT.  rc = sql
18b40 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
18b50 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
18b60 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
18b70 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
18b80 3d 30 20 29 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  =0 ) zFilename =
18b90 20 22 5c 30 30 30 5c 30 30 30 22 3b 0a 20 20 70   "\000\000";.  p
18ba0 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
18bb0 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69  ueNew(0);.  sqli
18bc0 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
18bd0 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  Val, -1, zFilena
18be0 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  me, SQLITE_UTF16
18bf0 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53  NATIVE, SQLITE_S
18c00 54 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e  TATIC);.  zFilen
18c10 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61  ame8 = sqlite3Va
18c20 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51  lueText(pVal, SQ
18c30 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66  LITE_UTF8);.  if
18c40 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a  ( zFilename8 ){.
18c50 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74      rc = openDat
18c60 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38  abase(zFilename8
18c70 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20  , ppDb,.        
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
18c90 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
18ca0 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
18cb0 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20  N_CREATE, 0);.  
18cc0 20 20 61 73 73 65 72 74 28 20 2a 70 70 44 62 20    assert( *ppDb 
18cd0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
18ce0 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72  MEM );.    if( r
18cf0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18d00 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a  !DbHasProperty(*
18d10 70 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65  ppDb, 0, DB_Sche
18d20 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20  maLoaded) ){.   
18d30 20 20 20 53 43 48 45 4d 41 5f 45 4e 43 28 2a 70     SCHEMA_ENC(*p
18d40 70 44 62 29 20 3d 20 45 4e 43 28 2a 70 70 44 62  pDb) = ENC(*ppDb
18d50 29 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ) = SQLITE_UTF16
18d60 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20 20  NATIVE;.    }.  
18d70 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
18d80 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18d90 7d 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  }.  sqlite3Value
18da0 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72  Free(pVal);..  r
18db0 65 74 75 72 6e 20 72 63 20 26 20 30 78 66 66 3b  eturn rc & 0xff;
18dc0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
18dd0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
18de0 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  /../*.** Registe
18df0 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f  r a new collatio
18e00 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  n sequence with 
18e10 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
18e20 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  dle db..*/.int s
18e30 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
18e40 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  llation(.  sqlit
18e50 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3* db, .  const
18e60 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
18e70 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69   int enc, .  voi
18e80 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
18e90 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
18ea0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
18eb0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
18ec0 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .){.  return sql
18ed0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
18ee0 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 4e 61  ation_v2(db, zNa
18ef0 6d 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78  me, enc, pCtx, x
18f00 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 7d 0a 0a  Compare, 0);.}..
18f10 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
18f20 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
18f30 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
18f40 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
18f50 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
18f60 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
18f70 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74  tion_v2(.  sqlit
18f80 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74  e3* db, .  const
18f90 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
18fa0 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69   int enc, .  voi
18fb0 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
18fc0 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
18fd0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
18fe0 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
18ff0 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28  ,.  void(*xDel)(
19000 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  void*).){.  int 
19010 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  rc;..#ifdef SQLI
19020 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
19030 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
19040 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
19050 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20  db) || zName==0 
19060 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
19070 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
19080 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
19090 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
190a0 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
190b0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
190c0 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61  d );.  rc = crea
190d0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
190e0 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20  zName, (u8)enc, 
190f0 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
19100 78 44 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71  xDel);.  rc = sq
19110 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
19120 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
19130 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
19140 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
19150 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
19160 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
19170 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  6./*.** Register
19180 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e   a new collation
19190 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74   sequence with t
191a0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
191b0 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
191c0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
191d0 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69  lation16(.  sqli
191e0 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73  te3* db, .  cons
191f0 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20  t void *zName,. 
19200 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69   int enc, .  voi
19210 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a  d* pCtx,.  int(*
19220 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c  xCompare)(void*,
19230 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
19240 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  int,const void*)
19250 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
19260 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72  QLITE_OK;.  char
19270 20 2a 7a 4e 61 6d 65 38 3b 0a 0a 23 69 66 64 65   *zName8;..#ifde
19280 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
19290 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
192a0 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
192b0 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61  eckOk(db) || zNa
192c0 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  me==0 ) return S
192d0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
192e0 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
192f0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
19300 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
19310 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
19320 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61  cFailed );.  zNa
19330 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66  me8 = sqlite3Utf
19340 31 36 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c  16to8(db, zName,
19350 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31   -1, SQLITE_UTF1
19360 36 4e 41 54 49 56 45 29 3b 0a 20 20 69 66 28 20  6NATIVE);.  if( 
19370 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63  zName8 ){.    rc
19380 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69   = createCollati
19390 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28  on(db, zName8, (
193a0 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  u8)enc, pCtx, xC
193b0 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20  ompare, 0);.    
193c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
193d0 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20  , zName8);.  }. 
193e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
193f0 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
19400 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
19410 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
19420 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
19430 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
19440 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f  OMIT_UTF16 */../
19450 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
19460 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
19470 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62  ce factory callb
19480 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74  ack with the dat
19490 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20  abase handle.** 
194a0 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20  db. Replace any 
194b0 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61  previously insta
194c0 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  lled collation s
194d0 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e  equence factory.
194e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
194f0 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
19500 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
19510 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e   .  void *pCollN
19520 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69  eededArg, .  voi
19530 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28  d(*xCollNeeded)(
19540 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69  void*,sqlite3*,i
19550 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73  nt eTextRep,cons
19560 74 20 63 68 61 72 2a 29 0a 29 7b 0a 23 69 66 64  t char*).){.#ifd
19570 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
19580 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
19590 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
195a0 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74  heckOk(db) ) ret
195b0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
195c0 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
195d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
195e0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
195f0 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
19600 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64  ed = xCollNeeded
19610 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
19620 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d  ded16 = 0;.  db-
19630 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20  >pCollNeededArg 
19640 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  = pCollNeededArg
19650 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
19660 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
19670 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
19680 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
19690 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
196a0 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  TF16./*.** Regis
196b0 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  ter a collation 
196c0 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
196d0 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
196e0 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
196f0 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63  le.** db. Replac
19700 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79  e any previously
19710 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61   installed colla
19720 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
19730 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctory..*/.int sq
19740 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
19750 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71 6c 69  needed16(.  sqli
19760 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64  te3 *db, .  void
19770 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67   *pCollNeededArg
19780 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c  , .  void(*xColl
19790 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64 2a 2c  Needed16)(void*,
197a0 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65  sqlite3*,int eTe
197b0 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64  xtRep,const void
197c0 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *).){.#ifdef SQL
197d0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
197e0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
197f0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
19800 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
19810 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
19820 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
19830 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
19840 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
19850 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30  >xCollNeeded = 0
19860 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
19870 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65  ded16 = xCollNee
19880 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f  ded16;.  db->pCo
19890 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43  llNeededArg = pC
198a0 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20  ollNeededArg;.  
198b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
198c0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
198d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
198e0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
198f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
19900 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  6 */..#ifndef SQ
19910 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
19920 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ATED./*.** This 
19930 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20  function is now 
19940 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20  an anachronism. 
19950 49 74 20 75 73 65 64 20 74 6f 20 62 65 20 75 73  It used to be us
19960 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72  ed to recover fr
19970 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29  om a.** malloc()
19980 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51   failure, but SQ
19990 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68  Lite now does th
199a0 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
199b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
199c0 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28  _global_recover(
199d0 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
199e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
199f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20  dif../*.** Test 
19a00 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f  to see whether o
19a10 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61  r not the databa
19a20 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  se connection is
19a30 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a   in autocommit.*
19a40 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20  * mode.  Return 
19a50 54 52 55 45 20 69 66 20 69 74 20 69 73 20 61 6e  TRUE if it is an
19a60 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20  d FALSE if not. 
19a70 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   Autocommit mode
19a80 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66   is on.** by def
19a90 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69  ault.  Autocommi
19aa0 74 20 69 73 20 64 69 73 61 62 6c 65 64 20 62 79  t is disabled by
19ab0 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65   a BEGIN stateme
19ac0 6e 74 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64  nt and reenabled
19ad0 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20  .** by the next 
19ae0 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41  COMMIT or ROLLBA
19af0 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  CK..*/.int sqlit
19b00 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
19b10 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
19b20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
19b30 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
19b40 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
19b50 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
19b60 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
19b70 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
19b80 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
19b90 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
19ba0 6e 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  n db->autoCommit
19bb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
19bc0 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
19bd0 73 20 61 72 65 20 73 75 62 73 74 69 74 75 74 65  s are substitute
19be0 73 20 66 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20  s for constants 
19bf0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a  SQLITE_CORRUPT,.
19c00 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  ** SQLITE_MISUSE
19c10 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  , SQLITE_CANTOPE
19c20 4e 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  N, SQLITE_IOERR 
19c30 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 74 68  and possibly oth
19c40 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73  er error.** cons
19c50 74 61 6e 74 73 2e 20 20 54 68 65 79 20 73 65 72  tants.  They ser
19c60 76 65 20 74 77 6f 20 70 75 72 70 6f 73 65 73 3a  ve two purposes:
19c70 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72  .**.**   1.  Ser
19c80 76 65 20 61 73 20 61 20 63 6f 6e 76 65 6e 69 65  ve as a convenie
19c90 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20  nt place to set 
19ca0 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20  a breakpoint in 
19cb0 61 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 20 20  a debugger.**   
19cc0 20 20 20 20 74 6f 20 64 65 74 65 63 74 20 77 68      to detect wh
19cd0 65 6e 20 76 65 72 73 69 6f 6e 20 65 72 72 6f 72  en version error
19ce0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75   conditions occu
19cf0 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20  rs..**.**   2.  
19d00 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c  Invoke sqlite3_l
19d10 6f 67 28 29 20 74 6f 20 70 72 6f 76 69 64 65 20  og() to provide 
19d20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20  the source code 
19d30 6c 6f 63 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a  location where.*
19d40 2a 20 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65  *       a low-le
19d50 76 65 6c 20 65 72 72 6f 72 20 69 73 20 66 69 72  vel error is fir
19d60 73 74 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a  st detected..*/.
19d70 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75  int sqlite3Corru
19d80 70 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  ptError(int line
19d90 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
19da0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
19db0 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
19dc0 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
19dd0 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 20 20  LITE_CORRUPT,.  
19de0 20 20 20 20 20 20 20 20 20 20 20 20 22 64 61 74              "dat
19df0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
19e00 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b   at line %d of [
19e10 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20  %.10s]",.       
19e20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32         lineno, 2
19e30 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  0+sqlite3_source
19e40 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  id());.  return 
19e50 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
19e60 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69 73  }.int sqlite3Mis
19e70 75 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  useError(int lin
19e80 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65  eno){.  testcase
19e90 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
19ea0 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b  onfig.xLog!=0 );
19eb0 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53  .  sqlite3_log(S
19ec0 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 0a 20  QLITE_MISUSE, . 
19ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 6d 69               "mi
19ee0 73 75 73 65 20 61 74 20 6c 69 6e 65 20 25 64 20  suse at line %d 
19ef0 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20  of [%.10s]",.   
19f00 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e             linen
19f10 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f  o, 20+sqlite3_so
19f20 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74  urceid());.  ret
19f30 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
19f40 45 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  E;.}.int sqlite3
19f50 43 61 6e 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e  CantopenError(in
19f60 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
19f70 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
19f80 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
19f90 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
19fa0 6c 6f 67 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  log(SQLITE_CANTO
19fb0 50 45 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  PEN, .          
19fc0 20 20 20 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e      "cannot open
19fd0 20 66 69 6c 65 20 61 74 20 6c 69 6e 65 20 25 64   file at line %d
19fe0 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20   of [%.10s]",.  
19ff0 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65              line
1a000 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73  no, 20+sqlite3_s
1a010 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65  ourceid());.  re
1a020 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
1a030 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  OPEN;.}...#ifnde
1a040 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
1a050 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54  PRECATED./*.** T
1a060 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e 69  his is a conveni
1a070 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68 61  ence routine tha
1a080 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61  t makes sure tha
1a090 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70 65  t all thread-spe
1a0a0 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f  cific.** data fo
1a0b0 72 20 74 68 69 73 20 74 68 72 65 61 64 20 68 61  r this thread ha
1a0c0 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74  s been deallocat
1a0d0 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  ed..**.** SQLite
1a0e0 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20   no longer uses 
1a0f0 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 20  thread-specific 
1a100 64 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f 75  data so this rou
1a110 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a  tine is now a.**
1a120 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20 72   no-op.  It is r
1a130 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73 74  etained for hist
1a140 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62 69  orical compatibi
1a150 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lity..*/.void sq
1a160 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
1a170 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65  anup(void){.}.#e
1a180 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
1a190 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  rn meta informat
1a1a0 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63  ion about a spec
1a1b0 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  ific column of a
1a1c0 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
1a1d0 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20  .** See comment 
1a1e0 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71  in sqlite3.h (sq
1a1f0 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64  lite.h.in) for d
1a200 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73  etails..*/.int s
1a210 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
1a220 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20  umn_metadata(.  
1a230 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1a240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1a250 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
1a260 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1a270 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20 20   *zDbName,      
1a280 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61    /* Database na
1a290 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  me or NULL */.  
1a2a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
1a2b0 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54  leName,     /* T
1a2c0 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63  able name */.  c
1a2d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
1a2e0 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f  mnName,    /* Co
1a2f0 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63  lumn name */.  c
1a300 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61  har const **pzDa
1a310 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55  taType,    /* OU
1a320 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20 64  TPUT: Declared d
1a330 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68  ata type */.  ch
1a340 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c  ar const **pzCol
1a350 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54  lSeq,     /* OUT
1a360 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73  PUT: Collation s
1a370 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a  equence name */.
1a380 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c    int *pNotNull,
1a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a3a0 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
1a3b0 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
1a3c0 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 20  aint exists */. 
1a3d0 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65   int *pPrimaryKe
1a3e0 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
1a3f0 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20  OUTPUT: True if 
1a400 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20 50  column part of P
1a410 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74  K */.  int *pAut
1a420 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  oinc            
1a430 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
1a440 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20  ue if column is 
1a450 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a  auto-increment *
1a460 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
1a470 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
1a480 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   0;.  Table *pTa
1a490 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20  b = 0;.  Column 
1a4a0 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pCol = 0;.  int
1a4b0 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 63 68 61   iCol = 0;.  cha
1a4c0 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79  r const *zDataTy
1a4d0 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  pe = 0;.  char c
1a4e0 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d  onst *zCollSeq =
1a4f0 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c   0;.  int notnul
1a500 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69  l = 0;.  int pri
1a510 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69  marykey = 0;.  i
1a520 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a  nt autoinc = 0;.
1a530 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1a540 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1a550 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1a560 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1a570 20 7c 7c 20 7a 54 61 62 6c 65 4e 61 6d 65 3d 3d   || zTableName==
1a580 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1a590 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1a5a0 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  PT;.  }.#endif..
1a5b0 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20    /* Ensure the 
1a5c0 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
1a5d0 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20  has been loaded 
1a5e0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
1a5f0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1a600 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
1a610 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
1a620 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49  .  rc = sqlite3I
1a630 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67  nit(db, &zErrMsg
1a640 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
1a650 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f  OK!=rc ){.    go
1a660 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
1a670 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
1a680 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73  he table in ques
1a690 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d  tion */.  pTab =
1a6a0 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
1a6b0 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65  e(db, zTableName
1a6c0 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66  , zDbName);.  if
1a6d0 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d  ( !pTab || pTab-
1a6e0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
1a6f0 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f  pTab = 0;.    go
1a700 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
1a710 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  }..  /* Find the
1a720 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63   column for whic
1a730 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73  h info is reques
1a740 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a 43 6f  ted */.  if( zCo
1a750 6c 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  lumnName==0 ){. 
1a760 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6f 72 20     /* Query for 
1a770 65 78 69 73 74 61 6e 63 65 20 6f 66 20 74 61 62  existance of tab
1a780 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d 65 6c  le only */.  }el
1a790 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c  se{.    for(iCol
1a7a0 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
1a7b0 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
1a7c0 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
1a7d0 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
1a7e0 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
1a7f0 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e  e3StrICmp(pCol->
1a800 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61  zName, zColumnNa
1a810 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  me) ){.        b
1a820 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1a830 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
1a840 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  ==pTab->nCol ){.
1a850 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77        if( HasRow
1a860 69 64 28 70 54 61 62 29 20 26 26 20 73 71 6c 69  id(pTab) && sqli
1a870 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75  te3IsRowid(zColu
1a880 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  mnName) ){.     
1a890 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     iCol = pTab->
1a8a0 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70  iPKey;.        p
1a8b0 43 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20  Col = iCol>=0 ? 
1a8c0 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
1a8d0 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  ] : 0;.      }el
1a8e0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62  se{.        pTab
1a8f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
1a900 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
1a910 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1a920 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1a930 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73  ing block stores
1a940 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d   the meta inform
1a950 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ation that will 
1a960 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a  be returned.  **
1a970 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69   to the caller i
1a980 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  n local variable
1a990 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f  s zDataType, zCo
1a9a0 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20  llSeq, notnull, 
1a9b0 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20  primarykey.  ** 
1a9c0 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20  and autoinc. At 
1a9d0 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
1a9e0 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69   are two possibi
1a9f0 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20  lities:.  ** .  
1aa00 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73 70  **     1. The sp
1aa10 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e  ecified column n
1aa20 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20  ame was rowid", 
1aa30 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64  "oid" or "_rowid
1aa40 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  _" .  **        
1aa50 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
1aa60 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61  explicitly decla
1aa70 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20  red IPK column. 
1aa80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32  .  **.  **     2
1aa90 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e  . The table is n
1aaa0 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20 74 68  ot a view and th
1aab0 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64  e column name id
1aac0 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a  entified an .  *
1aad0 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69 63 69  *        explici
1aae0 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  tly declared col
1aaf0 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69  umn. Copy meta i
1ab00 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
1ab10 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69  *pCol..  */ .  i
1ab20 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a  f( pCol ){.    z
1ab30 44 61 74 61 54 79 70 65 20 3d 20 70 43 6f 6c 2d  DataType = pCol-
1ab40 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43 6f 6c  >zType;.    zCol
1ab50 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f  lSeq = pCol->zCo
1ab60 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20  ll;.    notnull 
1ab70 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21  = pCol->notNull!
1ab80 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b  =0;.    primaryk
1ab90 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c  ey  = (pCol->col
1aba0 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f  Flags & COLFLAG_
1abb0 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20 20  PRIMKEY)!=0;.   
1abc0 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d   autoinc = pTab-
1abd0 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20  >iPKey==iCol && 
1abe0 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
1abf0 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
1ac00 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b  nt)!=0;.  }else{
1ac10 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d  .    zDataType =
1ac20 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20   "INTEGER";.    
1ac30 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a  primarykey = 1;.
1ac40 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c    }.  if( !zColl
1ac50 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c  Seq ){.    zColl
1ac60 53 65 71 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Seq = sqlite3Str
1ac70 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 0a 65 72 72  BINARY;.  }..err
1ac80 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  or_out:.  sqlite
1ac90 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
1aca0 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65  b);..  /* Whethe
1acb0 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63  r the function c
1acc0 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72  all succeeded or
1acd0 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65   failed, set the
1ace0 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
1acf0 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65  rs.  ** to whate
1ad00 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20  ver their local 
1ad10 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e  counterparts con
1ad20 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tain. If an erro
1ad30 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a  r did occur,.  *
1ad40 2a 20 74 68 69 73 20 68 61 73 20 74 68 65 20 65  * this has the e
1ad50 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67  ffect of zeroing
1ad60 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61   all output para
1ad70 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69  meters..  */.  i
1ad80 66 28 20 70 7a 44 61 74 61 54 79 70 65 20 29 20  f( pzDataType ) 
1ad90 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44  *pzDataType = zD
1ada0 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70  ataType;.  if( p
1adb0 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f  zCollSeq ) *pzCo
1adc0 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71  llSeq = zCollSeq
1add0 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c  ;.  if( pNotNull
1ade0 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e   ) *pNotNull = n
1adf0 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50  otnull;.  if( pP
1ae00 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72  rimaryKey ) *pPr
1ae10 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61  imaryKey = prima
1ae20 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75  rykey;.  if( pAu
1ae30 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e  toinc ) *pAutoin
1ae40 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20  c = autoinc;..  
1ae50 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72  if( SQLITE_OK==r
1ae60 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  c && !pTab ){.  
1ae70 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1ae80 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
1ae90 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69    zErrMsg = sqli
1aea0 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
1aeb0 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f  no such table co
1aec0 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54  lumn: %s.%s", zT
1aed0 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20  ableName,.      
1aee0 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a    zColumnName);.
1aef0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1af00 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c  ERROR;.  }.  sql
1af10 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
1af20 28 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73  (db, rc, (zErrMs
1af30 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d  g?"%s":0), zErrM
1af40 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  sg);.  sqlite3Db
1af50 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67  Free(db, zErrMsg
1af60 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1af70 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
1af80 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1af90 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1afa0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
1afb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  .}../*.** Sleep 
1afc0 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
1afd0 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
1afe0 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
1aff0 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lept..*/.int sql
1b000 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d  ite3_sleep(int m
1b010 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
1b020 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  s *pVfs;.  int r
1b030 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69  c;.  pVfs = sqli
1b040 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
1b050 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29  .  if( pVfs==0 )
1b060 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
1b070 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
1b080 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63  orks in millisec
1b090 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e  onds, but the un
1b0a0 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70  derlying OsSleep
1b0b0 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65  () .  ** API use
1b0c0 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20  s microseconds. 
1b0d0 48 65 6e 63 65 20 74 68 65 20 31 30 30 30 27 73  Hence the 1000's
1b0e0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73  ..  */.  rc = (s
1b0f0 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56  qlite3OsSleep(pV
1b100 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30  fs, 1000*ms)/100
1b110 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  0);.  return rc;
1b120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  .}../*.** Enable
1b130 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
1b140 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20  extended result 
1b150 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  codes..*/.int sq
1b160 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
1b170 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69  esult_codes(sqli
1b180 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f  te3 *db, int ono
1b190 66 66 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ff){.#ifdef SQLI
1b1a0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1b1b0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1b1c0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1b1d0 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
1b1e0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1b1f0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1b200 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1b210 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
1b220 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20  errMask = onoff 
1b230 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30  ? 0xffffffff : 0
1b240 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  xff;.  sqlite3_m
1b250 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1b260 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1b270 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1b280 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78  .** Invoke the x
1b290 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68  FileControl meth
1b2a0 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  od on a particul
1b2b0 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  ar database..*/.
1b2c0 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  int sqlite3_file
1b2d0 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  _control(sqlite3
1b2e0 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
1b2f0 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f   *zDbName, int o
1b300 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
1b310 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1b320 45 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72 65 65  E_ERROR;.  Btree
1b330 20 2a 70 42 74 72 65 65 3b 0a 0a 23 69 66 64 65   *pBtree;..#ifde
1b340 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1b350 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1b360 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1b370 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
1b380 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
1b390 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
1b3a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1b3b0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1b3c0 20 20 70 42 74 72 65 65 20 3d 20 73 71 6c 69 74    pBtree = sqlit
1b3d0 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28  e3DbNameToBtree(
1b3e0 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  db, zDbName);.  
1b3f0 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20  if( pBtree ){.  
1b400 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
1b410 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
1b420 65 20 2a 66 64 3b 0a 20 20 20 20 73 71 6c 69 74  e *fd;.    sqlit
1b430 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
1b440 72 65 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ree);.    pPager
1b450 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
1b460 61 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  ager(pBtree);.  
1b470 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b480 21 3d 30 20 29 3b 0a 20 20 20 20 66 64 20 3d 20  !=0 );.    fd = 
1b490 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1b4a0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73  (pPager);.    as
1b4b0 73 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20  sert( fd!=0 );. 
1b4c0 20 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54     if( op==SQLIT
1b4d0 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49  E_FCNTL_FILE_POI
1b4e0 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28  NTER ){.      *(
1b4f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70  sqlite3_file**)p
1b500 41 72 67 20 3d 20 66 64 3b 0a 20 20 20 20 20 20  Arg = fd;.      
1b510 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1b520 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
1b530 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  ==SQLITE_FCNTL_V
1b540 46 53 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20  FS_POINTER ){.  
1b550 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 76 66      *(sqlite3_vf
1b560 73 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74  s**)pArg = sqlit
1b570 65 33 50 61 67 65 72 56 66 73 28 70 50 61 67 65  e3PagerVfs(pPage
1b580 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  r);.      rc = S
1b590 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1b5a0 6c 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49  lse if( op==SQLI
1b5b0 54 45 5f 46 43 4e 54 4c 5f 4a 4f 55 52 4e 41 4c  TE_FCNTL_JOURNAL
1b5c0 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20  _POINTER ){.    
1b5d0 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65    *(sqlite3_file
1b5e0 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65  **)pArg = sqlite
1b5f0 33 50 61 67 65 72 4a 72 6e 6c 46 69 6c 65 28 70  3PagerJrnlFile(p
1b600 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
1b610 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1b620 20 20 7d 65 6c 73 65 20 69 66 28 20 66 64 2d 3e    }else if( fd->
1b630 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
1b640 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1b650 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20  FileControl(fd, 
1b660 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d  op, pArg);.    }
1b670 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1b680 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
1b690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1b6a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
1b6b0 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  tree);.  }.  sql
1b6c0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1b6d0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
1b6e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b6f0 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
1b700 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69  the testing logi
1b710 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  c..*/.int sqlite
1b720 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69  3_test_control(i
1b730 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69  nt op, ...){.  i
1b740 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 64 65  nt rc = 0;.#ifde
1b750 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55  f SQLITE_OMIT_BU
1b760 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20 55 4e 55  ILTIN_TEST.  UNU
1b770 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6f 70  SED_PARAMETER(op
1b780 29 3b 0a 23 65 6c 73 65 0a 20 20 76 61 5f 6c 69  );.#else.  va_li
1b790 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72  st ap;.  va_star
1b7a0 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
1b7b0 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20  tch( op ){..    
1b7c0 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20 74  /*.    ** Save t
1b7d0 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
1b7e0 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20 20   of the PRNG..  
1b7f0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1b800 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
1b810 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20 20  NG_SAVE: {.     
1b820 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76 65   sqlite3PrngSave
1b830 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
1b840 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1b850 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f   /*.    ** Resto
1b860 72 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  re the state of 
1b870 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20  the PRNG to the 
1b880 6c 61 73 74 20 73 74 61 74 65 20 73 61 76 65 64  last state saved
1b890 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52   using.    ** PR
1b8a0 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52 4e  NG_SAVE.  If PRN
1b8b0 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65 72  G_SAVE has never
1b8c0 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61 6c   before been cal
1b8d0 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  led, then.    **
1b8e0 20 74 68 69 73 20 76 65 72 62 20 61 63 74 73 20   this verb acts 
1b8f0 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54 2e  like PRNG_RESET.
1b900 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1b910 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1b920 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b  _PRNG_RESTORE: {
1b930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72  .      sqlite3Pr
1b940 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65 28 29  ngRestoreState()
1b950 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1b960 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1b970 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50 52   ** Reset the PR
1b980 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20 75  NG back to its u
1b990 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61  ninitialized sta
1b9a0 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63 61  te.  The next ca
1b9b0 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c  ll.    ** to sql
1b9c0 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
1b9d0 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74 68  ) will reseed th
1b9e0 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20 73  e PRNG using a s
1b9f0 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a  ingle call.    *
1ba00 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d  * to the xRandom
1ba10 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20 74  ness method of t
1ba20 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 0a  he default VFS..
1ba30 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1ba40 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1ba50 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20  PRNG_RESET: {.  
1ba60 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
1ba70 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 20  omness(0,0);.   
1ba80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ba90 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1baa0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1bab0 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53 54  trol(BITVEC_TEST
1bac0 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29  , size, program)
1bad0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
1bae0 75 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e 73  un a test agains
1baf0 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65 63  t a Bitvec objec
1bb00 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65 20  t of size.  The 
1bb10 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e 74  program argument
1bb20 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61 72  .    ** is an ar
1bb30 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20  ray of integers 
1bb40 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
1bb50 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20 2d   test.  Return -
1bb60 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65  1 on a.    ** me
1bb70 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1bb80 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63  error, 0 on succ
1bb90 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  ess, or non-zero
1bba0 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20   for an error.. 
1bbb0 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73 71     ** See the sq
1bbc0 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74  lite3BitvecBuilt
1bbd0 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64 64  inTest() for add
1bbe0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
1bbf0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1bc00 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1bc10 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54  CTRL_BITVEC_TEST
1bc20 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  : {.      int sz
1bc30 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1bc40 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  t);.      int *a
1bc50 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  Prog = va_arg(ap
1bc60 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72  , int*);.      r
1bc70 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
1bc80 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c  cBuiltinTest(sz,
1bc90 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62   aProg);.      b
1bca0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1bcb0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1bcc0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1bcd0 28 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20  (FAULT_INSTALL, 
1bce0 78 43 61 6c 6c 62 61 63 6b 29 0a 20 20 20 20 2a  xCallback).    *
1bcf0 2a 0a 20 20 20 20 2a 2a 20 41 72 72 61 6e 67 65  *.    ** Arrange
1bd00 20 74 6f 20 69 6e 76 6f 6b 65 20 78 43 61 6c 6c   to invoke xCall
1bd10 62 61 63 6b 28 29 20 77 68 65 6e 65 76 65 72 20  back() whenever 
1bd20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
1bd30 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20 20  ) is called,.   
1bd40 20 2a 2a 20 69 66 20 78 43 61 6c 6c 62 61 63 6b   ** if xCallback
1bd50 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20   is not NULL..  
1bd60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73 20 61    **.    ** As a
1bd70 20 74 65 73 74 20 6f 66 20 74 68 65 20 66 61 75   test of the fau
1bd80 6c 74 20 73 69 6d 75 6c 61 74 6f 72 20 6d 65 63  lt simulator mec
1bd90 68 61 6e 69 73 6d 20 69 74 73 65 6c 66 2c 20 73  hanism itself, s
1bda0 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30  qlite3FaultSim(0
1bdb0 29 0a 20 20 20 20 2a 2a 20 69 73 20 63 61 6c 6c  ).    ** is call
1bdc0 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  ed immediately a
1bdd0 66 74 65 72 20 69 6e 73 74 61 6c 6c 69 6e 67 20  fter installing 
1bde0 74 68 65 20 6e 65 77 20 63 61 6c 6c 62 61 63 6b  the new callback
1bdf0 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e 0a   and the return.
1be00 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 66 72 6f      ** value fro
1be10 6d 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69  m sqlite3FaultSi
1be20 6d 28 30 29 20 62 65 63 6f 6d 65 73 20 74 68 65  m(0) becomes the
1be30 20 72 65 74 75 72 6e 20 66 72 6f 6d 0a 20 20 20   return from.   
1be40 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   ** sqlite3_test
1be50 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20 20 20  _control()..    
1be60 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1be70 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55 4c  TE_TESTCTRL_FAUL
1be80 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20 20  T_INSTALL: {.   
1be90 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69     /* MSVC is pi
1bea0 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e  cky about pullin
1beb0 67 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d  g func ptrs from
1bec0 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20   va lists..     
1bed0 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f   ** http://suppo
1bee0 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d  rt.microsoft.com
1bef0 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20  /kb/47961.      
1bf00 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ** sqlite3Global
1bf10 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c  Config.xTestCall
1bf20 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70  back = va_arg(ap
1bf30 2c 20 69 6e 74 28 2a 29 28 69 6e 74 29 29 3b 0a  , int(*)(int));.
1bf40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
1bf50 79 70 65 64 65 66 20 69 6e 74 28 2a 54 45 53 54  ypedef int(*TEST
1bf60 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 28  CALLBACKFUNC_t)(
1bf70 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
1bf80 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1bf90 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20  xTestCallback = 
1bfa0 76 61 5f 61 72 67 28 61 70 2c 20 54 45 53 54 43  va_arg(ap, TESTC
1bfb0 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 3b 0a  ALLBACKFUNC_t);.
1bfc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1bfd0 65 33 46 61 75 6c 74 53 69 6d 28 30 29 3b 0a 20  e3FaultSim(0);. 
1bfe0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bff0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1c000 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1c010 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41  ontrol(BENIGN_MA
1c020 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67  LLOC_HOOKS, xBeg
1c030 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a  in, xEnd).    **
1c040 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72  .    ** Register
1c050 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74   hooks to call t
1c060 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63 68  o indicate which
1c070 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
1c080 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62  es .    ** are b
1c090 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  enign..    */.  
1c0a0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1c0b0 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41  STCTRL_BENIGN_MA
1c0c0 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20  LLOC_HOOKS: {.  
1c0d0 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64      typedef void
1c0e0 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e   (*void_function
1c0f0 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76  )(void);.      v
1c100 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65  oid_function xBe
1c110 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20  nignBegin;.     
1c120 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78   void_function x
1c130 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20  BenignEnd;.     
1c140 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20   xBenignBegin = 
1c150 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f  va_arg(ap, void_
1c160 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  function);.     
1c170 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61   xBenignEnd = va
1c180 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75  _arg(ap, void_fu
1c190 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73  nction);.      s
1c1a0 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c  qlite3BenignMall
1c1b0 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42  ocHooks(xBenignB
1c1c0 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64  egin, xBenignEnd
1c1d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1c1e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1c1f0 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
1c200 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1c210 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49  E_TESTCTRL_PENDI
1c220 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65  NG_BYTE, unsigne
1c230 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a  d int X).    **.
1c240 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50      ** Set the P
1c250 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74  ENDING byte to t
1c260 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  he value in the 
1c270 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30  argument, if X>0
1c280 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f  ..    ** Make no
1c290 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30   changes if X==0
1c2a0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  .  Return the va
1c2b0 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69  lue of the pendi
1c2c0 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61  ng byte.    ** a
1c2d0 73 20 69 74 20 65 78 69 73 74 69 6e 67 20 62 65  s it existing be
1c2e0 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e  fore this routin
1c2f0 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20  e was called..  
1c300 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f    **.    ** IMPO
1c310 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67  RTANT:  Changing
1c320 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
1c330 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30  e from 0x4000000
1c340 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20  0 results in.   
1c350 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   ** an incompati
1c360 62 6c 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ble database fil
1c370 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67  e format.  Chang
1c380 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ing the PENDING 
1c390 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c  byte.    ** whil
1c3a0 65 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 63  e any database c
1c3b0 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65  onnection is ope
1c3c0 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64  n results in und
1c3d0 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a  efined and.    *
1c3e0 2a 20 64 65 6c 65 74 65 72 69 6f 75 73 20 62 65  * deleterious be
1c3f0 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  havior..    */. 
1c400 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1c410 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
1c420 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72 63  BYTE: {.      rc
1c430 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
1c440 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c450 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20 7b  OMIT_WSD.      {
1c460 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
1c470 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76  d int newVal = v
1c480 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e  a_arg(ap, unsign
1c490 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  ed int);.       
1c4a0 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73 71   if( newVal ) sq
1c4b0 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65  lite3PendingByte
1c4c0 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20   = newVal;.     
1c4d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
1c4e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1c4f0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1c500 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1c510 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1c520 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58 29  L_ASSERT, int X)
1c530 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1c540 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69  his action provi
1c550 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74  des a run-time t
1c560 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68  est to see wheth
1c570 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a  er or not.    **
1c580 20 61 73 73 65 72 74 28 29 20 77 61 73 20 65 6e   assert() was en
1c590 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
1c5a0 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73 20  -time.  If X is 
1c5b0 74 72 75 65 20 61 6e 64 20 61 73 73 65 72 74 28  true and assert(
1c5c0 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61 62  ).    ** is enab
1c5d0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65  led, then the re
1c5e0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 72  turn value is tr
1c5f0 75 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75  ue.  If X is tru
1c600 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73  e and.    ** ass
1c610 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
1c620 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  d, then the retu
1c630 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f  rn value is zero
1c640 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20 20 2a  .  If X is.    *
1c650 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65  * false and asse
1c660 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2c  rt() is enabled,
1c670 20 74 68 65 6e 20 74 68 65 20 61 73 73 65 72 74   then the assert
1c680 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74 68  ion fires and th
1c690 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  e.    ** process
1c6a0 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20 69   aborts.  If X i
1c6b0 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65  s false and asse
1c6c0 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  rt() is disabled
1c6d0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a  , then the.    *
1c6e0 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
1c6f0 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20  s zero..    */. 
1c700 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1c710 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20  ESTCTRL_ASSERT: 
1c720 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c 65  {.      volatile
1c730 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20   int x = 0;.    
1c740 20 20 61 73 73 65 72 74 28 20 28 78 20 3d 20 76    assert( (x = v
1c750 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29 21 3d  a_arg(ap,int))!=
1c760 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
1c770 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  x;.      break;.
1c780 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20      }...    /*. 
1c790 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
1c7a0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1c7b0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
1c7c0 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a  YS, int X).    *
1c7d0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63  *.    ** This ac
1c7e0 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20  tion provides a 
1c7f0 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f  run-time test to
1c800 20 73 65 65 20 68 6f 77 20 74 68 65 20 41 4c 57   see how the ALW
1c810 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e  AYS and.    ** N
1c820 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65 72 65  EVER macros were
1c830 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d 70   defined at comp
1c840 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a  ile-time..    **
1c850 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 74 75  .    ** The retu
1c860 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c 57 41  rn value is ALWA
1c870 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a  YS(X).  .    **.
1c880 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d      ** The recom
1c890 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73 20 58  mended test is X
1c8a0 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72 65 74  ==2.  If the ret
1c8b0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32 2c 20  urn value is 2, 
1c8c0 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a  that means.    *
1c8d0 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e  * ALWAYS() and N
1c8e0 45 56 45 52 28 29 20 61 72 65 20 62 6f 74 68 20  EVER() are both 
1c8f0 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75  no-op pass-throu
1c900 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69 63 68  gh macros, which
1c910 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   is the.    ** d
1c920 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 2e 20  efault setting. 
1c930 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
1c940 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65 6e 20  alue is 1, then 
1c950 41 4c 57 41 59 53 28 29 20 69 73 20 65 69 74 68  ALWAYS() is eith
1c960 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d 63  er.    ** hard-c
1c970 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f 72 20  oded to true or 
1c980 65 6c 73 65 20 69 74 20 61 73 73 65 72 74 73 20  else it asserts 
1c990 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20  if its argument 
1c9a0 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a  is false..    **
1c9b0 20 54 68 65 20 66 69 72 73 74 20 62 65 68 61 76   The first behav
1c9c0 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65 64 20  ior (hard-coded 
1c9d0 74 6f 20 74 72 75 65 29 20 69 73 20 74 68 65 20  to true) is the 
1c9e0 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53  case if.    ** S
1c9f0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1ca00 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61 74  SSERT shows that
1ca10 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73   assert() is dis
1ca20 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 73 65  abled and the se
1ca30 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68 61  cond.    ** beha
1ca40 76 69 6f 72 20 28 61 73 73 65 72 74 20 69 66 20  vior (assert if 
1ca50 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
1ca60 41 4c 57 41 59 53 28 29 20 69 73 20 66 61 6c 73  ALWAYS() is fals
1ca70 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20 69  e) is the case i
1ca80 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  f.    ** SQLITE_
1ca90 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20  TESTCTRL_ASSERT 
1caa0 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65 72  shows that asser
1cab0 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  t() is enabled..
1cac0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1cad0 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  e run-time test 
1cae0 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74 20  procedure might 
1caf0 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c  look something l
1cb00 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a  ike this:.    **
1cb10 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28 20 73  .    **    if( s
1cb20 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1cb30 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1cb40 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d  TRL_ALWAYS, 2)==
1cb50 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  2 ){.    **     
1cb60 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61 6e 64   // ALWAYS() and
1cb70 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e 6f 2d   NEVER() are no-
1cb80 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20  op pass-through 
1cb90 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20  macros.    **   
1cba0 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
1cbb0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1cbc0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1cbd0 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a 20 20  ASSERT, 1) ){.  
1cbe0 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
1cbf0 41 59 53 28 78 29 20 61 73 73 65 72 74 73 20 74  AYS(x) asserts t
1cc00 68 61 74 20 78 20 69 73 20 74 72 75 65 2e 20 4e  hat x is true. N
1cc10 45 56 45 52 28 78 29 20 61 73 73 65 72 74 73 20  EVER(x) asserts 
1cc20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  x is false..    
1cc30 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  **    }else{.   
1cc40 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41   **      // ALWA
1cc50 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74  YS(x) is a const
1cc60 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28 78 29  ant 1.  NEVER(x)
1cc70 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 30   is a constant 0
1cc80 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20  ..    **    }.  
1cc90 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1cca0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
1ccb0 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  WAYS: {.      in
1ccc0 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  t x = va_arg(ap,
1ccd0 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  int);.      rc =
1cce0 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20 20 20   ALWAYS(x);.    
1ccf0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1cd00 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
1cd10 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1cd20 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1cd30 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 29 3b  CTRL_BYTEORDER);
1cd40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1cd50 68 65 20 69 6e 74 65 67 65 72 20 72 65 74 75 72  he integer retur
1cd60 6e 65 64 20 72 65 76 65 61 6c 73 20 74 68 65 20  ned reveals the 
1cd70 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74 68  byte-order of th
1cd80 65 20 63 6f 6d 70 75 74 65 72 20 6f 6e 20 77 68  e computer on wh
1cd90 69 63 68 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74  ich.    ** SQLit
1cda0 65 20 69 73 20 72 75 6e 6e 69 6e 67 3a 0a 20 20  e is running:.  
1cdb0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1cdc0 20 20 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69    1     big-endi
1cdd0 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65  an,    determine
1cde0 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20  d at run-time.  
1cdf0 20 20 2a 2a 20 20 20 20 20 20 31 30 20 20 20 20    **      10    
1ce00 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20   little-endian, 
1ce10 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75  determined at ru
1ce20 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 34  n-time.    **  4
1ce30 33 32 31 30 31 20 20 20 20 20 62 69 67 2d 65 6e  32101     big-en
1ce40 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69  dian,    determi
1ce50 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ned at compile-t
1ce60 69 6d 65 0a 20 20 20 20 2a 2a 20 20 31 32 33 34  ime.    **  1234
1ce70 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e  10     little-en
1ce80 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64  dian, determined
1ce90 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1cea0 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 63 61 73  .    */ .    cas
1ceb0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1cec0 4c 5f 42 59 54 45 4f 52 44 45 52 3a 20 7b 0a 20  L_BYTEORDER: {. 
1ced0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1cee0 5f 42 59 54 45 4f 52 44 45 52 2a 31 30 30 20 2b  _BYTEORDER*100 +
1cef0 20 53 51 4c 49 54 45 5f 4c 49 54 54 4c 45 45 4e   SQLITE_LITTLEEN
1cf00 44 49 41 4e 2a 31 30 20 2b 20 53 51 4c 49 54 45  DIAN*10 + SQLITE
1cf10 5f 42 49 47 45 4e 44 49 41 4e 3b 0a 20 20 20 20  _BIGENDIAN;.    
1cf20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1cf30 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
1cf40 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1cf50 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45  LITE_TESTCTRL_RE
1cf60 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20 2a  SERVE, sqlite3 *
1cf70 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a  db, int N).    *
1cf80 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65  *.    ** Set the
1cf90 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20 74   nReserve size t
1cfa0 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  o N for the main
1cfb0 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68 65   database on the
1cfc0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
1cfd0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a   connection db..
1cfe0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1cff0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1d000 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20 20  RESERVE: {.     
1d010 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
1d020 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
1d030 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78  3*);.      int x
1d040 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
1d050 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1d060 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1d070 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73  >mutex);.      s
1d080 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
1d090 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30  geSize(db->aDb[0
1d0a0 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b  ].pBt, 0, x, 0);
1d0b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
1d0c0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1d0d0 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65  utex);.      bre
1d0e0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1d0f0 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1d100 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1d110 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
1d120 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a  TIONS, sqlite3 *
1d130 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a  db, int N).    *
1d140 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20  *.    ** Enable 
1d150 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72 69 6f  or disable vario
1d160 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  us optimizations
1d170 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
1d180 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20 20  poses.  The .   
1d190 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20 69   ** argument N i
1d1a0 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f  s a bitmask of o
1d1b0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20  ptimizations to 
1d1c0 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46 6f  be disabled.  Fo
1d1d0 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20  r normal.    ** 
1d1e0 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75  operation N shou
1d1f0 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 69 64  ld be 0.  The id
1d200 65 61 20 69 73 20 74 68 61 74 20 61 20 74 65 73  ea is that a tes
1d210 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20  t program (like 
1d220 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c  the.    ** SQL L
1d230 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c 54  ogic Test or SLT
1d240 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63 61   test module) ca
1d250 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20 53  n run the same S
1d260 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  QL multiple time
1d270 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76 61  s.    ** with va
1d280 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69  rious optimizati
1d290 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f 20  ons disabled to 
1d2a0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
1d2b0 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20 20  same answer.    
1d2c0 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ** is obtained i
1d2d0 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20 20  n every case..  
1d2e0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1d2f0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
1d300 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20  TIMIZATIONS: {. 
1d310 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
1d320 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
1d330 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64  lite3*);.      d
1d340 62 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d 20  b->dbOptFlags = 
1d350 28 75 31 36 29 28 76 61 5f 61 72 67 28 61 70 2c  (u16)(va_arg(ap,
1d360 20 69 6e 74 29 20 26 20 30 78 66 66 66 66 29 3b   int) & 0xffff);
1d370 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d380 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
1d390 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20  TE_N_KEYWORD.   
1d3a0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
1d3b0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1d3c0 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f  TESTCTRL_ISKEYWO
1d3d0 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  RD, const char *
1d3e0 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20  zWord).    **.  
1d3f0 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69 73    ** If zWord is
1d400 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f 67   a keyword recog
1d410 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70 61 72  nized by the par
1d420 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ser, then return
1d430 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62   the.    ** numb
1d440 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20  er of keywords. 
1d450 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73 20   Or if zWord is 
1d460 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20 72  not a keyword, r
1d470 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20  eturn 0..    ** 
1d480 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73  .    ** This tes
1d490 74 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e 6c  t feature is onl
1d4a0 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  y available in t
1d4b0 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20  he amalgamation 
1d4c0 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68 65  since.    ** the
1d4d0 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
1d4e0 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 64  D macro is not d
1d4f0 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66  efined in this f
1d500 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20 20  ile if SQLite.  
1d510 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75 73    ** is built us
1d520 69 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f 75  ing separate sou
1d530 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a  rce files..    *
1d540 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1d550 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59  E_TESTCTRL_ISKEY
1d560 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f  WORD: {.      co
1d570 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 20  nst char *zWord 
1d580 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e  = va_arg(ap, con
1d590 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20  st char*);.     
1d5a0 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
1d5b0 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b  Strlen30(zWord);
1d5c0 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 71 6c  .      rc = (sql
1d5d0 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28  ite3KeywordCode(
1d5e0 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d  (u8*)zWord, n)!=
1d5f0 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45 5f  TK_ID) ? SQLITE_
1d600 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20  N_KEYWORD : 0;. 
1d610 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d620 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f  }.#endif ..    /
1d630 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
1d640 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1d650 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41  STCTRL_SCRATCHMA
1d660 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c  LLOC, sz, &pNew,
1d670 20 70 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a   pFree);.    **.
1d680 20 20 20 20 2a 2a 20 50 61 73 73 20 70 46 72 65      ** Pass pFre
1d690 65 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 53 63  e into sqlite3Sc
1d6a0 72 61 74 63 68 46 72 65 65 28 29 2e 20 0a 20 20  ratchFree(). .  
1d6b0 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68 65    ** If sz>0 the
1d6c0 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 73 63 72  n allocate a scr
1d6d0 61 74 63 68 20 62 75 66 66 65 72 20 69 6e 74 6f  atch buffer into
1d6e0 20 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a   pNew.  .    */.
1d6f0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1d700 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48  TESTCTRL_SCRATCH
1d710 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20  MALLOC: {.      
1d720 76 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70  void *pFree, **p
1d730 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20  pNew;.      int 
1d740 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 76  sz;.      sz = v
1d750 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
1d760 20 20 20 20 20 20 70 70 4e 65 77 20 3d 20 76 61        ppNew = va
1d770 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29  _arg(ap, void**)
1d780 3b 0a 20 20 20 20 20 20 70 46 72 65 65 20 3d 20  ;.      pFree = 
1d790 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
1d7a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 20  );.      if( sz 
1d7b0 29 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69 74  ) *ppNew = sqlit
1d7c0 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28  e3ScratchMalloc(
1d7d0 73 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sz);.      sqlit
1d7e0 65 33 53 63 72 61 74 63 68 46 72 65 65 28 70 46  e3ScratchFree(pF
1d7f0 72 65 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ree);.      brea
1d800 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1d810 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1d820 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1d830 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d  ESTCTRL_LOCALTIM
1d840 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f  E_FAULT, int ono
1d850 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ff);.    **.    
1d860 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
1d870 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72  onoff is non-zer
1d880 6f 2c 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65  o, configure the
1d890 20 77 72 61 70 70 65 72 73 20 73 6f 20 74 68 61   wrappers so tha
1d8a0 74 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62  t all.    ** sub
1d8b0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
1d8c0 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e 64   localtime() and
1d8d0 20 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e 20   variants fail. 
1d8e0 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f  If onoff is zero
1d8f0 2c 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68  ,.    ** undo th
1d900 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20  is setting..    
1d910 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1d920 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41  TE_TESTCTRL_LOCA
1d930 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20  LTIME_FAULT: {. 
1d940 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1d950 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74  alConfig.bLocalt
1d960 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61 72  imeFault = va_ar
1d970 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
1d980 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1d990 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
1d9a0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1d9b0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45  LITE_TESTCTRL_NE
1d9c0 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 69 6e 74  VER_CORRUPT, int
1d9d0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1d9e0 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61 20   Set or clear a 
1d9f0 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63 61  flag that indica
1da00 74 65 73 20 74 68 61 74 20 74 68 65 20 64 61 74  tes that the dat
1da10 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 61 6c  abase file is al
1da20 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20 20 2a  ways well-.    *
1da30 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e 65 76  * formed and nev
1da40 65 72 20 63 6f 72 72 75 70 74 2e 20 20 54 68 69  er corrupt.  Thi
1da50 73 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20  s flag is clear 
1da60 62 79 20 64 65 66 61 75 6c 74 2c 20 69 6e 64 69  by default, indi
1da70 63 61 74 69 6e 67 20 74 68 61 74 0a 20 20 20 20  cating that.    
1da80 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1da90 73 20 6d 69 67 68 74 20 68 61 76 65 20 61 72 62  s might have arb
1daa0 69 74 72 61 72 79 20 63 6f 72 72 75 70 74 69 6f  itrary corruptio
1dab0 6e 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65 20  n.  Setting the 
1dac0 66 6c 61 67 20 64 75 72 69 6e 67 0a 20 20 20 20  flag during.    
1dad0 2a 2a 20 74 65 73 74 69 6e 67 20 63 61 75 73 65  ** testing cause
1dae0 73 20 63 65 72 74 61 69 6e 20 61 73 73 65 72 74  s certain assert
1daf0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  () statements in
1db00 20 74 68 65 20 63 6f 64 65 20 74 6f 20 62 65 20   the code to be 
1db10 61 63 74 69 76 61 74 65 64 0a 20 20 20 20 2a 2a  activated.    **
1db20 20 74 68 61 74 20 64 65 6d 6f 6e 73 74 72 61 74   that demonstrat
1db30 20 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20 77   invariants on w
1db40 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
1db50 61 73 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a  ase files..    *
1db60 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1db70 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52  E_TESTCTRL_NEVER
1db80 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20 20 20  _CORRUPT: {.    
1db90 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1dba0 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f 72 72 75  onfig.neverCorru
1dbb0 70 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  pt = va_arg(ap, 
1dbc0 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
1dbd0 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f  k;.    }...    /
1dbe0 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1dbf0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1dc00 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f  TESTCTRL_VDBE_CO
1dc10 56 45 52 41 47 45 2c 20 78 43 61 6c 6c 62 61 63  VERAGE, xCallbac
1dc20 6b 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a 0a  k, ptr);.    **.
1dc30 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 56      ** Set the V
1dc40 44 42 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c  DBE coverage cal
1dc50 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74  lback function t
1dc60 6f 20 78 43 61 6c 6c 62 61 63 6b 20 77 69 74 68  o xCallback with
1dc70 20 63 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2a   context .    **
1dc80 20 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20 20   pointer ptr..  
1dc90 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1dca0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44  LITE_TESTCTRL_VD
1dcb0 42 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a 23  BE_COVERAGE: {.#
1dcc0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
1dcd0 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20  E_COVERAGE.     
1dce0 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a   typedef void (*
1dcf0 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29  branch_callback)
1dd00 28 76 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c 75 38  (void*,int,u8,u8
1dd10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1dd20 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64  GlobalConfig.xVd
1dd30 62 65 42 72 61 6e 63 68 20 3d 20 76 61 5f 61 72  beBranch = va_ar
1dd40 67 28 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c  g(ap,branch_call
1dd50 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  back);.      sql
1dd60 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1dd70 2e 70 56 64 62 65 42 72 61 6e 63 68 41 72 67 20  .pVdbeBranchArg 
1dd80 3d 20 76 61 5f 61 72 67 28 61 70 2c 76 6f 69 64  = va_arg(ap,void
1dd90 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  *);.#endif.     
1dda0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1ddb0 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1ddc0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1ddd0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52  ITE_TESTCTRL_SOR
1dde0 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d  TER_MMAP, db, nM
1ddf0 61 78 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65  ax); */.    case
1de00 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1de10 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a  _SORTER_MMAP: {.
1de20 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1de30 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
1de40 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
1de50 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d  db->nMaxSorterMm
1de60 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
1de70 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
1de80 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1de90 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1dea0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1deb0 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 29 3b  ESTCTRL_ISINIT);
1dec0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
1ded0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1dee0 69 66 20 53 51 4c 69 74 65 20 68 61 73 20 62 65  if SQLite has be
1def0 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61  en initialized a
1df00 6e 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  nd SQLITE_ERROR 
1df10 69 66 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20  if.    ** not.. 
1df20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1df30 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
1df40 53 49 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20 69  SINIT: {.      i
1df50 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
1df60 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30  Config.isInit==0
1df70 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45   ) rc = SQLITE_E
1df80 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
1df90 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1dfa0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1dfb0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1dfc0 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c  STCTRL_IMPOSTER,
1dfd0 20 64 62 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f   db, dbName, onO
1dfe0 66 66 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 2a  ff, tnum);.    *
1dff0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65  *.    ** This te
1e000 73 74 20 63 6f 6e 74 72 6f 6c 20 69 73 20 75 73  st control is us
1e010 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 6d 70  ed to create imp
1e020 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20 22  oster tables.  "
1e030 64 62 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72  db" is a pointer
1e040 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 64  .    ** to the d
1e050 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1e060 6f 6e 2e 20 20 64 62 4e 61 6d 65 20 69 73 20 74  on.  dbName is t
1e070 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
1e080 20 28 65 78 3a 20 22 6d 61 69 6e 22 20 6f 72 0a   (ex: "main" or.
1e090 20 20 20 20 2a 2a 20 22 74 65 6d 70 22 29 20 77      ** "temp") w
1e0a0 68 69 63 68 20 77 69 6c 6c 20 72 65 63 65 69 76  hich will receiv
1e0b0 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72 2e 20  e the imposter. 
1e0c0 20 22 6f 6e 4f 66 66 22 20 74 75 72 6e 73 20 69   "onOff" turns i
1e0d0 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 0a  mposter mode on.
1e0e0 20 20 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20      ** or off.  
1e0f0 22 74 6e 75 6d 22 20 69 73 20 74 68 65 20 72 6f  "tnum" is the ro
1e100 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
1e110 2d 74 72 65 65 20 74 6f 20 77 68 69 63 68 20 74  -tree to which t
1e120 68 65 20 69 6d 70 6f 73 74 65 72 0a 20 20 20 20  he imposter.    
1e130 2a 2a 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  ** table should 
1e140 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 2a 2a 0a  connect..    **.
1e150 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 69 6d      ** Enable im
1e160 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 6c 79  poster mode only
1e170 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61   when the schema
1e180 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1e190 6e 20 70 61 72 73 65 64 2e 20 20 54 68 65 6e 0a  n parsed.  Then.
1e1a0 20 20 20 20 2a 2a 20 72 75 6e 20 61 20 73 69 6e      ** run a sin
1e1b0 67 6c 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  gle CREATE TABLE
1e1c0 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 63 6f   statement to co
1e1d0 6e 73 74 72 75 63 74 20 74 68 65 20 69 6d 70 6f  nstruct the impo
1e1e0 73 74 65 72 20 74 61 62 6c 65 20 69 6e 0a 20 20  ster table in.  
1e1f0 20 20 2a 2a 20 74 68 65 20 70 61 72 73 65 64 20    ** the parsed 
1e200 73 63 68 65 6d 61 2e 20 20 54 68 65 6e 20 74 75  schema.  Then tu
1e210 72 6e 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65  rn imposter mode
1e220 20 62 61 63 6b 20 6f 66 66 20 61 67 61 69 6e 2e   back off again.
1e230 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1e240 66 20 6f 6e 4f 66 66 3d 3d 30 20 61 6e 64 20 74  f onOff==0 and t
1e250 6e 75 6d 3e 30 20 74 68 65 6e 20 72 65 73 65 74  num>0 then reset
1e260 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
1e270 61 6c 6c 20 64 61 74 61 62 61 73 65 73 2c 20 63  all databases, c
1e280 61 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  ausing.    ** th
1e290 65 20 73 63 68 65 6d 61 20 74 6f 20 62 65 20 72  e schema to be r
1e2a0 65 70 61 72 73 65 64 20 74 68 65 20 6e 65 78 74  eparsed the next
1e2b0 20 74 69 6d 65 20 69 74 20 69 73 20 6e 65 65 64   time it is need
1e2c0 65 64 2e 20 20 54 68 69 73 20 68 61 73 20 74 68  ed.  This has th
1e2d0 65 0a 20 20 20 20 2a 2a 20 65 66 66 65 63 74 20  e.    ** effect 
1e2e0 6f 66 20 65 72 61 73 69 6e 67 20 61 6c 6c 20 69  of erasing all i
1e2f0 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 0a  mposter tables..
1e300 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1e310 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1e320 49 4d 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20  IMPOSTER: {.    
1e330 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1e340 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1e350 65 33 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e3*);.      sqli
1e360 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1e370 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
1e380 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d    db->init.iDb =
1e390 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
1e3a0 6d 65 28 64 62 2c 20 76 61 5f 61 72 67 28 61 70  me(db, va_arg(ap
1e3b0 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a  ,const char*));.
1e3c0 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62        db->init.b
1e3d0 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69  usy = db->init.i
1e3e0 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 3d 20 76  mposterTable = v
1e3f0 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
1e400 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65       db->init.ne
1e410 77 54 6e 75 6d 20 3d 20 76 61 5f 61 72 67 28 61  wTnum = va_arg(a
1e420 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  p,int);.      if
1e430 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
1e440 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e  =0 && db->init.n
1e450 65 77 54 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20  ewTnum>0 ){.    
1e460 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
1e470 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e  AllSchemasOfConn
1e480 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20  ection(db);.    
1e490 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1e4a0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1e4b0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
1e4c0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
1e4d0 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23  .  va_end(ap);.#
1e4e0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1e4f0 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53  OMIT_BUILTIN_TES
1e500 54 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  T */.  return rc
1e510 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1e520 69 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75  is a utility rou
1e530 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20  tine, useful to 
1e540 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
1e550 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73  ons, that checks
1e560 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20  .** to see if a 
1e570 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 61  database file wa
1e580 73 20 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e  s a URI that con
1e590 74 61 69 6e 65 64 20 61 20 73 70 65 63 69 66 69  tained a specifi
1e5a0 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61  c query .** para
1e5b0 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f  meter, and if so
1e5c0 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c   obtains the val
1e5d0 75 65 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  ue of the query 
1e5e0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
1e5f0 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
1e600 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
1e610 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20  ilename pointer 
1e620 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20  passed into the 
1e630 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f  xOpen().** metho
1e640 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65  d of a VFS imple
1e650 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
1e660 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20  zParam argument 
1e670 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
1e680 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61  he.** query para
1e690 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20  meter we seek.  
1e6a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
1e6b0 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  urns the value o
1e6c0 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20  f the zParam.** 
1e6d0 70 61 72 61 6d 65 74 65 72 20 69 66 20 69 74 20  parameter if it 
1e6e0 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65 20  exists.  If the 
1e6f0 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e  parameter does n
1e700 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 72  ot exist, this r
1e710 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
1e720 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
1e730 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
1e740 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72  *sqlite3_uri_par
1e750 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61  ameter(const cha
1e760 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f  r *zFilename, co
1e770 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
1e780 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  ){.  if( zFilena
1e790 6d 65 3d 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d  me==0 || zParam=
1e7a0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1e7b0 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
1e7c0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
1e7d0 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
1e7e0 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65  while( zFilename
1e7f0 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78  [0] ){.    int x
1e800 20 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e   = strcmp(zFilen
1e810 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20  ame, zParam);.  
1e820 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
1e830 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1e840 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
1e850 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65     if( x==0 ) re
1e860 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
1e870 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d      zFilename +=
1e880 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
1e890 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b  (zFilename) + 1;
1e8a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1e8b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1e8c0 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
1e8d0 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72   for a query par
1e8e0 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ameter..*/.int s
1e8f0 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
1e900 61 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  an(const char *z
1e910 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20  Filename, const 
1e920 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e  char *zParam, in
1e930 74 20 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73  t bDflt){.  cons
1e940 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  t char *z = sqli
1e950 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
1e960 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  r(zFilename, zPa
1e970 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20  ram);.  bDflt = 
1e980 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75  bDflt!=0;.  retu
1e990 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65  rn z ? sqlite3Ge
1e9a0 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c  tBoolean(z, bDfl
1e9b0 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f  t) : bDflt;.}../
1e9c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34  *.** Return a 64
1e9d0 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c  -bit integer val
1e9e0 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20 70  ue for a query p
1e9f0 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c  arameter..*/.sql
1ea00 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74  ite3_int64 sqlit
1ea10 65 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20  e3_uri_int64(.  
1ea20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1ea30 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c  ename,    /* Fil
1ea40 65 6e 61 6d 65 20 61 73 20 70 61 73 73 65 64 20  ename as passed 
1ea50 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f  to xOpen */.  co
1ea60 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
1ea70 2c 20 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70  ,       /* URI p
1ea80 61 72 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20  arameter sought 
1ea90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
1eaa0 36 34 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f  64 bDflt       /
1eab0 2a 20 72 65 74 75 72 6e 20 69 66 20 70 61 72 61  * return if para
1eac0 6d 65 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67  meter is missing
1ead0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
1eae0 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
1eaf0 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a  _uri_parameter(z
1eb00 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d  Filename, zParam
1eb10 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  );.  sqlite3_int
1eb20 36 34 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26  64 v;.  if( z &&
1eb30 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78   sqlite3DecOrHex
1eb40 54 6f 49 36 34 28 7a 2c 20 26 76 29 3d 3d 53 51  ToI64(z, &v)==SQ
1eb50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62  LITE_OK ){.    b
1eb60 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20  Dflt = v;.  }.  
1eb70 72 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a  return bDflt;.}.
1eb80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1eb90 65 20 42 74 72 65 65 20 70 6f 69 6e 74 65 72 20  e Btree pointer 
1eba0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a 44  identified by zD
1ebb0 62 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e  bName.  Return N
1ebc0 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
1ebd0 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69  ..*/.Btree *sqli
1ebe0 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65  te3DbNameToBtree
1ebf0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
1ec00 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
1ec10 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  e){.  int i;.  f
1ec20 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
1ec30 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
1ec40 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 0a   db->aDb[i].pBt.
1ec50 20 20 20 20 20 26 26 20 28 7a 44 62 4e 61 6d 65       && (zDbName
1ec60 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
1ec70 72 49 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 64  rICmp(zDbName, d
1ec80 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29  b->aDb[i].zName)
1ec90 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0).    ){.    
1eca0 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 44 62    return db->aDb
1ecb0 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 7d 0a 20  [i].pBt;.    }. 
1ecc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1ecd0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1ece0 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74  he filename of t
1ecf0 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f  he database asso
1ed00 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
1ed10 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
1ed20 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  tion..*/.const c
1ed30 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f  har *sqlite3_db_
1ed40 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 33  filename(sqlite3
1ed50 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
1ed60 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74   *zDbName){.  Bt
1ed70 72 65 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66  ree *pBt;.#ifdef
1ed80 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1ed90 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1eda0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1edb0 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
1edc0 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
1edd0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
1ede0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
1edf0 69 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74  if.  pBt = sqlit
1ee00 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28  e3DbNameToBtree(
1ee10 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  db, zDbName);.  
1ee20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c  return pBt ? sql
1ee30 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
1ee40 6e 61 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d  name(pBt) : 0;.}
1ee50 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  ../*.** Return 1
1ee60 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20   if database is 
1ee70 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69  read-only or 0 i
1ee80 66 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 52  f read/write.  R
1ee90 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e  eturn -1 if.** n
1eea0 6f 20 73 75 63 68 20 64 61 74 61 62 61 73 65 20  o such database 
1eeb0 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  exists..*/.int s
1eec0 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e  qlite3_db_readon
1eed0 6c 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ly(sqlite3 *db, 
1eee0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
1eef0 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  ame){.  Btree *p
1ef00 42 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  Bt;.#ifdef SQLIT
1ef10 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1ef20 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1ef30 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1ef40 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
1ef50 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1ef60 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  PT;.    return -
1ef70 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  1;.  }.#endif.  
1ef80 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  pBt = sqlite3DbN
1ef90 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
1efa0 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  DbName);.  retur
1efb0 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42  n pBt ? sqlite3B
1efc0 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 70  treeIsReadonly(p
1efd0 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a 0a 23 69 66  Bt) : -1;.}..#if
1efe0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
1eff0 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a  E_SNAPSHOT./*.**
1f000 20 4f 62 74 61 69 6e 20 61 20 73 6e 61 70 73 68   Obtain a snapsh
1f010 6f 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68  ot handle for th
1f020 65 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 64 61  e snapshot of da
1f030 74 61 62 61 73 65 20 7a 44 62 20 63 75 72 72 65  tabase zDb curre
1f040 6e 74 6c 79 20 0a 2a 2a 20 62 65 69 6e 67 20 72  ntly .** being r
1f050 65 61 64 20 62 79 20 68 61 6e 64 6c 65 20 64 62  ead by handle db
1f060 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f070 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 0a 20  _snapshot_get(. 
1f080 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
1f090 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1f0a0 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  ,.  sqlite3_snap
1f0b0 73 68 6f 74 20 2a 2a 70 70 53 6e 61 70 73 68 6f  shot **ppSnapsho
1f0c0 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t.){.  int rc = 
1f0d0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69  SQLITE_ERROR;.#i
1f0e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f0f0 54 5f 57 41 4c 0a 20 20 69 6e 74 20 69 44 62 3b  T_WAL.  int iDb;
1f100 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1f110 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1f120 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1f130 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1f140 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1f150 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
1f160 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  T;.  }.#endif.  
1f170 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1f180 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1f190 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
1f1a0 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
1f1b0 44 62 29 3b 0a 20 20 69 66 28 20 69 44 62 3d 3d  Db);.  if( iDb==
1f1c0 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20  0 || iDb>1 ){.  
1f1d0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
1f1e0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
1f1f0 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  .    if( 0==sqli
1f200 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
1f210 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
1f220 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1f230 65 42 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c  eBeginTrans(pBt,
1f240 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1f250 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f260 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1f270 69 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f  ite3PagerSnapsho
1f280 74 47 65 74 28 73 71 6c 69 74 65 33 42 74 72 65  tGet(sqlite3Btre
1f290 65 50 61 67 65 72 28 70 42 74 29 2c 20 70 70 53  ePager(pBt), ppS
1f2a0 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20  napshot);.      
1f2b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  }.    }.  }..  s
1f2c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1f2d0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23  ve(db->mutex);.#
1f2e0 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54  endif   /* SQLIT
1f2f0 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20  E_OMIT_WAL */.  
1f300 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f310 0a 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d  .** Open a read-
1f320 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74  transaction on t
1f330 68 65 20 73 6e 61 70 73 68 6f 74 20 69 64 65 6e  he snapshot iden
1f340 64 69 66 69 65 64 20 62 79 20 70 53 6e 61 70 73  dified by pSnaps
1f350 68 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  hot..*/.int sqli
1f360 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65  te3_snapshot_ope
1f370 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n(.  sqlite3 *db
1f380 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
1f390 2a 7a 44 62 2c 20 0a 20 20 73 71 6c 69 74 65 33  *zDb, .  sqlite3
1f3a0 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70  _snapshot *pSnap
1f3b0 73 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63  shot.){.  int rc
1f3c0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1f3d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f3e0 4f 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66  OMIT_WAL..#ifdef
1f3f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1f400 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1f410 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1f420 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
1f430 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1f440 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
1f450 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
1f460 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
1f470 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62  mutex);.  if( db
1f480 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20  ->autoCommit==0 
1f490 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 0a  ){.    int iDb;.
1f4a0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
1f4b0 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
1f4c0 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69 44  zDb);.    if( iD
1f4d0 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b  b==0 || iDb>1 ){
1f4e0 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
1f4f0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  t = db->aDb[iDb]
1f500 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
1f510 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 49  0==sqlite3BtreeI
1f520 73 49 6e 52 65 61 64 54 72 61 6e 73 28 70 42 74  sInReadTrans(pBt
1f530 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1f540 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e  = sqlite3PagerSn
1f550 61 70 73 68 6f 74 4f 70 65 6e 28 73 71 6c 69 74  apshotOpen(sqlit
1f560 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
1f570 29 2c 20 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20  ), pSnapshot);. 
1f580 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1f590 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f5a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f5b0 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
1f5c0 73 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  s(pBt, 0);.     
1f5d0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1f5e0 72 53 6e 61 70 73 68 6f 74 4f 70 65 6e 28 73 71  rSnapshotOpen(sq
1f5f0 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
1f600 70 42 74 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  pBt), 0);.      
1f610 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1f620 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
1f630 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1f640 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 20  >mutex);.#endif 
1f650 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    /* SQLITE_OMIT
1f660 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e  _WAL */.  return
1f670 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   rc;.}../*.** Fr
1f680 65 65 20 61 20 73 6e 61 70 73 68 6f 74 20 68 61  ee a snapshot ha
1f690 6e 64 6c 65 20 6f 62 74 61 69 6e 65 64 20 66 72  ndle obtained fr
1f6a0 6f 6d 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  om sqlite3_snaps
1f6b0 68 6f 74 5f 67 65 74 28 29 2e 0a 2a 2f 0a 76 6f  hot_get()..*/.vo
1f6c0 69 64 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  id sqlite3_snaps
1f6d0 68 6f 74 5f 66 72 65 65 28 73 71 6c 69 74 65 33  hot_free(sqlite3
1f6e0 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70  _snapshot *pSnap
1f6f0 73 68 6f 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  shot){.  sqlite3
1f700 5f 66 72 65 65 28 70 53 6e 61 70 73 68 6f 74 29  _free(pSnapshot)
1f710 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
1f720 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50  LITE_ENABLE_SNAP
1f730 53 48 4f 54 20 2a 2f 0a                          SHOT */.