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

Artifact fa3b9f523bcecf7b35d3f77ad1c091cd6902c74d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64  u.h".#endif.#ifd
0320: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0330: 5f 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74  _JSON1.int sqlit
0340: 65 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69  e3Json1Init(sqli
0350: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69  te3*);.#endif.#i
0360: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
0370: 4c 45 5f 46 54 53 35 0a 69 6e 74 20 73 71 6c 69  LE_FTS5.int sqli
0380: 74 65 33 46 74 73 35 49 6e 69 74 28 73 71 6c 69  te3Fts5Init(sqli
0390: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  te3*);.#endif..#
03a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d  ifndef SQLITE_AM
03b0: 41 4c 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d  ALGAMATION./* IM
03c0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
03d0: 20 52 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54   R-46656-45156 T
03e0: 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69  he sqlite3_versi
03f0: 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73  on[] string cons
0400: 74 61 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  tant.** contains
0410: 20 74 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c   the text of SQL
0420: 49 54 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72  ITE_VERSION macr
0430: 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  o. .*/.const cha
0440: 72 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  r sqlite3_versio
0450: 6e 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52  n[] = SQLITE_VER
0460: 53 49 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  SION;.#endif../*
0470: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0480: 4f 46 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37  OF: R-53536-4257
0490: 35 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  5 The sqlite3_li
04a0: 62 76 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74  bversion() funct
04b0: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61  ion returns.** a
04c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
04d0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  to the sqlite3_v
04e0: 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20  ersion[] string 
04f0: 63 6f 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f  constant. .*/.co
0500: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0510: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69  3_libversion(voi
0520: 64 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  d){ return sqlit
0530: 65 33 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f  e3_version; }../
0540: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
0550: 2d 4f 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33  -OF: R-63124-393
0560: 30 30 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73  00 The sqlite3_s
0570: 6f 75 72 63 65 69 64 28 29 20 66 75 6e 63 74 69  ourceid() functi
0580: 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20  on returns a.** 
0590: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
05a0: 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f  ing constant who
05b0: 73 65 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  se value is the 
05c0: 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53  same as the.** S
05d0: 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20  QLITE_SOURCE_ID 
05e0: 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d  C preprocessor m
05f0: 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20  acro. .*/.const 
0600: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f  char *sqlite3_so
0610: 75 72 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65  urceid(void){ re
0620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52  turn SQLITE_SOUR
0630: 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  CE_ID; }../* IMP
0640: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0650: 52 2d 33 35 32 31 30 2d 36 33 35 30 38 20 54 68  R-35210-63508 Th
0660: 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  e sqlite3_libver
0670: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75  sion_number() fu
0680: 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  nction.** return
0690: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75  s an integer equ
06a0: 61 6c 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52  al to SQLITE_VER
06b0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a  SION_NUMBER..*/.
06c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  int sqlite3_libv
06d0: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f  ersion_number(vo
06e0: 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  id){ return SQLI
06f0: 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
0700: 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  R; }../* IMPLEME
0710: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30  NTATION-OF: R-20
0720: 37 39 30 2d 31 34 30 32 35 20 54 68 65 20 73 71  790-14025 The sq
0730: 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65  lite3_threadsafe
0740: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
0750: 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61  rns.** zero if a
0760: 6e 64 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74  nd only if SQLit
0770: 65 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77  e was compiled w
0780: 69 74 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64  ith mutexing cod
0790: 65 20 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f  e omitted due to
07a0: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54  .** the SQLITE_T
07b0: 48 52 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c  HREADSAFE compil
07c0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65  e-time option be
07d0: 69 6e 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f  ing set to 0..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72  .int sqlite3_thr
07f0: 65 61 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72  eadsafe(void){ r
0800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52  eturn SQLITE_THR
0810: 45 41 44 53 41 46 45 3b 20 7d 0a 0a 2f 2a 0a 2a  EADSAFE; }../*.*
0820: 2a 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * When compiling
0830: 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72   the test fixtur
0840: 65 20 6f 72 20 77 69 74 68 20 64 65 62 75 67 67  e or with debugg
0850: 69 6e 67 20 65 6e 61 62 6c 65 64 20 28 6f 6e 20  ing enabled (on 
0860: 57 69 6e 33 32 29 2c 0a 2a 2a 20 74 68 69 73 20  Win32),.** this 
0870: 76 61 72 69 61 62 6c 65 20 62 65 69 6e 67 20 73  variable being s
0880: 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 77  et to non-zero w
0890: 69 6c 6c 20 63 61 75 73 65 20 4f 53 54 52 41 43  ill cause OSTRAC
08a0: 45 20 6d 61 63 72 6f 73 20 74 6f 20 65 6d 69 74  E macros to emit
08b0: 0a 2a 2a 20 65 78 74 72 61 20 64 69 61 67 6e 6f  .** extra diagno
08c0: 73 74 69 63 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  stic information
08d0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
08e0: 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
08f0: 0a 23 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  .# ifndef SQLITE
0900: 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 0a  _DEBUG_OS_TRACE.
0910: 23 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  #   define SQLIT
0920: 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45  E_DEBUG_OS_TRACE
0930: 20 30 0a 23 20 65 6e 64 69 66 0a 20 20 69 6e 74   0.# endif.  int
0940: 20 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 20   sqlite3OSTrace 
0950: 3d 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f  = SQLITE_DEBUG_O
0960: 53 5f 54 52 41 43 45 3b 0a 23 65 6e 64 69 66 0a  S_TRACE;.#endif.
0970: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0980: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
0990: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
09a0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
09b0: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E)./*.** If the 
09c0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
09d0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  on pointer is no
09e0: 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a 2a 2a  t NULL and if.**
09f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
0a00: 4f 54 52 41 43 45 20 69 73 20 65 6e 61 62 6c 65  OTRACE is enable
0a10: 64 2c 20 74 68 65 6e 20 6d 65 73 73 61 67 65 73  d, then messages
0a20: 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20 49   describing.** I
0a30: 2f 4f 20 61 63 74 69 76 65 20 61 72 65 20 77 72  /O active are wr
0a40: 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68 69 73  itten using this
0a50: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 73   function.  Thes
0a60: 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20 61 72  e messages.** ar
0a70: 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 64  e intended for d
0a80: 65 62 75 67 67 69 6e 67 20 61 63 74 69 76 69 74  ebugging activit
0a90: 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53 51 4c 49 54  y only..*/.SQLIT
0aa0: 45 5f 41 50 49 20 76 6f 69 64 20 28 53 51 4c 49  E_API void (SQLI
0ab0: 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74 65  TE_CDECL *sqlite
0ac0: 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20  3IoTrace)(const 
0ad0: 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b  char*, ...) = 0;
0ae0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
0af0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0b00: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
0b10: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
0b20: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  ng which is the.
0b30: 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  ** name of a dir
0b40: 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61  ectory, then tha
0b50: 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  t directory will
0b60: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
0b70: 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66  e.** temporary f
0b80: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  iles..**.** See 
0b90: 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41  also the "PRAGMA
0ba0: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
0bb0: 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61  ctory" SQL comma
0bc0: 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nd..*/.char *sql
0bd0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
0be0: 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ory = 0;../*.** 
0bf0: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0c00: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0c10: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0c20: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0c30: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0c40: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0c50: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0c60: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0c70: 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62 61  re.** all databa
0c80: 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66 69  se files specifi
0c90: 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ed with a relati
0ca0: 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a 0a  ve pathname..**.
0cb0: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  ** See also the 
0cc0: 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f  "PRAGMA data_sto
0cd0: 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53 51  re_directory" SQ
0ce0: 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68  L command..*/.ch
0cf0: 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74 61  ar *sqlite3_data
0d00: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  _directory = 0;.
0d10: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0d20: 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a 2a  e SQLite.  .**.*
0d30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0d40: 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ust be called to
0d50: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
0d60: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
0d70: 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20 6d  n,.** VFS, and m
0d80: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73 20  utex subsystems 
0d90: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61  prior to doing a
0da0: 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b 20  ny serious work 
0db0: 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e 20  with.** SQLite. 
0dc0: 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73 20   But as long as 
0dd0: 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70 69  you do not compi
0de0: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f  le with SQLITE_O
0df0: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a 20  MIT_AUTOINIT.** 
0e00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
0e10: 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74 6f  l be called auto
0e20: 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65 79  matically by key
0e30: 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20 61   routines such a
0e40: 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  s.** sqlite3_ope
0e50: 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  n().  .**.** Thi
0e60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
0e70: 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20 69  o-op except on i
0e80: 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63 61  ts very first ca
0e90: 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63 65  ll for the proce
0ea0: 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74 68  ss,.** or for th
0eb0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66 74  e first call aft
0ec0: 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
0ed0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a 2a  ite3_shutdown..*
0ee0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
0ef0: 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74 68  hread to call th
0f00: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
0f10: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
0f20: 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65 74  on to.** complet
0f30: 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71 75  ion.  If subsequ
0f40: 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c 6c  ent threads call
0f50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
0f60: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  fore the first.*
0f70: 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69 6e  * thread has fin
0f80: 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69 61  ished the initia
0f90: 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73  lization process
0fa0: 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73 65  , then the subse
0fb0: 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64 73  quent.** threads
0fc0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fd0: 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  l the first thre
0fe0: 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74 68  ad finishes with
0ff0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1000: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
1010: 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67 68  irst thread migh
1020: 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  t call this rout
1030: 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79 2e  ine recursively.
1040: 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20 63    Recursive.** c
1050: 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75  alls to this rou
1060: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tine should not 
1070: 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73 65  block, of course
1080: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
1090: 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  .** initializati
10a0: 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c 64  on process would
10b0: 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65 2e   never complete.
10c0: 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65 20  .**.** Let X be 
10d0: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  the first thread
10e0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 72   to enter this r
10f0: 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20 62  outine.  Let Y b
1100: 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  e some other.** 
1110: 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77 68  thread.  Then wh
1120: 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ile the initial 
1130: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  invocation of th
1140: 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58 20  is routine by X 
1150: 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74 65  is.** incomplete
1160: 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65 64  , it is required
1170: 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   that:.**.**    
1180: 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69 73  *  Calls to this
1190: 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59 20   routine from Y 
11a0: 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69 6c  must block until
11b0: 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74 0a   the outer-most.
11c0: 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62 79  **       call by
11d0: 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a 2a   X completes..**
11e0: 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72 73  .**    *  Recurs
11f0: 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68 69  ive calls to thi
1200: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
1210: 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20 69  hread X return i
1220: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
1230: 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f 63      without bloc
1240: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
1250: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1260: 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f 4c  void){.  MUTEX_L
1270: 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
1280: 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20  tex *pMaster; ) 
1290: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
12a0: 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a  n static mutex *
12b0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1300: 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69 6e  _EXTRA_INIT.  in
1310: 74 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20  t bRunExtraInit 
1320: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
1340: 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  tra initializati
1350: 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6e  on needed */.#en
1360: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1370: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63  TE_OMIT_WSD.  rc
1380: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
1390: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
13a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13b0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
13c0: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
13d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 6f 6c  .  /* If the fol
13e0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20  lowing assert() 
13f0: 66 61 69 6c 73 20 6f 6e 20 73 6f 6d 65 20 6f 62  fails on some ob
1400: 73 63 75 72 65 20 70 72 6f 63 65 73 73 6f 72 2f  scure processor/
1410: 63 6f 6d 70 69 6c 65 72 0a 20 20 2a 2a 20 63 6f  compiler.  ** co
1420: 6d 62 69 6e 61 74 69 6f 6e 2c 20 74 68 65 20 77  mbination, the w
1430: 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 74 6f  ork-around is to
1440: 20 73 65 74 20 74 68 65 20 63 6f 72 72 65 63 74   set the correct
1450: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 73 69   pointer.  ** si
1460: 7a 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ze at compile-ti
1470: 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  me using -DSQLIT
1480: 45 5f 50 54 52 53 49 5a 45 3d 6e 20 63 6f 6d 70  E_PTRSIZE=n comp
1490: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
14a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  */.  assert( SQL
14b0: 49 54 45 5f 50 54 52 53 49 5a 45 3d 3d 73 69 7a  ITE_PTRSIZE==siz
14c0: 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 0a 20  eof(char*) );.. 
14d0: 20 2f 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73   /* If SQLite is
14e0: 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c 65 74   already complet
14f0: 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  ely initialized,
1500: 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 0a   then this call.
1510: 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
1520: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 73 68 6f  initialize() sho
1530: 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20  uld be a no-op. 
1540: 20 42 75 74 20 74 68 65 20 69 6e 69 74 69 61 6c   But the initial
1550: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d 75 73  ization.  ** mus
1560: 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e 20 20  t be complete.  
1570: 53 6f 20 69 73 49 6e 69 74 20 6d 75 73 74 20 6e  So isInit must n
1580: 6f 74 20 62 65 20 73 65 74 20 75 6e 74 69 6c 20  ot be set until 
1590: 74 68 65 20 76 65 72 79 20 65 6e 64 0a 20 20 2a  the very end.  *
15a0: 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * of this routin
15b0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  e..  */.  if( sq
15c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15d0: 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72  g.isInit ) retur
15e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
15f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
1600: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
1610: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   is initialized.
1620: 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 0a    If unable to .
1630: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
1640: 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  the mutex subsys
1650: 74 65 6d 2c 20 72 65 74 75 72 6e 20 65 61 72 6c  tem, return earl
1660: 79 20 77 69 74 68 20 74 68 65 20 65 72 72 6f 72  y with the error
1670: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 79  ..  ** If the sy
1680: 73 74 65 6d 20 69 73 20 73 6f 20 73 69 63 6b 20  stem is so sick 
1690: 74 68 61 74 20 77 65 20 61 72 65 20 75 6e 61 62  that we are unab
16a0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  le to allocate a
16b0: 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20 74 68 65   mutex,.  ** the
16c0: 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 53  re is not much S
16d0: 51 4c 69 74 65 20 69 73 20 67 6f 69 6e 67 20 74  QLite is going t
16e0: 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 2e  o be able to do.
16f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d  .  **.  ** The m
1700: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 20 6d  utex subsystem m
1710: 75 73 74 20 74 61 6b 65 20 63 61 72 65 20 6f 66  ust take care of
1720: 20 73 65 72 69 61 6c 69 7a 69 6e 67 20 69 74 73   serializing its
1730: 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69 74 69 61   own.  ** initia
1740: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  lization..  */. 
1750: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 75 74   rc = sqlite3Mut
1760: 65 78 49 6e 69 74 28 29 3b 0a 20 20 69 66 28 20  exInit();.  if( 
1770: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1780: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1790: 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20 73 79   the malloc() sy
17a0: 73 74 65 6d 20 61 6e 64 20 74 68 65 20 72 65 63  stem and the rec
17b0: 75 72 73 69 76 65 20 70 49 6e 69 74 4d 75 74 65  ursive pInitMute
17c0: 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a 20 54 68  x mutex..  ** Th
17d0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  is operation is 
17e0: 70 72 6f 74 65 63 74 65 64 20 62 79 20 74 68 65  protected by the
17f0: 20 53 54 41 54 49 43 5f 4d 41 53 54 45 52 20 6d   STATIC_MASTER m
1800: 75 74 65 78 2e 20 20 4e 6f 74 65 20 74 68 61 74  utex.  Note that
1810: 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c 6c 6f 63  .  ** MutexAlloc
1820: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  () is called for
1830: 20 61 20 73 74 61 74 69 63 20 6d 75 74 65 78 20   a static mutex 
1840: 70 72 69 6f 72 20 74 6f 20 69 6e 69 74 69 61 6c  prior to initial
1850: 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6d  izing the.  ** m
1860: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20  alloc subsystem 
1870: 2d 20 74 68 69 73 20 69 6d 70 6c 69 65 73 20 74  - this implies t
1880: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
1890: 6f 6e 20 6f 66 20 61 20 73 74 61 74 69 63 0a 20  on of a static. 
18a0: 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74 20 6e   ** mutex must n
18b0: 6f 74 20 72 65 71 75 69 72 65 20 73 75 70 70 6f  ot require suppo
18c0: 72 74 20 66 72 6f 6d 20 74 68 65 20 6d 61 6c 6c  rt from the mall
18d0: 6f 63 20 73 75 62 73 79 73 74 65 6d 2e 0a 20 20  oc subsystem..  
18e0: 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  */.  MUTEX_LOGIC
18f0: 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69  ( pMaster = sqli
1900: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
1910: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1920: 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73  C_MASTER); ).  s
1930: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1940: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
1950: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1960: 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d  ig.isMutexInit =
1970: 20 31 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   1;.  if( !sqlit
1980: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1990: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
19a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
19b0: 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a 20 20 7d  allocInit();.  }
19c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
19e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
19f0: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 31  isMallocInit = 1
1a00: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
1a10: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1a20: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1a30: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1a40: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
1a50: 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 73  x =.           s
1a60: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1a70: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
1a80: 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20 20  CURSIVE);.      
1a90: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1aa0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
1ab0: 65 78 20 26 26 20 21 73 71 6c 69 74 65 33 47 6c  ex && !sqlite3Gl
1ac0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1ad0: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
1ae0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1af0: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  EM_BKPT;.      }
1b00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1b10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  {.    sqlite3Glo
1b30: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
1b40: 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20  itMutex++;.  }. 
1b50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1b60: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a  eave(pMaster);..
1b70: 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f    /* If rc is no
1b80: 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74  t SQLITE_OK at t
1b90: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
1ba0: 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f  either the mallo
1bb0: 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d  c.  ** subsystem
1bc0: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e   could not be in
1bd0: 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65  itialized or the
1be0: 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74   system failed t
1bf0: 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20  o allocate.  ** 
1c00: 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d  the pInitMutex m
1c10: 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20  utex. Return an 
1c20: 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20  error in either 
1c30: 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  case.  */.  if( 
1c40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c50: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1c60: 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65    }..  /* Do the
1c70: 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69   rest of the ini
1c80: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65  tialization unde
1c90: 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  r the recursive 
1ca0: 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68  mutex so.  ** th
1cb0: 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62  at we will be ab
1cc0: 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63  le to handle rec
1cd0: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74  ursive calls int
1ce0: 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69  o.  ** sqlite3_i
1cf0: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68  nitialize().  Th
1d00: 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1d10: 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20  s normally come 
1d20: 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c  through.  ** sql
1d30: 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77  ite3_os_init() w
1d40: 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73  hen it invokes s
1d50: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1d60: 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72  ter(), but other
1d70: 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20  .  ** recursive 
1d80: 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f  calls might also
1d90: 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20   be possible..  
1da0: 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
1db0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31  TATION-OF: R-001
1dc0: 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20  40-37445 SQLite 
1dd0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
1de0: 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20  rializes calls. 
1df0: 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74   ** to the xInit
1e00: 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20   method, so the 
1e10: 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65  xInit method nee
1e20: 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73  d not be threads
1e30: 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  afe..  **.  ** T
1e40: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74  he following mut
1e50: 65 78 20 69 73 20 77 68 61 74 20 73 65 72 69 61  ex is what seria
1e60: 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20  lizes access to 
1e70: 74 68 65 20 61 70 70 64 65 66 20 70 63 61 63 68  the appdef pcach
1e80: 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74  e xInit.  ** met
1e90: 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74  hods.  The sqlit
1ea0: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
1eb0: 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73  s.xInit() all is
1ec0: 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65   embedded in the
1ed0: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
1ee0: 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69  lite3PcacheIniti
1ef0: 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  alize()..  */.  
1f00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1f10: 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ter(sqlite3Globa
1f20: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
1f30: 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ex);.  if( sqlit
1f40: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1f50: 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69  sInit==0 && sqli
1f60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f70: 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b  inProgress==0 ){
1f80: 0a 20 20 20 20 46 75 6e 63 44 65 66 48 61 73 68  .    FuncDefHash
1f90: 20 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41   *pHash = &GLOBA
1fa0: 4c 28 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73  L(FuncDefHash, s
1fb0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63  qlite3GlobalFunc
1fc0: 74 69 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69  tions);.    sqli
1fd0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1fe0: 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a  inProgress = 1;.
1ff0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2000: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20  ABLE_SQLLOG.    
2010: 7b 0a 20 20 20 20 20 20 65 78 74 65 72 6e 20 76  {.      extern v
2020: 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  oid sqlite3_init
2030: 5f 73 71 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a 20  _sqllog(void);. 
2040: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 69       sqlite3_ini
2050: 74 5f 73 71 6c 6c 6f 67 28 29 3b 0a 20 20 20 20  t_sqllog();.    
2060: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d  }.#endif.    mem
2070: 73 65 74 28 70 48 61 73 68 2c 20 30 2c 20 73 69  set(pHash, 0, si
2080: 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f 62  zeof(sqlite3Glob
2090: 61 6c 46 75 6e 63 74 69 6f 6e 73 29 29 3b 0a 20  alFunctions));. 
20a0: 20 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74     sqlite3Regist
20b0: 65 72 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e  erGlobalFunction
20c0: 73 28 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  s();.    if( sql
20d0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
20e0: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 3d 3d 30  .isPCacheInit==0
20f0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2100: 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74  qlite3PcacheInit
2110: 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20 7d 0a  ialize();.    }.
2120: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2130: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
2140: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2150: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20  ig.isPCacheInit 
2160: 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 1;.      rc = 
2170: 73 71 6c 69 74 65 33 4f 73 49 6e 69 74 28 29 3b  sqlite3OsInit();
2180: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2190: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61        sqlite3PCa
21b0: 63 68 65 42 75 66 66 65 72 53 65 74 75 70 28 20  cheBufferSetup( 
21c0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
21d0: 66 69 67 2e 70 50 61 67 65 2c 20 0a 20 20 20 20  fig.pPage, .    
21e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
21f0: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65  balConfig.szPage
2200: 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  , sqlite3GlobalC
2210: 6f 6e 66 69 67 2e 6e 50 61 67 65 29 3b 0a 20 20  onfig.nPage);.  
2220: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2230: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d  lConfig.isInit =
2240: 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   1;.#ifdef SQLIT
2250: 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 20  E_EXTRA_INIT.   
2260: 20 20 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74     bRunExtraInit
2270: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 1;.#endif.   
2280: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c   }.    sqlite3Gl
2290: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
22a0: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 7d 0a 20  gress = 0;.  }. 
22b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
22c0: 65 61 76 65 28 73 71 6c 69 74 65 33 47 6c 6f 62  eave(sqlite3Glob
22d0: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
22e0: 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62  tex);..  /* Go b
22f0: 61 63 6b 20 75 6e 64 65 72 20 74 68 65 20 73 74  ack under the st
2300: 61 74 69 63 20 6d 75 74 65 78 20 61 6e 64 20 63  atic mutex and c
2310: 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65 63 75  lean up the recu
2320: 72 73 69 76 65 0a 20 20 2a 2a 20 6d 75 74 65 78  rsive.  ** mutex
2330: 20 74 6f 20 70 72 65 76 65 6e 74 20 61 20 72 65   to prevent a re
2340: 73 6f 75 72 63 65 20 6c 65 61 6b 2e 0a 20 20 2a  source leak..  *
2350: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
2360: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
2370: 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ;.  sqlite3Globa
2380: 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74  lConfig.nRefInit
2390: 4d 75 74 65 78 2d 2d 3b 0a 20 20 69 66 28 20 73  Mutex--;.  if( s
23a0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
23b0: 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78  ig.nRefInitMutex
23c0: 3c 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  <=0 ){.    asser
23d0: 74 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  t( sqlite3Global
23e0: 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d  Config.nRefInitM
23f0: 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73  utex==0 );.    s
2400: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
2410: 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  e(sqlite3GlobalC
2420: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
2430: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
2440: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
2450: 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20  Mutex = 0;.  }. 
2460: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
2470: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a  eave(pMaster);..
2480: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
2490: 6e 67 20 69 73 20 6a 75 73 74 20 61 20 73 61 6e  ng is just a san
24a0: 69 74 79 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ity check to mak
24b0: 65 20 73 75 72 65 20 53 51 4c 69 74 65 20 68 61  e sure SQLite ha
24c0: 73 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70  s.  ** been comp
24d0: 69 6c 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20  iled correctly. 
24e0: 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   It is important
24f0: 20 74 6f 20 72 75 6e 20 74 68 69 73 20 63 6f 64   to run this cod
2500: 65 2c 20 62 75 74 0a 20 20 2a 2a 20 77 65 20 64  e, but.  ** we d
2510: 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 75 6e  on't want to run
2520: 20 69 74 20 74 6f 6f 20 6f 66 74 65 6e 20 61 6e   it too often an
2530: 64 20 73 6f 61 6b 20 75 70 20 43 50 55 20 63 79  d soak up CPU cy
2540: 63 6c 65 73 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a  cles for no.  **
2550: 20 72 65 61 73 6f 6e 2e 20 20 53 6f 20 77 65 20   reason.  So we 
2560: 72 75 6e 20 69 74 20 6f 6e 63 65 20 64 75 72 69  run it once duri
2570: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ng initializatio
2580: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  n..  */.#ifndef 
2590: 4e 44 45 42 55 47 0a 23 69 66 6e 64 65 66 20 53  NDEBUG.#ifndef S
25a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
25b0: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 54  ING_POINT.  /* T
25c0: 68 69 73 20 73 65 63 74 69 6f 6e 20 6f 66 20 63  his section of c
25d0: 6f 64 65 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70  ode's only "outp
25e0: 75 74 22 20 69 73 20 76 69 61 20 61 73 73 65 72  ut" is via asser
25f0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  t() statements. 
2600: 2a 2f 0a 20 20 69 66 20 28 20 72 63 3d 3d 53 51  */.  if ( rc==SQ
2610: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
2620: 36 34 20 78 20 3d 20 28 28 28 75 36 34 29 31 29  64 x = (((u64)1)
2630: 3c 3c 36 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75  <<63)-1;.    dou
2640: 62 6c 65 20 79 3b 0a 20 20 20 20 61 73 73 65 72  ble y;.    asser
2650: 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b  t(sizeof(x)==8);
2660: 0a 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65  .    assert(size
2670: 6f 66 28 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29  of(x)==sizeof(y)
2680: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 79  );.    memcpy(&y
2690: 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20 61 73  , &x, 8);.    as
26a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 49 73 4e  sert( sqlite3IsN
26b0: 61 4e 28 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e  aN(y) );.  }.#en
26c0: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  dif.#endif..  /*
26d0: 20 44 6f 20 65 78 74 72 61 20 69 6e 69 74 69 61   Do extra initia
26e0: 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 72  lization steps r
26f0: 65 71 75 65 73 74 65 64 20 62 79 20 74 68 65 20  equested by the 
2700: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2710: 54 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74  T.  ** compile-t
2720: 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20 20 2a 2f  ime option..  */
2730: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2740: 58 54 52 41 5f 49 4e 49 54 0a 20 20 69 66 28 20  XTRA_INIT.  if( 
2750: 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20 29 7b  bRunExtraInit ){
2760: 0a 20 20 20 20 69 6e 74 20 53 51 4c 49 54 45 5f  .    int SQLITE_
2770: 45 58 54 52 41 5f 49 4e 49 54 28 63 6f 6e 73 74  EXTRA_INIT(const
2780: 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 72 63 20   char*);.    rc 
2790: 3d 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  = SQLITE_EXTRA_I
27a0: 4e 49 54 28 30 29 3b 0a 20 20 7d 0a 23 65 6e 64  NIT(0);.  }.#end
27b0: 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
27c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 74  .}../*.** Undo t
27d0: 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 73 71  he effects of sq
27e0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
27f0: 28 29 2e 20 20 4d 75 73 74 20 6e 6f 74 20 62 65  ().  Must not be
2800: 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 0a 2a 2a   called while.**
2810: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
2820: 61 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65 20  anding database 
2830: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d  connections or m
2840: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2850: 73 20 6f 72 0a 2a 2a 20 77 68 69 6c 65 20 61 6e  s or.** while an
2860: 79 20 70 61 72 74 20 6f 66 20 53 51 4c 69 74 65  y part of SQLite
2870: 20 69 73 20 6f 74 68 65 72 77 69 73 65 20 69 6e   is otherwise in
2880: 20 75 73 65 20 69 6e 20 61 6e 79 20 74 68 72 65   use in any thre
2890: 61 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ad.  This.** rou
28a0: 74 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 72 65  tine is not thre
28b0: 61 64 73 61 66 65 2e 20 20 42 75 74 20 69 74 20  adsafe.  But it 
28c0: 69 73 20 73 61 66 65 20 74 6f 20 69 6e 76 6f 6b  is safe to invok
28d0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  e this routine.*
28e0: 2a 20 6f 6e 20 77 68 65 6e 20 53 51 4c 69 74 65  * on when SQLite
28f0: 20 69 73 20 61 6c 72 65 61 64 79 20 73 68 75 74   is already shut
2900: 20 64 6f 77 6e 2e 20 20 49 66 20 53 51 4c 69 74   down.  If SQLit
2910: 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 68 75  e is already shu
2920: 74 20 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e 20 74  t down.** when t
2930: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
2940: 6e 76 6f 6b 65 64 2c 20 74 68 65 6e 20 74 68 69  nvoked, then thi
2950: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68  s routine is a h
2960: 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a  armless no-op..*
2970: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 68  /.int sqlite3_sh
2980: 75 74 64 6f 77 6e 28 76 6f 69 64 29 7b 0a 23 69  utdown(void){.#i
2990: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
29a0: 5f 57 53 44 0a 20 20 69 6e 74 20 72 63 20 3d 20  _WSD.  int rc = 
29b0: 73 71 6c 69 74 65 33 5f 77 73 64 5f 69 6e 69 74  sqlite3_wsd_init
29c0: 28 34 30 39 36 2c 20 32 34 29 3b 0a 20 20 69 66  (4096, 24);.  if
29d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29e0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
29f0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2a00: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2a10: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29  lConfig.isInit )
2a20: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
2a30: 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e 0a 20  EXTRA_SHUTDOWN. 
2a40: 20 20 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 45     void SQLITE_E
2a50: 58 54 52 41 5f 53 48 55 54 44 4f 57 4e 28 76 6f  XTRA_SHUTDOWN(vo
2a60: 69 64 29 3b 0a 20 20 20 20 53 51 4c 49 54 45 5f  id);.    SQLITE_
2a70: 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e 28 29  EXTRA_SHUTDOWN()
2a80: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
2a90: 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 3b 0a 20  ite3_os_end();. 
2aa0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74     sqlite3_reset
2ab0: 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28  _auto_extension(
2ac0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
2ad0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69  obalConfig.isIni
2ae0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
2af0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2b00: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2b10: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2b20: 50 63 61 63 68 65 53 68 75 74 64 6f 77 6e 28 29  PcacheShutdown()
2b30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
2b40: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
2b50: 68 65 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  heInit = 0;.  }.
2b60: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2b70: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c  balConfig.isMall
2b80: 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  ocInit ){.    sq
2b90: 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28 29  lite3MallocEnd()
2ba0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
2bb0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c  balConfig.isMall
2bc0: 6f 63 49 6e 69 74 20 3d 20 30 3b 0a 0a 23 69 66  ocInit = 0;..#if
2bd0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2be0: 5f 53 48 55 54 44 4f 57 4e 5f 44 49 52 45 43 54  _SHUTDOWN_DIRECT
2bf0: 4f 52 49 45 53 0a 20 20 20 20 2f 2a 20 54 68 65  ORIES.    /* The
2c00: 20 68 65 61 70 20 73 75 62 73 79 73 74 65 6d 20   heap subsystem 
2c10: 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 73 68 75  has now been shu
2c20: 74 64 6f 77 6e 20 61 6e 64 20 74 68 65 73 65 20  tdown and these 
2c30: 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f  values are suppo
2c40: 73 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  sed.    ** to be
2c50: 20 4e 55 4c 4c 20 6f 72 20 70 6f 69 6e 74 20 74   NULL or point t
2c60: 6f 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61  o memory that wa
2c70: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
2c80: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
2c90: 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77  ,.    ** which w
2ca0: 6f 75 6c 64 20 72 65 6c 79 20 6f 6e 20 74 68 61  ould rely on tha
2cb0: 74 20 68 65 61 70 20 73 75 62 73 79 73 74 65 6d  t heap subsystem
2cc0: 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 6d 61 6b  ; therefore, mak
2cd0: 65 20 73 75 72 65 20 74 68 65 73 65 0a 20 20 20  e sure these.   
2ce0: 20 2a 2a 20 76 61 6c 75 65 73 20 63 61 6e 6e 6f   ** values canno
2cf0: 74 20 72 65 66 65 72 20 74 6f 20 68 65 61 70 20  t refer to heap 
2d00: 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20  memory that was 
2d10: 6a 75 73 74 20 69 6e 76 61 6c 69 64 61 74 65 64  just invalidated
2d20: 20 77 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   when the.    **
2d30: 20 68 65 61 70 20 73 75 62 73 79 73 74 65 6d 20   heap subsystem 
2d40: 77 61 73 20 73 68 75 74 64 6f 77 6e 2e 20 20 54  was shutdown.  T
2d50: 68 69 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e 65  his is only done
2d60: 20 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   if the current 
2d70: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 74  call to.    ** t
2d80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73  his function res
2d90: 75 6c 74 65 64 20 69 6e 20 74 68 65 20 68 65 61  ulted in the hea
2da0: 70 20 73 75 62 73 79 73 74 65 6d 20 61 63 74 75  p subsystem actu
2db0: 61 6c 6c 79 20 62 65 69 6e 67 20 73 68 75 74 64  ally being shutd
2dc0: 6f 77 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  own..    */.    
2dd0: 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
2de0: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20  ectory = 0;.    
2df0: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
2e00: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23 65 6e 64  ectory = 0;.#end
2e10: 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  if.  }.  if( sql
2e20: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2e30: 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 29 7b 0a  .isMutexInit ){.
2e40: 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78      sqlite3Mutex
2e50: 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  End();.    sqlit
2e60: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2e70: 73 4d 75 74 65 78 49 6e 69 74 20 3d 20 30 3b 0a  sMutexInit = 0;.
2e80: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
2e90: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2ea0: 2a 20 54 68 69 73 20 41 50 49 20 61 6c 6c 6f 77  * This API allow
2eb0: 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74  s applications t
2ec0: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 67 6c 6f  o modify the glo
2ed0: 62 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  bal configuratio
2ee0: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69  n of.** the SQLi
2ef0: 74 65 20 6c 69 62 72 61 72 79 20 61 74 20 72 75  te library at ru
2f00: 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  n-time..**.** Th
2f10: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
2f20: 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  d only be called
2f30: 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
2f40: 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a  no outstanding.*
2f50: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
2f60: 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79  ctions or memory
2f70: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 54   allocations.  T
2f80: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
2f90: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 61 66 65  ot.** threadsafe
2fa0: 2e 20 20 46 61 69 6c 75 72 65 20 74 6f 20 68 65  .  Failure to he
2fb0: 65 64 20 74 68 65 73 65 20 77 61 72 6e 69 6e 67  ed these warning
2fc0: 73 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 75 6e  s can lead to un
2fd0: 70 72 65 64 69 63 74 61 62 6c 65 0a 2a 2a 20 62  predictable.** b
2fe0: 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  ehavior..*/.int 
2ff0: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 69  sqlite3_config(i
3000: 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76  nt op, ...){.  v
3010: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74  a_list ap;.  int
3020: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
3030: 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63  ..  /* sqlite3_c
3040: 6f 6e 66 69 67 28 29 20 73 68 61 6c 6c 20 72 65  onfig() shall re
3050: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
3060: 53 45 20 69 66 20 69 74 20 69 73 20 69 6e 76 6f  SE if it is invo
3070: 6b 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74  ked while.  ** t
3080: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
3090: 79 20 69 73 20 69 6e 20 75 73 65 2e 20 2a 2f 0a  y is in use. */.
30a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
30b0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
30c0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
30d0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20  _MISUSE_BKPT;.. 
30e0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70   va_start(ap, op
30f0: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  );.  switch( op 
3100: 29 7b 0a 0a 20 20 20 20 2f 2a 20 4d 75 74 65 78  ){..    /* Mutex
3110: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   configuration o
3120: 70 74 69 6f 6e 73 20 61 72 65 20 6f 6e 6c 79 20  ptions are only 
3130: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 20 74  available in a t
3140: 68 72 65 61 64 73 61 66 65 0a 20 20 20 20 2a 2a  hreadsafe.    **
3150: 20 63 6f 6d 70 69 6c 65 2e 0a 20 20 20 20 2a 2f   compile..    */
3160: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
3170: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20  ITE_THREADSAFE) 
3180: 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  && SQLITE_THREAD
3190: 53 41 46 45 3e 30 20 20 2f 2a 20 49 4d 50 3a 20  SAFE>0  /* IMP: 
31a0: 52 2d 35 34 34 36 36 2d 34 36 37 35 36 20 2a 2f  R-54466-46756 */
31b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
31c0: 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48  _CONFIG_SINGLETH
31d0: 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  READ: {.      /*
31e0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
31f0: 30 32 37 34 38 2d 31 39 30 39 36 20 54 68 69 73  02748-19096 This
3200: 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65   option sets the
3210: 20 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20   threading mode 
3220: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 69 6e 67  to.      ** Sing
3230: 6c 65 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  le-thread. */.  
3240: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3250: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
3260: 65 78 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61  ex = 0;  /* Disa
3270: 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72  ble mutex on cor
3280: 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
3290: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
32a0: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20  FullMutex = 0;  
32b0: 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78  /* Disable mutex
32c0: 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   on connections 
32d0: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
32e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
32f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3300: 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53  THREADSAFE) && S
3310: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
3320: 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 30 35  >0 /* IMP: R-205
3330: 32 30 2d 35 34 30 38 36 20 2a 2f 0a 20 20 20 20  20-54086 */.    
3340: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3350: 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a 20  IG_MULTITHREAD: 
3360: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
3370: 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 33 37 34 2d  NCE-OF: R-14374-
3380: 34 32 34 36 38 20 54 68 69 73 20 6f 70 74 69 6f  42468 This optio
3390: 6e 20 73 65 74 73 20 74 68 65 20 74 68 72 65 61  n sets the threa
33a0: 64 69 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20  ding mode to.   
33b0: 20 20 20 2a 2a 20 4d 75 6c 74 69 2d 74 68 72 65     ** Multi-thre
33c0: 61 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ad. */.      sql
33d0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
33e0: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b  .bCoreMutex = 1;
33f0: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65    /* Enable mute
3400: 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20  x on core */.   
3410: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3420: 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
3430: 78 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62  x = 0;  /* Disab
3440: 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e  le mutex on conn
3450: 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20  ections */.     
3460: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
3470: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
3480: 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41  (SQLITE_THREADSA
3490: 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  FE) && SQLITE_TH
34a0: 52 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d  READSAFE>0 /* IM
34b0: 50 3a 20 52 2d 35 39 35 39 33 2d 32 31 38 31 30  P: R-59593-21810
34c0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
34d0: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41  ITE_CONFIG_SERIA
34e0: 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f  LIZED: {.      /
34f0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
3500: 2d 34 31 32 32 30 2d 35 31 38 30 30 20 54 68 69  -41220-51800 Thi
3510: 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68  s option sets th
3520: 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65  e threading mode
3530: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 65 72   to.      ** Ser
3540: 69 61 6c 69 7a 65 64 2e 20 2a 2f 0a 20 20 20 20  ialized. */.    
3550: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3560: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
3570: 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65   = 1;  /* Enable
3580: 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a   mutex on core *
3590: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
35a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c  lobalConfig.bFul
35b0: 6c 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20  lMutex = 1;  /* 
35c0: 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20  Enable mutex on 
35d0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20  connections */. 
35e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
35f0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
3600: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45  ined(SQLITE_THRE
3610: 41 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54  ADSAFE) && SQLIT
3620: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f  E_THREADSAFE>0 /
3630: 2a 20 49 4d 50 3a 20 52 2d 36 33 36 36 36 2d 34  * IMP: R-63666-4
3640: 38 37 35 35 20 2a 2f 0a 20 20 20 20 63 61 73 65  8755 */.    case
3650: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
3660: 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  UTEX: {.      /*
3670: 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65   Specify an alte
3680: 72 6e 61 74 69 76 65 20 6d 75 74 65 78 20 69 6d  rnative mutex im
3690: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
36a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
36b0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 20  balConfig.mutex 
36c0: 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71  = *va_arg(ap, sq
36d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68  lite3_mutex_meth
36e0: 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ods*);.      bre
36f0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
3700: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
3710: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20  ITE_THREADSAFE) 
3720: 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  && SQLITE_THREAD
3730: 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52  SAFE>0 /* IMP: R
3740: 2d 31 34 34 35 30 2d 33 37 35 39 37 20 2a 2f 0a  -14450-37597 */.
3750: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3760: 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54 45 58 3a  CONFIG_GETMUTEX:
3770: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72   {.      /* Retr
3780: 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  ieve the current
3790: 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74   mutex implement
37a0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a  ation */.      *
37b0: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
37c0: 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73  e3_mutex_methods
37d0: 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  *) = sqlite3Glob
37e0: 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 3b 0a  alConfig.mutex;.
37f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3800: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63   }.#endif..    c
3810: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3820: 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20  G_MALLOC: {.    
3830: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3840: 3a 20 52 2d 35 35 35 39 34 2d 32 31 30 33 30 20  : R-55594-21030 
3850: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
3860: 47 5f 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20  G_MALLOC option 
3870: 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a  takes a.      **
3880: 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
3890: 20 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e   which is a poin
38a0: 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e  ter to an instan
38b0: 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  ce of the.      
38c0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  ** sqlite3_mem_m
38d0: 65 74 68 6f 64 73 20 73 74 72 75 63 74 75 72 65  ethods structure
38e0: 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 73  . The argument s
38f0: 70 65 63 69 66 69 65 73 20 61 6c 74 65 72 6e 61  pecifies alterna
3900: 74 69 76 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  tive.      ** lo
3910: 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61  w-level memory a
3920: 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e  llocation routin
3930: 65 73 20 74 6f 20 62 65 20 75 73 65 64 20 69 6e  es to be used in
3940: 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20 6d 65   place of the me
3950: 6d 6f 72 79 0a 20 20 20 20 20 20 2a 2a 20 61 6c  mory.      ** al
3960: 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65  location routine
3970: 73 20 62 75 69 6c 74 20 69 6e 74 6f 20 53 51 4c  s built into SQL
3980: 69 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ite. */.      sq
3990: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
39a0: 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70  g.m = *va_arg(ap
39b0: 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  , sqlite3_mem_me
39c0: 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62  thods*);.      b
39d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
39e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
39f0: 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a  IG_GETMALLOC: {.
3a00: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3a10: 45 2d 4f 46 3a 20 52 2d 35 31 32 31 33 2d 34 36  E-OF: R-51213-46
3a20: 34 31 34 20 54 68 65 20 53 51 4c 49 54 45 5f 43  414 The SQLITE_C
3a30: 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 20  ONFIG_GETMALLOC 
3a40: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20  option takes a. 
3a50: 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61       ** single a
3a60: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
3a70: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
3a80: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3a90: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
3aa0: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74  3_mem_methods st
3ab0: 72 75 63 74 75 72 65 2e 20 54 68 65 20 73 71 6c  ructure. The sql
3ac0: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
3ad0: 20 73 74 72 75 63 74 75 72 65 20 69 73 0a 20 20   structure is.  
3ae0: 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69      ** filled wi
3af0: 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  th the currently
3b00: 20 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20   defined memory 
3b10: 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69  allocation routi
3b20: 6e 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  nes. */.      if
3b30: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
3b40: 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d  onfig.m.xMalloc=
3b50: 3d 30 20 29 20 73 71 6c 69 74 65 33 4d 65 6d 53  =0 ) sqlite3MemS
3b60: 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20  etDefault();.   
3b70: 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73     *va_arg(ap, s
3b80: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
3b90: 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  ds*) = sqlite3Gl
3ba0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20  obalConfig.m;.  
3bb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3bc0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3bd0: 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55  _CONFIG_MEMSTATU
3be0: 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  S: {.      /* EV
3bf0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 32  IDENCE-OF: R-612
3c00: 37 35 2d 33 35 31 35 37 20 54 68 65 20 53 51 4c  75-35157 The SQL
3c10: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54  ITE_CONFIG_MEMST
3c20: 41 54 55 53 20 6f 70 74 69 6f 6e 20 74 61 6b 65  ATUS option take
3c30: 73 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c  s.      ** singl
3c40: 65 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 79  e argument of ty
3c50: 70 65 20 69 6e 74 2c 20 69 6e 74 65 72 70 72 65  pe int, interpre
3c60: 74 65 64 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e  ted as a boolean
3c70: 2c 20 77 68 69 63 68 20 65 6e 61 62 6c 65 73 0a  , which enables.
3c80: 20 20 20 20 20 20 2a 2a 20 6f 72 20 64 69 73 61        ** or disa
3c90: 62 6c 65 73 20 74 68 65 20 63 6f 6c 6c 65 63 74  bles the collect
3ca0: 69 6f 6e 20 6f 66 20 6d 65 6d 6f 72 79 20 61 6c  ion of memory al
3cb0: 6c 6f 63 61 74 69 6f 6e 20 73 74 61 74 69 73 74  location statist
3cc0: 69 63 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ics. */.      sq
3cd0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3ce0: 67 2e 62 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f  g.bMemstat = va_
3cf0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
3d00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3d10: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3d20: 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 3a  _CONFIG_SCRATCH:
3d30: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3d40: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 34 30 34  ENCE-OF: R-08404
3d50: 2d 36 30 38 38 37 20 54 68 65 72 65 20 61 72 65  -60887 There are
3d60: 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73   three arguments
3d70: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   to.      ** SQL
3d80: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54  ITE_CONFIG_SCRAT
3d90: 43 48 3a 20 41 20 70 6f 69 6e 74 65 72 20 61 6e  CH: A pointer an
3da0: 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20   8-byte aligned 
3db0: 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 20 66 72  memory buffer fr
3dc0: 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 77 68 69 63  om.      ** whic
3dd0: 68 20 74 68 65 20 73 63 72 61 74 63 68 20 61 6c  h the scratch al
3de0: 6c 6f 63 61 74 69 6f 6e 73 20 77 69 6c 6c 20 62  locations will b
3df0: 65 20 64 72 61 77 6e 2c 20 74 68 65 20 73 69 7a  e drawn, the siz
3e00: 65 20 6f 66 20 65 61 63 68 20 73 63 72 61 74 63  e of each scratc
3e10: 68 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63  h.      ** alloc
3e20: 61 74 69 6f 6e 20 28 73 7a 29 2c 20 61 6e 64 20  ation (sz), and 
3e30: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
3e40: 65 72 20 6f 66 20 73 63 72 61 74 63 68 20 61 6c  er of scratch al
3e50: 6c 6f 63 61 74 69 6f 6e 73 20 28 4e 29 2e 20 2a  locations (N). *
3e60: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3e70: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72  lobalConfig.pScr
3e80: 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70  atch = va_arg(ap
3e90: 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
3ea0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3eb0: 66 69 67 2e 73 7a 53 63 72 61 74 63 68 20 3d 20  fig.szScratch = 
3ec0: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3ed0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3ee0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61  obalConfig.nScra
3ef0: 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tch = va_arg(ap,
3f00: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
3f10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3f20: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3f30: 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a 20 20  _PAGECACHE: {.  
3f40: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
3f50: 4f 46 3a 20 52 2d 31 38 37 36 31 2d 33 36 36 30  OF: R-18761-3660
3f60: 31 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65  1 There are thre
3f70: 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20  e arguments to. 
3f80: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43       ** SQLITE_C
3f90: 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a  ONFIG_PAGECACHE:
3fa0: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 38 2d   A pointer to 8-
3fb0: 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d 65 6d  byte aligned mem
3fc0: 6f 72 79 20 28 70 4d 65 6d 29 2c 0a 20 20 20 20  ory (pMem),.    
3fd0: 20 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66    ** the size of
3fe0: 20 65 61 63 68 20 70 61 67 65 20 63 61 63 68 65   each page cache
3ff0: 20 6c 69 6e 65 20 28 73 7a 29 2c 20 61 6e 64 20   line (sz), and 
4000: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
4010: 63 68 65 20 6c 69 6e 65 73 0a 20 20 20 20 20 20  che lines.      
4020: 2a 2a 20 28 4e 29 2e 20 2a 2f 0a 20 20 20 20 20  ** (N). */.     
4030: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4040: 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f  nfig.pPage = va_
4050: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
4060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4070: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65  balConfig.szPage
4080: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4090: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
40a0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
40b0: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
40c0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
40d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
40e0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
40f0: 5f 50 43 41 43 48 45 5f 48 44 52 53 5a 3a 20 7b  _PCACHE_HDRSZ: {
4100: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
4110: 43 45 2d 4f 46 3a 20 52 2d 33 39 31 30 30 2d 32  CE-OF: R-39100-2
4120: 37 33 31 37 20 54 68 65 20 53 51 4c 49 54 45 5f  7317 The SQLITE_
4130: 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f 48 44  CONFIG_PCACHE_HD
4140: 52 53 5a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73  RSZ option takes
4150: 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67  .      ** a sing
4160: 6c 65 20 70 61 72 61 6d 65 74 65 72 20 77 68 69  le parameter whi
4170: 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ch is a pointer 
4180: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e  to an integer an
4190: 64 20 77 72 69 74 65 73 20 69 6e 74 6f 0a 20 20  d writes into.  
41a0: 20 20 20 20 2a 2a 20 74 68 61 74 20 69 6e 74 65      ** that inte
41b0: 67 65 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ger the number o
41c0: 66 20 65 78 74 72 61 20 62 79 74 65 73 20 70 65  f extra bytes pe
41d0: 72 20 70 61 67 65 20 72 65 71 75 69 72 65 64 20  r page required 
41e0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 0a 20 20  for each page.  
41f0: 20 20 20 20 2a 2a 20 69 6e 20 53 51 4c 49 54 45      ** in SQLITE
4200: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
4210: 45 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f  E. */.      *va_
4220: 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 20 3d 20  arg(ap, int*) = 
4230: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4240: 65 33 48 65 61 64 65 72 53 69 7a 65 42 74 72 65  e3HeaderSizeBtre
4250: 65 28 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20  e() +.          
4260: 73 71 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a  sqlite3HeaderSiz
4270: 65 50 63 61 63 68 65 28 29 20 2b 0a 20 20 20 20  ePcache() +.    
4280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 48 65 61        sqlite3Hea
4290: 64 65 72 53 69 7a 65 50 63 61 63 68 65 31 28 29  derSizePcache1()
42a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
42b0: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53     }..    case S
42c0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41  QLITE_CONFIG_PCA
42d0: 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  CHE: {.      /* 
42e0: 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62  no-op */.      b
42f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4300: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
4310: 49 47 5f 47 45 54 50 43 41 43 48 45 3a 20 7b 0a  IG_GETPCACHE: {.
4320: 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 6e 20        /* now an 
4330: 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72  error */.      r
4340: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
4350: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4360: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53     }..    case S
4370: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41  QLITE_CONFIG_PCA
4380: 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  CHE2: {.      /*
4390: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
43a0: 36 33 33 32 35 2d 34 38 33 37 38 20 54 68 65 20  63325-48378 The 
43b0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43  SQLITE_CONFIG_PC
43c0: 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b  ACHE2 option tak
43d0: 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69  es a.      ** si
43e0: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  ngle argument wh
43f0: 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ich is a pointer
4400: 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 70   to an sqlite3_p
4410: 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20  cache_methods2. 
4420: 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20       ** object. 
4430: 54 68 69 73 20 6f 62 6a 65 63 74 20 73 70 65 63  This object spec
4440: 69 66 69 65 73 20 74 68 65 20 69 6e 74 65 72 66  ifies the interf
4450: 61 63 65 20 74 6f 20 61 20 63 75 73 74 6f 6d 20  ace to a custom 
4460: 70 61 67 65 20 63 61 63 68 65 0a 20 20 20 20 20  page cache.     
4470: 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   ** implementati
4480: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  on. */.      sql
4490: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
44a0: 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61 5f 61  .pcache2 = *va_a
44b0: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70  rg(ap, sqlite3_p
44c0: 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29  cache_methods2*)
44d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
44e0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
44f0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50  LITE_CONFIG_GETP
4500: 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20 20  CACHE2: {.      
4510: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4520: 52 2d 32 32 30 33 35 2d 34 36 31 38 32 20 54 68  R-22035-46182 Th
4530: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4540: 47 45 54 50 43 41 43 48 45 32 20 6f 70 74 69 6f  GETPCACHE2 optio
4550: 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20  n takes a.      
4560: 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65  ** single argume
4570: 6e 74 20 77 68 69 63 68 20 69 73 20 61 20 70 6f  nt which is a po
4580: 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
4590: 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f  te3_pcache_metho
45a0: 64 73 32 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a  ds2.      ** obj
45b0: 65 63 74 2e 20 53 51 4c 69 74 65 20 63 6f 70 69  ect. SQLite copi
45c0: 65 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  es of the curren
45d0: 74 20 70 61 67 65 20 63 61 63 68 65 20 69 6d 70  t page cache imp
45e0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 6f  lementation into
45f0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6f  .      ** that o
4600: 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20  bject. */.      
4610: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
4620: 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 2e  lConfig.pcache2.
4630: 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  xInit==0 ){.    
4640: 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63 68      sqlite3PCach
4650: 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20  eSetDefault();. 
4660: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 76 61       }.      *va
4670: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
4680: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
4690: 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  *) = sqlite3Glob
46a0: 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32  alConfig.pcache2
46b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
46c0: 20 20 20 7d 0a 0a 2f 2a 20 45 56 49 44 45 4e 43     }../* EVIDENC
46d0: 45 2d 4f 46 3a 20 52 2d 30 36 36 32 36 2d 31 32  E-OF: R-06626-12
46e0: 39 31 31 20 54 68 65 20 53 51 4c 49 54 45 5f 43  911 The SQLITE_C
46f0: 4f 4e 46 49 47 5f 48 45 41 50 20 6f 70 74 69 6f  ONFIG_HEAP optio
4700: 6e 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61  n is only.** ava
4710: 69 6c 61 62 6c 65 20 69 66 20 53 51 4c 69 74 65  ilable if SQLite
4720: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
4730: 68 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  h either SQLITE_
4740: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20 6f  ENABLE_MEMSYS3 o
4750: 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  r.** SQLITE_ENAB
4760: 4c 45 5f 4d 45 4d 53 59 53 35 20 61 6e 64 20 72  LE_MEMSYS5 and r
4770: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 52  eturns SQLITE_ER
4780: 52 4f 52 20 69 66 20 69 6e 76 6f 6b 65 64 20 6f  ROR if invoked o
4790: 74 68 65 72 77 69 73 65 2e 20 2a 2f 0a 23 69 66  therwise. */.#if
47a0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
47b0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20  ENABLE_MEMSYS3) 
47c0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
47d0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
47e0: 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
47f0: 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b  E_CONFIG_HEAP: {
4800: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
4810: 43 45 2d 4f 46 3a 20 52 2d 31 39 38 35 34 2d 34  CE-OF: R-19854-4
4820: 32 31 32 36 20 54 68 65 72 65 20 61 72 65 20 74  2126 There are t
4830: 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74  hree arguments t
4840: 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  o.      ** SQLIT
4850: 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 41  E_CONFIG_HEAP: A
4860: 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  n 8-byte aligned
4870: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4880: 6d 65 6d 6f 72 79 2c 20 74 68 65 0a 20 20 20 20  memory, the.    
4890: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62    ** number of b
48a0: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 65 6d 6f  ytes in the memo
48b0: 72 79 20 62 75 66 66 65 72 2c 20 61 6e 64 20 74  ry buffer, and t
48c0: 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 63  he minimum alloc
48d0: 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 20 20 20 20  ation size..    
48e0: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
48f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
4900: 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Heap = va_arg(ap
4910: 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
4920: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4930: 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61  fig.nHeap = va_a
4940: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
4950: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4960: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76  Config.mnReq = v
4970: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
4980: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
4990: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
49a0: 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20 20 20  nReq<1 ){.      
49b0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
49c0: 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31 3b  onfig.mnReq = 1;
49d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
49e0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
49f0: 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c 31  nfig.mnReq>(1<<1
4a00: 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  2) ){.        /*
4a10: 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65 73 74   cap min request
4a20: 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20 2a 2f   size at 2^12 */
4a30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4a40: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52  GlobalConfig.mnR
4a50: 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20 20  eq = (1<<12);.  
4a60: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
4a70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4a80: 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b  nfig.pHeap==0 ){
4a90: 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
4aa0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 39 32 30  ENCE-OF: R-49920
4ab0: 2d 36 30 31 38 39 20 49 66 20 74 68 65 20 66 69  -60189 If the fi
4ac0: 72 73 74 20 70 6f 69 6e 74 65 72 20 28 74 68 65  rst pointer (the
4ad0: 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 29   memory pointer)
4ae0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 4e  .        ** is N
4af0: 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c 69 74 65  ULL, then SQLite
4b00: 20 72 65 76 65 72 74 73 20 74 6f 20 75 73 69 6e   reverts to usin
4b10: 67 20 69 74 73 20 64 65 66 61 75 6c 74 20 6d 65  g its default me
4b20: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 0a 20  mory allocator. 
4b30: 20 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20 73         ** (the s
4b40: 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28 29 20 69  ystem malloc() i
4b50: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 29 2c 20  mplementation), 
4b60: 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70 72 69 6f  undoing any prio
4b70: 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 0a  r invocation of.
4b80: 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54          ** SQLIT
4b90: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2e  E_CONFIG_MALLOC.
4ba0: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
4bb0: 20 20 20 20 2a 2a 20 53 65 74 74 69 6e 67 20 73      ** Setting s
4bc0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4bd0: 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a 65 72 6f  ig.m to all zero
4be0: 73 20 77 69 6c 6c 20 63 61 75 73 65 20 6d 61 6c  s will cause mal
4bf0: 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  loc to.        *
4c00: 2a 20 72 65 76 65 72 74 20 74 6f 20 69 74 73 20  * revert to its 
4c10: 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e  default implemen
4c20: 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69  tation when sqli
4c30: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
4c40: 20 69 73 20 72 75 6e 0a 20 20 20 20 20 20 20 20   is run.        
4c50: 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  */.        memse
4c60: 74 28 26 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  t(&sqlite3Global
4c70: 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20 73 69 7a  Config.m, 0, siz
4c80: 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  eof(sqlite3Globa
4c90: 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a 20 20 20  lConfig.m));.   
4ca0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4cb0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
4cc0: 3a 20 52 2d 36 31 30 30 36 2d 30 38 39 31 38 20  : R-61006-08918 
4cd0: 49 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 70 6f  If the memory po
4ce0: 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c  inter is not NUL
4cf0: 4c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  L then the.     
4d00: 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76     ** alternativ
4d10: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
4d20: 6f 72 20 69 73 20 65 6e 67 61 67 65 64 20 74 6f  or is engaged to
4d30: 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f 66 20 53   handle all of S
4d40: 51 4c 69 74 65 73 0a 20 20 20 20 20 20 20 20 2a  QLites.        *
4d50: 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  * memory allocat
4d60: 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f 0a 23 69  ion needs. */.#i
4d70: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
4d80: 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20 20  LE_MEMSYS3.     
4d90: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4da0: 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69  Config.m = *sqli
4db0: 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33  te3MemGetMemsys3
4dc0: 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ();.#endif.#ifde
4dd0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
4de0: 4d 45 4d 53 59 53 35 0a 20 20 20 20 20 20 20 20  MEMSYS5.        
4df0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4e00: 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33  fig.m = *sqlite3
4e10: 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35 28 29 3b  MemGetMemsys5();
4e20: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a  .#endif.      }.
4e30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4e40: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63   }.#endif..    c
4e50: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
4e60: 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20  G_LOOKASIDE: {. 
4e70: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4e80: 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61  alConfig.szLooka
4e90: 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70  side = va_arg(ap
4ea0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
4eb0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4ec0: 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76  g.nLookaside = v
4ed0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
4ee0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4ef0: 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 52   }.    .    /* R
4f00: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
4f10: 74 6f 20 74 68 65 20 6c 6f 67 67 65 72 20 66 75  to the logger fu
4f20: 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74 73 20 66  nction and its f
4f30: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20  irst argument.. 
4f40: 20 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c     ** The defaul
4f50: 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67  t is NULL.  Logg
4f60: 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64 20  ing is disabled 
4f70: 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  if the function 
4f80: 70 6f 69 6e 74 65 72 20 69 73 0a 20 20 20 20 2a  pointer is.    *
4f90: 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20  * NULL..    */. 
4fa0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
4fb0: 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20  ONFIG_LOG: {.   
4fc0: 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69     /* MSVC is pi
4fd0: 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e  cky about pullin
4fe0: 67 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d  g func ptrs from
4ff0: 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20   va lists..     
5000: 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f   ** http://suppo
5010: 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d  rt.microsoft.com
5020: 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20  /kb/47961.      
5030: 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ** sqlite3Global
5040: 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61  Config.xLog = va
5050: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 28 2a 29  _arg(ap, void(*)
5060: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
5070: 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20   char*));.      
5080: 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65 66  */.      typedef
5090: 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f 74   void(*LOGFUNC_t
50a0: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
50b0: 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20  t char*);.      
50c0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
50d0: 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72  fig.xLog = va_ar
50e0: 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74 29  g(ap, LOGFUNC_t)
50f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
5100: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67  lobalConfig.pLog
5110: 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Arg = va_arg(ap,
5120: 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 62   void*);.      b
5130: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
5140: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
5150: 20 52 2d 35 35 35 34 38 2d 33 33 38 31 37 20 54   R-55548-33817 T
5160: 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  he compile-time 
5170: 73 65 74 74 69 6e 67 20 66 6f 72 20 55 52 49 20  setting for URI 
5180: 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20 20 2a 2a  filenames.    **
5190: 20 63 61 6e 20 62 65 20 63 68 61 6e 67 65 64 20   can be changed 
51a0: 61 74 20 73 74 61 72 74 2d 74 69 6d 65 20 75 73  at start-time us
51b0: 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 73  ing the.    ** s
51c0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
51d0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c  LITE_CONFIG_URI,
51e0: 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c  1) or.    ** sql
51f0: 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
5200: 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 30 29  TE_CONFIG_URI,0)
5210: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   configuration c
5220: 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  alls..    */.   
5230: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
5240: 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20  FIG_URI: {.     
5250: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
5260: 20 52 2d 32 35 34 35 31 2d 36 31 31 32 35 20 54   R-25451-61125 T
5270: 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
5280: 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74 61 6b 65  _URI option take
5290: 73 20 61 20 73 69 6e 67 6c 65 0a 20 20 20 20 20  s a single.     
52a0: 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 6f 66 20   ** argument of 
52b0: 74 79 70 65 20 69 6e 74 2e 20 49 66 20 6e 6f 6e  type int. If non
52c0: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52 49 20  -zero, then URI 
52d0: 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c 6f 62  handling is glob
52e0: 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20 65 6e  ally.      ** en
52f0: 61 62 6c 65 64 2e 20 49 66 20 74 68 65 20 70 61  abled. If the pa
5300: 72 61 6d 65 74 65 72 20 69 73 20 7a 65 72 6f 2c  rameter is zero,
5310: 20 74 68 65 6e 20 55 52 49 20 68 61 6e 64 6c 69   then URI handli
5320: 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a 20  ng is globally. 
5330: 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65 64       ** disabled
5340: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
5350: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
5360: 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61 72 67  OpenUri = va_arg
5370: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
5380: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
5390: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
53a0: 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49  ONFIG_COVERING_I
53b0: 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20 20 20  NDEX_SCAN: {.   
53c0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
53d0: 46 3a 20 52 2d 33 36 35 39 32 2d 30 32 37 37 32  F: R-36592-02772
53e0: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
53f0: 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44 45  IG_COVERING_INDE
5400: 58 5f 53 43 41 4e 0a 20 20 20 20 20 20 2a 2a 20  X_SCAN.      ** 
5410: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73  option takes a s
5420: 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 61 72  ingle integer ar
5430: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
5440: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
5450: 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f 6c 65 61  .      ** boolea
5460: 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 65 6e  n in order to en
5470: 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20  able or disable 
5480: 74 68 65 20 75 73 65 20 6f 66 20 63 6f 76 65 72  the use of cover
5490: 69 6e 67 20 69 6e 64 69 63 65 73 20 66 6f 72 0a  ing indices for.
54a0: 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 20 74 61        ** full ta
54b0: 62 6c 65 20 73 63 61 6e 73 20 69 6e 20 74 68 65  ble scans in the
54c0: 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65 72   query optimizer
54d0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
54e0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
54f0: 55 73 65 43 69 73 20 3d 20 76 61 5f 61 72 67 28  UseCis = va_arg(
5500: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
5510: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
5520: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5530: 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20 63 61  LE_SQLLOG.    ca
5540: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
5550: 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20 20 20 20  _SQLLOG: {.     
5560: 20 74 79 70 65 64 65 66 20 76 6f 69 64 28 2a 53   typedef void(*S
5570: 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69  QLLOGFUNC_t)(voi
5580: 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f  d*, sqlite3*, co
5590: 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 3b  nst char*, int);
55a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
55b0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
55c0: 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  og = va_arg(ap, 
55d0: 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20  SQLLOGFUNC_t);. 
55e0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
55f0: 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
5600: 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Arg = va_arg(ap,
5610: 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20 20 20 20   void *);.      
5620: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
5630: 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51  dif..    case SQ
5640: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50  LITE_CONFIG_MMAP
5650: 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 2f  _SIZE: {.      /
5660: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5670: 2d 35 38 30 36 33 2d 33 38 32 35 38 20 53 51 4c  -58063-38258 SQL
5680: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f  ITE_CONFIG_MMAP_
5690: 53 49 5a 45 20 74 61 6b 65 73 20 74 77 6f 20 36  SIZE takes two 6
56a0: 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 69  4-bit.      ** i
56b0: 6e 74 65 67 65 72 20 28 73 71 6c 69 74 65 33 5f  nteger (sqlite3_
56c0: 69 6e 74 36 34 29 20 76 61 6c 75 65 73 20 74 68  int64) values th
56d0: 61 74 20 61 72 65 20 74 68 65 20 64 65 66 61 75  at are the defau
56e0: 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d  lt mmap size lim
56f0: 69 74 0a 20 20 20 20 20 20 2a 2a 20 28 74 68 65  it.      ** (the
5700: 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67   default setting
5710: 20 66 6f 72 20 50 52 41 47 4d 41 20 6d 6d 61 70   for PRAGMA mmap
5720: 5f 73 69 7a 65 29 20 61 6e 64 20 74 68 65 20 6d  _size) and the m
5730: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 0a 20  aximum allowed. 
5740: 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20 73 69 7a       ** mmap siz
5750: 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20 20 20 20  e limit. */.    
5760: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
5770: 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28  szMmap = va_arg(
5780: 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ap, sqlite3_int6
5790: 34 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  4);.      sqlite
57a0: 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61 70 20 3d  3_int64 mxMmap =
57b0: 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
57c0: 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20  te3_int64);.    
57d0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
57e0: 3a 20 52 2d 35 33 33 36 37 2d 34 33 31 39 30 20  : R-53367-43190 
57f0: 49 66 20 65 69 74 68 65 72 20 61 72 67 75 6d 65  If either argume
5800: 6e 74 20 74 6f 20 74 68 69 73 20 6f 70 74 69 6f  nt to this optio
5810: 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6e 65  n is.      ** ne
5820: 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 61  gative, then tha
5830: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 63 68  t argument is ch
5840: 61 6e 67 65 64 20 74 6f 20 69 74 73 20 63 6f 6d  anged to its com
5850: 70 69 6c 65 2d 74 69 6d 65 20 64 65 66 61 75 6c  pile-time defaul
5860: 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  t..      **.    
5870: 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
5880: 3a 20 52 2d 33 34 39 39 33 2d 34 35 30 33 31 20  : R-34993-45031 
5890: 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  The maximum allo
58a0: 77 65 64 20 6d 6d 61 70 20 73 69 7a 65 20 77 69  wed mmap size wi
58b0: 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 73  ll be.      ** s
58c0: 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63 61 74 65  ilently truncate
58d0: 64 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 73  d if necessary s
58e0: 6f 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  o that it does n
58f0: 6f 74 20 65 78 63 65 65 64 20 74 68 65 0a 20 20  ot exceed the.  
5900: 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74      ** compile-t
5910: 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70  ime maximum mmap
5920: 20 73 69 7a 65 20 73 65 74 20 62 79 20 74 68 65   size set by the
5930: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
5940: 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a 2a 20 63  _SIZE.      ** c
5950: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
5960: 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
5970: 20 20 20 69 66 28 20 6d 78 4d 6d 61 70 3c 30 20     if( mxMmap<0 
5980: 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c 49 54 45  || mxMmap>SQLITE
5990: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 20 29  _MAX_MMAP_SIZE )
59a0: 7b 0a 20 20 20 20 20 20 20 20 6d 78 4d 6d 61 70  {.        mxMmap
59b0: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d   = SQLITE_MAX_MM
59c0: 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 7d  AP_SIZE;.      }
59d0: 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 6d 61  .      if( szMma
59e0: 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d 20 53  p<0 ) szMmap = S
59f0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d  QLITE_DEFAULT_MM
5a00: 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 69  AP_SIZE;.      i
5a10: 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d 61 70  f( szMmap>mxMmap
5a20: 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61  ) szMmap = mxMma
5a30: 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  p;.      sqlite3
5a40: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d  GlobalConfig.mxM
5a50: 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20  map = mxMmap;.  
5a60: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
5a70: 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 20 3d  lConfig.szMmap =
5a80: 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20 20 62   szMmap;.      b
5a90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
5aa0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 26   SQLITE_OS_WIN &
5ab0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
5ac0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29 20 2f  _WIN32_MALLOC) /
5ad0: 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30 2d 35  * IMP: R-04780-5
5ae0: 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61 73 65  5815 */.    case
5af0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57   SQLITE_CONFIG_W
5b00: 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b  IN32_HEAPSIZE: {
5b10: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
5b20: 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36 2d 30  CE-OF: R-34926-0
5b30: 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f 4e 46  3360 SQLITE_CONF
5b40: 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a  IG_WIN32_HEAPSIZ
5b50: 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62 69 74  E takes a 32-bit
5b60: 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69 67 6e  .      ** unsign
5b70: 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  ed integer value
5b80: 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73 20   that specifies 
5b90: 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65  the maximum size
5ba0: 20 6f 66 20 74 68 65 20 63 72 65 61 74 65 64 0a   of the created.
5bb0: 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e 20 2a        ** heap. *
5bc0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
5bd0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61  lobalConfig.nHea
5be0: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  p = va_arg(ap, i
5bf0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
5c00: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
5c10: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5c20: 43 4f 4e 46 49 47 5f 50 4d 41 53 5a 3a 20 7b 0a  CONFIG_PMASZ: {.
5c30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5c40: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d 61 20  balConfig.szPma 
5c50: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73  = va_arg(ap, uns
5c60: 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20  igned int);.    
5c70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
5c80: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
5c90: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5ca0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72  _ERROR;.      br
5cb0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
5cc0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
5cd0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
5ce0: 2a 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f  ** Set up the lo
5cf0: 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72 73 20  okaside buffers 
5d00: 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63  for a database c
5d10: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65  onnection..** Re
5d20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
5d30: 6e 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20  n success.  .** 
5d40: 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20  If lookaside is 
5d50: 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c 20  already active, 
5d60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
5d70: 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a  SY..**.** The sz
5d80: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
5d90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
5da0: 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73  s in each lookas
5db0: 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65  ide slot..** The
5dc0: 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69   cnt parameter i
5dd0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
5de0: 73 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72  slots.  If pStar
5df0: 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a  t is NULL the.**
5e00: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c   space for the l
5e10: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20  ookaside memory 
5e20: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
5e30: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
5e40: 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20  )..** If pStart 
5e50: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
5e60: 20 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79   it is sz*cnt by
5e70: 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  tes of memory to
5e80: 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20   use for.** the 
5e90: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
5ea0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5eb0: 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73  setupLookaside(s
5ec0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64  qlite3 *db, void
5ed0: 20 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20   *pBuf, int sz, 
5ee0: 69 6e 74 20 63 6e 74 29 7b 0a 23 69 66 6e 64 65  int cnt){.#ifnde
5ef0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
5f00: 4f 4b 41 53 49 44 45 0a 20 20 76 6f 69 64 20 2a  OKASIDE.  void *
5f10: 70 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64 62  pStart;.  if( db
5f20: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74  ->lookaside.nOut
5f30: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
5f40: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
5f50: 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65 78    /* Free any ex
5f60: 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65  isting lookaside
5f70: 20 62 75 66 66 65 72 20 66 6f 72 20 74 68 69 73   buffer for this
5f80: 20 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a 20   handle before. 
5f90: 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61   ** allocating a
5fa0: 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20 64   new one so we d
5fb0: 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61 76  on't have to hav
5fc0: 65 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20 2a  e space for .  *
5fd0: 2a 20 62 6f 74 68 20 61 74 20 74 68 65 20 73 61  * both at the sa
5fe0: 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20  me time..  */.  
5ff0: 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  if( db->lookasid
6000: 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20  e.bMalloced ){. 
6010: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6020: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53  db->lookaside.pS
6030: 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  tart);.  }.  /* 
6040: 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c 6f  The size of a lo
6050: 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20 61 66 74  okaside slot aft
6060: 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20 6e 65  er ROUNDDOWN8 ne
6070: 65 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65 72  eds to be larger
6080: 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20 70 6f 69  .  ** than a poi
6090: 6e 74 65 72 20 74 6f 20 62 65 20 75 73 65 66 75  nter to be usefu
60a0: 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d 20 52  l..  */.  sz = R
60b0: 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20 20  OUNDDOWN8(sz);  
60c0: 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38 2d  /* IMP: R-33038-
60d0: 30 39 33 38 32 20 2a 2f 0a 20 20 69 66 28 20 73  09382 */.  if( s
60e0: 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c  z<=(int)sizeof(L
60f0: 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29  ookasideSlot*) )
6100: 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 63   sz = 0;.  if( c
6110: 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b 0a  nt<0 ) cnt = 0;.
6120: 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20 63    if( sz==0 || c
6130: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20  nt==0 ){.    sz 
6140: 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20  = 0;.    pStart 
6150: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
6160: 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20   pBuf==0 ){.    
6170: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
6180: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
6190: 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33  pStart = sqlite3
61a0: 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20 29  Malloc( sz*cnt )
61b0: 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31 39  ;  /* IMP: R-619
61c0: 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20 20  49-35727 */.    
61d0: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
61e0: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66  Malloc();.    if
61f0: 28 20 70 53 74 61 72 74 20 29 20 63 6e 74 20 3d  ( pStart ) cnt =
6200: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69   sqlite3MallocSi
6210: 7a 65 28 70 53 74 61 72 74 29 2f 73 7a 3b 0a 20  ze(pStart)/sz;. 
6220: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74 61   }else{.    pSta
6230: 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a 20  rt = pBuf;.  }. 
6240: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
6250: 53 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a  Start = pStart;.
6260: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
6270: 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d  pFree = 0;.  db-
6280: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20  >lookaside.sz = 
6290: 28 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70  (u16)sz;.  if( p
62a0: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74  Start ){.    int
62b0: 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64   i;.    Lookasid
62c0: 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73  eSlot *p;.    as
62d0: 73 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29  sert( sz > (int)
62e0: 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65  sizeof(Lookaside
62f0: 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70 20  Slot*) );.    p 
6300: 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74  = (LookasideSlot
6310: 2a 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f  *)pStart;.    fo
6320: 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b  r(i=cnt-1; i>=0;
6330: 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i--){.      p->
6340: 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b  pNext = db->look
6350: 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20 20  aside.pFree;.   
6360: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
6370: 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20 20  .pFree = p;.    
6380: 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65    p = (Lookaside
6390: 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b  Slot*)&((u8*)p)[
63a0: 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  sz];.    }.    d
63b0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e  b->lookaside.pEn
63c0: 64 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = p;.    db->l
63d0: 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62 6c  ookaside.bDisabl
63e0: 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c  e = 0;.    db->l
63f0: 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63  ookaside.bMalloc
6400: 65 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a  ed = pBuf==0 ?1:
6410: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
6420: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53  db->lookaside.pS
6430: 74 61 72 74 20 3d 20 64 62 3b 0a 20 20 20 20 64  tart = db;.    d
6440: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e  b->lookaside.pEn
6450: 64 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e  d = db;.    db->
6460: 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 61 62  lookaside.bDisab
6470: 6c 65 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e  le = 1;.    db->
6480: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
6490: 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  ced = 0;.  }.#en
64a0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
64b0: 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 20 2a 2f 0a  IT_LOOKASIDE */.
64c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
64d0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
64e0: 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20 61 73  urn the mutex as
64f0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
6500: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
6510: 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  ion..*/.sqlite3_
6520: 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33 5f 64  mutex *sqlite3_d
6530: 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65 33 20  b_mutex(sqlite3 
6540: 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *db){.#ifdef SQL
6550: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
6560: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
6570: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
6580: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
6590: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
65a0: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
65b0: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
65c0: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d 75 74 65   return db->mute
65d0: 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  x;.}../*.** Free
65e0: 20 75 70 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f   up as much memo
65f0: 72 79 20 61 73 20 77 65 20 63 61 6e 20 66 72 6f  ry as we can fro
6600: 6d 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61  m the given data
6610: 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
6620: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
6630: 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65  e3_db_release_me
6640: 6d 6f 72 79 28 73 71 6c 69 74 65 33 20 2a 64 62  mory(sqlite3 *db
6650: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66  ){.  int i;..#if
6660: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6670: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
6680: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
6690: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
66a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
66b0: 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
66c0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
66d0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
66e0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
66f0: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
6700: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
6710: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74  Db; i++){.    Bt
6720: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
6730: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
6740: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
6750: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
6760: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
6770: 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73 71  r(pBt);.      sq
6780: 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b  lite3PagerShrink
6790: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
67a0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
67b0: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
67c0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
67d0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
67e0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
67f0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  E_OK;.}../*.** F
6800: 6c 75 73 68 20 61 6e 79 20 64 69 72 74 79 20 70  lush any dirty p
6810: 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
6820: 72 2d 63 61 63 68 65 20 66 6f 72 20 61 6e 79 20  r-cache for any 
6830: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
6840: 65 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f  e.** to disk..*/
6850: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f  .int sqlite3_db_
6860: 63 61 63 68 65 66 6c 75 73 68 28 73 71 6c 69 74  cacheflush(sqlit
6870: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
6880: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
6890: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 62 53  ITE_OK;.  int bS
68a0: 65 65 6e 42 75 73 79 20 3d 20 30 3b 0a 0a 23 69  eenBusy = 0;..#i
68b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
68c0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
68d0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
68e0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
68f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
6900: 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
6910: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
6920: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
6930: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
6940: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
6950: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
6960: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
6970: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
6980: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
6990: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
69a0: 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c 69   if( pBt && sqli
69b0: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
69c0: 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
69d0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
69e0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
69f0: 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63  r(pBt);.      rc
6a00: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
6a10: 6c 75 73 68 28 70 50 61 67 65 72 29 3b 0a 20 20  lush(pPager);.  
6a20: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
6a30: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
6a40: 20 20 20 62 53 65 65 6e 42 75 73 79 20 3d 20 31     bSeenBusy = 1
6a50: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
6a60: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
6a70: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
6a80: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
6a90: 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  ll(db);.  sqlite
6aa0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
6ab0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
6ac0: 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f  rn ((rc==SQLITE_
6ad0: 4f 4b 20 26 26 20 62 53 65 65 6e 42 75 73 79 29  OK && bSeenBusy)
6ae0: 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a   ? SQLITE_BUSY :
6af0: 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   rc);.}../*.** C
6b00: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74  onfiguration set
6b10: 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e 64  tings for an ind
6b20: 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73 65  ividual database
6b30: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69   connection.*/.i
6b40: 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f  nt sqlite3_db_co
6b50: 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64 62  nfig(sqlite3 *db
6b60: 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a  , int op, ...){.
6b70: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
6b80: 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61  int rc;.  va_sta
6b90: 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
6ba0: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
6bb0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43 4f  case SQLITE_DBCO
6bc0: 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20  NFIG_LOOKASIDE: 
6bd0: 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 42  {.      void *pB
6be0: 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  uf = va_arg(ap, 
6bf0: 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20  void*); /* IMP: 
6c00: 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a 2f  R-26835-10964 */
6c10: 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20  .      int sz = 
6c20: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
6c30: 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
6c40: 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a  -47871-25994 */.
6c50: 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20        int cnt = 
6c60: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
6c70: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
6c80: 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20  04460-53386 */. 
6c90: 20 20 20 20 20 72 63 20 3d 20 73 65 74 75 70 4c       rc = setupL
6ca0: 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42 75  ookaside(db, pBu
6cb0: 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20  f, sz, cnt);.   
6cc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6cd0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
6ce0: 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
6cf0: 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  t struct {.     
6d00: 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20     int op;      
6d10: 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f  /* The opcode */
6d20: 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d 61 73  .        u32 mas
6d30: 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66  k;    /* Mask of
6d40: 20 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c 69   the bit in sqli
6d50: 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65 74  te3.flags to set
6d60: 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20 20  /clear */.      
6d70: 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a  } aFlagOp[] = {.
6d80: 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45          { SQLITE
6d90: 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
6da0: 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54 45  _FKEY,    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 53 51 4c  BLE_TRIGGER, SQL
6df0: 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65  ITE_EnableTrigge
6e00: 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20  r  },.      };. 
6e10: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e       unsigned in
6e20: 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t i;.      rc = 
6e30: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
6e40: 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32 33   IMP: R-42790-23
6e50: 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  372 */.      for
6e60: 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
6e70: 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29  e(aFlagOp); i++)
6e80: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46  {.        if( aF
6e90: 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20  lagOp[i].op==op 
6ea0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
6eb0: 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67 28   onoff = va_arg(
6ec0: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
6ed0: 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d 20      int *pRes = 
6ee0: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29  va_arg(ap, int*)
6ef0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
6f00: 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66  oldFlags = db->f
6f10: 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lags;.          
6f20: 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20  if( onoff>0 ){. 
6f30: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66             db->f
6f40: 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b  lags |= aFlagOp[
6f50: 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20  i].mask;.       
6f60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f     }else if( ono
6f70: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
6f80: 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26       db->flags &
6f90: 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61  = ~aFlagOp[i].ma
6fa0: 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sk;.          }.
6fb0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 6c            if( ol
6fc0: 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67  dFlags!=db->flag
6fd0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
6fe0: 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
6ff0: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
7000: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (db);.          
7010: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
7020: 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  pRes ){.        
7030: 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62 2d      *pRes = (db-
7040: 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f 70  >flags & aFlagOp
7050: 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20  [i].mask)!=0;.  
7060: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7070: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7080: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  OK;.          br
7090: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
70a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
70b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
70c0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
70d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
70e0: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
70f0: 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b 30  f the buffer z[0
7100: 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20  ..n-1] contains 
7110: 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73  all spaces..*/.s
7120: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70 61  tatic int allSpa
7130: 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ces(const char *
7140: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69  z, int n){.  whi
7150: 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31  le( n>0 && z[n-1
7160: 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d  ]==' ' ){ n--; }
7170: 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a  .  return n==0;.
7180: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
7190: 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
71a0: 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
71b0: 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77  named "BINARY" w
71c0: 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a  hich is always.*
71d0: 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  * available..**.
71e0: 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c 61  ** If the padFla
71f0: 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  g argument is no
7200: 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61 63  t NULL then spac
7210: 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68 65  e padding at the
7220: 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e   end.** of strin
7230: 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20  gs is ignored.  
7240: 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20  This implements 
7250: 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74  the RTRIM collat
7260: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
7270: 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a  nt binCollFunc(.
7280: 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c    void *padFlag,
7290: 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
72a0: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
72b0: 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f  .  int nKey2, co
72c0: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a  nst void *pKey2.
72d0: 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a  ){.  int rc, n;.
72e0: 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79    n = nKey1<nKey
72f0: 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79  2 ? nKey1 : nKey
7300: 32 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  2;.  /* EVIDENCE
7310: 2d 4f 46 3a 20 52 2d 36 35 30 33 33 2d 32 38 34  -OF: R-65033-284
7320: 34 39 20 54 68 65 20 62 75 69 6c 74 2d 69 6e 20  49 The built-in 
7330: 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e  BINARY collation
7340: 20 63 6f 6d 70 61 72 65 73 0a 20 20 2a 2a 20 73   compares.  ** s
7350: 74 72 69 6e 67 73 20 62 79 74 65 20 62 79 20 62  trings byte by b
7360: 79 74 65 20 75 73 69 6e 67 20 74 68 65 20 6d 65  yte using the me
7370: 6d 63 6d 70 28 29 20 66 75 6e 63 74 69 6f 6e 20  mcmp() function 
7380: 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72  from the standar
7390: 64 20 43 0a 20 20 2a 2a 20 6c 69 62 72 61 72 79  d C.  ** library
73a0: 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6d 65 6d 63  . */.  rc = memc
73b0: 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c  mp(pKey1, pKey2,
73c0: 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30   n);.  if( rc==0
73d0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46   ){.    if( padF
73e0: 6c 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53  lag.     && allS
73f0: 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b  paces(((char*)pK
7400: 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29  ey1)+n, nKey1-n)
7410: 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63  .     && allSpac
7420: 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32  es(((char*)pKey2
7430: 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20  )+n, nKey2-n).  
7440: 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56    ){.      /* EV
7450: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31 36  IDENCE-OF: R-316
7460: 32 34 2d 32 34 37 33 37 20 52 54 52 49 4d 20 69  24-24737 RTRIM i
7470: 73 20 6c 69 6b 65 20 42 49 4e 41 52 59 20 65 78  s like BINARY ex
7480: 63 65 70 74 20 74 68 61 74 20 65 78 74 72 61 0a  cept that extra.
7490: 20 20 20 20 20 20 2a 2a 20 73 70 61 63 65 73 20        ** spaces 
74a0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 69  at the end of ei
74b0: 74 68 65 72 20 73 74 72 69 6e 67 20 64 6f 20 6e  ther string do n
74c0: 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 72 65  ot change the re
74d0: 73 75 6c 74 2e 20 49 6e 20 6f 74 68 65 72 0a 20  sult. In other. 
74e0: 20 20 20 20 20 2a 2a 20 77 6f 72 64 73 2c 20 73       ** words, s
74f0: 74 72 69 6e 67 73 20 77 69 6c 6c 20 63 6f 6d 70  trings will comp
7500: 61 72 65 20 65 71 75 61 6c 20 74 6f 20 6f 6e 65  are equal to one
7510: 20 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f 6e 67   another as long
7520: 20 61 73 20 74 68 65 79 0a 20 20 20 20 20 20 2a   as they.      *
7530: 2a 20 64 69 66 66 65 72 20 6f 6e 6c 79 20 69 6e  * differ only in
7540: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
7550: 70 61 63 65 73 20 61 74 20 74 68 65 20 65 6e 64  paces at the end
7560: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d  ..      */.    }
7570: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
7580: 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a   nKey1 - nKey2;.
7590: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
75a0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
75b0: 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69 6e  Another built-in
75c0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
75d0: 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a  nce: NOCASE. .**
75e0: 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74 69  .** This collati
75f0: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 69  ng sequence is i
7600: 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73  ntended to be us
7610: 65 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e 64  ed for "case ind
7620: 65 70 65 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d 70  ependent.** comp
7630: 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27  arison". SQLite'
7640: 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75  s knowledge of u
7650: 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 63  pper and lower c
7660: 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73 0a  ase equivalents.
7670: 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20  ** extends only 
7680: 74 6f 20 74 68 65 20 32 36 20 63 68 61 72 61 63  to the 26 charac
7690: 74 65 72 73 20 75 73 65 64 20 69 6e 20 74 68 65  ters used in the
76a0: 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
76b0: 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20  e..**.** At the 
76c0: 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73 20  moment there is 
76d0: 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d 70  only a UTF-8 imp
76e0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  lementation..*/.
76f0: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61 73  static int nocas
7700: 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a  eCollatingFunc(.
7710: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
7720: 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
7730: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
7740: 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f  .  int nKey2, co
7750: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a  nst void *pKey2.
7760: 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71 6c  ){.  int r = sql
7770: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20 20  ite3StrNICmp(.  
7780: 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 20      (const char 
7790: 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20  *)pKey1, (const 
77a0: 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e  char *)pKey2, (n
77b0: 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79  Key1<nKey2)?nKey
77c0: 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53  1:nKey2);.  UNUS
77d0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
77e0: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d  Used);.  if( 0==
77f0: 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65  r ){.    r = nKe
7800: 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20  y1-nKey2;.  }.  
7810: 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a  return r;.}../*.
7820: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52 4f  ** Return the RO
7830: 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  WID of the most 
7840: 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f  recent insert.*/
7850: 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 71  .sqlite_int64 sq
7860: 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
7870: 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33 20  t_rowid(sqlite3 
7880: 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  *db){.#ifdef SQL
7890: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
78a0: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
78b0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
78c0: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
78d0: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
78e0: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
78f0: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
7900: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74   return db->last
7910: 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
7920: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
7930: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e 20  r of changes in 
7940: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
7950: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
7960: 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  exec()..*/.int s
7970: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 73  qlite3_changes(s
7980: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
7990: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
79a0: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
79b0: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
79c0: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
79d0: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
79e0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
79f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
7a00: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64  endif.  return d
7a10: 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  b->nChange;.}../
7a20: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
7a30: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65  number of change
7a40: 73 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61  s since the data
7a50: 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20  base handle was 
7a60: 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  opened..*/.int s
7a70: 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61  qlite3_total_cha
7a80: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
7a90: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
7aa0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
7ab0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
7ac0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
7ad0: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
7ae0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
7af0: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
7b00: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
7b10: 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  turn db->nTotalC
7b20: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
7b30: 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73  Close all open s
7b40: 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69 73 20  avepoints. This 
7b50: 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61  function only ma
7b60: 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c 64 73  nipulates fields
7b70: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
7b80: 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63  ase handle objec
7b90: 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63  t, it does not c
7ba0: 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70 6f 69  lose any savepoi
7bb0: 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  nts that may be 
7bc0: 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62  open.** at the b
7bd0: 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65 76 65  -tree/pager leve
7be0: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
7bf0: 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
7c00: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
7c10: 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53 61    while( db->pSa
7c20: 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53  vepoint ){.    S
7c30: 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d  avepoint *pTmp =
7c40: 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b   db->pSavepoint;
7c50: 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f  .    db->pSavepo
7c60: 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78  int = pTmp->pNex
7c70: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  t;.    sqlite3Db
7c80: 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a  Free(db, pTmp);.
7c90: 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70    }.  db->nSavep
7ca0: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  oint = 0;.  db->
7cb0: 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  nStatement = 0;.
7cc0: 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74    db->isTransact
7cd0: 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ionSavepoint = 0
7ce0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
7cf0: 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
7d00: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69   function associ
7d10: 61 74 65 64 20 77 69 74 68 20 46 75 6e 63 44 65  ated with FuncDe
7d20: 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45 78 63  f p, if any. Exc
7d30: 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20  ept,.** if this 
7d40: 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20  is not the last 
7d50: 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75 6e 63  copy of the func
7d60: 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76  tion, do not inv
7d70: 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65  oke it. Multiple
7d80: 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 61 20  .** copies of a 
7d90: 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20  single function 
7da0: 61 72 65 20 63 72 65 61 74 65 64 20 77 68 65 6e  are created when
7db0: 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e   create_function
7dc0: 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  () is called.** 
7dd0: 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e 59 20  with SQLITE_ANY 
7de0: 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e  as the encoding.
7df0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7e00: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
7e10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
7e20: 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63  cDef *p){.  Func
7e30: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73  Destructor *pDes
7e40: 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70 44 65  tructor = p->pDe
7e50: 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28 20  structor;.  if( 
7e60: 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  pDestructor ){. 
7e70: 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e     pDestructor->
7e80: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
7e90: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
7ea0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44  f==0 ){.      pD
7eb0: 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73 74  estructor->xDest
7ec0: 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72 2d  roy(pDestructor-
7ed0: 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20  >pUserData);.   
7ee0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7ef0: 28 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f 72  (db, pDestructor
7f00: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
7f10: 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74  /*.** Disconnect
7f20: 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74 61   all sqlite3_vta
7f30: 62 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 62  b objects that b
7f40: 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62 61 73  elong to databas
7f50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
7f60: 64 62 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  db. This is call
7f70: 65 64 20 77 68 65 6e 20 64 62 20 69 73 20 62 65  ed when db is be
7f80: 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73  ing closed..*/.s
7f90: 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 63 6f  tatic void disco
7fa0: 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 73 71 6c  nnectAllVtab(sql
7fb0: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64  ite3 *db){.#ifnd
7fc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
7fd0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e  IRTUALTABLE.  in
7fe0: 74 20 69 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20  t i;.  HashElem 
7ff0: 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  *p;.  sqlite3Btr
8000: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
8010: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
8020: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
8030: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
8040: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63  = db->aDb[i].pSc
8050: 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 64 62  hema;.    if( db
8060: 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61  ->aDb[i].pSchema
8070: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d   ){.      for(p=
8080: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
8090: 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  &pSchema->tblHas
80a0: 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48  h); p; p=sqliteH
80b0: 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20  ashNext(p)){.   
80c0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
80d0: 20 3d 20 28 54 61 62 6c 65 20 2a 29 73 71 6c 69   = (Table *)sqli
80e0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
80f0: 20 20 20 20 20 20 20 69 66 28 20 49 73 56 69 72         if( IsVir
8100: 74 75 61 6c 28 70 54 61 62 29 20 29 20 73 71 6c  tual(pTab) ) sql
8110: 69 74 65 33 56 74 61 62 44 69 73 63 6f 6e 6e 65  ite3VtabDisconne
8120: 63 74 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  ct(db, pTab);.  
8130: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8140: 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61    for(p=sqliteHa
8150: 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f  shFirst(&db->aMo
8160: 64 75 6c 65 29 3b 20 70 3b 20 70 3d 73 71 6c 69  dule); p; p=sqli
8170: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
8180: 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64      Module *pMod
8190: 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c   = (Module *)sql
81a0: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
81b0: 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 70 45      if( pMod->pE
81c0: 70 6f 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73  poTab ){.      s
81d0: 71 6c 69 74 65 33 56 74 61 62 44 69 73 63 6f 6e  qlite3VtabDiscon
81e0: 6e 65 63 74 28 64 62 2c 20 70 4d 6f 64 2d 3e 70  nect(db, pMod->p
81f0: 45 70 6f 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  EpoTab);.    }. 
8200: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
8210: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
8220: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
8230: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 23 65 6c 73  aveAll(db);.#els
8240: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
8250: 45 54 45 52 28 64 62 29 3b 0a 23 65 6e 64 69 66  ETER(db);.#endif
8260: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
8270: 20 54 52 55 45 20 69 66 20 64 61 74 61 62 61 73   TRUE if databas
8280: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  e connection db 
8290: 68 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20  has unfinalized 
82a0: 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74  prepared.** stat
82b0: 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69  ements or unfini
82c0: 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63  shed sqlite3_bac
82d0: 6b 75 70 20 6f 62 6a 65 63 74 73 2e 20 20 0a 2a  kup objects.  .*
82e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e  /.static int con
82f0: 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 73 71  nectionIsBusy(sq
8300: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
8310: 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t j;.  assert( s
8320: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8330: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
8340: 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20    if( db->pVdbe 
8350: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f  ) return 1;.  fo
8360: 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62  r(j=0; j<db->nDb
8370: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65  ; j++){.    Btre
8380: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
8390: 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28  [j].pBt;.    if(
83a0: 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42   pBt && sqlite3B
83b0: 74 72 65 65 49 73 49 6e 42 61 63 6b 75 70 28 70  treeIsInBackup(p
83c0: 42 74 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  Bt) ) return 1;.
83d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
83e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
83f0: 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74  n existing SQLit
8400: 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74  e database.*/.st
8410: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
8420: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64  Close(sqlite3 *d
8430: 62 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f 6d 62  b, int forceZomb
8440: 69 65 29 7b 0a 20 20 69 66 28 20 21 64 62 20 29  ie){.  if( !db )
8450: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
8460: 45 2d 4f 46 3a 20 52 2d 36 33 32 35 37 2d 31 31  E-OF: R-63257-11
8470: 37 34 30 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69  740 Calling sqli
8480: 74 65 33 5f 63 6c 6f 73 65 28 29 20 6f 72 0a 20  te3_close() or. 
8490: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6c     ** sqlite3_cl
84a0: 6f 73 65 5f 76 32 28 29 20 77 69 74 68 20 61 20  ose_v2() with a 
84b0: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 72 67  NULL pointer arg
84c0: 75 6d 65 6e 74 20 69 73 20 61 20 68 61 72 6d 6c  ument is a harml
84d0: 65 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20  ess no-op. */.  
84e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
84f0: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  OK;.  }.  if( !s
8500: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
8510: 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
8520: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8530: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
8540: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
8550: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
8560: 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72 63  tex);..  /* Forc
8570: 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 63 61  e xDisconnect ca
8580: 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75  lls on all virtu
8590: 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64  al tables */.  d
85a0: 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62  isconnectAllVtab
85b0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  (db);..  /* If a
85c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
85d0: 6f 70 65 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e  open, the discon
85e0: 6e 65 63 74 41 6c 6c 56 74 61 62 28 29 20 63 61  nectAllVtab() ca
85f0: 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69  ll above.  ** wi
8600: 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c  ll not have call
8610: 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65  ed the xDisconne
8620: 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61  ct() method on a
8630: 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20  ny virtual.  ** 
8640: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62  tables in the db
8650: 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61  ->aVTrans[] arra
8660: 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  y. The following
8670: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
8680: 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c  back().  ** call
8690: 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20   will do so. We 
86a0: 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20  need to do this 
86b0: 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b  before the check
86c0: 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a   for active.  **
86d0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
86e0: 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d  below, as the v-
86f0: 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61  table implementa
8700: 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72  tion may be stor
8710: 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72  ing.  ** some pr
8720: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
8730: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  s internally..  
8740: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  */.  sqlite3Vtab
8750: 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20  Rollback(db);.. 
8760: 20 2f 2a 20 4c 65 67 61 63 79 20 62 65 68 61 76   /* Legacy behav
8770: 69 6f 72 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f  ior (sqlite3_clo
8780: 73 65 28 29 20 62 65 68 61 76 69 6f 72 29 20 69  se() behavior) i
8790: 73 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a  s to return.  **
87a0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20   SQLITE_BUSY if 
87b0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  the connection c
87c0: 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64  an not be closed
87d0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
87e0: 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72 63 65 5a  */.  if( !forceZ
87f0: 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65 63 74  ombie && connect
8800: 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b  ionIsBusy(db) ){
8810: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
8820: 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c  rWithMsg(db, SQL
8830: 49 54 45 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c  ITE_BUSY, "unabl
8840: 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74  e to close due t
8850: 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a  o unfinalized ".
8860: 20 20 20 20 20 20 20 22 73 74 61 74 65 6d 65 6e         "statemen
8870: 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64  ts or unfinished
8880: 20 62 61 63 6b 75 70 73 22 29 3b 0a 20 20 20 20   backups");.    
8890: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
88a0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
88b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
88c0: 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66  E_BUSY;.  }..#if
88d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
88e0: 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73  E_SQLLOG.  if( s
88f0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
8900: 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20  ig.xSqllog ){.  
8910: 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65    /* Closing the
8920: 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20   handle. Fourth 
8930: 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73  parameter is pas
8940: 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 32 2e  sed the value 2.
8950: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 47   */.    sqlite3G
8960: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
8970: 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  log(sqlite3Globa
8980: 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41  lConfig.pSqllogA
8990: 72 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20  rg, db, 0, 2);. 
89a0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
89b0: 43 6f 6e 76 65 72 74 20 74 68 65 20 63 6f 6e 6e  Convert the conn
89c0: 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f  ection into a zo
89d0: 6d 62 69 65 20 61 6e 64 20 74 68 65 6e 20 63 6c  mbie and then cl
89e0: 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64  ose it..  */.  d
89f0: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
8a00: 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a  E_MAGIC_ZOMBIE;.
8a10: 20 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75    sqlite3LeaveMu
8a20: 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69  texAndCloseZombi
8a30: 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(db);.  return 
8a40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
8a50: 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61 74 69 6f  .** Two variatio
8a60: 6e 73 20 6f 6e 20 74 68 65 20 70 75 62 6c 69 63  ns on the public
8a70: 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20 63   interface for c
8a80: 6c 6f 73 69 6e 67 20 61 20 64 61 74 61 62 61 73  losing a databas
8a90: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
8aa0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f   The sqlite3_clo
8ab0: 73 65 28 29 20 76 65 72 73 69 6f 6e 20 72 65 74  se() version ret
8ac0: 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59  urns SQLITE_BUSY
8ad0: 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74   and.** leaves t
8ae0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  he connection op
8af0: 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72  tion if there ar
8b00: 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72  e unfinalized pr
8b10: 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d  epared.** statem
8b20: 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68  ents or unfinish
8b30: 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  ed sqlite3_backu
8b40: 70 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ps.  The sqlite3
8b50: 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76  _close_v2().** v
8b60: 65 72 73 69 6f 6e 20 66 6f 72 63 65 73 20 74 68  ersion forces th
8b70: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
8b80: 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20  become a zombie 
8b90: 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  if there are.** 
8ba0: 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75 72 63  unclosed resourc
8bb0: 65 73 2c 20 61 6e 64 20 61 72 72 61 6e 67 65 73  es, and arranges
8bc0: 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f   for deallocatio
8bd0: 6e 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 0a  n when the last.
8be0: 2a 2a 20 70 72 65 70 61 72 65 20 73 74 61 74 65  ** prepare state
8bf0: 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74 65 33 5f  ment or sqlite3_
8c00: 62 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a  backup closes..*
8c10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c  /.int sqlite3_cl
8c20: 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ose(sqlite3 *db)
8c30: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
8c40: 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69  Close(db,0); }.i
8c50: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  nt sqlite3_close
8c60: 5f 76 32 28 73 71 6c 69 74 65 33 20 2a 64 62 29  _v2(sqlite3 *db)
8c70: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
8c80: 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a  Close(db,1); }..
8c90: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
8ca0: 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61   mutex on databa
8cb0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
8cc0: 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d  ..**.** Furtherm
8cd0: 6f 72 65 2c 20 69 66 20 64 61 74 61 62 61 73 65  ore, if database
8ce0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69   connection db i
8cf0: 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e  s a zombie (mean
8d00: 69 6e 67 20 74 68 61 74 20 74 68 65 72 65 0a 2a  ing that there.*
8d10: 2a 20 68 61 73 20 62 65 65 6e 20 61 20 70 72 69  * has been a pri
8d20: 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  or call to sqlit
8d30: 65 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72 20  e3_close(db) or 
8d40: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
8d50: 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65  (db)) and.** eve
8d60: 72 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ry sqlite3_stmt 
8d70: 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e  has now been fin
8d80: 61 6c 69 7a 65 64 20 61 6e 64 20 65 76 65 72 79  alized and every
8d90: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
8da0: 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c  has.** finished,
8db0: 20 74 68 65 6e 20 66 72 65 65 20 61 6c 6c 20 72   then free all r
8dc0: 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69  esources..*/.voi
8dd0: 64 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75  d sqlite3LeaveMu
8de0: 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69  texAndCloseZombi
8df0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
8e00: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20    HashElem *i;  
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e20: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
8e30: 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  iterator */.  in
8e40: 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t j;..  /* If th
8e50: 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
8e60: 69 6e 67 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ing sqlite3_stmt
8e70: 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b   or sqlite3_back
8e80: 75 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20  up objects.  ** 
8e90: 6f 72 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  or if the connec
8ea0: 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74  tion has not yet
8eb0: 20 62 65 65 6e 20 63 6c 6f 73 65 64 20 62 79 20   been closed by 
8ec0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
8ed0: 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75  (),.  ** then ju
8ee0: 73 74 20 6c 65 61 76 65 20 74 68 65 20 6d 75 74  st leave the mut
8ef0: 65 78 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ex and return.. 
8f00: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
8f10: 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49  gic!=SQLITE_MAGI
8f20: 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e  C_ZOMBIE || conn
8f30: 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29  ectionIsBusy(db)
8f40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8f50: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
8f60: 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75  mutex);.    retu
8f70: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  rn;.  }..  /* If
8f80: 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
8f90: 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
8fa0: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
8fb0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a   connection has.
8fc0: 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20    ** closed all 
8fd0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e 64  sqlite3_stmt and
8fe0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
8ff0: 6f 62 6a 65 63 74 73 20 61 6e 64 20 68 61 73 20  objects and has 
9000: 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64  been.  ** passed
9010: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73   to sqlite3_clos
9020: 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  e (meaning that 
9030: 69 74 20 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e  it is a zombie).
9040: 20 20 54 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a    Therefore,.  *
9050: 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 66  * go ahead and f
9060: 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65  ree all resource
9070: 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  s..  */..  /* If
9080: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
9090: 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20  s open, roll it 
90a0: 62 61 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20  back. This also 
90b0: 65 6e 73 75 72 65 73 20 74 68 61 74 20 69 66 0a  ensures that if.
90c0: 20 20 2a 2a 20 61 6e 79 20 64 61 74 61 62 61 73    ** any databas
90d0: 65 20 73 63 68 65 6d 61 73 20 68 61 76 65 20 62  e schemas have b
90e0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 62 79 20  een modified by 
90f0: 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74  an uncommitted t
9100: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
9110: 74 68 65 79 20 61 72 65 20 72 65 73 65 74 2e 20  they are reset. 
9120: 41 6e 64 20 74 68 61 74 20 74 68 65 20 72 65 71  And that the req
9130: 75 69 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74  uired b-tree mut
9140: 65 78 20 69 73 20 68 65 6c 64 20 74 6f 20 6d 61  ex is held to ma
9150: 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  ke.  ** the page
9160: 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73  r rollback and s
9170: 63 68 65 6d 61 20 72 65 73 65 74 20 61 6e 20 61  chema reset an a
9180: 74 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e  tomic operation.
9190: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c   */.  sqlite3Rol
91a0: 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
91b0: 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46  ITE_OK);..  /* F
91c0: 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64  ree any outstand
91d0: 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20 73 74  ing Savepoint st
91e0: 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73  ructures. */.  s
91f0: 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
9200: 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a  oints(db);..  /*
9210: 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61 62   Close all datab
9220: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
9230: 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  */.  for(j=0; j<
9240: 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20  db->nDb; j++){. 
9250: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
9260: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b  b = &db->aDb[j];
9270: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
9280: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
9290: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62  e3BtreeClose(pDb
92a0: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44  ->pBt);.      pD
92b0: 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20  b->pBt = 0;.    
92c0: 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20    if( j!=1 ){.  
92d0: 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65        pDb->pSche
92e0: 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ma = 0;.      }.
92f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43      }.  }.  /* C
9300: 6c 65 61 72 20 74 68 65 20 54 45 4d 50 20 73 63  lear the TEMP sc
9310: 68 65 6d 61 20 73 65 70 61 72 61 74 65 6c 79 20  hema separately 
9320: 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66  and last */.  if
9330: 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ( db->aDb[1].pSc
9340: 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c 69  hema ){.    sqli
9350: 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64  te3SchemaClear(d
9360: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
9370: 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  a);.  }.  sqlite
9380: 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28  3VtabUnlockList(
9390: 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  db);..  /* Free 
93a0: 75 70 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  up the array of 
93b0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
93c0: 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ses */.  sqlite3
93d0: 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65  CollapseDatabase
93e0: 41 72 72 61 79 28 64 62 29 3b 0a 20 20 61 73 73  Array(db);.  ass
93f0: 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20  ert( db->nDb<=2 
9400: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
9410: 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb==db->aDbSta
9420: 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c  tic );..  /* Tel
9430: 6c 20 74 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f  l the code in no
9440: 74 69 66 79 2e 63 20 74 68 61 74 20 74 68 65 20  tify.c that the 
9450: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f  connection no lo
9460: 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20  nger holds any. 
9470: 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f   ** locks and do
9480: 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
9490: 6e 79 20 66 75 72 74 68 65 72 20 75 6e 6c 6f 63  ny further unloc
94a0: 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63  k-notify callbac
94b0: 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ks..  */.  sqlit
94c0: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73  e3ConnectionClos
94d0: 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 6a  ed(db);..  for(j
94e0: 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28  =0; j<ArraySize(
94f0: 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20 6a 2b  db->aFunc.a); j+
9500: 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20  +){.    FuncDef 
9510: 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73 68 2c 20  *pNext, *pHash, 
9520: 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 64 62  *p;.    for(p=db
9530: 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70 3b  ->aFunc.a[j]; p;
9540: 20 70 3d 70 48 61 73 68 29 7b 0a 20 20 20 20 20   p=pHash){.     
9550: 20 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61 73   pHash = p->pHas
9560: 68 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  h;.      while( 
9570: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 66 75 6e  p ){.        fun
9580: 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c  ctionDestroy(db,
9590: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65   p);.        pNe
95a0: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
95b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
95c0: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  Free(db, p);.   
95d0: 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a       p = pNext;.
95e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
95f0: 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  }.  for(i=sqlite
9600: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
9610: 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73  CollSeq); i; i=s
9620: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
9630: 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  ){.    CollSeq *
9640: 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71  pColl = (CollSeq
9650: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
9660: 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76  a(i);.    /* Inv
9670: 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63 74  oke any destruct
9680: 6f 72 73 20 72 65 67 69 73 74 65 72 65 64 20 66  ors registered f
9690: 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  or collation seq
96a0: 75 65 6e 63 65 20 75 73 65 72 20 64 61 74 61 2e  uence user data.
96b0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   */.    for(j=0;
96c0: 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<3; j++){.    
96d0: 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78    if( pColl[j].x
96e0: 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Del ){.        p
96f0: 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f  Coll[j].xDel(pCo
9700: 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20  ll[j].pUser);.  
9710: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
9720: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9730: 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20  , pColl);.  }.  
9740: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
9750: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
9760: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9770: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
9780: 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  E.  for(i=sqlite
9790: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
97a0: 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71  Module); i; i=sq
97b0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
97c0: 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d  {.    Module *pM
97d0: 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73  od = (Module *)s
97e0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
97f0: 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e  ;.    if( pMod->
9800: 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20  xDestroy ){.    
9810: 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79    pMod->xDestroy
9820: 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20  (pMod->pAux);.  
9830: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
9840: 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c  tabEponymousTabl
9850: 65 43 6c 65 61 72 28 64 62 2c 20 70 4d 6f 64 29  eClear(db, pMod)
9860: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
9870: 72 65 65 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20  ree(db, pMod);. 
9880: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
9890: 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75  Clear(&db->aModu
98a0: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  le);.#endif..  s
98b0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
98c0: 53 51 4c 49 54 45 5f 4f 4b 29 3b 20 2f 2a 20 44  SQLITE_OK); /* D
98d0: 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e 79 20 63  eallocates any c
98e0: 61 63 68 65 64 20 65 72 72 6f 72 20 73 74 72 69  ached error stri
98f0: 6e 67 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ngs. */.  sqlite
9900: 33 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70  3ValueFree(db->p
9910: 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  Err);.  sqlite3C
9920: 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64  loseExtensions(d
9930: 62 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55  b);.#if SQLITE_U
9940: 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
9950: 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ON.  sqlite3_fre
9960: 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68  e(db->auth.zAuth
9970: 55 73 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  User);.  sqlite3
9980: 5f 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a  _free(db->auth.z
9990: 41 75 74 68 50 57 29 3b 0a 23 65 6e 64 69 66 0a  AuthPW);.#endif.
99a0: 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
99b0: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f  QLITE_MAGIC_ERRO
99c0: 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d  R;..  /* The tem
99d0: 70 2d 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  p-database schem
99e0: 61 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 64  a is allocated d
99f0: 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20  ifferently from 
9a00: 74 68 65 20 6f 74 68 65 72 20 73 63 68 65 6d 61  the other schema
9a10: 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75  .  ** objects (u
9a20: 73 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  sing sqliteMallo
9a30: 63 28 29 20 64 69 72 65 63 74 6c 79 2c 20 69 6e  c() directly, in
9a40: 73 74 65 61 64 20 6f 66 20 73 71 6c 69 74 65 33  stead of sqlite3
9a50: 42 74 72 65 65 53 63 68 65 6d 61 28 29 29 2e 0a  BtreeSchema())..
9a60: 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64 73    ** So it needs
9a70: 20 74 6f 20 62 65 20 66 72 65 65 64 20 68 65 72   to be freed her
9a80: 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74  e. Todo: Why not
9a90: 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20 73   roll the temp s
9aa0: 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20  chema into.  ** 
9ab0: 74 68 65 20 73 61 6d 65 20 73 71 6c 69 74 65 4d  the same sqliteM
9ac0: 61 6c 6c 6f 63 28 29 20 61 73 20 74 68 65 20 6f  alloc() as the o
9ad0: 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63 61 74 65  ne that allocate
9ae0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  s the database .
9af0: 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 3f 0a    ** structure?.
9b00: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62    */.  sqlite3Db
9b10: 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62  Free(db, db->aDb
9b20: 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20  [1].pSchema);.  
9b30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
9b40: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
9b50: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
9b60: 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45  LITE_MAGIC_CLOSE
9b70: 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  D;.  sqlite3_mut
9b80: 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74 65  ex_free(db->mute
9b90: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  x);.  assert( db
9ba0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74  ->lookaside.nOut
9bb0: 3d 3d 30 20 29 3b 20 20 2f 2a 20 46 61 69 6c 73  ==0 );  /* Fails
9bc0: 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20   on a lookaside 
9bd0: 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 2a 2f 0a 20  memory leak */. 
9be0: 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   if( db->lookasi
9bf0: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a  de.bMalloced ){.
9c00: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9c10: 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70  (db->lookaside.p
9c20: 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 73 71  Start);.  }.  sq
9c30: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a  lite3_free(db);.
9c40: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
9c50: 6b 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66  k all database f
9c60: 69 6c 65 73 2e 20 20 49 66 20 74 72 69 70 43 6f  iles.  If tripCo
9c70: 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45  de is not SQLITE
9c80: 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 79  _OK, then.** any
9c90: 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
9ca0: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28  re invalidated (
9cb0: 22 74 72 69 70 70 65 64 22 20 2d 20 61 73 20 69  "tripped" - as i
9cc0: 6e 20 22 74 72 69 70 70 69 6e 67 20 61 20 63 69  n "tripping a ci
9cd0: 72 63 75 69 74 0a 2a 2a 20 62 72 65 61 6b 65 72  rcuit.** breaker
9ce0: 22 29 20 61 6e 64 20 6d 61 64 65 20 74 6f 20 72  ") and made to r
9cf0: 65 74 75 72 6e 20 74 72 69 70 43 6f 64 65 20 69  eturn tripCode i
9d00: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
9d10: 66 75 72 74 68 65 72 0a 2a 2a 20 61 74 74 65 6d  further.** attem
9d20: 70 74 73 20 74 6f 20 75 73 65 20 74 68 61 74 20  pts to use that 
9d30: 63 75 72 73 6f 72 2e 20 20 52 65 61 64 20 63 75  cursor.  Read cu
9d40: 72 73 6f 72 73 20 72 65 6d 61 69 6e 20 6f 70 65  rsors remain ope
9d50: 6e 20 61 6e 64 20 76 61 6c 69 64 0a 2a 2a 20 62  n and valid.** b
9d60: 75 74 20 61 72 65 20 22 73 61 76 65 64 22 20 69  ut are "saved" i
9d70: 6e 20 63 61 73 65 20 74 68 65 20 74 61 62 6c 65  n case the table
9d80: 20 70 61 67 65 73 20 61 72 65 20 6d 6f 76 65 64   pages are moved
9d90: 20 61 72 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f 69 64   around..*/.void
9da0: 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
9db0: 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  All(sqlite3 *db,
9dc0: 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b 0a   int tripCode){.
9dd0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
9de0: 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 69 6e  nTrans = 0;.  in
9df0: 74 20 73 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a  t schemaChange;.
9e00: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9e10: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
9e20: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
9e30: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
9e40: 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f  alloc();..  /* O
9e50: 62 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65  btain all b-tree
9e60: 20 6d 75 74 65 78 65 73 20 62 65 66 6f 72 65 20   mutexes before 
9e70: 6d 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73  making any calls
9e80: 20 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62 61 63   to BtreeRollbac
9e90: 6b 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20  k(). .  ** This 
9ea0: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20  is important in 
9eb0: 63 61 73 65 20 74 68 65 20 74 72 61 6e 73 61 63  case the transac
9ec0: 74 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65  tion being rolle
9ed0: 64 20 62 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20  d back has.  ** 
9ee0: 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74  modified the dat
9ef0: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
9f00: 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65   the b-tree mute
9f10: 78 65 73 20 61 72 65 20 6e 6f 74 20 74 61 6b 65  xes are not take
9f20: 6e 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74 68 65  n.  ** here, the
9f30: 6e 20 61 6e 6f 74 68 65 72 20 73 68 61 72 65 64  n another shared
9f40: 2d 63 61 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f  -cache connectio
9f50: 6e 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e  n might sneak in
9f60: 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68   between.  ** th
9f70: 65 20 64 61 74 61 62 61 73 65 20 72 6f 6c 6c 62  e database rollb
9f80: 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72  ack and schema r
9f90: 65 73 65 74 2c 20 77 68 69 63 68 20 63 61 6e 20  eset, which can 
9fa0: 63 61 75 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a  cause false.  **
9fb0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 72 65 70 6f   corruption repo
9fc0: 72 74 73 20 69 6e 20 73 6f 6d 65 20 63 61 73 65  rts in some case
9fd0: 73 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  s.  */.  sqlite3
9fe0: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
9ff0: 29 3b 0a 20 20 73 63 68 65 6d 61 43 68 61 6e 67  );.  schemaChang
a000: 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  e = (db->flags &
a010: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
a020: 61 6e 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d  anges)!=0 && db-
a030: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 3b 0a 0a  >init.busy==0;..
a040: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
a050: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
a060: 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61  Btree *p = db->a
a070: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
a080: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 69 66  f( p ){.      if
a090: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
a0a0: 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20 20  InTrans(p) ){.  
a0b0: 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d 20        inTrans = 
a0c0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
a0d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
a0e0: 6c 62 61 63 6b 28 70 2c 20 74 72 69 70 43 6f 64  lback(p, tripCod
a0f0: 65 2c 20 21 73 63 68 65 6d 61 43 68 61 6e 67 65  e, !schemaChange
a100: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
a110: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
a120: 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  ck(db);.  sqlite
a130: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
a140: 28 29 3b 0a 0a 20 20 69 66 28 20 28 64 62 2d 3e  ();..  if( (db->
a150: 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49 6e 74  flags&SQLITE_Int
a160: 65 72 6e 43 68 61 6e 67 65 73 29 21 3d 30 20 26  ernChanges)!=0 &
a170: 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  & db->init.busy=
a180: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
a190: 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
a1a0: 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20  tatements(db);. 
a1b0: 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 41     sqlite3ResetA
a1c0: 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65  llSchemasOfConne
a1d0: 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20  ction(db);.  }. 
a1e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
a1f0: 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a  veAll(db);..  /*
a200: 20 41 6e 79 20 64 65 66 65 72 72 65 64 20 63 6f   Any deferred co
a210: 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69  nstraint violati
a220: 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20 62 65 65  ons have now bee
a230: 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20  n resolved. */. 
a240: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
a250: 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 44  ns = 0;.  db->nD
a260: 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d  eferredImmCons =
a270: 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20   0;.  db->flags 
a280: 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72  &= ~SQLITE_Defer
a290: 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  FKs;..  /* If on
a2a0: 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69  e has been confi
a2b0: 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68  gured, invoke th
a2c0: 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20  e rollback-hook 
a2d0: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66  callback */.  if
a2e0: 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43  ( db->xRollbackC
a2f0: 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72  allback && (inTr
a300: 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f  ans || !db->auto
a310: 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64  Commit) ){.    d
a320: 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c  b->xRollbackCall
a330: 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61  back(db->pRollba
a340: 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ckArg);.  }.}../
a350: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
a360: 61 74 69 63 20 73 74 72 69 6e 67 20 63 6f 6e 74  atic string cont
a370: 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20  aining the name 
a380: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
a390: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a   the error code.
a3a0: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  ** specified in 
a3b0: 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  the argument..*/
a3c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
a3d0: 49 54 45 5f 4e 45 45 44 5f 45 52 52 5f 4e 41 4d  ITE_NEED_ERR_NAM
a3e0: 45 29 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  E).const char *s
a3f0: 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e  qlite3ErrName(in
a400: 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63  t rc){.  const c
a410: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
a420: 20 20 69 6e 74 20 69 2c 20 6f 72 69 67 52 63 20    int i, origRc 
a430: 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = rc;.  for(i=0;
a440: 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30   i<2 && zName==0
a450: 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66  ; i++, rc &= 0xf
a460: 66 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20  f){.    switch( 
a470: 72 63 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  rc ){.      case
a480: 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20   SQLITE_OK:     
a490: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
a4a0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b  e = "SQLITE_OK";
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a4d0: 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20  e SQLITE_ERROR: 
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
a4f0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52  me = "SQLITE_ERR
a500: 4f 52 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  OR";            
a510: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a520: 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  se SQLITE_INTERN
a530: 41 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  AL:           zN
a540: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e  ame = "SQLITE_IN
a550: 54 45 52 4e 41 4c 22 3b 20 20 20 20 20 20 20 20  TERNAL";        
a560: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a570: 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a  ase SQLITE_PERM:
a580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
a590: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50  Name = "SQLITE_P
a5a0: 45 52 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20  ERM";           
a5b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a5c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
a5d0: 54 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T:              
a5e0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a5f0: 41 42 4f 52 54 22 3b 20 20 20 20 20 20 20 20 20  ABORT";         
a600: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a610: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f   case SQLITE_ABO
a620: 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20  RT_ROLLBACK:    
a630: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a640: 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22  _ABORT_ROLLBACK"
a650: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
a660: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
a670: 53 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  SY:             
a680: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a690: 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20 20  E_BUSY";        
a6a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a6b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
a6c0: 55 53 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 20  USY_RECOVERY:   
a6d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a6e0: 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59  TE_BUSY_RECOVERY
a6f0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
a700: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a710: 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20  BUSY_SNAPSHOT:  
a720: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a730: 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f  ITE_BUSY_SNAPSHO
a740: 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  T";     break;. 
a750: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a760: 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20 20 20  _LOCKED:        
a770: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a780: 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20  LITE_LOCKED";   
a790: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a7a0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a7b0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
a7c0: 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  ACHE: zName = "S
a7d0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
a7e0: 52 45 44 43 41 43 48 45 22 3b 62 72 65 61 6b 3b  REDCACHE";break;
a7f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a800: 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20  TE_NOMEM:       
a810: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a820: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20  SQLITE_NOMEM";  
a830: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
a840: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a850: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20  ITE_READONLY:   
a860: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a870: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
a880: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
a890: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a8a0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45  LITE_READONLY_RE
a8b0: 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d  COVERY:  zName =
a8c0: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
a8d0: 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 62 72 65  Y_RECOVERY"; bre
a8e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a8f0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43  QLITE_READONLY_C
a900: 41 4e 54 4c 4f 43 4b 3a 20 20 7a 4e 61 6d 65 20  ANTLOCK:  zName 
a910: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
a920: 4c 59 5f 43 41 4e 54 4c 4f 43 4b 22 3b 20 62 72  LY_CANTLOCK"; br
a930: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a940: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
a950: 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65  ROLLBACK:  zName
a960: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
a970: 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62  NLY_ROLLBACK"; b
a980: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a990: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
a9a0: 5f 44 42 4d 4f 56 45 44 3a 20 20 20 7a 4e 61 6d  _DBMOVED:   zNam
a9b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
a9c0: 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 22 3b 20 20  ONLY_DBMOVED";  
a9d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a9e0: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  e SQLITE_INTERRU
a9f0: 50 54 3a 20 20 20 20 20 20 20 20 20 20 7a 4e 61  PT:          zNa
aa00: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54  me = "SQLITE_INT
aa10: 45 52 52 55 50 54 22 3b 20 20 20 20 20 20 20 20  ERRUPT";        
aa20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
aa30: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a  se SQLITE_IOERR:
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
aa50: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
aa60: 45 52 52 22 3b 20 20 20 20 20 20 20 20 20 20 20  ERR";           
aa70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
aa80: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
aa90: 5f 52 45 41 44 3a 20 20 20 20 20 20 20 20 20 7a  _READ:         z
aaa0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
aab0: 4f 45 52 52 5f 52 45 41 44 22 3b 20 20 20 20 20  OERR_READ";     
aac0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
aad0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
aae0: 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20 20 20  R_SHORT_READ:   
aaf0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
ab00: 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
ab10: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
ab20: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
ab30: 52 52 5f 57 52 49 54 45 3a 20 20 20 20 20 20 20  RR_WRITE:       
ab40: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ab50: 5f 49 4f 45 52 52 5f 57 52 49 54 45 22 3b 20 20  _IOERR_WRITE";  
ab60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ab70: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
ab80: 45 52 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 20  ERR_FSYNC:      
ab90: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
aba0: 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20  E_IOERR_FSYNC"; 
abb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
abc0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
abd0: 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20  OERR_DIR_FSYNC: 
abe0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
abf0: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
ac00: 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  NC";   break;.  
ac10: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ac20: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3a 20  IOERR_TRUNCATE: 
ac30: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ac40: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
ac50: 54 45 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  TE";    break;. 
ac60: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ac70: 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a 20 20 20  _IOERR_FSTAT:   
ac80: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ac90: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
aca0: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
acb0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
acc0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20  E_IOERR_UNLOCK: 
acd0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
ace0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
acf0: 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  CK";      break;
ad00: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ad10: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a  TE_IOERR_RDLOCK:
ad20: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ad30: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
ad40: 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b  OCK";      break
ad50: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ad60: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
ad70: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
ad80: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  "SQLITE_IOERR_DE
ad90: 4c 45 54 45 22 3b 20 20 20 20 20 20 62 72 65 61  LETE";      brea
ada0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
adb0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
adc0: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
add0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e   "SQLITE_IOERR_N
ade0: 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65  OMEM";       bre
adf0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
ae00: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
ae10: 53 53 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  SS:       zName 
ae20: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
ae30: 41 43 43 45 53 53 22 3b 20 20 20 20 20 20 62 72  ACCESS";      br
ae40: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ae50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
ae60: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a  CKRESERVEDLOCK:.
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae90: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
aea0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
aeb0: 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b  VEDLOCK"; break;
aec0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
aed0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20  TE_IOERR_LOCK:  
aee0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
aef0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
af00: 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  K";        break
af10: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
af20: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a  ITE_IOERR_CLOSE:
af30: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
af40: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  "SQLITE_IOERR_CL
af50: 4f 53 45 22 3b 20 20 20 20 20 20 20 62 72 65 61  OSE";       brea
af60: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
af70: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43  LITE_IOERR_DIR_C
af80: 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d  LOSE:    zName =
af90: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44   "SQLITE_IOERR_D
afa0: 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20 62 72 65  IR_CLOSE";   bre
afb0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
afc0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
afd0: 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  PEN:      zName 
afe0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
aff0: 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20 20 62 72  SHMOPEN";     br
b000: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b010: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b020: 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65  SIZE:      zName
b030: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b040: 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20 20 20 62  _SHMSIZE";     b
b050: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b060: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
b070: 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d  MLOCK:      zNam
b080: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b090: 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20  R_SHMLOCK";     
b0a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b0b0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
b0c0: 48 4d 4d 41 50 3a 20 20 20 20 20 20 20 7a 4e 61  HMMAP:       zNa
b0d0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b0e0: 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20 20 20 20  RR_SHMMAP";     
b0f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b100: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b110: 53 45 45 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e  SEEK:         zN
b120: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b130: 45 52 52 5f 53 45 45 4b 22 3b 20 20 20 20 20 20  ERR_SEEK";      
b140: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b150: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b160: 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a  _DELETE_NOENT: z
b170: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b180: 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
b190: 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  T";break;.      
b1a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b1b0: 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20 20 20 20  R_MMAP:         
b1c0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b1d0: 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20 20 20 20  IOERR_MMAP";    
b1e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b1f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b200: 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 3a 20  RR_GETTEMPPATH: 
b210: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b220: 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
b230: 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  TH"; break;.    
b240: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b250: 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a 20 20 20  ERR_CONVPATH:   
b260: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b270: 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48  E_IOERR_CONVPATH
b280: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
b290: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b2a0: 4f 52 52 55 50 54 3a 20 20 20 20 20 20 20 20 20  ORRUPT:         
b2b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b2c0: 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20 20 20  TE_CORRUPT";    
b2d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b2e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b2f0: 43 4f 52 52 55 50 54 5f 56 54 41 42 3a 20 20 20  CORRUPT_VTAB:   
b300: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b310: 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  ITE_CORRUPT_VTAB
b320: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
b330: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b340: 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20 20 20 20  _NOTFOUND:      
b350: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b360: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20  LITE_NOTFOUND"; 
b370: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b380: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b390: 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20 20 20  E_FULL:         
b3a0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b3b0: 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20  QLITE_FULL";    
b3c0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b3d0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b3e0: 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20  TE_CANTOPEN:    
b3f0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b400: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22  SQLITE_CANTOPEN"
b410: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
b420: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b430: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54  ITE_CANTOPEN_NOT
b440: 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65 20 3d 20  EMPDIR: zName = 
b450: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
b460: 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62 72 65 61  _NOTEMPDIR";brea
b470: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b480: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53  LITE_CANTOPEN_IS
b490: 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  DIR:     zName =
b4a0: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
b4b0: 4e 5f 49 53 44 49 52 22 3b 20 20 20 20 62 72 65  N_ISDIR";    bre
b4c0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b4d0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
b4e0: 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20  ULLPATH:  zName 
b4f0: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
b500: 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b 20 62 72  EN_FULLPATH"; br
b510: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b520: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
b530: 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e 61 6d 65  CONVPATH:  zName
b540: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
b550: 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22 3b 20 62  PEN_CONVPATH"; b
b560: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b570: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
b580: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
b590: 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 52 4f 54  e = "SQLITE_PROT
b5a0: 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20 20 20 20  OCOL";          
b5b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b5c0: 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20  e SQLITE_EMPTY: 
b5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
b5e0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50  me = "SQLITE_EMP
b5f0: 54 59 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  TY";            
b600: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b610: 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41  se SQLITE_SCHEMA
b620: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
b630: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 53 43  ame = "SQLITE_SC
b640: 48 45 4d 41 22 3b 20 20 20 20 20 20 20 20 20 20  HEMA";          
b650: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b660: 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49  ase SQLITE_TOOBI
b670: 47 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  G:             z
b680: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 54  Name = "SQLITE_T
b690: 4f 4f 42 49 47 22 3b 20 20 20 20 20 20 20 20 20  OOBIG";         
b6a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b6b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
b6c0: 54 52 41 49 4e 54 3a 20 20 20 20 20 20 20 20 20  TRAINT:         
b6d0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b6e0: 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20 20 20 20  CONSTRAINT";    
b6f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b700: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
b710: 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 3a 20  STRAINT_UNIQUE: 
b720: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b730: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51  _CONSTRAINT_UNIQ
b740: 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  UE"; break;.    
b750: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
b760: 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45 52  NSTRAINT_TRIGGER
b770: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
b780: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49  E_CONSTRAINT_TRI
b790: 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20  GGER";break;.   
b7a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b7b0: 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
b7c0: 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20  NKEY:.          
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7e0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b7f0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b800: 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b 20 20 20  _FOREIGNKEY";   
b810: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b820: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
b830: 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20 7a 4e 61  INT_CHECK:   zNa
b840: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
b850: 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 22 3b 20  STRAINT_CHECK"; 
b860: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b870: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
b880: 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a  AINT_PRIMARYKEY:
b890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8b0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b8c0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d  _CONSTRAINT_PRIM
b8d0: 41 52 59 4b 45 59 22 3b 20 20 20 62 72 65 61 6b  ARYKEY";   break
b8e0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b8f0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e  ITE_CONSTRAINT_N
b900: 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20  OTNULL: zName = 
b910: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
b920: 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65 61  NT_NOTNULL";brea
b930: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b940: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b950: 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20 20  COMMITHOOK:.    
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b980: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
b990: 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
b9a0: 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  K";   break;.   
b9b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b9c0: 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 3a 20  ONSTRAINT_VTAB: 
b9d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b9e0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54  TE_CONSTRAINT_VT
b9f0: 41 42 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  AB";   break;.  
ba00: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
ba10: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54  CONSTRAINT_FUNCT
ba20: 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ION:.           
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba40: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ba50: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
ba60: 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20 20 20 62  FUNCTION";     b
ba70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ba80: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
ba90: 4e 54 5f 52 4f 57 49 44 3a 20 20 20 7a 4e 61 6d  NT_ROWID:   zNam
baa0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
bab0: 54 52 41 49 4e 54 5f 52 4f 57 49 44 22 3b 20 20  TRAINT_ROWID";  
bac0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bad0: 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  e SQLITE_MISMATC
bae0: 48 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  H:           zNa
baf0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53  me = "SQLITE_MIS
bb00: 4d 41 54 43 48 22 3b 20 20 20 20 20 20 20 20 20  MATCH";         
bb10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bb20: 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  se SQLITE_MISUSE
bb30: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
bb40: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49  ame = "SQLITE_MI
bb50: 53 55 53 45 22 3b 20 20 20 20 20 20 20 20 20 20  SUSE";          
bb60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bb70: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  ase SQLITE_NOLFS
bb80: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
bb90: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
bba0: 4f 4c 46 53 22 3b 20 20 20 20 20 20 20 20 20 20  OLFS";          
bbb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bbc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55 54 48  case SQLITE_AUTH
bbd0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
bbe0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bbf0: 41 55 54 48 22 3b 20 20 20 20 20 20 20 20 20 20  AUTH";          
bc00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bc10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4f 52   case SQLITE_FOR
bc20: 4d 41 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  MAT:            
bc30: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bc40: 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20 20 20  _FORMAT";       
bc50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bc60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 41    case SQLITE_RA
bc70: 4e 47 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  NGE:            
bc80: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bc90: 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20 20 20  E_RANGE";       
bca0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bcb0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
bcc0: 4f 54 41 44 42 3a 20 20 20 20 20 20 20 20 20 20  OTADB:          
bcd0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bce0: 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20 20  TE_NOTADB";     
bcf0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bd00: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bd10: 52 4f 57 3a 20 20 20 20 20 20 20 20 20 20 20 20  ROW:            
bd20: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bd30: 49 54 45 5f 52 4f 57 22 3b 20 20 20 20 20 20 20  ITE_ROW";       
bd40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bd50: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bd60: 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20 20 20 20  _NOTICE:        
bd70: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bd80: 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b 20 20 20  LITE_NOTICE";   
bd90: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bda0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bdb0: 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52  E_NOTICE_RECOVER
bdc0: 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  _WAL: zName = "S
bdd0: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
bde0: 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65 61 6b 3b  OVER_WAL";break;
bdf0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
be00: 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
be10: 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20 20  R_ROLLBACK:.    
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be30: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
be40: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49  e = "SQLITE_NOTI
be50: 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42  CE_RECOVER_ROLLB
be60: 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ACK"; break;.   
be70: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57     case SQLITE_W
be80: 41 52 4e 49 4e 47 3a 20 20 20 20 20 20 20 20 20  ARNING:         
be90: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bea0: 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20 20 20 20  TE_WARNING";    
beb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bec0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bed0: 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45  WARNING_AUTOINDE
bee0: 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  X:  zName = "SQL
bef0: 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f  ITE_WARNING_AUTO
bf00: 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20  INDEX"; break;. 
bf10: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bf20: 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20 20 20 20  _DONE:          
bf30: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bf40: 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20  LITE_DONE";     
bf50: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bf60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
bf70: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
bf80: 73 74 61 74 69 63 20 63 68 61 72 20 7a 42 75 66  static char zBuf
bf90: 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  [50];.    sqlite
bfa0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
bfb0: 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
bfc0: 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25  SQLITE_UNKNOWN(%
bfd0: 64 29 22 2c 20 6f 72 69 67 52 63 29 3b 0a 20 20  d)", origRc);.  
bfe0: 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75 66 3b 0a    zName = zBuf;.
bff0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61    }.  return zNa
c000: 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me;.}.#endif../*
c010: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61  .** Return a sta
c020: 74 69 63 20 73 74 72 69 6e 67 20 74 68 61 74 20  tic string that 
c030: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b 69  describes the ki
c040: 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63  nd of error spec
c050: 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  ified in the.** 
c060: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e  argument..*/.con
c070: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
c080: 45 72 72 53 74 72 28 69 6e 74 20 72 63 29 7b 0a  ErrStr(int rc){.
c090: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
c0a0: 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b  har* const aMsg[
c0b0: 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c  ] = {.    /* SQL
c0c0: 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20  ITE_OK          
c0d0: 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72  */ "not an error
c0e0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c0f0: 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a 2f 20  _ERROR       */ 
c100: 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72  "SQL logic error
c110: 20 6f 72 20 6d 69 73 73 69 6e 67 20 64 61 74 61   or missing data
c120: 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  base",.    /* SQ
c130: 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20  LITE_INTERNAL   
c140: 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51   */ 0,.    /* SQ
c150: 4c 49 54 45 5f 50 45 52 4d 20 20 20 20 20 20 20  LITE_PERM       
c160: 20 2a 2f 20 22 61 63 63 65 73 73 20 70 65 72 6d   */ "access perm
c170: 69 73 73 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a  ission denied",.
c180: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42      /* SQLITE_AB
c190: 4f 52 54 20 20 20 20 20 20 20 2a 2f 20 22 63 61  ORT       */ "ca
c1a0: 6c 6c 62 61 63 6b 20 72 65 71 75 65 73 74 65 64  llback requested
c1b0: 20 71 75 65 72 79 20 61 62 6f 72 74 22 2c 0a 20   query abort",. 
c1c0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53     /* SQLITE_BUS
c1d0: 59 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74  Y        */ "dat
c1e0: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 22  abase is locked"
c1f0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c200: 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a 2f 20 22  LOCKED      */ "
c210: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69  database table i
c220: 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f  s locked",.    /
c230: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20  * SQLITE_NOMEM  
c240: 20 20 20 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20       */ "out of 
c250: 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20  memory",.    /* 
c260: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
c270: 20 20 20 2a 2f 20 22 61 74 74 65 6d 70 74 20 74     */ "attempt t
c280: 6f 20 77 72 69 74 65 20 61 20 72 65 61 64 6f 6e  o write a readon
c290: 6c 79 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20  ly database",.  
c2a0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45    /* SQLITE_INTE
c2b0: 52 52 55 50 54 20 20 20 2a 2f 20 22 69 6e 74 65  RRUPT   */ "inte
c2c0: 72 72 75 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a  rrupted",.    /*
c2d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 20 20   SQLITE_IOERR   
c2e0: 20 20 20 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f      */ "disk I/O
c2f0: 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20   error",.    /* 
c300: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 20  SQLITE_CORRUPT  
c310: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
c320: 64 69 73 6b 20 69 6d 61 67 65 20 69 73 20 6d 61  disk image is ma
c330: 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a  lformed",.    /*
c340: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
c350: 20 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20      */ "unknown 
c360: 6f 70 65 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20  operation",.    
c370: 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20  /* SQLITE_FULL  
c380: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
c390: 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66 75  se or disk is fu
c3a0: 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ll",.    /* SQLI
c3b0: 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a  TE_CANTOPEN    *
c3c0: 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  / "unable to ope
c3d0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 22  n database file"
c3e0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c3f0: 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22  PROTOCOL    */ "
c400: 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
c410: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c420: 5f 45 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20  _EMPTY       */ 
c430: 22 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20  "table contains 
c440: 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20 20 2f 2a  no data",.    /*
c450: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20   SQLITE_SCHEMA  
c460: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
c470: 20 73 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e   schema has chan
c480: 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ged",.    /* SQL
c490: 49 54 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20  ITE_TOOBIG      
c4a0: 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72 20 62 6c  */ "string or bl
c4b0: 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20  ob too big",.   
c4c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   /* SQLITE_CONST
c4d0: 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74  RAINT  */ "const
c4e0: 72 61 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20  raint failed",. 
c4f0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53     /* SQLITE_MIS
c500: 4d 41 54 43 48 20 20 20 20 2a 2f 20 22 64 61 74  MATCH    */ "dat
c510: 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22 2c  atype mismatch",
c520: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  .    /* SQLITE_M
c530: 49 53 55 53 45 20 20 20 20 20 20 2a 2f 20 22 6c  ISUSE      */ "l
c540: 69 62 72 61 72 79 20 72 6f 75 74 69 6e 65 20 63  ibrary routine c
c550: 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20 73 65 71  alled out of seq
c560: 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20 53  uence",.    /* S
c570: 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20  QLITE_NOLFS     
c580: 20 20 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c 65    */ "large file
c590: 20 73 75 70 70 6f 72 74 20 69 73 20 64 69 73 61   support is disa
c5a0: 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  bled",.    /* SQ
c5b0: 4c 49 54 45 5f 41 55 54 48 20 20 20 20 20 20 20  LITE_AUTH       
c5c0: 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61 74 69   */ "authorizati
c5d0: 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20  on denied",.    
c5e0: 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  /* SQLITE_FORMAT
c5f0: 20 20 20 20 20 20 2a 2f 20 22 61 75 78 69 6c 69        */ "auxili
c600: 61 72 79 20 64 61 74 61 62 61 73 65 20 66 6f 72  ary database for
c610: 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20 20 20 20  mat error",.    
c620: 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 20  /* SQLITE_RANGE 
c630: 20 20 20 20 20 20 2a 2f 20 22 62 69 6e 64 20 6f        */ "bind o
c640: 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f  r column index o
c650: 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20  ut of range",.  
c660: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41    /* SQLITE_NOTA
c670: 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65  DB      */ "file
c680: 20 69 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72   is encrypted or
c690: 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61   is not a databa
c6a0: 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73  se",.  };.  cons
c6b0: 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22  t char *zErr = "
c6c0: 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 0a  unknown error";.
c6d0: 20 20 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a    switch( rc ){.
c6e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c6f0: 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20  ABORT_ROLLBACK: 
c700: 7b 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20 22  {.      zErr = "
c710: 61 62 6f 72 74 20 64 75 65 20 74 6f 20 52 4f 4c  abort due to ROL
c720: 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20 20 62 72  LBACK";.      br
c730: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
c740: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
c750: 72 63 20 26 3d 20 30 78 66 66 3b 0a 20 20 20 20  rc &= 0xff;.    
c760: 20 20 69 66 28 20 41 4c 57 41 59 53 28 72 63 3e    if( ALWAYS(rc>
c770: 3d 30 29 20 26 26 20 72 63 3c 41 72 72 61 79 53  =0) && rc<ArrayS
c780: 69 7a 65 28 61 4d 73 67 29 20 26 26 20 61 4d 73  ize(aMsg) && aMs
c790: 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20 20 20 20  g[rc]!=0 ){.    
c7a0: 20 20 20 20 7a 45 72 72 20 3d 20 61 4d 73 67 5b      zErr = aMsg[
c7b0: 72 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc];.      }.   
c7c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c7d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72    }.  return zEr
c7e0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  r;.}../*.** This
c7f0: 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
c800: 6e 74 73 20 61 20 62 75 73 79 20 63 61 6c 6c 62  nts a busy callb
c810: 61 63 6b 20 74 68 61 74 20 73 6c 65 65 70 73 20  ack that sleeps 
c820: 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61 67 61  and tries.** aga
c830: 69 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f  in until a timeo
c840: 75 74 20 76 61 6c 75 65 20 69 73 20 72 65 61 63  ut value is reac
c850: 68 65 64 2e 20 20 54 68 65 20 74 69 6d 65 6f 75  hed.  The timeou
c860: 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e  t value is.** an
c870: 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20   integer number 
c880: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
c890: 70 61 73 73 65 64 20 69 6e 20 61 73 20 74 68 65  passed in as the
c8a0: 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
c8b0: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
c8c0: 74 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42  t sqliteDefaultB
c8d0: 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20 76 6f  usyCallback(. vo
c8e0: 69 64 20 2a 70 74 72 2c 20 20 20 20 20 20 20 20  id *ptr,        
c8f0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
c900: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
c910: 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20 20 20 20  . int count     
c920: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
c930: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 61  mber of times ta
c940: 62 6c 65 20 68 61 73 20 62 65 65 6e 20 62 75 73  ble has been bus
c950: 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49  y */.){.#if SQLI
c960: 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20 48 41 56  TE_OS_WIN || HAV
c970: 45 5f 55 53 4c 45 45 50 0a 20 20 73 74 61 74 69  E_USLEEP.  stati
c980: 63 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79  c const u8 delay
c990: 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20  s[] =.     { 1, 
c9a0: 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30  2, 5, 10, 15, 20
c9b0: 2c 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20  , 25, 25,  25,  
c9c0: 35 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a  50,  50, 100 };.
c9d0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
c9e0: 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20  8 totals[] =.   
c9f0: 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c    { 0, 1, 3,  8,
ca00: 20 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c   18, 33, 53, 78,
ca10: 20 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20   103, 128, 178, 
ca20: 32 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20  228 };.# define 
ca30: 4e 44 45 4c 41 59 20 41 72 72 61 79 53 69 7a 65  NDELAY ArraySize
ca40: 28 64 65 6c 61 79 73 29 0a 20 20 73 71 6c 69 74  (delays).  sqlit
ca50: 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65  e3 *db = (sqlite
ca60: 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74  3 *)ptr;.  int t
ca70: 69 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73  imeout = db->bus
ca80: 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20  yTimeout;.  int 
ca90: 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20  delay, prior;.. 
caa0: 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d   assert( count>=
cab0: 30 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74  0 );.  if( count
cac0: 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20   < NDELAY ){.   
cad0: 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b   delay = delays[
cae0: 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f  count];.    prio
caf0: 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74  r = totals[count
cb00: 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
cb10: 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e  delay = delays[N
cb20: 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72  DELAY-1];.    pr
cb30: 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45  ior = totals[NDE
cb40: 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28  LAY-1] + delay*(
cb50: 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29  count-(NDELAY-1)
cb60: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69  );.  }.  if( pri
cb70: 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d  or + delay > tim
cb80: 65 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61  eout ){.    dela
cb90: 79 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72  y = timeout - pr
cba0: 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c  ior;.    if( del
cbb0: 61 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ay<=0 ) return 0
cbc0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
cbd0: 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c  sSleep(db->pVfs,
cbe0: 20 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20   delay*1000);.  
cbf0: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a  return 1;.#else.
cc00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
cc10: 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a  (sqlite3 *)ptr;.
cc20: 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20    int timeout = 
cc30: 28 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29  ((sqlite3 *)ptr)
cc40: 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20  ->busyTimeout;. 
cc50: 20 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31   if( (count+1)*1
cc60: 30 30 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b  000 > timeout ){
cc70: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
cc80: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c   }.  sqlite3OsSl
cc90: 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30  eep(db->pVfs, 10
cca0: 30 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e  00000);.  return
ccb0: 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   1;.#endif.}../*
ccc0: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67  .** Invoke the g
ccd0: 69 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65  iven busy handle
cce0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
ccf0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
cd00: 77 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f  when an operatio
cd10: 6e 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 20  n failed with a 
cd20: 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73  lock..** If this
cd30: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
cd40: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c   non-zero, the l
cd50: 6f 63 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20  ock is retried. 
cd60: 20 49 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e   If it.** return
cd70: 73 20 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69  s 0, the operati
cd80: 6f 6e 20 61 62 6f 72 74 73 20 77 69 74 68 20 61  on aborts with a
cd90: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72  n SQLITE_BUSY er
cda0: 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ror..*/.int sqli
cdb0: 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
cdc0: 64 6c 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72  dler(BusyHandler
cdd0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
cde0: 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
cdf0: 29 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30  ) || p->xFunc==0
ce00: 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29   || p->nBusy<0 )
ce10: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20   return 0;.  rc 
ce20: 3d 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41  = p->xFunc(p->pA
ce30: 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20  rg, p->nBusy);. 
ce40: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
ce50: 20 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b    p->nBusy = -1;
ce60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d  .  }else{.    p-
ce70: 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20  >nBusy++;.  }.  
ce80: 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f  return rc; .}../
ce90: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
cea0: 65 20 73 65 74 73 20 74 68 65 20 62 75 73 79 20  e sets the busy 
ceb0: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20  callback for an 
cec0: 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20  Sqlite database 
ced0: 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20  to the.** given 
cee0: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
cef0: 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  n with the given
cf00: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
cf10: 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68  t sqlite3_busy_h
cf20: 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65  andler(.  sqlite
cf30: 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78  3 *db,.  int (*x
cf40: 42 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29  Busy)(void*,int)
cf50: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29  ,.  void *pArg.)
cf60: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
cf70: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
cf80: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
cf90: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
cfa0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
cfb0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
cfc0: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
cfd0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
cfe0: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73  utex);.  db->bus
cff0: 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20 3d  yHandler.xFunc =
d000: 20 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75   xBusy;.  db->bu
d010: 73 79 48 61 6e 64 6c 65 72 2e 70 41 72 67 20 3d  syHandler.pArg =
d020: 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73   pArg;.  db->bus
d030: 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d  yHandler.nBusy =
d040: 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 54 69   0;.  db->busyTi
d050: 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 73 71 6c  meout = 0;.  sql
d060: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
d070: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
d080: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d090: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
d0a0: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
d0b0: 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20  _CALLBACK./*.** 
d0c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
d0d0: 73 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63  s the progress c
d0e0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53  allback for an S
d0f0: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
d100: 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63  o the.** given c
d110: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
d120: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
d130: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 70 72  argument. The pr
d140: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
d150: 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b  will.** be invok
d160: 65 64 20 65 76 65 72 79 20 6e 4f 70 73 20 6f 70  ed every nOps op
d170: 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  codes..*/.void s
d180: 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
d190: 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74  handler(.  sqlit
d1a0: 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e  e3 *db, .  int n
d1b0: 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72  Ops,.  int (*xPr
d1c0: 6f 67 72 65 73 73 29 28 76 6f 69 64 2a 29 2c 20  ogress)(void*), 
d1d0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
d1e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d1f0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
d200: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
d210: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
d220: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
d230: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
d240: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
d250: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
d260: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
d270: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
d280: 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20 64 62  nOps>0 ){.    db
d290: 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50  ->xProgress = xP
d2a0: 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 64 62 2d  rogress;.    db-
d2b0: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20  >nProgressOps = 
d2c0: 28 75 6e 73 69 67 6e 65 64 29 6e 4f 70 73 3b 0a  (unsigned)nOps;.
d2d0: 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73      db->pProgres
d2e0: 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 7d  sArg = pArg;.  }
d2f0: 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 78 50  else{.    db->xP
d300: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
d310: 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70   db->nProgressOp
d320: 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 70  s = 0;.    db->p
d330: 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 30 3b  ProgressArg = 0;
d340: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
d350: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
d360: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
d370: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
d380: 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61 20  tine installs a 
d390: 64 65 66 61 75 6c 74 20 62 75 73 79 20 68 61 6e  default busy han
d3a0: 64 6c 65 72 20 74 68 61 74 20 77 61 69 74 73 20  dler that waits 
d3b0: 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  for the.** speci
d3c0: 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d  fied number of m
d3d0: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f  illiseconds befo
d3e0: 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a  re returning 0..
d3f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  */.int sqlite3_b
d400: 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69  usy_timeout(sqli
d410: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29  te3 *db, int ms)
d420: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
d430: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
d440: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
d450: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
d460: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d470: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
d480: 6e 64 69 66 0a 20 20 69 66 28 20 6d 73 3e 30 20  ndif.  if( ms>0 
d490: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
d4a0: 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20  usy_handler(db, 
d4b0: 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73  sqliteDefaultBus
d4c0: 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  yCallback, (void
d4d0: 2a 29 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e 62  *)db);.    db->b
d4e0: 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b  usyTimeout = ms;
d4f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
d500: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
d510: 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  er(db, 0, 0);.  
d520: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
d530: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
d540: 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67  ause any pending
d550: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74   operation to st
d560: 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c 69 65  op at its earlie
d570: 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a  st opportunity..
d580: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
d590: 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74 65  interrupt(sqlite
d5a0: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
d5b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
d5c0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
d5d0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
d5e0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
d5f0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
d600: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
d610: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rn;.  }.#endif. 
d620: 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
d630: 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f  upted = 1;.}.../
d640: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
d650: 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74 68  on is exactly th
d660: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
d670: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
d680: 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74  n(), except.** t
d690: 68 61 74 20 69 74 20 69 73 20 64 65 73 69 67 6e  hat it is design
d6a0: 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
d6b0: 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65  by internal code
d6c0: 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  . The difference
d6d0: 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66 20 61   is.** that if a
d6e0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20   malloc() fails 
d6f0: 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  in sqlite3_creat
d700: 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e  e_function(), an
d710: 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69   error code.** i
d720: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
d730: 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  he mallocFailed 
d740: 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a  flag cleared. .*
d750: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 72 65  /.int sqlite3Cre
d760: 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ateFunc(.  sqlit
d770: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
d780: 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e  char *zFunctionN
d790: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  ame,.  int nArg,
d7a0: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
d7b0: 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a 20  id *pUserData,. 
d7c0: 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28   void (*xSFunc)(
d7d0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
d7e0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
d7f0: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
d800: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
d810: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
d820: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
d830: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
d840: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
d850: 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72 75  *),.  FuncDestru
d860: 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f  ctor *pDestructo
d870: 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a  r.){.  FuncDef *
d880: 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  p;.  int nName;.
d890: 20 20 69 6e 74 20 65 78 74 72 61 46 6c 61 67 73    int extraFlags
d8a0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
d8b0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d8c0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
d8d0: 69 66 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  if( zFunctionNam
d8e0: 65 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28 78  e==0 ||.      (x
d8f0: 53 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c  SFunc && (xFinal
d900: 20 7c 7c 20 78 53 74 65 70 29 29 20 7c 7c 20 0a   || xStep)) || .
d910: 20 20 20 20 20 20 28 21 78 53 46 75 6e 63 20 26        (!xSFunc &
d920: 26 20 28 78 46 69 6e 61 6c 20 26 26 20 21 78 53  & (xFinal && !xS
d930: 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28  tep)) ||.      (
d940: 21 78 53 46 75 6e 63 20 26 26 20 28 21 78 46 69  !xSFunc && (!xFi
d950: 6e 61 6c 20 26 26 20 78 53 74 65 70 29 29 20 7c  nal && xStep)) |
d960: 7c 0a 20 20 20 20 20 20 28 6e 41 72 67 3c 2d 31  |.      (nArg<-1
d970: 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f   || nArg>SQLITE_
d980: 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
d990: 29 20 7c 7c 0a 20 20 20 20 20 20 28 32 35 35 3c  ) ||.      (255<
d9a0: 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  (nName = sqlite3
d9b0: 53 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74  Strlen30( zFunct
d9c0: 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b 0a 20 20  ionName))) ){.  
d9d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d9e0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
d9f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
da00: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54  TE_FUNC_CONSTANT
da10: 3d 3d 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  ==SQLITE_DETERMI
da20: 4e 49 53 54 49 43 20 29 3b 0a 20 20 65 78 74 72  NISTIC );.  extr
da30: 61 46 6c 61 67 73 20 3d 20 65 6e 63 20 26 20 20  aFlags = enc &  
da40: 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
da50: 53 54 49 43 3b 0a 20 20 65 6e 63 20 26 3d 20 28  STIC;.  enc &= (
da60: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d  SQLITE_FUNC_ENCM
da70: 41 53 4b 7c 53 51 4c 49 54 45 5f 41 4e 59 29 3b  ASK|SQLITE_ANY);
da80: 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .  .#ifndef SQLI
da90: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
daa0: 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46  /* If SQLITE_UTF
dab0: 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20  16 is specified 
dac0: 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  as the encoding 
dad0: 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20  type, transform 
dae0: 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65  this.  ** to one
daf0: 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   of SQLITE_UTF16
db00: 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46  LE or SQLITE_UTF
db10: 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20  16BE using the. 
db20: 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36   ** SQLITE_UTF16
db30: 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51  NATIVE macro. SQ
db40: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f  LITE_UTF16 is no
db50: 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  t used internall
db60: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  y..  **.  ** If 
db70: 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20 73 70  SQLITE_ANY is sp
db80: 65 63 69 66 69 65 64 2c 20 61 64 64 20 74 68 72  ecified, add thr
db90: 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  ee versions of t
dba0: 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  he function.  **
dbb0: 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62   to the hash tab
dbc0: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
dbd0: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
dbe0: 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53 51   ){.    enc = SQ
dbf0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
dc00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 6e  ;.  }else if( en
dc10: 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b  c==SQLITE_ANY ){
dc20: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
dc30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
dc40: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
dc50: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  ctionName, nArg,
dc60: 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 65 78 74   SQLITE_UTF8|ext
dc70: 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  raFlags,.       
dc80: 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 53 46    pUserData, xSF
dc90: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
dca0: 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  al, pDestructor)
dcb0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
dcc0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
dcd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
dce0: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
dcf0: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  ctionName, nArg,
dd00: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 7c   SQLITE_UTF16LE|
dd10: 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20 20 20  extraFlags,.    
dd20: 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c        pUserData,
dd30: 20 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 20   xSFunc, xStep, 
dd40: 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63  xFinal, pDestruc
dd50: 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tor);.    }.    
dd60: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
dd70: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
dd80: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
dd90: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
dda0: 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  16BE;.  }.#else.
ddb0: 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55    enc = SQLITE_U
ddc0: 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20  TF8;.#endif.  . 
ddd0: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 20   /* Check if an 
dde0: 65 78 69 73 74 69 6e 67 20 66 75 6e 63 74 69 6f  existing functio
ddf0: 6e 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72  n is being overr
de00: 69 64 64 65 6e 20 6f 72 20 64 65 6c 65 74 65 64  idden or deleted
de10: 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e  . If so,.  ** an
de20: 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  d there are acti
de30: 76 65 20 56 4d 73 2c 20 74 68 65 6e 20 72 65 74  ve VMs, then ret
de40: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
de50: 20 49 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a 20   If a function. 
de60: 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f 76 65   ** is being ove
de70: 72 72 69 64 64 65 6e 2f 64 65 6c 65 74 65 64 20  rridden/deleted 
de80: 62 75 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f  but there are no
de90: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 61 6c 6c   active VMs, all
dea0: 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72  ow the.  ** oper
deb0: 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75  ation to continu
dec0: 65 20 62 75 74 20 69 6e 76 61 6c 69 64 61 74 65  e but invalidate
ded0: 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65 64   all precompiled
dee0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
def0: 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46  /.  p = sqlite3F
df00: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
df10: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
df20: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29  Name, nArg, (u8)
df30: 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  enc, 0);.  if( p
df40: 20 26 26 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67   && (p->funcFlag
df50: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
df60: 45 4e 43 4d 41 53 4b 29 3d 3d 65 6e 63 20 26 26  ENCMASK)==enc &&
df70: 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29   p->nArg==nArg )
df80: 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56  {.    if( db->nV
df90: 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20  dbeActive ){.   
dfa0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
dfb0: 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54  ithMsg(db, SQLIT
dfc0: 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20  E_BUSY, .       
dfd0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65   "unable to dele
dfe0: 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d 66  te/modify user-f
dff0: 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f 20 61  unction due to a
e000: 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
e010: 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ");.      assert
e020: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
e030: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
e040: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
e050: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e060: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
e070: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
e080: 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  s(db);.    }.  }
e090: 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46  ..  p = sqlite3F
e0a0: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
e0b0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
e0c0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29  Name, nArg, (u8)
e0d0: 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73 65 72  enc, 1);.  asser
e0e0: 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  t(p || db->mallo
e0f0: 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28 20  cFailed);.  if( 
e100: 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
e110: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
e120: 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
e130: 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   an older versio
e140: 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  n of the functio
e150: 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75  n with a configu
e160: 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69  red destructor i
e170: 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70  s.  ** being rep
e180: 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65  laced invoke the
e190: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
e1a0: 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20  tion here. */.  
e1b0: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
e1c0: 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70  db, p);..  if( p
e1d0: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
e1e0: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
e1f0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Ref++;.  }.  p->
e200: 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44  pDestructor = pD
e210: 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e  estructor;.  p->
e220: 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70 2d 3e  funcFlags = (p->
e230: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
e240: 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29  TE_FUNC_ENCMASK)
e250: 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 20   | extraFlags;. 
e260: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 75   testcase( p->fu
e270: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
e280: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29  _DETERMINISTIC )
e290: 3b 0a 20 20 70 2d 3e 78 53 46 75 6e 63 20 3d 20  ;.  p->xSFunc = 
e2a0: 78 53 46 75 6e 63 20 3f 20 78 53 46 75 6e 63 20  xSFunc ? xSFunc 
e2b0: 3a 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46  : xStep;.  p->xF
e2c0: 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c  inalize = xFinal
e2d0: 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61  ;.  p->pUserData
e2e0: 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20   = pUserData;.  
e2f0: 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29 6e  p->nArg = (u16)n
e300: 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Arg;.  return SQ
e310: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
e320: 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73 65  * Create new use
e330: 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  r functions..*/.
e340: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
e350: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73  te_function(.  s
e360: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f  qlite3 *db,.  co
e370: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
e380: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
e390: 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a  nt enc,.  void *
e3a0: 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 46 75  p,.  void (*xSFu
e3b0: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
e3c0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
e3d0: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
e3e0: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
e3f0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
e400: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
e410: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
e420: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
e430: 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75  text*).){.  retu
e440: 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  rn sqlite3_creat
e450: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62  e_function_v2(db
e460: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
e470: 6e 63 2c 20 70 2c 20 78 53 46 75 6e 63 2c 20 78  nc, p, xSFunc, x
e480: 53 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Step,.          
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 20 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c            xFinal
e4b0: 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  , 0);.}..int sql
e4c0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
e4d0: 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74  tion_v2(.  sqlit
e4e0: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
e4f0: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69  char *zFunc,.  i
e500: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
e510: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20  nc,.  void *p,. 
e520: 20 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28   void (*xSFunc)(
e530: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
e540: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
e550: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
e560: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
e570: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
e580: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
e590: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
e5a0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e5b0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  *),.  void (*xDe
e5c0: 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29  stroy)(void *).)
e5d0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
e5e0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e  ITE_ERROR;.  Fun
e5f0: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72  cDestructor *pAr
e600: 67 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  g = 0;..#ifdef S
e610: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
e620: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
e630: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
e640: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
e650: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
e660: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e  SE_BKPT;.  }.#en
e670: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
e680: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
e690: 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65 73  tex);.  if( xDes
e6a0: 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72 67  troy ){.    pArg
e6b0: 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63 74   = (FuncDestruct
e6c0: 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  or *)sqlite3DbMa
e6d0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
e6e0: 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63 74  eof(FuncDestruct
e6f0: 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70  or));.    if( !p
e700: 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44 65  Arg ){.      xDe
e710: 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20 20  stroy(p);.      
e720: 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a  goto out;.    }.
e730: 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74 72      pArg->xDestr
e740: 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a 20  oy = xDestroy;. 
e750: 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44 61     pArg->pUserDa
e760: 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 63  ta = p;.  }.  rc
e770: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
e780: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c 20  Func(db, zFunc, 
e790: 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 53  nArg, enc, p, xS
e7a0: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
e7b0: 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66  nal, pArg);.  if
e7c0: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
e7d0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  nRef==0 ){.    a
e7e0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
e7f0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73  E_OK );.    xDes
e800: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c  troy(p);.    sql
e810: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
e820: 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a  Arg);.  }.. out:
e830: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
e840: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
e850: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
e860: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
e870: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e880: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e890: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20  _OMIT_UTF16.int 
e8a0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
e8b0: 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  unction16(.  sql
e8c0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
e8d0: 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f  t void *zFunctio
e8e0: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
e8f0: 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65  g,.  int eTextRe
e900: 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  p,.  void *p,.  
e910: 76 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73  void (*xSFunc)(s
e920: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
e930: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
e940: 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  e**),.  void (*x
e950: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
e960: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
e970: 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76  e3_value**),.  v
e980: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
e990: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a  lite3_context*).
e9a0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
e9b0: 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69  har *zFunc8;..#i
e9c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
e9d0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
e9e0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
e9f0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20  yCheckOk(db) || 
ea00: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30  zFunctionName==0
ea10: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ea20: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
ea30: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
ea40: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
ea50: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
ea60: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
ea70: 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d  ed );.  zFunc8 =
ea80: 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38   sqlite3Utf16to8
ea90: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
eaa0: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
eab0: 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72  TF16NATIVE);.  r
eac0: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
ead0: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38  eFunc(db, zFunc8
eae0: 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70  , nArg, eTextRep
eaf0: 2c 20 70 2c 20 78 53 46 75 6e 63 2c 78 53 74 65  , p, xSFunc,xSte
eb00: 70 2c 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73  p,xFinal,0);.  s
eb10: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
eb20: 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d   zFunc8);.  rc =
eb30: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
eb40: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
eb50: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
eb60: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
eb70: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
eb80: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65  .../*.** Declare
eb90: 20 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e   that a function
eba0: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f   has been overlo
ebb0: 61 64 65 64 20 62 79 20 61 20 76 69 72 74 75 61  aded by a virtua
ebc0: 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  l table..**.** I
ebd0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61  f the function a
ebe0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 73  lready exists as
ebf0: 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62 61   a regular globa
ec00: 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e  l function, then
ec10: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
ec20: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
ec30: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f   the function do
ec40: 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
ec50: 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e  en create.** a n
ec60: 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77 61  ew one that alwa
ec70: 79 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e 2d  ys throws a run-
ec80: 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a  time error.  .**
ec90: 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61 6c  .** When virtual
eca0: 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20 74   tables intend t
ecb0: 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76 65  o provide an ove
ecc0: 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f 6e  rloaded function
ecd0: 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64  , they.** should
ece0: 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   call this routi
ecf0: 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
ed00: 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  the global funct
ed10: 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41  ion exists..** A
ed20: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
ed30: 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20 6f   must exist in o
ed40: 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72 65  rder for name re
ed50: 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b  solution to work
ed60: 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f  .** properly..*/
ed70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76 65  .int sqlite3_ove
ed80: 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a  rload_function(.
ed90: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
eda0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
edb0: 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29  me,.  int nArg.)
edc0: 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20  {.  int nName = 
edd0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
ede0: 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63  zName);.  int rc
edf0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23   = SQLITE_OK;..#
ee00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
ee10: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
ee20: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
ee30: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c  tyCheckOk(db) ||
ee40: 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 6e 41 72   zName==0 || nAr
ee50: 67 3c 2d 32 20 29 7b 0a 20 20 20 20 72 65 74 75  g<-2 ){.    retu
ee60: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
ee70: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  _BKPT;.  }.#endi
ee80: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
ee90: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
eea0: 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  x);.  if( sqlite
eeb0: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
eec0: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  , zName, nName, 
eed0: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
eee0: 38 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  8, 0)==0 ){.    
eef0: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
ef00: 74 65 46 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65  teFunc(db, zName
ef10: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
ef20: 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20  TF8,.           
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef40: 30 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69  0, sqlite3Invali
ef50: 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c  dFunction, 0, 0,
ef60: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   0);.  }.  rc = 
ef70: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
ef80: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
ef90: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
efa0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
efb0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
efc0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
efd0: 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  ACE./*.** Regist
efe0: 65 72 20 61 20 74 72 61 63 65 20 66 75 6e 63 74  er a trace funct
eff0: 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66  ion.  The pArg f
f000: 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
f010: 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 74 72  ly registered tr
f020: 61 63 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ace.** is return
f030: 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  ed.  .**.** A NU
f040: 4c 4c 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f  LL trace functio
f050: 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20  n means that no 
f060: 74 72 61 63 69 6e 67 20 69 73 20 65 78 65 63 75  tracing is execu
f070: 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c  tes.  A non-NULL
f080: 0a 2a 2a 20 74 72 61 63 65 20 69 73 20 61 20 70  .** trace is a p
f090: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
f0a0: 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76  tion that is inv
f0b0: 6f 6b 65 64 20 61 74 20 74 68 65 20 73 74 61 72  oked at the star
f0c0: 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c  t of each.** SQL
f0d0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
f0e0: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 74 72 61  oid *sqlite3_tra
f0f0: 63 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ce(sqlite3 *db, 
f100: 76 6f 69 64 20 28 2a 78 54 72 61 63 65 29 28 76  void (*xTrace)(v
f110: 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
f120: 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  ), void *pArg){.
f130: 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23    void *pOld;..#
f140: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f150: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
f160: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
f170: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
f180: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
f190: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
f1a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f1b0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
f1c0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
f1d0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64  ->mutex);.  pOld
f1e0: 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67   = db->pTraceArg
f1f0: 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d  ;.  db->xTrace =
f200: 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70   xTrace;.  db->p
f210: 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b  TraceArg = pArg;
f220: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f230: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
f240: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64  );.  return pOld
f250: 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  ;.}./*.** Regist
f260: 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e  er a profile fun
f270: 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67  ction.  The pArg
f280: 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
f290: 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  usly registered 
f2a0: 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  .** profile func
f2b0: 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64  tion is returned
f2c0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c  .  .**.** A NULL
f2d0: 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
f2e0: 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20  n means that no 
f2f0: 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65  profiling is exe
f300: 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55  cutes.  A non-NU
f310: 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73  LL.** profile is
f320: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
f330: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
f340: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
f350: 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a  conclusion of.**
f360: 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
f370: 65 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e  ent that is run.
f380: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
f390: 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c  3_profile(.  sql
f3a0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64  ite3 *db,.  void
f3b0: 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69   (*xProfile)(voi
f3c0: 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73  d*,const char*,s
f3d0: 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20  qlite_uint64),. 
f3e0: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
f3f0: 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69   void *pOld;..#i
f400: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
f410: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
f420: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
f430: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
f440: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
f450: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
f460: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
f470: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
f480: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
f490: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
f4a0: 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72  = db->pProfileAr
f4b0: 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c  g;.  db->xProfil
f4c0: 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20  e = xProfile;.  
f4d0: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20  db->pProfileArg 
f4e0: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
f4f0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
f500: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
f510: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69  rn pOld;.}.#endi
f520: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
f530: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
f540: 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63   Register a func
f550: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
f560: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
f570: 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a  ction commits..*
f580: 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64  * If the invoked
f590: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
f5a0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
f5b0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f   the commit beco
f5c0: 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63  mes a.** rollbac
f5d0: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  k..*/.void *sqli
f5e0: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
f5f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
f600: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f610: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
f620: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
f630: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
f640: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20  lback)(void*),  
f650: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69  /* Function to i
f660: 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f  nvoke on each co
f670: 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mmit */.  void *
f680: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
f690: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
f6a0: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
f6b0: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  */.){.  void *pO
f6c0: 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ld;..#ifdef SQLI
f6d0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
f6e0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
f6f0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
f700: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
f710: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
f720: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
f730: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
f740: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
f750: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
f760: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f    pOld = db->pCo
f770: 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78  mmitArg;.  db->x
f780: 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d  CommitCallback =
f790: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
f7a0: 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70  ->pCommitArg = p
f7b0: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
f7c0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
f7d0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
f7e0: 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pOld;.}../*.** R
f7f0: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
f800: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
f810: 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77   each time a row
f820: 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20   is updated,.** 
f830: 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65  inserted or dele
f840: 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64  ted using this d
f850: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
f860: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
f870: 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b  ite3_update_hook
f880: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f8a0: 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
f8b0: 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
f8c0: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  e */.  void (*xC
f8d0: 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69  allback)(void*,i
f8e0: 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c  nt,char const *,
f8f0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c  char const *,sql
f900: 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f  ite_int64),.  vo
f910: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
f920: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
f930: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
f940: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
f950: 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66 20   *pRet;..#ifdef 
f960: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
f970: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
f980: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
f990: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
f9a0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
f9b0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
f9c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
f9d0: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
f9e0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
f9f0: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
fa00: 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64  >pUpdateArg;.  d
fa10: 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61  b->xUpdateCallba
fa20: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
fa30: 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67    db->pUpdateArg
fa40: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
fa50: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
fa60: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
fa70: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
fa80: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
fa90: 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
faa0: 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
fab0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
fac0: 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62  rolled.** back b
fad0: 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
fae0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
faf0: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c  oid *sqlite3_rol
fb00: 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71  lback_hook(.  sq
fb10: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
fb20: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
fb30: 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
fb40: 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
fb50: 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63   void (*xCallbac
fb60: 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61  k)(void*), /* Ca
fb70: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
fb80: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  */.  void *pArg 
fb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fba0: 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * Argument to th
fbb0: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b  e function */.){
fbc0: 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a  .  void *pRet;..
fbd0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
fbe0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
fbf0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
fc00: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
fc10: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
fc20: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
fc30: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
fc40: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
fc50: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
fc60: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
fc70: 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63  t = db->pRollbac
fc80: 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c  kArg;.  db->xRol
fc90: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20  lbackCallback = 
fca0: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
fcb0: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20  >pRollbackArg = 
fcc0: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
fcd0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
fce0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
fcf0: 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65   pRet;.}..#ifnde
fd00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
fd10: 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  L./*.** The sqli
fd20: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63  te3_wal_hook() c
fd30: 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72  allback register
fd40: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77 61  ed by sqlite3_wa
fd50: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
fd60: 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71  ()..** Invoke sq
fd70: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
fd80: 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75 6d 62  oint if the numb
fd90: 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20  er of frames in 
fda0: 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20  the log file.** 
fdb0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
fdc0: 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72 67 20  sqlite3.pWalArg 
fdd0: 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67  cast to an integ
fde0: 65 72 20 28 74 68 65 20 76 61 6c 75 65 20 63 6f  er (the value co
fdf0: 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a 20 77  nfigured by.** w
fe00: 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
fe10: 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71  t())..*/ .int sq
fe20: 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48  lite3WalDefaultH
fe30: 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c  ook(.  void *pCl
fe40: 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a  ientData,     /*
fe50: 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73   Argument */.  s
fe60: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
fe70: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
fe80: 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
fe90: 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20  har *zDb,       
fea0: 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20  /* Database */. 
feb0: 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20 20 20   int nFrame     
fec0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
fed0: 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69  of WAL */.){.  i
fee0: 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54  f( nFrame>=SQLIT
fef0: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c  E_PTR_TO_INT(pCl
ff00: 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20 20 20  ientData) ){.   
ff10: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
ff20: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
ff30: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
ff40: 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29  ckpoint(db, zDb)
ff50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
ff60: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
ff70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
ff80: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
ff90: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
ffa0: 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  WAL */../*.** Co
ffb0: 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c 69 74  nfigure an sqlit
ffc0: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61  e3_wal_hook() ca
ffd0: 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61  llback to automa
ffe0: 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69  tically checkpoi
fff0: 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  nt.** a database
10000 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e   after committin
10010 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
10020 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 46 72  if there are nFr
10030 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66  ame or.** more f
10040 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
10050 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a   file. Passing z
10060 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74 69 76  ero or a negativ
10070 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 2a  e value as the.*
10080 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d 65 74  * nFrame paramet
10090 65 72 20 64 69 73 61 62 6c 65 73 20 61 75 74 6f  er disables auto
100a0 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74  matic checkpoint
100b0 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a  s entirely..**.*
100c0 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  * The callback r
100d0 65 67 69 73 74 65 72 65 64 20 62 79 20 74 68 69  egistered by thi
100e0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61  s function repla
100f0 63 65 73 20 61 6e 79 20 65 78 69 73 74 69 6e 67  ces any existing
10100 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67   callback.** reg
10110 69 73 74 65 72 65 64 20 75 73 69 6e 67 20 73 71  istered using sq
10120 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
10130 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65 67 69  . Likewise, regi
10140 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c 62 61  stering a callba
10150 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69  ck.** using sqli
10160 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64  te3_wal_hook() d
10170 69 73 61 62 6c 65 73 20 74 68 65 20 61 75 74 6f  isables the auto
10180 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74  matic checkpoint
10190 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f   mechanism.** co
101a0 6e 66 69 67 75 72 65 64 20 62 79 20 74 68 69 73  nfigured by this
101b0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
101c0 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75  t sqlite3_wal_au
101d0 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c  tocheckpoint(sql
101e0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46  ite3 *db, int nF
101f0 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51  rame){.#ifdef SQ
10200 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
10210 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
10220 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (db);.  UNUSED_P
10230 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d 65 29  ARAMETER(nFrame)
10240 3b 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 53  ;.#else.#ifdef S
10250 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
10260 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
10270 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
10280 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
10290 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
102a0 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  PT;.#endif.  if(
102b0 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20   nFrame>0 ){.   
102c0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
102d0 6b 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c  k(db, sqlite3Wal
102e0 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c  DefaultHook, SQL
102f0 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e  ITE_INT_TO_PTR(n
10300 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65  Frame));.  }else
10310 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61  {.    sqlite3_wa
10320 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29  l_hook(db, 0, 0)
10330 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
10340 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10350 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
10360 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
10370 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
10380 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74   time a transact
10390 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ion is written.*
103a0 2a 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65  * into the write
103b0 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68  -ahead-log by th
103c0 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
103d0 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
103e0 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f  *sqlite3_wal_hoo
103f0 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
10400 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10410 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
10420 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
10430 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  db handle */.  i
10440 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  nt(*xCallback)(v
10450 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c  oid *, sqlite3*,
10460 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e   const char*, in
10470 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  t),.  void *pArg
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10490 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
104a0 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
104b0 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f  o xCallback() */
104c0 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
104d0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f  TE_OMIT_WAL.  vo
104e0 69 64 20 2a 70 52 65 74 3b 0a 23 69 66 64 65 66  id *pRet;.#ifdef
104f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
10500 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
10510 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
10520 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
10530 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
10540 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
10550 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
10560 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
10570 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
10580 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
10590 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d  ->pWalArg;.  db-
105a0 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20  >xWalCallback = 
105b0 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
105c0 3e 70 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b  >pWalArg = pArg;
105d0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
105e0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
105f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
10600 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
10610 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
10620 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64  .** Checkpoint d
10630 61 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a  atabase zDb..*/.
10640 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
10650 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20  checkpoint_v2(. 
10660 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
10670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10680 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
10690 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dle */.  const c
106a0 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20  har *zDb,       
106b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
106c0 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74   of attached dat
106d0 61 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20  abase (or NULL) 
106e0 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20  */.  int eMode, 
106f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10700 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43       /* SQLITE_C
10710 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75  HECKPOINT_* valu
10720 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f  e */.  int *pnLo
10730 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
10740 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
10750 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69  ize of WAL log i
10760 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e  n frames */.  in
10770 74 20 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20  t *pnCkpt       
10780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10790 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62   OUT: Total numb
107a0 65 72 20 6f 66 20 66 72 61 6d 65 73 20 63 68 65  er of frames che
107b0 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a  ckpointed */.){.
107c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
107d0 49 54 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e 20  IT_WAL.  return 
107e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
107f0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10810 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
10820 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d  e */.  int iDb =
10830 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
10840 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65  CHED;  /* sqlite
10850 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66  3.aDb[] index of
10860 20 64 62 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e   db to checkpoin
10870 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  t */..#ifdef SQL
10880 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
10890 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
108a0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
108b0 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
108c0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
108d0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
108e0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75  nitialize the ou
108f0 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 74  tput variables t
10900 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61 6e 20  o -1 in case an 
10910 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
10920 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a  .  if( pnLog ) *
10930 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66  pnLog = -1;.  if
10940 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b  ( pnCkpt ) *pnCk
10950 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65  pt = -1;..  asse
10960 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
10970 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30  POINT_PASSIVE==0
10980 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
10990 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
109a0 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73  FULL==1 );.  ass
109b0 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
109c0 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d  KPOINT_RESTART==
109d0 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  2 );.  assert( S
109e0 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
109f0 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a  _TRUNCATE==3 );.
10a00 20 20 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49    if( eMode<SQLI
10a10 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
10a20 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53  SSIVE || eMode>S
10a30 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
10a40 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20  _TRUNCATE ){.   
10a50 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
10a60 20 52 2d 30 33 39 39 36 2d 31 32 30 38 38 20 54   R-03996-12088 T
10a70 68 65 20 4d 20 70 61 72 61 6d 65 74 65 72 20 6d  he M parameter m
10a80 75 73 74 20 62 65 20 61 20 76 61 6c 69 64 20 63  ust be a valid c
10a90 68 65 63 6b 70 6f 69 6e 74 0a 20 20 20 20 2a 2a  heckpoint.    **
10aa0 20 6d 6f 64 65 3a 20 2a 2f 0a 20 20 20 20 72 65   mode: */.    re
10ab0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
10ac0 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
10ad0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
10ae0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
10af0 20 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29   zDb && zDb[0] )
10b00 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  {.    iDb = sqli
10b10 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
10b20 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66  , zDb);.  }.  if
10b30 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72  ( iDb<0 ){.    r
10b40 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
10b50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
10b60 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
10b70 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b  LITE_ERROR, "unk
10b80 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25  nown database: %
10b90 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73  s", zDb);.  }els
10ba0 65 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 48  e{.    db->busyH
10bb0 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30  andler.nBusy = 0
10bc0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
10bd0 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  e3Checkpoint(db,
10be0 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c   iDb, eMode, pnL
10bf0 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20  og, pnCkpt);.   
10c00 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
10c10 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 63 20  , rc);.  }.  rc 
10c20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
10c30 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
10c40 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10c50 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
10c60 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
10c70 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70  }.../*.** Checkp
10c80 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44  oint database zD
10c90 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e 55 4c  b. If zDb is NUL
10ca0 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62 75 66  L, or if the buf
10cb0 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a  fer zDb points.*
10cc0 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20  * to contains a 
10cd0 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69  zero-length stri
10ce0 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68 65 64  ng, all attached
10cf0 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 0a   databases are .
10d00 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e  ** checkpointed.
10d10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
10d20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73  wal_checkpoint(s
10d30 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
10d40 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
10d50 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
10d60 52 2d 34 31 36 31 33 2d 32 30 35 35 33 20 54 68  R-41613-20553 Th
10d70 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  e sqlite3_wal_ch
10d80 65 63 6b 70 6f 69 6e 74 28 44 2c 58 29 20 69 73  eckpoint(D,X) is
10d90 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20   equivalent to. 
10da0 20 2a 2a 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f   ** sqlite3_wal_
10db0 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 44 2c  checkpoint_v2(D,
10dc0 58 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  X,SQLITE_CHECKPO
10dd0 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30 29  INT_PASSIVE,0,0)
10de0 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71  . */.  return sq
10df0 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
10e00 6f 69 6e 74 5f 76 32 28 64 62 2c 7a 44 62 2c 53  oint_v2(db,zDb,S
10e10 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
10e20 5f 50 41 53 53 49 56 45 2c 30 2c 30 29 3b 0a 7d  _PASSIVE,0,0);.}
10e30 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10e40 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
10e50 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  Run a checkpoint
10e60 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   on database iDb
10e70 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
10e80 70 20 69 66 20 64 61 74 61 62 61 73 65 20 69 44  p if database iD
10e90 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72  b is.** not curr
10ea0 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41  ently open in WA
10eb0 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  L mode..**.** If
10ec0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
10ed0 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  s open on the da
10ee0 74 61 62 61 73 65 20 62 65 69 6e 67 20 63 68 65  tabase being che
10ef0 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20  ckpointed, this 
10f00 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
10f10 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  urns SQLITE_LOCK
10f20 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f  ED and a checkpo
10f30 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  int is not attem
10f40 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  pted. If .** an 
10f50 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
10f60 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  le running the c
10f70 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51  heckpoint, an SQ
10f80 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
10f90 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
10fa0 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45  (i.e. SQLITE_IOE
10fb0 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  RR). Otherwise, 
10fc0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
10fd0 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61   The mutex on da
10fe0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
10ff0 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
11000 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  by the caller. T
11010 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f  he mutex.** asso
11020 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
11030 73 70 65 63 69 66 69 63 20 62 2d 74 72 65 65 20  specific b-tree 
11040 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74  being checkpoint
11050 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a  ed is taken by.*
11060 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
11070 77 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70  while the checkp
11080 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e  oint is running.
11090 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73  .**.** If iDb is
110a0 20 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d   passed SQLITE_M
110b0 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65  AX_ATTACHED, the
110c0 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  n all attached d
110d0 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20  atabases are.** 
110e0 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66  checkpointed. If
110f0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
11100 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 72  ountered it is r
11110 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74  eturned immediat
11120 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65  ely -.** no atte
11130 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
11140 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65  heckpoint any re
11150 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65  maining database
11160 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  s..**.** Paramet
11170 65 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20  er eMode is one 
11180 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  of SQLITE_CHECKP
11190 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55  OINT_PASSIVE, FU
111a0 4c 4c 20 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a  LL or RESTART..*
111b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
111c0 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20  ckpoint(sqlite3 
111d0 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e  *db, int iDb, in
111e0 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e  t eMode, int *pn
111f0 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74  Log, int *pnCkpt
11200 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
11210 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
11220 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
11230 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ode */.  int i; 
11240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11250 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
11260 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
11270 75 67 68 20 61 74 74 61 63 68 65 64 20 64 62 73  ugh attached dbs
11280 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20   */.  int bBusy 
11290 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
112a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
112b0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73   SQLITE_BUSY has
112c0 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
112d0 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
112e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
112f0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
11300 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f  .  assert( !pnLo
11310 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20  g || *pnLog==-1 
11320 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e  );.  assert( !pn
11330 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d  Ckpt || *pnCkpt=
11340 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  =-1 );..  for(i=
11350 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20  0; i<db->nDb && 
11360 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
11370 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d  ++){.    if( i==
11380 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49  iDb || iDb==SQLI
11390 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20  TE_MAX_ATTACHED 
113a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
113b0 6c 69 74 65 33 42 74 72 65 65 43 68 65 63 6b 70  lite3BtreeCheckp
113c0 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  oint(db->aDb[i].
113d0 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f  pBt, eMode, pnLo
113e0 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20  g, pnCkpt);.    
113f0 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20    pnLog = 0;.   
11400 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20     pnCkpt = 0;. 
11410 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
11420 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
11430 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20      bBusy = 1;. 
11440 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
11450 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
11460 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
11470 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
11480 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20 53 51  K && bBusy) ? SQ
11490 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a  LITE_BUSY : rc;.
114a0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
114b0 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
114c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
114d0 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65  ion returns true
114e0 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20   if main-memory 
114f0 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69  should be used i
11500 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74  nstead of.** a t
11510 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f  emporary file fo
11520 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65  r transient page
11530 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74  r files and stat
11540 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a  ement journals..
11550 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
11560 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e  urned depends on
11570 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62   the value of db
11580 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75  ->temp_store (ru
11590 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74  ntime.** paramet
115a0 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  er) and the comp
115b0 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f  ile time value o
115c0 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
115d0 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c  ORE. The.** foll
115e0 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
115f0 72 69 62 65 73 20 74 68 65 20 72 65 6c 61 74 69  ribes the relati
11600 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 74  onship between t
11610 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a  hese two values.
11620 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ** and this func
11630 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c  tions return val
11640 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49  ue..**.**   SQLI
11650 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20  TE_TEMP_STORE   
11660 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65    db->temp_store
11670 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66       Location of
11680 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
11690 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ase.**   -------
116a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
116b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
116c0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
116d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116e0 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20  .**   0         
116f0 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20              any 
11700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
11710 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
11720 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20   0).**   1      
11730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
11740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11750 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
11760 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20  urn 0).**   1   
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
11790 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
117a0 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31  return 1).**   1
117b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117c0 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
117d0 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
117e0 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
117f0 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
11800 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
11810 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
11820 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
11830 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
11840 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
11850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
11860 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
11870 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  1).**   2       
11880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118a0 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
118b0 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20  rn 1).**   3    
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118d0 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
118e0 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
118f0 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20  eturn 1).*/.int 
11900 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
11910 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65  ory(const sqlite
11920 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49  3 *db){.#if SQLI
11930 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31  TE_TEMP_STORE==1
11940 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e  .  return ( db->
11950 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b  temp_store==2 );
11960 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
11970 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32  TE_TEMP_STORE==2
11980 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e  .  return ( db->
11990 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b  temp_store!=1 );
119a0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
119b0 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33  TE_TEMP_STORE==3
119c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
119d0 54 45 52 28 64 62 29 3b 0a 20 20 72 65 74 75 72  TER(db);.  retur
119e0 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  n 1;.#endif.#if 
119f0 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
11a00 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45  E<1 || SQLITE_TE
11a10 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 55 4e 55  MP_STORE>3.  UNU
11a20 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
11a30 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  );.  return 0;.#
11a40 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
11a50 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f  eturn UTF-8 enco
11a60 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67  ded English lang
11a70 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e  uage explanation
11a80 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
11a90 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f  ent.** error..*/
11aa0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
11ab0 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69  ite3_errmsg(sqli
11ac0 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73  te3 *db){.  cons
11ad0 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28  t char *z;.  if(
11ae0 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
11af0 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  rn sqlite3ErrStr
11b00 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b  (SQLITE_NOMEM_BK
11b10 50 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  PT);.  }.  if( !
11b20 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
11b30 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
11b40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
11b50 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
11b60 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a  E_MISUSE_BKPT);.
11b70 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
11b80 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
11b90 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tex);.  if( db->
11ba0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
11bb0 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45      z = sqlite3E
11bc0 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d  rrStr(SQLITE_NOM
11bd0 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d 65 6c 73  EM_BKPT);.  }els
11be0 65 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e{.    testcase(
11bf0 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 3b 0a   db->pErr==0 );.
11c00 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 73      z = (char*)s
11c10 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
11c20 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  t(db->pErr);.   
11c30 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
11c40 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
11c50 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
11c60 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45      z = sqlite3E
11c70 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64  rrStr(db->errCod
11c80 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
11c90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
11ca0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
11cb0 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23    return z;.}..#
11cc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11cd0 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
11ce0 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e 63  eturn UTF-16 enc
11cf0 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e  oded English lan
11d00 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f  guage explanatio
11d10 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
11d20 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  cent.** error..*
11d30 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
11d40 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28 73  lite3_errmsg16(s
11d50 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73  qlite3 *db){.  s
11d60 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20  tatic const u16 
11d70 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20  outOfMem[] = {. 
11d80 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27     'o', 'u', 't'
11d90 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c  , ' ', 'o', 'f',
11da0 20 27 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20   ' ', 'm', 'e', 
11db0 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27  'm', 'o', 'r', '
11dc0 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61  y', 0.  };.  sta
11dd0 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6d 69  tic const u16 mi
11de0 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27  suse[] = {.    '
11df0 6c 27 2c 20 27 69 27 2c 20 27 62 27 2c 20 27 72  l', 'i', 'b', 'r
11e00 27 2c 20 27 61 27 2c 20 27 72 27 2c 20 27 79 27  ', 'a', 'r', 'y'
11e10 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 72 27 2c  , ' ', .    'r',
11e20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20   'o', 'u', 't', 
11e30 27 69 27 2c 20 27 6e 27 2c 20 27 65 27 2c 20 27  'i', 'n', 'e', '
11e40 20 27 2c 20 0a 20 20 20 20 27 63 27 2c 20 27 61   ', .    'c', 'a
11e50 27 2c 20 27 6c 27 2c 20 27 6c 27 2c 20 27 65 27  ', 'l', 'l', 'e'
11e60 2c 20 27 64 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'd', ' ', .   
11e70 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20   'o', 'u', 't', 
11e80 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27  ' ', .    'o', '
11e90 66 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 73  f', ' ', .    's
11ea0 27 2c 20 27 65 27 2c 20 27 71 27 2c 20 27 75 27  ', 'e', 'q', 'u'
11eb0 2c 20 27 65 27 2c 20 27 6e 27 2c 20 27 63 27 2c  , 'e', 'n', 'c',
11ec0 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20   'e', 0.  };..  
11ed0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20  const void *z;. 
11ee0 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
11ef0 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f  return (void *)o
11f00 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69  utOfMem;.  }.  i
11f10 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
11f20 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
11f30 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
11f40 20 28 76 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b   (void *)misuse;
11f50 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
11f60 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
11f70 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d  utex);.  if( db-
11f80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
11f90 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a  .    z = (void *
11fa0 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c  )outOfMem;.  }el
11fb0 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69  se{.    z = sqli
11fc0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
11fd0 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20  (db->pErr);.    
11fe0 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
11ff0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
12000 74 68 4d 73 67 28 64 62 2c 20 64 62 2d 3e 65 72  thMsg(db, db->er
12010 72 43 6f 64 65 2c 20 73 71 6c 69 74 65 33 45 72  rCode, sqlite3Er
12020 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65  rStr(db->errCode
12030 29 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  ));.      z = sq
12040 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
12050 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  16(db->pErr);.  
12060 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c    }.    /* A mal
12070 6c 6f 63 28 29 20 6d 61 79 20 68 61 76 65 20 66  loc() may have f
12080 61 69 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65  ailed within the
12090 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
120a0 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a  _value_text16().
120b0 20 20 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66      ** above. If
120c0 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
120d0 65 2c 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e  e, then the db->
120e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
120f0 67 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  g needs to.    *
12100 2a 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66  * be cleared bef
12110 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44  ore returning. D
12120 6f 20 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c  o this directly,
12130 20 69 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a   instead of via.
12140 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70      ** sqlite3Ap
12150 69 45 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69  iExit(), to avoi
12160 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 64 61  d setting the da
12170 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72  tabase handle er
12180 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20  ror message..   
12190 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   */.    sqlite3O
121a0 6f 6d 43 6c 65 61 72 28 64 62 29 3b 0a 20 20 7d  omClear(db);.  }
121b0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
121c0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
121d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  );.  return z;.}
121e0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
121f0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
12200 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
12210 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72  e most recent er
12220 72 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ror code generat
12230 65 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20  ed by an SQLite 
12240 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c  routine. If NULL
12250 20 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f   is.** passed to
12260 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
12270 77 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c  we assume a mall
12280 6f 63 28 29 20 66 61 69 6c 65 64 20 64 75 72 69  oc() failed duri
12290 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ng sqlite3_open(
122a0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
122b0 33 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65  3_errcode(sqlite
122c0 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
122d0 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65   && !sqlite3Safe
122e0 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
122f0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
12300 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
12310 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
12320 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !db || db->mallo
12330 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
12340 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
12350 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  EM_BKPT;.  }.  r
12360 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64  eturn db->errCod
12370 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b  e & db->errMask;
12380 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  .}.int sqlite3_e
12390 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
123a0 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
123b0 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74  if( db && !sqlit
123c0 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
123d0 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
123e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
123f0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
12400 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
12410 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
12420 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12430 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
12440 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e   }.  return db->
12450 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  errCode;.}../*.*
12460 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e  * Return a strin
12470 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
12480 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72   the kind of err
12490 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
124a0 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  the.** argument.
124b0 20 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20    For now, this 
124c0 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74 68 65  simply calls the
124d0 20 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69 74 65   internal sqlite
124e0 33 45 72 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e  3ErrStr().** fun
124f0 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ction..*/.const 
12500 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72  char *sqlite3_er
12510 72 73 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20  rstr(int rc){.  
12520 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
12530 72 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  rStr(rc);.}../*.
12540 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
12550 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
12560 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65 20  on for database 
12570 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65 20  "db".  The name 
12580 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20  is zName.** and 
12590 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20  the encoding is 
125a0 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  enc..*/.static i
125b0 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  nt createCollati
125c0 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64  on(.  sqlite3* d
125d0 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
125e0 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e  *zName, .  u8 en
125f0 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  c,.  void* pCtx,
12600 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
12610 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
12620 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
12630 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64  t void*),.  void
12640 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29  (*xDel)(void*).)
12650 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  {.  CollSeq *pCo
12660 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a  ll;.  int enc2;.
12670 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c    .  assert( sql
12680 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12690 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
126a0 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54   /* If SQLITE_UT
126b0 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64  F16 is specified
126c0 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
126d0 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d   type, transform
126e0 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e   this.  ** to on
126f0 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31  e of SQLITE_UTF1
12700 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54  6LE or SQLITE_UT
12710 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a  F16BE using the.
12720 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31    ** SQLITE_UTF1
12730 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53  6NATIVE macro. S
12740 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e  QLITE_UTF16 is n
12750 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  ot used internal
12760 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20  ly..  */.  enc2 
12770 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73  = enc;.  testcas
12780 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  e( enc2==SQLITE_
12790 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63  UTF16 );.  testc
127a0 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54  ase( enc2==SQLIT
127b0 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
127c0 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53  );.  if( enc2==S
127d0 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65  QLITE_UTF16 || e
127e0 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
127f0 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20  6_ALIGNED ){.   
12800 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55   enc2 = SQLITE_U
12810 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a  TF16NATIVE;.  }.
12820 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54    if( enc2<SQLIT
12830 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53  E_UTF8 || enc2>S
12840 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b  QLITE_UTF16BE ){
12850 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12860 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
12870 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
12880 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  if this call is 
12890 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c  removing or repl
128a0 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e  acing an existin
128b0 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a  g collation .  *
128c0 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73  * sequence. If s
128d0 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  o, and there are
128e0 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74   active VMs, ret
128f0 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65  urn busy. If the
12900 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61  re.  ** are no a
12910 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c  ctive VMs, inval
12920 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f  idate any pre-co
12930 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
12940 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20  s..  */.  pColl 
12950 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
12960 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63  lSeq(db, (u8)enc
12970 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  2, zName, 0);.  
12980 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f  if( pColl && pCo
12990 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20  ll->xCmp ){.    
129a0 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  if( db->nVdbeAct
129b0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ive ){.      sql
129c0 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
129d0 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  (db, SQLITE_BUSY
129e0 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62  , .        "unab
129f0 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64  le to delete/mod
12a00 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ify collation se
12a10 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20 61 63  quence due to ac
12a20 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22  tive statements"
12a30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
12a40 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
12a50 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
12a60 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
12a70 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20  ements(db);..   
12a80 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e   /* If collation
12a90 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20   sequence pColl 
12aa0 77 61 73 20 63 72 65 61 74 65 64 20 64 69 72 65  was created dire
12ab0 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c 20 74  ctly by a call t
12ac0 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
12ad0 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
12ae0 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72  n, and not gener
12af0 61 74 65 64 20 62 79 20 73 79 6e 74 68 43 6f 6c  ated by synthCol
12b00 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74  lSeq(),.    ** t
12b10 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73 20 6d  hen any copies m
12b20 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c  ade by synthColl
12b30 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20 62 65  Seq() need to be
12b40 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20 20   invalidated..  
12b50 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61    ** Also, colla
12b60 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f 72 20  tion destructor 
12b70 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29  - CollSeq.xDel()
12b80 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20   - function may 
12b90 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62  need.    ** to b
12ba0 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f  e called..    */
12bb0 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c 6c   .    if( (pColl
12bc0 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f  ->enc & ~SQLITE_
12bd0 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d  UTF16_ALIGNED)==
12be0 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20 43 6f  enc2 ){.      Co
12bf0 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73  llSeq *aColl = s
12c00 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
12c10 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e  db->aCollSeq, zN
12c20 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  ame);.      int 
12c30 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
12c40 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
12c50 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20       CollSeq *p 
12c60 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20  = &aColl[j];.   
12c70 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d       if( p->enc=
12c80 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20  =pColl->enc ){. 
12c90 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
12ca0 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  xDel ){.        
12cb0 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70      p->xDel(p->p
12cc0 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  User);.         
12cd0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
12ce0 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  xCmp = 0;.      
12cf0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12d00 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d  }.  }..  pColl =
12d10 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
12d20 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32  Seq(db, (u8)enc2
12d30 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69  , zName, 1);.  i
12d40 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65  f( pColl==0 ) re
12d50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12d60 4d 5f 42 4b 50 54 3b 0a 20 20 70 43 6f 6c 6c 2d  M_BKPT;.  pColl-
12d70 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65  >xCmp = xCompare
12d80 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  ;.  pColl->pUser
12d90 20 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c   = pCtx;.  pColl
12da0 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20  ->xDel = xDel;. 
12db0 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75   pColl->enc = (u
12dc0 38 29 28 65 6e 63 32 20 7c 20 28 65 6e 63 20 26  8)(enc2 | (enc &
12dd0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c   SQLITE_UTF16_AL
12de0 49 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c 69 74  IGNED));.  sqlit
12df0 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
12e00 54 45 5f 4f 4b 29 3b 0a 20 20 72 65 74 75 72 6e  TE_OK);.  return
12e10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
12e20 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72 61 79  /*.** This array
12e30 20 64 65 66 69 6e 65 73 20 68 61 72 64 20 75 70   defines hard up
12e40 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69  per bounds on li
12e50 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54 68 65  mit values.  The
12e60 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  .** initializer 
12e70 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e 20  must be kept in 
12e80 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 53 51  sync with the SQ
12e90 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20  LITE_LIMIT_*.** 
12ea0 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71 6c 69  #defines in sqli
12eb0 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  te3.h..*/.static
12ec0 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61 72 64   const int aHard
12ed0 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51  Limit[] = {.  SQ
12ee0 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c  LITE_MAX_LENGTH,
12ef0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  .  SQLITE_MAX_SQ
12f00 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  L_LENGTH,.  SQLI
12f10 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20  TE_MAX_COLUMN,. 
12f20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
12f30 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45  _DEPTH,.  SQLITE
12f40 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
12f50 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  LECT,.  SQLITE_M
12f60 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51  AX_VDBE_OP,.  SQ
12f70 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
12f80 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f  N_ARG,.  SQLITE_
12f90 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a 20 20  MAX_ATTACHED,.  
12fa0 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
12fb0 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a  PATTERN_LENGTH,.
12fc0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52    SQLITE_MAX_VAR
12fd0 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 20 20 20  IABLE_NUMBER,   
12fe0 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 38 30     /* IMP: R-380
12ff0 39 31 2d 33 32 33 35 32 20 2a 2f 0a 20 20 53 51  91-32352 */.  SQ
13000 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
13010 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45  _DEPTH,.  SQLITE
13020 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
13030 41 44 53 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d  ADS,.};../*.** M
13040 61 6b 65 20 73 75 72 65 20 74 68 65 20 68 61 72  ake sure the har
13050 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65 74  d limits are set
13060 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20 76   to reasonable v
13070 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c  alues.*/.#if SQL
13080 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31  ITE_MAX_LENGTH<1
13090 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  00.# error SQLIT
130a0 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73  E_MAX_LENGTH mus
130b0 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30  t be at least 10
130c0 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
130d0 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
130e0 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53  TH<100.# error S
130f0 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
13100 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
13110 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66  least 100.#endif
13120 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
13130 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54  SQL_LENGTH>SQLIT
13140 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65  E_MAX_LENGTH.# e
13150 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
13160 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  SQL_LENGTH must 
13170 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72 20 74  not be greater t
13180 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  han SQLITE_MAX_L
13190 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69 66  ENGTH.#endif.#if
131a0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
131b0 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20  OUND_SELECT<2.# 
131c0 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
131d0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
131e0 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
131f0 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 2.#endif.#if S
13200 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
13210 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  P<40.# error SQL
13220 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20  ITE_MAX_VDBE_OP 
13230 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
13240 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   40.#endif.#if S
13250 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
13260 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49  ON_ARG<0 || SQLI
13270 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
13280 41 52 47 3e 31 30 30 30 0a 23 20 65 72 72 6f 72  ARG>1000.# error
13290 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
132a0 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65  TION_ARG must be
132b0 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31   between 0 and 1
132c0 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  000.#endif.#if S
132d0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
132e0 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  ED<0 || SQLITE_M
132f0 41 58 5f 41 54 54 41 43 48 45 44 3e 31 32 35 0a  AX_ATTACHED>125.
13300 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
13310 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74  AX_ATTACHED must
13320 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
13330 64 20 31 32 35 0a 23 65 6e 64 69 66 0a 23 69 66  d 125.#endif.#if
13340 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
13350 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c  _PATTERN_LENGTH<
13360 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  1.# error SQLITE
13370 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
13380 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65  N_LENGTH must be
13390 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64   at least 1.#end
133a0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
133b0 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23  X_COLUMN>32767.#
133c0 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
133d0 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f  X_COLUMN must no
133e0 74 20 65 78 63 65 65 64 20 33 32 37 36 37 0a 23  t exceed 32767.#
133f0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
13400 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
13410 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c  TH<1.# error SQL
13420 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
13430 44 45 50 54 48 20 6d 75 73 74 20 62 65 20 61 74  DEPTH must be at
13440 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a   least 1.#endif.
13450 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  #if SQLITE_MAX_W
13460 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3c 30 20  ORKER_THREADS<0 
13470 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  || SQLITE_MAX_WO
13480 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 35 30 0a  RKER_THREADS>50.
13490 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
134a0 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  AX_WORKER_THREAD
134b0 53 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  S must be betwee
134c0 6e 20 30 20 61 6e 64 20 35 30 0a 23 65 6e 64 69  n 0 and 50.#endi
134d0 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  f.../*.** Change
134e0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
134f0 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20 74  limit.  Report t
13500 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a  he old value..**
13510 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c   If an invalid l
13520 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73 75  imit index is su
13530 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20 2d  pplied, report -
13540 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  1..** Make no ch
13550 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c 20  anges but still 
13560 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76  report the old v
13570 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e  alue if the.** n
13580 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61  ew limit is nega
13590 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  tive..**.** A ne
135a0 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f  w lower limit do
135b0 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78  es not shrink ex
135c0 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63 74  isting construct
135d0 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20  s..** It merely 
135e0 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e  prevents new con
135f0 73 74 72 75 63 74 73 20 74 68 61 74 20 65 78 63  structs that exc
13600 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a  eed the limit.**
13610 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a   from forming..*
13620 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69  /.int sqlite3_li
13630 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
13640 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e   int limitId, in
13650 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69  t newLimit){.  i
13660 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 23 69  nt oldLimit;..#i
13670 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
13680 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
13690 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
136a0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
136b0 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
136c0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
136d0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
136e0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 56  .#endif..  /* EV
136f0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31  IDENCE-OF: R-301
13700 38 39 2d 35 34 30 39 37 20 46 6f 72 20 65 61 63  89-54097 For eac
13710 68 20 6c 69 6d 69 74 20 63 61 74 65 67 6f 72 79  h limit category
13720 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41   SQLITE_LIMIT_NA
13730 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  ME.  ** there is
13740 20 61 20 68 61 72 64 20 75 70 70 65 72 20 62 6f   a hard upper bo
13750 75 6e 64 20 73 65 74 20 61 74 20 63 6f 6d 70 69  und set at compi
13760 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43 20 70  le-time by a C p
13770 72 65 70 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a  reprocessor.  **
13780 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20 53 51   macro called SQ
13790 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28  LITE_MAX_NAME. (
137a0 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e  The "_LIMIT_" in
137b0 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63 68 61   the name is cha
137c0 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d  nged to.  ** "_M
137d0 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73  AX_".).  */.  as
137e0 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
137f0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45  [SQLITE_LIMIT_LE
13800 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  NGTH]==SQLITE_MA
13810 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  X_LENGTH );.  as
13820 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
13830 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51  [SQLITE_LIMIT_SQ
13840 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54  L_LENGTH]==SQLIT
13850 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
13860 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
13870 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
13880 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53  LIMIT_COLUMN]==S
13890 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
138a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
138b0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
138c0 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48  LIMIT_EXPR_DEPTH
138d0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  ]==SQLITE_MAX_EX
138e0 50 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  PR_DEPTH );.  as
138f0 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
13900 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
13910 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d  MPOUND_SELECT]==
13920 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
13930 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61  UND_SELECT);.  a
13940 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
13950 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56  t[SQLITE_LIMIT_V
13960 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f  DBE_OP]==SQLITE_
13970 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20  MAX_VDBE_OP );. 
13980 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
13990 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
139a0 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d  _FUNCTION_ARG]==
139b0 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
139c0 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61 73 73  ION_ARG );.  ass
139d0 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
139e0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54  SQLITE_LIMIT_ATT
139f0 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ACHED]==SQLITE_M
13a00 41 58 5f 41 54 54 41 43 48 45 44 20 29 3b 0a 20  AX_ATTACHED );. 
13a10 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
13a20 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
13a30 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
13a40 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20  NGTH]==.        
13a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a70 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41         SQLITE_MA
13a80 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
13a90 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72  ENGTH );.  asser
13aa0 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
13ab0 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41  LITE_LIMIT_VARIA
13ac0 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c  BLE_NUMBER]==SQL
13ad0 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
13ae0 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73 73 65  _NUMBER);.  asse
13af0 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
13b00 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47  QLITE_LIMIT_TRIG
13b10 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49  GER_DEPTH]==SQLI
13b20 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
13b30 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
13b40 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
13b50 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
13b60 5f 54 48 52 45 41 44 53 5d 3d 3d 53 51 4c 49 54  _THREADS]==SQLIT
13b70 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
13b80 45 41 44 53 20 29 3b 0a 20 20 61 73 73 65 72 74  EADS );.  assert
13b90 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57  ( SQLITE_LIMIT_W
13ba0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3d 3d 28  ORKER_THREADS==(
13bb0 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31  SQLITE_N_LIMIT-1
13bc0 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d  ) );...  if( lim
13bd0 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49  itId<0 || limitI
13be0 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49  d>=SQLITE_N_LIMI
13bf0 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
13c00 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d  -1;.  }.  oldLim
13c10 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  it = db->aLimit[
13c20 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28 20  limitId];.  if( 
13c30 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20  newLimit>=0 ){  
13c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c50 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34 37 36   /* IMP: R-52476
13c60 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20 20 69 66  -28732 */.    if
13c70 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72 64  ( newLimit>aHard
13c80 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29  Limit[limitId] )
13c90 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74  {.      newLimit
13ca0 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69   = aHardLimit[li
13cb0 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a  mitId];  /* IMP:
13cc0 20 52 2d 35 31 34 36 33 2d 32 35 36 33 34 20 2a   R-51463-25634 *
13cd0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  /.    }.    db->
13ce0 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20  aLimit[limitId] 
13cf0 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a  = newLimit;.  }.
13d00 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69    return oldLimi
13d10 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
13d20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
13d30 2d 35 33 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a  -53341-35419 */.
13d40 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
13d50 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
13d60 6f 20 70 61 72 73 65 20 62 6f 74 68 20 55 52 49  o parse both URI
13d70 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20 66 69  s and non-URI fi
13d80 6c 65 6e 61 6d 65 73 20 70 61 73 73 65 64 20 62  lenames passed b
13d90 79 20 74 68 65 0a 2a 2a 20 75 73 65 72 20 74 6f  y the.** user to
13da0 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20 73   API functions s
13db0 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 6f 72  qlite3_open() or
13dc0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
13dd0 28 29 2c 20 61 6e 64 20 66 6f 72 20 64 61 74 61  (), and for data
13de0 62 61 73 65 0a 2a 2a 20 55 52 49 73 20 73 70 65  base.** URIs spe
13df0 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f  cified as part o
13e00 66 20 41 54 54 41 43 48 20 73 74 61 74 65 6d 65  f ATTACH stateme
13e10 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  nts..**.** The f
13e20 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
13e30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
13e40 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
13e50 65 20 56 46 53 20 74 6f 20 75 73 65 20 28 6f 72  e VFS to use (or
13e60 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20 73 69  .** a NULL to si
13e70 67 6e 69 66 79 20 74 68 65 20 64 65 66 61 75 6c  gnify the defaul
13e80 74 20 56 46 53 29 20 69 66 20 74 68 65 20 55 52  t VFS) if the UR
13e90 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  I does not conta
13ea0 69 6e 20 61 20 22 76 66 73 3d 78 78 78 22 0a 2a  in a "vfs=xxx".*
13eb0 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  * query paramete
13ec0 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  r. The second ar
13ed0 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20  gument contains 
13ee0 74 68 65 20 55 52 49 20 28 6f 72 20 6e 6f 6e 2d  the URI (or non-
13ef0 55 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a  URI filename).**
13f00 20 69 74 73 65 6c 66 2e 20 57 68 65 6e 20 74 68   itself. When th
13f10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
13f20 61 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c 61 67  alled the *pFlag
13f30 73 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c  s variable shoul
13f40 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68 65  d contain.** the
13f50 20 64 65 66 61 75 6c 74 20 66 6c 61 67 73 20 74   default flags t
13f60 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62  o open the datab
13f70 61 73 65 20 68 61 6e 64 6c 65 20 77 69 74 68 2e  ase handle with.
13f80 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   The value store
13f90 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73 20  d in.** *pFlags 
13fa0 6d 61 79 20 62 65 20 75 70 64 61 74 65 64 20 62  may be updated b
13fb0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
13fc0 69 66 20 74 68 65 20 55 52 49 20 66 69 6c 65 6e  if the URI filen
13fd0 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a  ame contains .**
13fe0 20 22 63 61 63 68 65 3d 78 78 78 22 20 6f 72 20   "cache=xxx" or 
13ff0 22 6d 6f 64 65 3d 78 78 78 22 20 71 75 65 72 79  "mode=xxx" query
14000 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a   parameters..**.
14010 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
14020 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
14030 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
14040 20 63 61 73 65 20 2a 70 70 56 66 73 20 69 73 20   case *ppVfs is 
14050 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a  set to point to.
14060 2a 2a 20 74 68 65 20 56 46 53 20 74 68 61 74 20  ** the VFS that 
14070 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74  should be used t
14080 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62  o open the datab
14090 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46 69 6c  ase file. *pzFil
140a0 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70  e is set to.** p
140b0 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
140c0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
140d0 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  name of the file
140e0 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69 73 20   to open. It is 
140f0 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  the .** responsi
14100 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
14110 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
14120 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  ly call sqlite3_
14130 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65 61 73  free() to releas
14140 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72  e.** this buffer
14150 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
14160 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
14170 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
14180 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
14190 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67 0a  d and *pzErrMsg.
141a0 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  ** may be set to
141b0 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
141c0 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e  er containing an
141d0 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
141e0 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73  e error .** mess
141f0 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  age. It is the r
14200 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
14210 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
14220 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73  ventually releas
14230 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72  e.** this buffer
14240 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69   by calling sqli
14250 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69  te3_free()..*/.i
14260 6e 74 20 73 71 6c 69 74 65 33 50 61 72 73 65 55  nt sqlite3ParseU
14270 72 69 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ri(.  const char
14280 20 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c 20 20   *zDefaultVfs,  
14290 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20        /* VFS to 
142a0 75 73 65 20 69 66 20 6e 6f 20 22 76 66 73 3d 78  use if no "vfs=x
142b0 78 78 22 20 71 75 65 72 79 20 6f 70 74 69 6f 6e  xx" query option
142c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
142d0 20 2a 7a 55 72 69 2c 20 20 20 20 20 20 20 20 20   *zUri,         
142e0 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72        /* Nul-ter
142f0 6d 69 6e 61 74 65 64 20 55 52 49 20 74 6f 20 70  minated URI to p
14300 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  arse */.  unsign
14310 65 64 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20  ed int *pFlags, 
14320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
14330 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e  OUT: SQLITE_OPEN
14340 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
14350 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a 70 70  sqlite3_vfs **pp
14360 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Vfs,            
14370 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f 20 75  /* OUT: VFS to u
14380 73 65 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a 2a  se */ .  char **
14390 70 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  pzFile,         
143a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
143b0 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e   Filename compon
143c0 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a 20 20  ent of URI */.  
143d0 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20  char **pzErrMsg 
143e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143f0 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65  /* OUT: Error me
14400 73 73 61 67 65 20 28 69 66 20 72 63 21 3d 53 51  ssage (if rc!=SQ
14410 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20  LITE_OK) */.){. 
14420 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14430 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  _OK;.  unsigned 
14440 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70 46 6c  int flags = *pFl
14450 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ags;.  const cha
14460 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66 61 75  r *zVfs = zDefau
14470 6c 74 56 66 73 3b 0a 20 20 63 68 61 72 20 2a 7a  ltVfs;.  char *z
14480 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 63 3b 0a  File;.  char c;.
14490 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 73 71 6c    int nUri = sql
144a0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 72  ite3Strlen30(zUr
144b0 69 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a  i);..  assert( *
144c0 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a  pzErrMsg==0 );..
144d0 20 20 69 66 28 20 28 28 66 6c 61 67 73 20 26 20    if( ((flags & 
144e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
144f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14500 49 4d 50 3a 20 52 2d 34 38 37 32 35 2d 33 32 32  IMP: R-48725-322
14510 30 36 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  06 */.          
14520 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62    || sqlite3Glob
14530 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72  alConfig.bOpenUr
14540 69 29 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 36  i) /* IMP: R-516
14550 38 39 2d 34 36 35 34 38 20 2a 2f 0a 20 20 20 26  89-46548 */.   &
14560 26 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d  & nUri>=5 && mem
14570 63 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a  cmp(zUri, "file:
14580 22 2c 20 35 29 3d 3d 30 20 2f 2a 20 49 4d 50 3a  ", 5)==0 /* IMP:
14590 20 52 2d 35 37 38 38 34 2d 33 37 34 39 36 20 2a   R-57884-37496 *
145a0 2f 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20  /.  ){.    char 
145b0 2a 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20 65  *zOpt;.    int e
145c0 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  State;          
145d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
145e0 65 72 20 73 74 61 74 65 20 77 68 65 6e 20 70 61  er state when pa
145f0 72 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20 20  rsing URI */.   
14600 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 20 20 20   int iIn;       
14610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14620 2a 20 49 6e 70 75 74 20 63 68 61 72 61 63 74 65  * Input characte
14630 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  r index */.    i
14640 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20 20  nt iOut = 0;    
14650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14660 4f 75 74 70 75 74 20 63 68 61 72 61 63 74 65 72  Output character
14670 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 75 36   index */.    u6
14680 34 20 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b 32  4 nByte = nUri+2
14690 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
146a0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f  ytes of space to
146b0 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20   allocate */..  
146c0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
146d0 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  he SQLITE_OPEN_U
146e0 52 49 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  RI flag is set t
146f0 6f 20 69 6e 64 69 63 61 74 65 20 74 6f 20 74 68  o indicate to th
14700 65 20 56 46 53 20 78 4f 70 65 6e 20 0a 20 20 20  e VFS xOpen .   
14710 20 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61 74 20   ** method that 
14720 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 78 74  there may be ext
14730 72 61 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f  ra parameters fo
14740 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  llowing the file
14750 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 66  -name.  */.    f
14760 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
14770 50 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66 6f  PEN_URI;..    fo
14780 72 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72  r(iIn=0; iIn<nUr
14790 69 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65 20  i; iIn++) nByte 
147a0 2b 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27  += (zUri[iIn]=='
147b0 26 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d  &');.    zFile =
147c0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
147d0 34 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  4(nByte);.    if
147e0 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72  ( !zFile ) retur
147f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
14800 4b 50 54 3b 0a 0a 20 20 20 20 69 49 6e 20 3d 20  KPT;..    iIn = 
14810 35 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  5;.#ifdef SQLITE
14820 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54 48 4f  _ALLOW_URI_AUTHO
14830 52 49 54 59 0a 20 20 20 20 69 66 28 20 73 74 72  RITY.    if( str
14840 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20 22 2f 2f  ncmp(zUri+5, "//
14850 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20  /", 3)==0 ){.   
14860 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20     iIn = 7;.    
14870 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
14880 6e 67 20 63 6f 6e 64 69 74 69 6f 6e 20 63 61 75  ng condition cau
14890 73 65 73 20 55 52 49 73 20 77 69 74 68 20 66 69  ses URIs with fi
148a0 76 65 20 6c 65 61 64 69 6e 67 20 2f 20 63 68 61  ve leading / cha
148b0 72 61 63 74 65 72 73 0a 20 20 20 20 20 20 2a 2a  racters.      **
148c0 20 6c 69 6b 65 20 66 69 6c 65 3a 2f 2f 2f 2f 2f   like file://///
148d0 68 6f 73 74 2f 70 61 74 68 20 74 6f 20 62 65 20  host/path to be 
148e0 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 55  converted into U
148f0 4e 43 73 20 6c 69 6b 65 20 2f 2f 68 6f 73 74 2f  NCs like //host/
14900 70 61 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 54  path..      ** T
14910 68 65 20 63 6f 72 72 65 63 74 20 55 52 49 20 66  he correct URI f
14920 6f 72 20 74 68 61 74 20 55 4e 43 20 68 61 73 20  or that UNC has 
14930 6f 6e 6c 79 20 74 77 6f 20 6f 72 20 66 6f 75 72  only two or four
14940 20 6c 65 61 64 69 6e 67 20 2f 20 63 68 61 72 61   leading / chara
14950 63 74 65 72 73 0a 20 20 20 20 20 20 2a 2a 20 66  cters.      ** f
14960 69 6c 65 3a 2f 2f 68 6f 73 74 2f 70 61 74 68 20  ile://host/path 
14970 6f 72 20 66 69 6c 65 3a 2f 2f 2f 2f 68 6f 73 74  or file:////host
14980 2f 70 61 74 68 2e 20 20 42 75 74 20 35 20 6c 65  /path.  But 5 le
14990 61 64 69 6e 67 20 73 6c 61 73 68 65 73 20 69 73  ading slashes is
149a0 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d   a .      ** com
149b0 6d 6f 6e 20 65 72 72 6f 72 2c 20 77 65 20 61 72  mon error, we ar
149c0 65 20 74 6f 6c 64 2c 20 73 6f 20 77 65 20 68 61  e told, so we ha
149d0 6e 64 6c 65 20 69 74 20 61 73 20 61 20 73 70 65  ndle it as a spe
149e0 63 69 61 6c 20 63 61 73 65 2e 20 2a 2f 0a 20 20  cial case. */.  
149f0 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
14a00 7a 55 72 69 2b 37 2c 20 22 2f 2f 2f 22 2c 20 33  zUri+7, "///", 3
14a10 29 3d 3d 30 20 29 7b 20 69 49 6e 2b 2b 3b 20 7d  )==0 ){ iIn++; }
14a20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
14a30 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20 22  trncmp(zUri+5, "
14a40 2f 2f 6c 6f 63 61 6c 68 6f 73 74 2f 22 2c 20 31  //localhost/", 1
14a50 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  2)==0 ){.      i
14a60 49 6e 20 3d 20 31 36 3b 0a 20 20 20 20 7d 0a 23  In = 16;.    }.#
14a70 65 6c 73 65 0a 20 20 20 20 2f 2a 20 44 69 73 63  else.    /* Disc
14a80 61 72 64 20 74 68 65 20 73 63 68 65 6d 65 20 61  ard the scheme a
14a90 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73 65 67  nd authority seg
14aa0 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52 49  ments of the URI
14ab0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55 72  . */.    if( zUr
14ac0 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55 72  i[5]=='/' && zUr
14ad0 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i[6]=='/' ){.   
14ae0 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20     iIn = 7;.    
14af0 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49    while( zUri[iI
14b00 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21  n] && zUri[iIn]!
14b10 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20  ='/' ) iIn++;.  
14b20 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20 26      if( iIn!=7 &
14b30 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d 65  & (iIn!=16 || me
14b40 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74 22  mcmp("localhost"
14b50 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29 20  , &zUri[7], 9)) 
14b60 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  ){.        *pzEr
14b70 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
14b80 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64 20  printf("invalid 
14b90 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20 25  uri authority: %
14ba0 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20  .*s", .         
14bb0 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69 5b     iIn-7, &zUri[
14bc0 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  7]);.        rc 
14bd0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
14be0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72          goto par
14bf0 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20  se_uri_out;.    
14c00 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
14c10 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68  ..    /* Copy th
14c20 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 61  e filename and a
14c30 6e 79 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ny query paramet
14c40 65 72 73 20 69 6e 74 6f 20 74 68 65 20 7a 46 69  ers into the zFi
14c50 6c 65 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20  le buffer. .    
14c60 2a 2a 20 44 65 63 6f 64 65 20 25 48 48 20 65 73  ** Decode %HH es
14c70 63 61 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e 67  cape codes along
14c80 20 74 68 65 20 77 61 79 2e 20 0a 20 20 20 20 2a   the way. .    *
14c90 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 69 6e 20  *.    ** Within 
14ca0 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69 61  this loop, varia
14cb0 62 6c 65 20 65 53 74 61 74 65 20 6d 61 79 20 62  ble eState may b
14cc0 65 20 73 65 74 20 74 6f 20 30 2c 20 31 20 6f 72  e set to 0, 1 or
14cd0 20 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20   2, depending.  
14ce0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72 73    ** on the pars
14cf0 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41 73 20  ing context. As 
14d00 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a  follows:.    **.
14d10 20 20 20 20 2a 2a 20 20 20 30 3a 20 50 61 72 73      **   0: Pars
14d20 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a 20  ing file-name.. 
14d30 20 20 20 2a 2a 20 20 20 31 3a 20 50 61 72 73 69     **   1: Parsi
14d40 6e 67 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e 20  ng name section 
14d50 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20  of a name=value 
14d60 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
14d70 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20 50 61 72  .    **   2: Par
14d80 73 69 6e 67 20 76 61 6c 75 65 20 73 65 63 74 69  sing value secti
14d90 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c  on of a name=val
14da0 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ue query paramet
14db0 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65  er..    */.    e
14dc0 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 77  State = 0;.    w
14dd0 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b  hile( (c = zUri[
14de0 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  iIn])!=0 && c!='
14df0 23 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 2b  #' ){.      iIn+
14e00 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  +;.      if( c==
14e10 27 25 27 20 0a 20 20 20 20 20 20 20 26 26 20 73  '%' .       && s
14e20 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a  qlite3Isxdigit(z
14e30 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20 20  Uri[iIn]) .     
14e40 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64    && sqlite3Isxd
14e50 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31 5d  igit(zUri[iIn+1]
14e60 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
14e70 20 20 20 20 69 6e 74 20 6f 63 74 65 74 20 3d 20      int octet = 
14e80 28 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74  (sqlite3HexToInt
14e90 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c 3c  (zUri[iIn++]) <<
14ea0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6f 63 74   4);.        oct
14eb0 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 48 65 78  et += sqlite3Hex
14ec0 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b  ToInt(zUri[iIn++
14ed0 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73  ]);..        ass
14ee0 65 72 74 28 20 6f 63 74 65 74 3e 3d 30 20 26 26  ert( octet>=0 &&
14ef0 20 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a 20 20   octet<256 );.  
14f00 20 20 20 20 20 20 69 66 28 20 6f 63 74 65 74 3d        if( octet=
14f10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
14f20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
14f30 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 22 25 30  s taken when "%0
14f40 30 22 20 61 70 70 65 61 72 73 20 77 69 74 68 69  0" appears withi
14f50 6e 20 74 68 65 20 55 52 49 2e 20 49 6e 20 74 68  n the URI. In th
14f60 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
14f70 63 61 73 65 20 77 65 20 69 67 6e 6f 72 65 20 61  case we ignore a
14f80 6c 6c 20 74 65 78 74 20 69 6e 20 74 68 65 20 72  ll text in the r
14f90 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
14fa0 70 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a 20 20  path, name or.  
14fb0 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
14fc0 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
14fd0 20 70 61 72 73 65 64 2e 20 53 6f 20 69 67 6e 6f   parsed. So igno
14fe0 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
14ff0 68 61 72 61 63 74 65 72 0a 20 20 20 20 20 20 20  haracter.       
15000 20 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70 20 74     ** and skip t
15010 6f 20 74 68 65 20 6e 65 78 74 20 22 3f 22 2c 20  o the next "?", 
15020 22 3d 22 20 6f 72 20 22 26 22 2c 20 61 73 20 61  "=" or "&", as a
15030 70 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f 0a 20  ppropriate. */. 
15040 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
15050 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21  (c = zUri[iIn])!
15060 3d 30 20 26 26 20 63 21 3d 27 23 27 20 0a 20 20  =0 && c!='#' .  
15070 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
15080 65 53 74 61 74 65 21 3d 30 20 7c 7c 20 63 21 3d  eState!=0 || c!=
15090 27 3f 27 29 0a 20 20 20 20 20 20 20 20 20 20 20  '?').           
150a0 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 31     && (eState!=1
150b0 20 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26 20 63   || (c!='=' && c
150c0 21 3d 27 26 27 29 29 0a 20 20 20 20 20 20 20 20  !='&')).        
150d0 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65        && (eState
150e0 21 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29 0a 20  !=2 || c!='&'). 
150f0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
15100 20 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20          iIn++;. 
15110 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15120 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
15130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15140 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20 20 20   c = octet;.    
15150 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61    }else if( eSta
15160 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27 26 27  te==1 && (c=='&'
15170 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b 0a 20   || c=='=') ){. 
15180 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
15190 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20  [iOut-1]==0 ){. 
151a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
151b0 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61 6d 65  mpty option name
151c0 2e 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6f 70  . Ignore this op
151d0 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65 72 2e  tion altogether.
151e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68   */.          wh
151f0 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26  ile( zUri[iIn] &
15200 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 23 27  & zUri[iIn]!='#'
15210 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31 5d 21   && zUri[iIn-1]!
15220 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20  ='&' ) iIn++;.  
15230 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
15240 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15250 20 20 20 20 69 66 28 20 63 3d 3d 27 26 27 20 29      if( c=='&' )
15260 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c  {.          zFil
15270 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
15280 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
15290 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74  .          eStat
152a0 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d  e = 2;.        }
152b0 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a  .        c = 0;.
152c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
152d0 28 65 53 74 61 74 65 3d 3d 30 20 26 26 20 63 3d  (eState==0 && c=
152e0 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74 61 74 65  ='?') || (eState
152f0 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27 29 20 29  ==2 && c=='&') )
15300 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b  {.        c = 0;
15310 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 20  .        eState 
15320 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
15330 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d     zFile[iOut++]
15340 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = c;.    }.    
15350 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 29 20  if( eState==1 ) 
15360 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
15370 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
15380 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  iOut++] = '\0';.
15390 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
153a0 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 2f  ] = '\0';..    /
153b0 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 72 65  * Check if there
153c0 20 77 65 72 65 20 61 6e 79 20 6f 70 74 69 6f 6e   were any option
153d0 73 20 73 70 65 63 69 66 69 65 64 20 74 68 61 74  s specified that
153e0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 74 65 72   should be inter
153f0 70 72 65 74 65 64 20 0a 20 20 20 20 2a 2a 20 68  preted .    ** h
15400 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74 68 61  ere. Options tha
15410 74 20 61 72 65 20 69 6e 74 65 72 70 72 65 74 65  t are interprete
15420 64 20 68 65 72 65 20 69 6e 63 6c 75 64 65 20 22  d here include "
15430 76 66 73 22 20 61 6e 64 20 74 68 6f 73 65 20 74  vfs" and those t
15440 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65  hat.    ** corre
15450 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73 20 74  spond to flags t
15460 68 61 74 20 6d 61 79 20 62 65 20 70 61 73 73 65  hat may be passe
15470 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  d to the sqlite3
15480 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20 20 2a  _open_v2().    *
15490 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20 20 20  * method. */.   
154a0 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65 5b 73   zOpt = &zFile[s
154b0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
154c0 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68  File)+1];.    wh
154d0 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a  ile( zOpt[0] ){.
154e0 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 20 3d        int nOpt =
154f0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
15500 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 63 68  (zOpt);.      ch
15510 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70 74  ar *zVal = &zOpt
15520 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20 20 20  [nOpt+1];.      
15530 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74  int nVal = sqlit
15540 65 33 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c 29  e3Strlen30(zVal)
15550 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 70  ;..      if( nOp
15560 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==3 && memcmp("
15570 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d  vfs", zOpt, 3)==
15580 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 56 66  0 ){.        zVf
15590 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20  s = zVal;.      
155a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
155b0 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 7b  truct OpenMode {
155c0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
155d0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
155e0 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20      int mode;.  
155f0 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65 20 3d        } *aMode =
15600 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72   0;.        char
15610 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20 30 3b   *zModeType = 0;
15620 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61 73  .        int mas
15630 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  k = 0;.        i
15640 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20  nt limit = 0;.. 
15650 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d         if( nOpt=
15660 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 63 61  =5 && memcmp("ca
15670 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d  che", zOpt, 5)==
15680 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
15690 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65  tatic struct Ope
156a0 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f 64 65  nMode aCacheMode
156b0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
156c0 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c 20 20     { "shared",  
156d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
156e0 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20  EDCACHE },.     
156f0 20 20 20 20 20 20 20 7b 20 22 70 72 69 76 61 74         { "privat
15700 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  e", SQLITE_OPEN_
15710 50 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a  PRIVATECACHE },.
15720 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c              { 0,
15730 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d   0 }.          }
15740 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73  ;..          mas
15750 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  k = SQLITE_OPEN_
15760 53 48 41 52 45 44 43 41 43 48 45 7c 53 51 4c 49  SHAREDCACHE|SQLI
15770 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
15780 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20 20 20  ACHE;.          
15790 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65 4d 6f  aMode = aCacheMo
157a0 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69  de;.          li
157b0 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  mit = mask;.    
157c0 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20        zModeType 
157d0 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20 20 20  = "cache";.     
157e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
157f0 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d 63   nOpt==4 && memc
15800 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c  mp("mode", zOpt,
15810 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)==0 ){.      
15820 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63      static struc
15830 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65 6e  t OpenMode aOpen
15840 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Mode[] = {.     
15850 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c 20 20         { "ro",  
15860 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
15870 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20 20  ONLY },.        
15880 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53 51 4c      { "rw",  SQL
15890 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
158a0 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 20  TE }, .         
158b0 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51 4c 49     { "rwc", SQLI
158c0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
158d0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
158e0 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20  CREATE },.      
158f0 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72 79 22        { "memory"
15900 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45  , SQLITE_OPEN_ME
15910 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20 20 20  MORY },.        
15920 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20      { 0, 0 }.   
15930 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20         };..     
15940 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49       mask = SQLI
15950 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
15960 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   | SQLITE_OPEN_R
15970 45 41 44 57 52 49 54 45 0a 20 20 20 20 20 20 20  EADWRITE.       
15980 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
15990 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
159a0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   | SQLITE_OPEN_M
159b0 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20 20 20  EMORY;.         
159c0 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d 6f   aMode = aOpenMo
159d0 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69  de;.          li
159e0 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c 61  mit = mask & fla
159f0 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d  gs;.          zM
15a00 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63 65 73  odeType = "acces
15a10 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  s";.        }.. 
15a20 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f 64 65         if( aMode
15a30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
15a40 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69  t i;.          i
15a50 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  nt mode = 0;.   
15a60 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
15a70 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29  aMode[i].z; i++)
15a80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
15a90 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 4d  nst char *z = aM
15aa0 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20 20  ode[i].z;.      
15ab0 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d 3d        if( nVal==
15ac0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
15ad0 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  z) && 0==memcmp(
15ae0 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20 29  zVal, z, nVal) )
15af0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
15b00 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e  mode = aMode[i].
15b10 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  mode;.          
15b20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15b30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15b40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
15b50 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  f( mode==0 ){.  
15b60 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72            *pzErr
15b70 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
15b80 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 25  rintf("no such %
15b90 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d 6f  s mode: %s", zMo
15ba0 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20  deType, zVal);. 
15bb0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
15bc0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
15bd0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
15be0 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20  arse_uri_out;.  
15bf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15c00 20 20 20 20 69 66 28 20 28 6d 6f 64 65 20 26 20      if( (mode & 
15c10 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d  ~SQLITE_OPEN_MEM
15c20 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a 20 20  ORY)>limit ){.  
15c30 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72            *pzErr
15c40 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
15c50 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65 20 6e  rintf("%s mode n
15c60 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22 2c  ot allowed: %s",
15c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c90 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79           zModeTy
15ca0 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20  pe, zVal);.     
15cb0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
15cc0 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 20  TE_PERM;.       
15cd0 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f       goto parse_
15ce0 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  uri_out;.       
15cf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
15d00 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26 20  lags = (flags & 
15d10 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20  ~mask) | mode;. 
15d20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15d30 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d 20 26  ..      zOpt = &
15d40 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20  zVal[nVal+1];.  
15d50 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    }..  }else{.  
15d60 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65    zFile = sqlite
15d70 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 55 72 69 2b  3_malloc64(nUri+
15d80 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69  2);.    if( !zFi
15d90 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
15da0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
15db0 20 20 20 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c     memcpy(zFile,
15dc0 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20   zUri, nUri);.  
15dd0 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20    zFile[nUri] = 
15de0 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
15df0 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a  nUri+1] = '\0';.
15e00 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
15e10 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20  LITE_OPEN_URI;. 
15e20 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20 3d 20 73   }..  *ppVfs = s
15e30 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
15e40 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 2a 70 70  zVfs);.  if( *pp
15e50 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  Vfs==0 ){.    *p
15e60 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
15e70 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75  3_mprintf("no su
15e80 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a 56 66  ch vfs: %s", zVf
15e90 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  s);.    rc = SQL
15ea0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
15eb0 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20  parse_uri_out:. 
15ec0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15ed0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
15ee0 33 5f 66 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20  3_free(zFile);. 
15ef0 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20     zFile = 0;.  
15f00 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c  }.  *pFlags = fl
15f10 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d  ags;.  *pzFile =
15f20 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e   zFile;.  return
15f30 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
15f40 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
15f50 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65   the work of ope
15f60 6e 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ning a database 
15f70 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20  on behalf of.** 
15f80 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 61  sqlite3_open() a
15f90 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  nd sqlite3_open1
15fa0 36 28 29 2e 20 54 68 65 20 64 61 74 61 62 61 73  6(). The databas
15fb0 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c  e filename "zFil
15fc0 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55  ename"  .** is U
15fd0 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f  TF-8 encoded..*/
15fe0 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
15ff0 44 61 74 61 62 61 73 65 28 0a 20 20 63 6f 6e 73  Database(.  cons
16000 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
16010 65 2c 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66  e, /* Database f
16020 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e  ilename UTF-8 en
16030 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  coded */.  sqlit
16040 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20  e3 **ppDb,      
16050 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e    /* OUT: Return
16060 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
16070 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  le */.  unsigned
16080 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 2f   int flags,    /
16090 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c  * Operational fl
160a0 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ags */.  const c
160b0 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20  har *zVfs       
160c0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 56  /* Name of the V
160d0 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a  FS to use */.){.
160e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
160f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16100 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63    /* Store alloc
16110 61 74 65 64 20 68 61 6e 64 6c 65 20 68 65 72 65  ated handle here
16120 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16140 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
16150 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  code */.  int is
16160 54 68 72 65 61 64 73 61 66 65 3b 20 20 20 20 20  Threadsafe;     
16170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
16180 65 20 66 6f 72 20 74 68 72 65 61 64 73 61 66 65  e for threadsafe
16190 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
161a0 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20    char *zOpen = 
161b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
161c0 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72    /* Filename ar
161d0 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74  gument to pass t
161e0 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f  o BtreeOpen() */
161f0 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
16200 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
16210 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73     /* Error mess
16220 61 67 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  age from sqlite3
16230 50 61 72 73 65 55 72 69 28 29 20 2a 2f 0a 0a 23  ParseUri() */..#
16240 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
16250 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
16260 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72 65  if( ppDb==0 ) re
16270 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
16280 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
16290 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66    *ppDb = 0;.#if
162a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
162b0 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
162c0 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
162d0 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
162e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
162f0 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61  dif..  /* Only a
16300 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20 63 6f  llow sensible co
16310 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69  mbinations of bi
16320 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67 73 20  ts in the flags 
16330 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a  argument.  .  **
16340 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20   Throw an error 
16350 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65  if any non-sense
16360 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20   combination is 
16370 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20 20 2a  used.  If we.  *
16380 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69  * do not block i
16390 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69  llegal combinati
163a0 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63 6f 75  ons here, it cou
163b0 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a 2a 20  ld trigger.  ** 
163c0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
163d0 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20 6c 61  nts in deeper la
163e0 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c 65 20  yers.  Sensible 
163f0 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a  combinations.  *
16400 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  * are:.  **.  **
16410 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45    1:  SQLITE_OPE
16420 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20  N_READONLY.  ** 
16430 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   2:  SQLITE_OPEN
16440 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a 2a 20  _READWRITE.  ** 
16450 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e   6:  SQLITE_OPEN
16460 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
16470 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
16480 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53    */.  assert( S
16490 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
164a0 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a  NLY  == 0x01 );.
164b0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
164c0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
164d0 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61 73 73  == 0x02 );.  ass
164e0 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
164f0 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20 30 78  _CREATE    == 0x
16500 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  04 );.  testcase
16510 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
16520 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52 45 41  ==0x02 ); /* REA
16530 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63  DONLY */.  testc
16540 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
16550 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20  7))==0x04 ); /* 
16560 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20 20 74  READWRITE */.  t
16570 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
16580 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20 29 3b  ags&7))==0x40 );
16590 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20 7c 20   /* READWRITE | 
165a0 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66 28 20  CREATE */.  if( 
165b0 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 20  ((1<<(flags&7)) 
165c0 26 20 30 78 34 36 29 3d 3d 30 20 29 7b 0a 20 20  & 0x46)==0 ){.  
165d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
165e0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 20 20 2f 2a  MISUSE_BKPT;  /*
165f0 20 49 4d 50 3a 20 52 2d 36 35 34 39 37 2d 34 34   IMP: R-65497-44
16600 35 39 34 20 2a 2f 0a 20 20 7d 0a 0a 20 20 69 66  594 */.  }..  if
16610 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
16620 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
16630 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72  ==0 ){.    isThr
16640 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d  eadsafe = 0;.  }
16650 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
16660 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
16670 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68  UTEX ){.    isTh
16680 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20  readsafe = 0;.  
16690 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
166a0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  & SQLITE_OPEN_FU
166b0 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  LLMUTEX ){.    i
166c0 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b  sThreadsafe = 1;
166d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73  .  }else{.    is
166e0 54 68 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c  Threadsafe = sql
166f0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
16700 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d  .bFullMutex;.  }
16710 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
16720 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
16730 54 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66  TECACHE ){.    f
16740 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
16750 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
16760 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
16770 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
16780 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61  g.sharedCacheEna
16790 62 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67  bled ){.    flag
167a0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
167b0 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
167c0 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68  }..  /* Remove h
167d0 61 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d  armful bits from
167e0 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
167f0 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  eter.  **.  ** T
16800 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  he SQLITE_OPEN_N
16810 4f 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54  OMUTEX and SQLIT
16820 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
16830 20 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a   flags were.  **
16840 20 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74   dealt with in t
16850 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65  he previous code
16860 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73   block.  Besides
16870 20 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79   these, the only
16880 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75  .  ** valid inpu
16890 74 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69  t flags for sqli
168a0 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72  te3_open_v2() ar
168b0 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  e SQLITE_OPEN_RE
168c0 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c  ADONLY,.  ** SQL
168d0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
168e0 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  TE, SQLITE_OPEN_
168f0 43 52 45 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f  CREATE, SQLITE_O
16900 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 2c  PEN_SHAREDCACHE,
16910 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45  .  ** SQLITE_OPE
16920 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 2c 20  N_PRIVATECACHE, 
16930 61 6e 64 20 73 6f 6d 65 20 72 65 73 65 72 76 65  and some reserve
16940 64 20 62 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c  d bits.  Silentl
16950 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20  y mask.  ** off 
16960 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 2e  all other flags.
16970 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d  .  */.  flags &=
16980 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e    ~( SQLITE_OPEN
16990 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c  _DELETEONCLOSE |
169a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
169b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
169c0 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20  USIVE |.        
169d0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
169e0 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20  EN_MAIN_DB |.   
169f0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
16a00 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
16a10 7c 20 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 52    SQLITE_OPEN_TR
16a30 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20  ANSIENT_DB | .  
16a40 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
16a50 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
16a60 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20  URNAL | .       
16a70 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
16a80 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
16a90 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
16aa0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53     SQLITE_OPEN_S
16ab0 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  UBJOURNAL | .   
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
16ad0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
16ae0 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20  OURNAL |.       
16af0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
16b00 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20  PEN_NOMUTEX |.  
16b10 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
16b20 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54  ITE_OPEN_FULLMUT
16b30 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EX |.           
16b40 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
16b50 57 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20  WAL.            
16b60 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
16b70 74 65 20 74 68 65 20 73 71 6c 69 74 65 20 64 61  te the sqlite da
16b80 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ta structure */.
16b90 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61    db = sqlite3Ma
16ba0 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
16bb0 28 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69  (sqlite3) );.  i
16bc0 66 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20  f( db==0 ) goto 
16bd0 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66  opendb_out;.  if
16be0 28 20 69 73 54 68 72 65 61 64 73 61 66 65 20 29  ( isThreadsafe )
16bf0 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20  {.    db->mutex 
16c00 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
16c10 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
16c20 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20  _RECURSIVE);.   
16c30 20 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d   if( db->mutex==
16c40 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
16c50 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20  e3_free(db);.   
16c60 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20     db = 0;.     
16c70 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
16c80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
16c90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
16ca0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
16cb0 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78  db->errMask = 0x
16cc0 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20  ff;.  db->nDb = 
16cd0 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  2;.  db->magic =
16ce0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55   SQLITE_MAGIC_BU
16cf0 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20  SY;.  db->aDb = 
16d00 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a  db->aDbStatic;..
16d10 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
16d20 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69  (db->aLimit)==si
16d30 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29  zeof(aHardLimit)
16d40 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d   );.  memcpy(db-
16d50 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69  >aLimit, aHardLi
16d60 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e  mit, sizeof(db->
16d70 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e  aLimit));.  db->
16d80 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
16d90 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
16da0 44 53 5d 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  DS] = SQLITE_DEF
16db0 41 55 4c 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  AULT_WORKER_THRE
16dc0 41 44 53 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43  ADS;.  db->autoC
16dd0 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d  ommit = 1;.  db-
16de0 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d  >nextAutovac = -
16df0 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d 6d 61 70 20  1;.  db->szMmap 
16e00 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
16e10 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20  onfig.szMmap;.  
16e20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65  db->nextPagesize
16e30 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61 78   = 0;.  db->nMax
16e40 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20 30 78 37  SorterMmap = 0x7
16e50 46 46 46 46 46 46 46 3b 0a 20 20 64 62 2d 3e 66  FFFFFFF;.  db->f
16e60 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53  lags |= SQLITE_S
16e70 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53  hortColNames | S
16e80 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67  QLITE_EnableTrig
16e90 67 65 72 20 7c 20 53 51 4c 49 54 45 5f 43 61 63  ger | SQLITE_Cac
16ea0 68 65 53 70 69 6c 6c 0a 23 69 66 20 21 64 65 66  heSpill.#if !def
16eb0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41  ined(SQLITE_DEFA
16ec0 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  ULT_AUTOMATIC_IN
16ed0 44 45 58 29 20 7c 7c 20 53 51 4c 49 54 45 5f 44  DEX) || SQLITE_D
16ee0 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43  EFAULT_AUTOMATIC
16ef0 5f 49 4e 44 45 58 0a 20 20 20 20 20 20 20 20 20  _INDEX.         
16f00 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
16f10 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65 6e 64 69  _AutoIndex.#endi
16f20 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  f.#if SQLITE_DEF
16f30 41 55 4c 54 5f 43 4b 50 54 46 55 4c 4c 46 53 59  AULT_CKPTFULLFSY
16f40 4e 43 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  NC.             
16f50 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 6b 70      | SQLITE_Ckp
16f60 74 46 75 6c 6c 46 53 79 6e 63 0a 23 65 6e 64 69  tFullFSync.#endi
16f70 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  f.#if SQLITE_DEF
16f80 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  AULT_FILE_FORMAT
16f90 3c 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  <4.             
16fa0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67      | SQLITE_Leg
16fb0 61 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69  acyFileFmt.#endi
16fc0 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
16fd0 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45  ENABLE_LOAD_EXTE
16fe0 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20  NSION.          
16ff0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
17000 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65  LoadExtension.#e
17010 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
17020 44 45 46 41 55 4c 54 5f 52 45 43 55 52 53 49 56  DEFAULT_RECURSIV
17030 45 5f 54 52 49 47 47 45 52 53 0a 20 20 20 20 20  E_TRIGGERS.     
17040 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
17050 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73  LITE_RecTriggers
17060 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
17070 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55  ned(SQLITE_DEFAU
17080 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29  LT_FOREIGN_KEYS)
17090 20 26 26 20 53 51 4c 49 54 45 5f 44 45 46 41 55   && SQLITE_DEFAU
170a0 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a  LT_FOREIGN_KEYS.
170b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170c0 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67   | SQLITE_Foreig
170d0 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a 23 69 66  nKeys.#endif.#if
170e0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
170f0 52 45 56 45 52 53 45 5f 55 4e 4f 52 44 45 52 45  REVERSE_UNORDERE
17100 44 5f 53 45 4c 45 43 54 53 29 0a 20 20 20 20 20  D_SELECTS).     
17110 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
17120 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65  LITE_ReverseOrde
17130 72 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  r.#endif.#if def
17140 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
17150 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
17160 5f 43 48 45 43 4b 29 0a 20 20 20 20 20 20 20 20  _CHECK).        
17170 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
17180 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 0a 23 65 6e  E_CellSizeCk.#en
17190 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71  dif.      ;.  sq
171a0 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
171b0 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69  b->aCollSeq);.#i
171c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
171d0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
171e0 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
171f0 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a  (&db->aModule);.
17200 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64  #endif..  /* Add
17210 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
17220 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
17230 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77  BINARY. BINARY w
17240 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54  orks for both UT
17250 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46  F-8.  ** and UTF
17260 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65  -16, so add a ve
17270 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74  rsion for each t
17280 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65  o avoid any unne
17290 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e  cessary.  ** con
172a0 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e  versions. The on
172b0 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20 63 61  ly error that ca
172c0 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69 73 20  n occur here is 
172d0 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  a malloc() failu
172e0 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 56  re..  **.  ** EV
172f0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 32 37  IDENCE-OF: R-527
17300 38 36 2d 34 34 38 37 38 20 53 51 4c 69 74 65 20  86-44878 SQLite 
17310 64 65 66 69 6e 65 73 20 74 68 72 65 65 20 62 75  defines three bu
17320 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67  ilt-in collating
17330 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a  .  ** functions:
17340 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f  .  */.  createCo
17350 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69  llation(db, sqli
17360 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51  te3StrBINARY, SQ
17370 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69  LITE_UTF8, 0, bi
17380 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
17390 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
173a0 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42  (db, sqlite3StrB
173b0 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54  INARY, SQLITE_UT
173c0 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c  F16BE, 0, binCol
173d0 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
173e0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
173f0 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
17400 59 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  Y, SQLITE_UTF16L
17410 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  E, 0, binCollFun
17420 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
17430 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f  ollation(db, "NO
17440 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54  CASE", SQLITE_UT
17450 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c  F8, 0, nocaseCol
17460 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a  latingFunc, 0);.
17470 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
17480 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53  n(db, "RTRIM", S
17490 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69  QLITE_UTF8, (voi
174a0 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  d*)1, binCollFun
174b0 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d  c, 0);.  if( db-
174c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
174d0 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
174e0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20 45  _out;.  }.  /* E
174f0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38  VIDENCE-OF: R-08
17500 33 30 38 2d 31 37 32 32 34 20 54 68 65 20 64 65  308-17224 The de
17510 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
17520 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c  function for all
17530 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 69 73  .  ** strings is
17540 20 42 49 4e 41 52 59 2e 20 0a 20 20 2a 2f 0a 20   BINARY. .  */. 
17550 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d   db->pDfltColl =
17560 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
17570 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55  Seq(db, SQLITE_U
17580 54 46 38 2c 20 73 71 6c 69 74 65 33 53 74 72 42  TF8, sqlite3StrB
17590 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 61 73 73  INARY, 0);.  ass
175a0 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ert( db->pDfltCo
175b0 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 50  ll!=0 );..  /* P
175c0 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d  arse the filenam
175d0 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 2e 20  e/URI argument. 
175e0 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61  */.  db->openFla
175f0 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63  gs = flags;.  rc
17600 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55   = sqlite3ParseU
17610 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61  ri(zVfs, zFilena
17620 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d  me, &flags, &db-
17630 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26  >pVfs, &zOpen, &
17640 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
17650 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17660 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
17670 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 73 71 6c 69  ITE_NOMEM ) sqli
17680 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
17690 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
176a0 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c  rWithMsg(db, rc,
176b0 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20   zErrMsg ? "%s" 
176c0 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  : 0, zErrMsg);. 
176d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
176e0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f  zErrMsg);.    go
176f0 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
17700 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
17710 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61  e backend databa
17720 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72  se driver */.  r
17730 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
17740 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a  Open(db->pVfs, z
17750 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61  Open, db, &db->a
17760 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20  Db[0].pBt, 0,.  
17770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17780 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51        flags | SQ
17790 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
177a0 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  B);.  if( rc!=SQ
177b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
177c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
177d0 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ERR_NOMEM ){.   
177e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
177f0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
17800 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
17810 72 28 64 62 2c 20 72 63 29 3b 0a 20 20 20 20 67  r(db, rc);.    g
17820 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
17830 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
17840 65 65 45 6e 74 65 72 28 64 62 2d 3e 61 44 62 5b  eeEnter(db->aDb[
17850 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61  0].pBt);.  db->a
17860 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20  Db[0].pSchema = 
17870 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74  sqlite3SchemaGet
17880 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  (db, db->aDb[0].
17890 70 42 74 29 3b 0a 20 20 69 66 28 20 21 64 62 2d  pBt);.  if( !db-
178a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
178b0 45 4e 43 28 64 62 29 20 3d 20 53 43 48 45 4d 41  ENC(db) = SCHEMA
178c0 5f 45 4e 43 28 64 62 29 3b 0a 20 20 73 71 6c 69  _ENC(db);.  sqli
178d0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 64 62  te3BtreeLeave(db
178e0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
178f0 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
17900 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68  ema = sqlite3Sch
17910 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a  emaGet(db, 0);..
17920 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74    /* The default
17930 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f   safety_level fo
17940 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
17950 61 73 65 20 69 73 20 27 66 75 6c 6c 27 3b 20 66  ase is 'full'; f
17960 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a  or the temp.  **
17970 20 64 61 74 61 62 61 73 65 20 69 74 20 69 73 20   database it is 
17980 27 4e 4f 4e 45 27 2e 20 54 68 69 73 20 6d 61 74  'NONE'. This mat
17990 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20 6c  ches the pager l
179a0 61 79 65 72 20 64 65 66 61 75 6c 74 73 2e 20 20  ayer defaults.  
179b0 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b  .  */.  db->aDb[
179c0 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61 69 6e  0].zName = "main
179d0 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  ";.  db->aDb[0].
179e0 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 33  safety_level = 3
179f0 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a  ;.  db->aDb[1].z
17a00 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20  Name = "temp";. 
17a10 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65   db->aDb[1].safe
17a20 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a 0a 20  ty_level = 1;.. 
17a30 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
17a40 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a  ITE_MAGIC_OPEN;.
17a50 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
17a60 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
17a70 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
17a80 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65   }..  /* Registe
17a90 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66  r all built-in f
17aa0 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f  unctions, but do
17ab0 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
17ac0 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20 64 61  read the.  ** da
17ad0 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 79 65  tabase schema ye
17ae0 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c 61 79  t. This is delay
17af0 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  ed until the fir
17b00 73 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61  st time the data
17b10 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61 63 63  base.  ** is acc
17b20 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71  essed..  */.  sq
17b30 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
17b40 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c  QLITE_OK);.  sql
17b50 69 74 65 33 52 65 67 69 73 74 65 72 42 75 69 6c  ite3RegisterBuil
17b60 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29  tinFunctions(db)
17b70 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74  ;..  /* Load aut
17b80 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e  omatic extension
17b90 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74  s - extensions t
17ba0 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 72 65  hat have been re
17bb0 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73  gistered.  ** us
17bc0 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
17bd0 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73  automatic_extens
17be0 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a  ion() API..  */.
17bf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
17c00 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66  rrcode(db);.  if
17c10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17c20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75  ){.    sqlite3Au
17c30 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73  toLoadExtensions
17c40 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  (db);.    rc = s
17c50 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
17c60 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  b);.    if( rc!=
17c70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17c80 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
17c90 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  ut;.    }.  }..#
17ca0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
17cb0 42 4c 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21  BLE_FTS1.  if( !
17cc0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
17cd0 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69   ){.    extern i
17ce0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e  nt sqlite3Fts1In
17cf0 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  it(sqlite3*);.  
17d00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
17d10 73 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s1Init(db);.  }.
17d20 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
17d30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
17d40 32 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  2.  if( !db->mal
17d50 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
17d60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17d70 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
17d80 69 74 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c  ite3Fts2Init(sql
17d90 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d  ite3*);.    rc =
17da0 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74   sqlite3Fts2Init
17db0 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
17dc0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
17dd0 45 4e 41 42 4c 45 5f 46 54 53 33 20 2f 2a 20 61  ENABLE_FTS3 /* a
17de0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 66  utomatically def
17df0 69 6e 65 64 20 62 79 20 53 51 4c 49 54 45 5f 45  ined by SQLITE_E
17e00 4e 41 42 4c 45 5f 46 54 53 34 20 2a 2f 0a 20 20  NABLE_FTS4 */.  
17e10 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
17e20 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
17e30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
17e40 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e   = sqlite3Fts3In
17e50 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
17e60 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
17e70 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 20 20  E_ENABLE_FTS5.  
17e80 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
17e90 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
17ea0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
17eb0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e   = sqlite3Fts5In
17ec0 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
17ed0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
17ee0 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69  E_ENABLE_ICU.  i
17ef0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
17f00 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
17f10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
17f20 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74  = sqlite3IcuInit
17f30 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
17f40 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
17f50 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20 69  ENABLE_RTREE.  i
17f60 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
17f70 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  iled && rc==SQLI
17f80 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d  TE_OK){.    rc =
17f90 20 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69   sqlite3RtreeIni
17fa0 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
17fb0 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
17fc0 5f 45 4e 41 42 4c 45 5f 44 42 53 54 41 54 5f 56  _ENABLE_DBSTAT_V
17fd0 54 41 42 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  TAB.  if( !db->m
17fe0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
17ff0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20  c==SQLITE_OK){. 
18000 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 44     rc = sqlite3D
18010 62 73 74 61 74 52 65 67 69 73 74 65 72 28 64 62  bstatRegister(db
18020 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
18030 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
18040 42 4c 45 5f 4a 53 4f 4e 31 0a 20 20 69 66 28 20  BLE_JSON1.  if( 
18050 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
18060 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
18070 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  OK){.    rc = sq
18080 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28 64  lite3Json1Init(d
18090 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
180a0 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45    /* -DSQLITE_DE
180b0 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
180c0 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55  DE=1 makes EXCLU
180d0 53 49 56 45 20 74 68 65 20 64 65 66 61 75 6c 74  SIVE the default
180e0 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f   locking.  ** mo
180f0 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45  de.  -DSQLITE_DE
18100 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
18110 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c  DE=0 make NORMAL
18120 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   the default loc
18130 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20  king.  ** mode. 
18140 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61   Doing nothing a
18150 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73  t all also makes
18160 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61   NORMAL the defa
18170 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ult..  */.#ifdef
18180 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
18190 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64  LOCKING_MODE.  d
181a0 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20  b->dfltLockMode 
181b0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
181c0 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20  _LOCKING_MODE;. 
181d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
181e0 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33  kingMode(sqlite3
181f0 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61  BtreePager(db->a
18200 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20  Db[0].pBt),.    
18210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18220 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46        SQLITE_DEF
18230 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
18240 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  E);.#endif..  if
18250 28 20 72 63 20 29 20 73 71 6c 69 74 65 33 45 72  ( rc ) sqlite3Er
18260 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20  ror(db, rc);..  
18270 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f  /* Enable the lo
18280 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73  okaside-malloc s
18290 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65  ubsystem */.  se
182a0 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c  tupLookaside(db,
182b0 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   0, sqlite3Globa
182c0 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73  lConfig.szLookas
182d0 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
182e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
182f0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
18300 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20  .nLookaside);.. 
18310 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
18320 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  ocheckpoint(db, 
18330 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
18340 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e  AL_AUTOCHECKPOIN
18350 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a  T);..opendb_out:
18360 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20  .  if( db ){.   
18370 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74   assert( db->mut
18380 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61  ex!=0 || isThrea
18390 64 73 61 66 65 3d 3d 30 0a 20 20 20 20 20 20 20  dsafe==0.       
183a0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c      || sqlite3Gl
183b0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
183c0 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Mutex==0 );.    
183d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
183e0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
183f0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
18400 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
18410 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
18420 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
18430 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  MEM );.  if( rc=
18440 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
18450 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
18460 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d  se(db);.    db =
18470 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
18480 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18490 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
184a0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49   SQLITE_MAGIC_SI
184b0 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20  CK;.  }.  *ppDb 
184c0 3d 20 64 62 3b 0a 23 69 66 64 65 66 20 53 51 4c  = db;.#ifdef SQL
184d0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
184e0 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  G.  if( sqlite3G
184f0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
18500 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  log ){.    /* Op
18510 65 6e 69 6e 67 20 61 20 64 62 20 68 61 6e 64 6c  ening a db handl
18520 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65  e. Fourth parame
18530 74 65 72 20 69 73 20 70 61 73 73 65 64 20 30 2e  ter is passed 0.
18540 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 41   */.    void *pA
18550 72 67 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  rg = sqlite3Glob
18560 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
18570 41 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Arg;.    sqlite3
18580 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
18590 6c 6c 6f 67 28 70 41 72 67 2c 20 64 62 2c 20 7a  llog(pArg, db, z
185a0 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  Filename, 0);.  
185b0 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
185c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f  ined(SQLITE_HAS_
185d0 43 4f 44 45 43 29 0a 20 20 69 66 28 20 72 63 3d  CODEC).  if( rc=
185e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
185f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 48    const char *zH
18600 65 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f  exKey = sqlite3_
18610 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 4f  uri_parameter(zO
18620 70 65 6e 2c 20 22 68 65 78 6b 65 79 22 29 3b 0a  pen, "hexkey");.
18630 20 20 20 20 69 66 28 20 7a 48 65 78 4b 65 79 20      if( zHexKey 
18640 26 26 20 7a 48 65 78 4b 65 79 5b 30 5d 20 29 7b  && zHexKey[0] ){
18650 0a 20 20 20 20 20 20 75 38 20 69 42 79 74 65 3b  .      u8 iByte;
18660 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
18670 20 20 20 20 63 68 61 72 20 7a 4b 65 79 5b 34 30      char zKey[40
18680 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ];.      for(i=0
18690 2c 20 69 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a  , iByte=0; i<siz
186a0 65 6f 66 28 7a 4b 65 79 29 2a 32 20 26 26 20 73  eof(zKey)*2 && s
186b0 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a  qlite3Isxdigit(z
186c0 48 65 78 4b 65 79 5b 69 5d 29 3b 20 69 2b 2b 29  HexKey[i]); i++)
186d0 7b 0a 20 20 20 20 20 20 20 20 69 42 79 74 65 20  {.        iByte 
186e0 3d 20 28 69 42 79 74 65 3c 3c 34 29 20 2b 20 73  = (iByte<<4) + s
186f0 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a  qlite3HexToInt(z
18700 48 65 78 4b 65 79 5b 69 5d 29 3b 0a 20 20 20 20  HexKey[i]);.    
18710 20 20 20 20 69 66 28 20 28 69 26 31 29 21 3d 30      if( (i&1)!=0
18720 20 29 20 7a 4b 65 79 5b 69 2f 32 5d 20 3d 20 69   ) zKey[i/2] = i
18730 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Byte;.      }.  
18740 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f      sqlite3_key_
18750 76 32 28 64 62 2c 20 30 2c 20 7a 4b 65 79 2c 20  v2(db, 0, zKey, 
18760 69 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  i/2);.    }.  }.
18770 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
18780 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b 0a 20 20  _free(zOpen);.  
18790 72 65 74 75 72 6e 20 72 63 20 26 20 30 78 66 66  return rc & 0xff
187a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
187b0 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68  a new database h
187c0 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  andle..*/.int sq
187d0 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f  lite3_open(.  co
187e0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
187f0 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20  ame, .  sqlite3 
18800 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72 65 74  **ppDb .){.  ret
18810 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65  urn openDatabase
18820 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62  (zFilename, ppDb
18830 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18840 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
18850 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
18860 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
18870 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71  TE, 0);.}.int sq
18880 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20  lite3_open_v2(. 
18890 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
188a0 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61  ename,   /* Data
188b0 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 28 55  base filename (U
188c0 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74  TF-8) */.  sqlit
188d0 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20  e3 **ppDb,      
188e0 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74     /* OUT: SQLit
188f0 65 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  e db handle */. 
18900 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
18910 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
18920 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
18930 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20 20 2f  r *zVfs        /
18940 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f  * Name of VFS mo
18950 64 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29  dule to use */.)
18960 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44  {.  return openD
18970 61 74 61 62 61 73 65 28 66 69 6c 65 6e 61 6d 65  atabase(filename
18980 2c 20 70 70 44 62 2c 20 28 75 6e 73 69 67 6e 65  , ppDb, (unsigne
18990 64 20 69 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66  d int)flags, zVf
189a0 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  s);.}..#ifndef S
189b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
189c0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  ./*.** Open a ne
189d0 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  w database handl
189e0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
189f0 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73  3_open16(.  cons
18a00 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d  t void *zFilenam
18a10 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a  e, .  sqlite3 **
18a20 70 70 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63  ppDb.){.  char c
18a30 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38  onst *zFilename8
18a40 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65  ;   /* zFilename
18a50 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d   encoded in UTF-
18a60 38 20 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46  8 instead of UTF
18a70 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -16 */.  sqlite3
18a80 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20  _value *pVal;.  
18a90 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20  int rc;..#ifdef 
18aa0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
18ab0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70  I_ARMOR.  if( pp
18ac0 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  Db==0 ) return S
18ad0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
18ae0 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44  T;.#endif.  *ppD
18af0 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  b = 0;.#ifndef S
18b00 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
18b10 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  NIT.  rc = sqlit
18b20 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
18b30 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
18b40 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20  rn rc;.#endif.  
18b50 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
18b60 20 29 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 22   ) zFilename = "
18b70 5c 30 30 30 5c 30 30 30 22 3b 0a 20 20 70 56 61  \000\000";.  pVa
18b80 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
18b90 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65  New(0);.  sqlite
18ba0 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
18bb0 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65  l, -1, zFilename
18bc0 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
18bd0 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41  TIVE, SQLITE_STA
18be0 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d  TIC);.  zFilenam
18bf0 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  e8 = sqlite3Valu
18c00 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49  eText(pVal, SQLI
18c10 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20  TE_UTF8);.  if( 
18c20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20  zFilename8 ){.  
18c30 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62    rc = openDatab
18c40 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20  ase(zFilename8, 
18c50 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ppDb,.          
18c60 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
18c70 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
18c80 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
18c90 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20  CREATE, 0);.    
18ca0 61 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c  assert( *ppDb ||
18cb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
18cc0 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  M );.    if( rc=
18cd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44  =SQLITE_OK && !D
18ce0 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70  bHasProperty(*pp
18cf0 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61  Db, 0, DB_Schema
18d00 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20  Loaded) ){.     
18d10 20 53 43 48 45 4d 41 5f 45 4e 43 28 2a 70 70 44   SCHEMA_ENC(*ppD
18d20 62 29 20 3d 20 45 4e 43 28 2a 70 70 44 62 29 20  b) = ENC(*ppDb) 
18d30 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
18d40 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  TIVE;.    }.  }e
18d50 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
18d60 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
18d70 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61  .  }.  sqlite3Va
18d80 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a  lueFree(pVal);..
18d90 20 20 72 65 74 75 72 6e 20 72 63 20 26 20 30 78    return rc & 0x
18da0 66 66 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ff;.}.#endif /* 
18db0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
18dc0 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  6 */../*.** Regi
18dd0 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
18de0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
18df0 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
18e00 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
18e10 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
18e20 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71  _collation(.  sq
18e30 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f  lite3* db, .  co
18e40 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
18e50 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20   .  int enc, .  
18e60 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
18e70 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
18e80 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
18e90 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
18ea0 64 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  d*).){.  return 
18eb0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
18ec0 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20  ollation_v2(db, 
18ed0 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20 70 43 74 78  zName, enc, pCtx
18ee0 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a  , xCompare, 0);.
18ef0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
18f00 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f  r a new collatio
18f10 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  n sequence with 
18f20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
18f30 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  dle db..*/.int s
18f40 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
18f50 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71  llation_v2(.  sq
18f60 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f  lite3* db, .  co
18f70 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
18f80 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20   .  int enc, .  
18f90 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
18fa0 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
18fb0 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
18fc0 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
18fd0 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65  d*),.  void(*xDe
18fe0 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  l)(void*).){.  i
18ff0 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53  nt rc;..#ifdef S
19000 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
19010 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
19020 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
19030 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d  Ok(db) || zName=
19040 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
19050 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
19060 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
19070 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
19080 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
19090 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
190a0 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63  iled );.  rc = c
190b0 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
190c0 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e  b, zName, (u8)en
190d0 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  c, pCtx, xCompar
190e0 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63 20 3d  e, xDel);.  rc =
190f0 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
19100 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
19110 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
19120 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
19130 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
19140 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
19150 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  TF16./*.** Regis
19160 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
19170 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
19180 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
19190 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
191a0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
191b0 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73  collation16(.  s
191c0 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
191d0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65  onst void *zName
191e0 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20  ,.  int enc, .  
191f0 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
19200 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
19210 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
19220 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
19230 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  d*).){.  int rc 
19240 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
19250 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 0a 23 69  har *zName8;..#i
19260 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
19270 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
19280 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
19290 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20  yCheckOk(db) || 
192a0 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
192b0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
192c0 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
192d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
192e0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
192f0 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
19300 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
19310 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33  zName8 = sqlite3
19320 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e 61  Utf16to8(db, zNa
19330 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
19340 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 69  TF16NATIVE);.  i
19350 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20  f( zName8 ){.   
19360 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c   rc = createColl
19370 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38  ation(db, zName8
19380 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c  , (u8)enc, pCtx,
19390 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20   xCompare, 0);. 
193a0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
193b0 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20 20  (db, zName8);.  
193c0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
193d0 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
193e0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
193f0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
19400 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19410 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
19420 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
19430 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
19440 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71   a collation seq
19450 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61  uence factory ca
19460 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20  llback with the 
19470 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
19480 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61  ** db. Replace a
19490 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e  ny previously in
194a0 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f  stalled collatio
194b0 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
194c0 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
194d0 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  e3_collation_nee
194e0 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ded(.  sqlite3 *
194f0 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f  db, .  void *pCo
19500 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20  llNeededArg, .  
19510 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65  void(*xCollNeede
19520 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33  d)(void*,sqlite3
19530 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63  *,int eTextRep,c
19540 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 23  onst char*).){.#
19550 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
19560 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
19570 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
19580 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
19590 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
195a0 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
195b0 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
195c0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
195d0 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  x);.  db->xCollN
195e0 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65  eeded = xCollNee
195f0 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  ded;.  db->xColl
19600 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20  Needed16 = 0;.  
19610 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41  db->pCollNeededA
19620 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64  rg = pCollNeeded
19630 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
19640 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
19650 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
19660 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
19670 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19680 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65  T_UTF16./*.** Re
19690 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69  gister a collati
196a0 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
196b0 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  ory callback wit
196c0 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
196d0 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70  andle.** db. Rep
196e0 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75  lace any previou
196f0 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f  sly installed co
19700 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
19710 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74   factory..*/.int
19720 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
19730 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20 73  on_needed16(.  s
19740 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76  qlite3 *db, .  v
19750 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64  oid *pCollNeeded
19760 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43  Arg, .  void(*xC
19770 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69  ollNeeded16)(voi
19780 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20  d*,sqlite3*,int 
19790 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76  eTextRep,const v
197a0 6f 69 64 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20  oid*).){.#ifdef 
197b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
197c0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
197d0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
197e0 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
197f0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
19800 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
19810 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
19820 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
19830 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20  db->xCollNeeded 
19840 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  = 0;.  db->xColl
19850 4e 65 65 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c  Needed16 = xColl
19860 4e 65 65 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e  Needed16;.  db->
19870 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d  pCollNeededArg =
19880 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b   pCollNeededArg;
19890 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
198a0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
198b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
198c0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
198d0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
198e0 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TF16 */..#ifndef
198f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
19900 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68  RECATED./*.** Th
19910 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
19920 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73  ow an anachronis
19930 6d 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65  m. It used to be
19940 20 75 73 65 64 20 74 6f 20 72 65 63 6f 76 65 72   used to recover
19950 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f   from a.** mallo
19960 63 28 29 20 66 61 69 6c 75 72 65 2c 20 62 75 74  c() failure, but
19970 20 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73   SQLite now does
19980 20 74 68 69 73 20 61 75 74 6f 6d 61 74 69 63 61   this automatica
19990 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  lly..*/.int sqli
199a0 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76  te3_global_recov
199b0 65 72 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  er(void){.  retu
199c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
199d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65  #endif../*.** Te
199e0 73 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65  st to see whethe
199f0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 64 61 74  r or not the dat
19a00 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
19a10 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69   is in autocommi
19a20 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75  t.** mode.  Retu
19a30 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
19a40 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f   and FALSE if no
19a50 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d  t.  Autocommit m
19a60 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20  ode is on.** by 
19a70 64 65 66 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f  default.  Autoco
19a80 6d 6d 69 74 20 69 73 20 64 69 73 61 62 6c 65 64  mmit is disabled
19a90 20 62 79 20 61 20 42 45 47 49 4e 20 73 74 61 74   by a BEGIN stat
19aa0 65 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e 61 62  ement and reenab
19ab0 6c 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65  led.** by the ne
19ac0 78 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c  xt COMMIT or ROL
19ad0 4c 42 41 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  LBACK..*/.int sq
19ae0 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f  lite3_get_autoco
19af0 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  mmit(sqlite3 *db
19b00 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
19b10 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
19b20 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
19b30 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
19b40 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
19b50 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
19b60 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
19b70 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
19b80 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  turn db->autoCom
19b90 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  mit;.}../*.** Th
19ba0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
19bb0 69 6e 65 73 20 61 72 65 20 73 75 62 73 74 69 74  ines are substit
19bc0 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74 61 6e  utes for constan
19bd0 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ts SQLITE_CORRUP
19be0 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53  T,.** SQLITE_MIS
19bf0 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  USE, SQLITE_CANT
19c00 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 49 4f 45  OPEN, SQLITE_IOE
19c10 52 52 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  RR and possibly 
19c20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63  other error.** c
19c30 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 79 20  onstants.  They 
19c40 73 65 72 76 65 20 74 77 6f 20 70 75 72 70 6f 73  serve two purpos
19c50 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20  es:.**.**   1.  
19c60 53 65 72 76 65 20 61 73 20 61 20 63 6f 6e 76 65  Serve as a conve
19c70 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73  nient place to s
19c80 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20  et a breakpoint 
19c90 69 6e 20 61 20 64 65 62 75 67 67 65 72 0a 2a 2a  in a debugger.**
19ca0 20 20 20 20 20 20 20 74 6f 20 64 65 74 65 63 74         to detect
19cb0 20 77 68 65 6e 20 76 65 72 73 69 6f 6e 20 65 72   when version er
19cc0 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f  ror conditions o
19cd0 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 32  ccurs..**.**   2
19ce0 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65  .  Invoke sqlite
19cf0 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f 76 69  3_log() to provi
19d00 64 65 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f  de the source co
19d10 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68 65 72  de location wher
19d20 65 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c 6f 77  e.**       a low
19d30 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 69 73 20  -level error is 
19d40 66 69 72 73 74 20 64 65 74 65 63 74 65 64 2e 0a  first detected..
19d50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  */.int sqlite3Co
19d60 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74 20 6c  rruptError(int l
19d70 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61  ineno){.  testca
19d80 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  se( sqlite3Globa
19d90 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20  lConfig.xLog!=0 
19da0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  );.  sqlite3_log
19db0 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c  (SQLITE_CORRUPT,
19dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
19dd0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
19de0 69 6f 6e 20 61 74 20 6c 69 6e 65 20 25 64 20 6f  ion at line %d o
19df0 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20  f [%.10s]",.    
19e00 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f            lineno
19e10 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75  , 20+sqlite3_sou
19e20 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75  rceid());.  retu
19e30 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
19e40 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  T;.}.int sqlite3
19e50 4d 69 73 75 73 65 45 72 72 6f 72 28 69 6e 74 20  MisuseError(int 
19e60 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63  lineno){.  testc
19e70 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ase( sqlite3Glob
19e80 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30  alConfig.xLog!=0
19e90 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f   );.  sqlite3_lo
19ea0 67 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c  g(SQLITE_MISUSE,
19eb0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
19ec0 22 6d 69 73 75 73 65 20 61 74 20 6c 69 6e 65 20  "misuse at line 
19ed0 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a  %d of [%.10s]",.
19ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69                li
19ef0 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33  neno, 20+sqlite3
19f00 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20  _sourceid());.  
19f10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
19f20 53 55 53 45 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  SUSE;.}.int sqli
19f30 74 65 33 43 61 6e 74 6f 70 65 6e 45 72 72 6f 72  te3CantopenError
19f40 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20  (int lineno){.  
19f50 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
19f60 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
19f70 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  og!=0 );.  sqlit
19f80 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 41  e3_log(SQLITE_CA
19f90 4e 54 4f 50 45 4e 2c 20 0a 20 20 20 20 20 20 20  NTOPEN, .       
19fa0 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 6f         "cannot o
19fb0 70 65 6e 20 66 69 6c 65 20 61 74 20 6c 69 6e 65  pen file at line
19fc0 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c   %d of [%.10s]",
19fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
19fe0 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65  ineno, 20+sqlite
19ff0 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20  3_sourceid());. 
1a000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1a010 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 69 6e 74 20 73  ANTOPEN;.}.int s
1a020 71 6c 69 74 65 33 4e 6f 6d 65 6d 45 72 72 6f 72  qlite3NomemError
1a030 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20  (int lineno){.  
1a040 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
1a050 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
1a060 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  og!=0 );.  sqlit
1a070 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
1a080 4d 45 4d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  MEM, .          
1a090 20 20 20 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f      "out of memo
1a0a0 72 79 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66  ry at line %d of
1a0b0 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20   [%.10s]",.     
1a0c0 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c           lineno,
1a0d0 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72   20+sqlite3_sour
1a0e0 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72  ceid());.  retur
1a0f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1a100 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6f 65  }.int sqlite3Ioe
1a110 72 72 6e 6f 6d 65 6d 45 72 72 6f 72 28 69 6e 74  rrnomemError(int
1a120 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
1a130 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
1a140 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
1a150 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  0 );.  sqlite3_l
1a160 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  og(SQLITE_IOERR_
1a170 4e 4f 4d 45 4d 2c 20 0a 20 20 20 20 20 20 20 20  NOMEM, .        
1a180 20 20 20 20 20 20 22 6f 75 74 20 6f 66 20 6d 65        "out of me
1a190 6d 6f 72 79 20 66 6f 72 20 49 2f 4f 20 61 74 20  mory for I/O at 
1a1a0 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
1a1b0 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
1a1c0 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
1a1d0 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
1a1e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1a1f0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1a200 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1a210 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
1a220 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  D./*.** This is 
1a230 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f  a convenience ro
1a240 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73  utine that makes
1a250 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74   sure that all t
1a260 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a  hread-specific.*
1a270 2a 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20  * data for this 
1a280 74 68 72 65 61 64 20 68 61 73 20 62 65 65 6e 20  thread has been 
1a290 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  deallocated..**.
1a2a0 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e  ** SQLite no lon
1a2b0 67 65 72 20 75 73 65 73 20 74 68 72 65 61 64 2d  ger uses thread-
1a2c0 73 70 65 63 69 66 69 63 20 64 61 74 61 20 73 6f  specific data so
1a2d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1a2e0 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e   now a.** no-op.
1a2f0 20 20 49 74 20 69 73 20 72 65 74 61 69 6e 65 64    It is retained
1a300 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20   for historical 
1a310 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a  compatibility..*
1a320 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74  /.void sqlite3_t
1a330 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f  hread_cleanup(vo
1a340 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  id){.}.#endif../
1a350 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61  *.** Return meta
1a360 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
1a370 75 74 20 61 20 73 70 65 63 69 66 69 63 20 63 6f  ut a specific co
1a380 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61  lumn of a databa
1a390 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65  se table..** See
1a3a0 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69   comment in sqli
1a3b0 74 65 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e  te3.h (sqlite.h.
1a3c0 69 6e 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  in) for details.
1a3d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1a3e0 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
1a3f0 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33  adata(.  sqlite3
1a400 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
1a410 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1a420 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  on handle */.  c
1a430 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1a440 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61  me,        /* Da
1a450 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e  tabase name or N
1a460 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
1a470 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c  har *zTableName,
1a480 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61       /* Table na
1a490 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  me */.  const ch
1a4a0 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  ar *zColumnName,
1a4b0 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
1a4c0 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  me */.  char con
1a4d0 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c  st **pzDataType,
1a4e0 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44      /* OUTPUT: D
1a4f0 65 63 6c 61 72 65 64 20 64 61 74 61 20 74 79 70  eclared data typ
1a500 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73  e */.  char cons
1a510 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20  t **pzCollSeq,  
1a520 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f     /* OUTPUT: Co
1a530 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1a540 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   name */.  int *
1a550 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20  pNotNull,       
1a560 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
1a570 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55  : True if NOT NU
1a580 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  LL constraint ex
1a590 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ists */.  int *p
1a5a0 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20 20 20  PrimaryKey,     
1a5b0 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a        /* OUTPUT:
1a5c0 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20   True if column 
1a5d0 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20  part of PK */.  
1a5e0 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20 20 20  int *pAutoinc   
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1a600 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63  UTPUT: True if c
1a610 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e  olumn is auto-in
1a620 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  crement */.){.  
1a630 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
1a640 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54  zErrMsg = 0;.  T
1a650 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a  able *pTab = 0;.
1a660 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
1a670 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d   0;.  int iCol =
1a680 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
1a690 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b   *zDataType = 0;
1a6a0 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
1a6b0 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69  CollSeq = 0;.  i
1a6c0 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a  nt notnull = 0;.
1a6d0 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79    int primarykey
1a6e0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f   = 0;.  int auto
1a6f0 69 6e 63 20 3d 20 30 3b 0a 0a 0a 23 69 66 64 65  inc = 0;...#ifde
1a700 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1a710 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1a720 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1a730 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 54 61  eckOk(db) || zTa
1a740 62 6c 65 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  bleName==0 ){.  
1a750 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a760 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
1a770 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e  .#endif..  /* En
1a780 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
1a790 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65 65  e schema has bee
1a7a0 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71  n loaded */.  sq
1a7b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1a7c0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
1a7d0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1a7e0 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d  rAll(db);.  rc =
1a7f0 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c   sqlite3Init(db,
1a800 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66   &zErrMsg);.  if
1a810 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
1a820 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  ){.    goto erro
1a830 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r_out;.  }..  /*
1a840 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
1a850 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f  e in question */
1a860 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
1a870 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
1a880 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61  TableName, zDbNa
1a890 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62  me);.  if( !pTab
1a8a0 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
1a8b0 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20  t ){.    pTab = 
1a8c0 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  0;.    goto erro
1a8d0 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r_out;.  }..  /*
1a8e0 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e   Find the column
1a8f0 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20   for which info 
1a900 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  is requested */.
1a910 20 20 69 66 28 20 7a 43 6f 6c 75 6d 6e 4e 61 6d    if( zColumnNam
1a920 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 51  e==0 ){.    /* Q
1a930 75 65 72 79 20 66 6f 72 20 65 78 69 73 74 61 6e  uery for existan
1a940 63 65 20 6f 66 20 74 61 62 6c 65 20 6f 6e 6c 79  ce of table only
1a950 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
1a960 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
1a970 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
1a980 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f  ol++){.      pCo
1a990 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
1a9a0 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28  iCol];.      if(
1a9b0 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
1a9c0 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  mp(pCol->zName, 
1a9d0 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a  zColumnName) ){.
1a9e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1a9f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1aa00 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d   if( iCol==pTab-
1aa10 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69  >nCol ){.      i
1aa20 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  f( HasRowid(pTab
1aa30 29 20 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f  ) && sqlite3IsRo
1aa40 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29  wid(zColumnName)
1aa50 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c   ){.        iCol
1aa60 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
1aa70 20 20 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 69          pCol = i
1aa80 43 6f 6c 3e 3d 30 20 3f 20 26 70 54 61 62 2d 3e  Col>=0 ? &pTab->
1aa90 61 43 6f 6c 5b 69 43 6f 6c 5d 20 3a 20 30 3b 0a  aCol[iCol] : 0;.
1aaa0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1aab0 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20       pTab = 0;. 
1aac0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f         goto erro
1aad0 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  r_out;.      }. 
1aae0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
1aaf0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
1ab00 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20 6d 65  ck stores the me
1ab10 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ta information t
1ab20 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
1ab30 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65  rned.  ** to the
1ab40 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c   caller in local
1ab50 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61 74 61   variables zData
1ab60 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20  Type, zCollSeq, 
1ab70 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79  notnull, primary
1ab80 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74  key.  ** and aut
1ab90 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20 70 6f  oinc. At this po
1aba0 69 6e 74 20 74 68 65 72 65 20 61 72 65 20 74 77  int there are tw
1abb0 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 3a  o possibilities:
1abc0 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20  .  ** .  **     
1abd0 31 2e 20 54 68 65 20 73 70 65 63 69 66 69 65 64  1. The specified
1abe0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73   column name was
1abf0 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22 20 6f   rowid", "oid" o
1ac00 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a  r "_rowid_" .  *
1ac10 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65  *        and the
1ac20 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69 63 69  re is no explici
1ac30 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49 50 4b  tly declared IPK
1ac40 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20   column. .  **. 
1ac50 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65 20 74   **     2. The t
1ac60 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69  able is not a vi
1ac70 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d  ew and the colum
1ac80 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66 69 65  n name identifie
1ac90 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20  d an .  **      
1aca0 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63    explicitly dec
1acb0 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f  lared column. Co
1acc0 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  py meta informat
1acd0 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a  ion from *pCol..
1ace0 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c    */ .  if( pCol
1acf0 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70   ){.    zDataTyp
1ad00 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b  e = pCol->zType;
1ad10 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20  .    zCollSeq = 
1ad20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20  pCol->zColl;.   
1ad30 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d   notnull = pCol-
1ad40 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20  >notNull!=0;.   
1ad50 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d 20 28   primarykey  = (
1ad60 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26  pCol->colFlags &
1ad70 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
1ad80 29 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e  )!=0;.    autoin
1ad90 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d  c = pTab->iPKey=
1ada0 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e  =iCol && (pTab->
1adb0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
1adc0 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b  toincrement)!=0;
1add0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44  .  }else{.    zD
1ade0 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47  ataType = "INTEG
1adf0 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79  ER";.    primary
1ae00 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  key = 1;.  }.  i
1ae10 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a  f( !zCollSeq ){.
1ae20 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 73      zCollSeq = s
1ae30 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
1ae40 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a  .  }..error_out:
1ae50 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1ae60 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20  eaveAll(db);..  
1ae70 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65 20 66  /* Whether the f
1ae80 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63  unction call suc
1ae90 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65 64  ceeded or failed
1aea0 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74  , set the output
1aeb0 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a   parameters.  **
1aec0 20 74 6f 20 77 68 61 74 65 76 65 72 20 74 68 65   to whatever the
1aed0 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72  ir local counter
1aee0 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49  parts contain. I
1aef0 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6f  f an error did o
1af00 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20  ccur,.  ** this 
1af10 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
1af20 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75  f zeroing all ou
1af30 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 2e  tput parameters.
1af40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61  .  */.  if( pzDa
1af50 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74 61  taType ) *pzData
1af60 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70 65  Type = zDataType
1af70 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65  ;.  if( pzCollSe
1af80 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d  q ) *pzCollSeq =
1af90 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28   zCollSeq;.  if(
1afa0 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f   pNotNull ) *pNo
1afb0 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b  tNull = notnull;
1afc0 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72 79 4b  .  if( pPrimaryK
1afd0 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b 65  ey ) *pPrimaryKe
1afe0 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a  y = primarykey;.
1aff0 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20 29    if( pAutoinc )
1b000 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75 74   *pAutoinc = aut
1b010 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c  oinc;..  if( SQL
1b020 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70  ITE_OK==rc && !p
1b030 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
1b040 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
1b050 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d  rMsg);.    zErrM
1b060 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
1b070 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75 63 68  ntf(db, "no such
1b080 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25   table column: %
1b090 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d  s.%s", zTableNam
1b0a0 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75  e,.        zColu
1b0b0 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20  mnName);.    rc 
1b0c0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
1b0d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
1b0e0 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63  orWithMsg(db, rc
1b0f0 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a  , (zErrMsg?"%s":
1b100 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0), zErrMsg);.  
1b110 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1b120 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 63  , zErrMsg);.  rc
1b130 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
1b140 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
1b150 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1b160 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
1b170 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b180 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c  ** Sleep for a l
1b190 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65  ittle while.  Re
1b1a0 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  turn the amount 
1b1b0 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a  of time slept..*
1b1c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c  /.int sqlite3_sl
1b1d0 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73  eep(int ms){.  s
1b1e0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1b1f0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 56  ;.  int rc;.  pV
1b200 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
1b210 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20  _find(0);.  if( 
1b220 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72 6e  pVfs==0 ) return
1b230 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   0;..  /* This f
1b240 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e  unction works in
1b250 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62   milliseconds, b
1b260 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ut the underlyin
1b270 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20 20 2a  g OsSleep() .  *
1b280 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63 72 6f  * API uses micro
1b290 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74  seconds. Hence t
1b2a0 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a  he 1000's..  */.
1b2b0 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4f    rc = (sqlite3O
1b2c0 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31 30 30  sSleep(pVfs, 100
1b2d0 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20 72  0*ms)/1000);.  r
1b2e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b2f0 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  ** Enable or dis
1b300 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64 65  able the extende
1b310 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a  d result codes..
1b320 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  */.int sqlite3_e
1b330 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
1b340 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  odes(sqlite3 *db
1b350 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 23 69  , int onoff){.#i
1b360 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1b370 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1b380 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1b390 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
1b3a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
1b3b0 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
1b3c0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b3d0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
1b3e0 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b  );.  db->errMask
1b3f0 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66   = onoff ? 0xfff
1b400 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20  fffff : 0xff;.  
1b410 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1b420 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
1b430 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b440 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76  OK;.}../*.** Inv
1b450 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e  oke the xFileCon
1b460 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61  trol method on a
1b470 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
1b480 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
1b490 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
1b4a0 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  l(sqlite3 *db, c
1b4b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1b4c0 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64  me, int op, void
1b4d0 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72   *pArg){.  int r
1b4e0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1b4f0 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  ;.  Btree *pBtre
1b500 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e;..#ifdef SQLIT
1b510 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1b520 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1b530 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1b540 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
1b550 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1b560 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1b570 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1b580 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74 72 65  >mutex);.  pBtre
1b590 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d  e = sqlite3DbNam
1b5a0 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62  eToBtree(db, zDb
1b5b0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 42 74  Name);.  if( pBt
1b5c0 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ree ){.    Pager
1b5d0 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 73 71   *pPager;.    sq
1b5e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a  lite3_file *fd;.
1b5f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b600 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
1b610 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69     pPager = sqli
1b620 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
1b630 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72  tree);.    asser
1b640 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
1b650 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74 65 33      fd = sqlite3
1b660 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65 72  PagerFile(pPager
1b670 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 66  );.    assert( f
1b680 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  d!=0 );.    if( 
1b690 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c  op==SQLITE_FCNTL
1b6a0 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29 7b  _FILE_POINTER ){
1b6b0 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65 33  .      *(sqlite3
1b6c0 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20 66  _file**)pArg = f
1b6d0 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  d;.      rc = SQ
1b6e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1b6f0 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54  se if( op==SQLIT
1b700 45 5f 46 43 4e 54 4c 5f 56 46 53 5f 50 4f 49 4e  E_FCNTL_VFS_POIN
1b710 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73  TER ){.      *(s
1b720 71 6c 69 74 65 33 5f 76 66 73 2a 2a 29 70 41 72  qlite3_vfs**)pAr
1b730 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  g = sqlite3Pager
1b740 56 66 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Vfs(pPager);.   
1b750 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1b760 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
1b770 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54   op==SQLITE_FCNT
1b780 4c 5f 4a 4f 55 52 4e 41 4c 5f 50 4f 49 4e 54 45  L_JOURNAL_POINTE
1b790 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c  R ){.      *(sql
1b7a0 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67  ite3_file**)pArg
1b7b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a   = sqlite3PagerJ
1b7c0 72 6e 6c 46 69 6c 65 28 70 50 61 67 65 72 29 3b  rnlFile(pPager);
1b7d0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1b7e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
1b7f0 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64   if( fd->pMethod
1b800 73 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  s ){.      rc = 
1b810 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
1b820 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72  trol(fd, op, pAr
1b830 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
1b840 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1b850 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d  _NOTFOUND;.    }
1b860 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1b870 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1b880 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1b890 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1b8a0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
1b8b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  c;.}../*.** Inte
1b8c0 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65 73  rface to the tes
1b8d0 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69  ting logic..*/.i
1b8e0 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  nt sqlite3_test_
1b8f0 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20  control(int op, 
1b900 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ...){.  int rc =
1b910 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
1b920 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54  E_OMIT_BUILTIN_T
1b930 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  EST.  UNUSED_PAR
1b940 41 4d 45 54 45 52 28 6f 70 29 3b 0a 23 65 6c 73  AMETER(op);.#els
1b950 65 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  e.  va_list ap;.
1b960 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f    va_start(ap, o
1b970 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p);.  switch( op
1b980 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   ){..    /*.    
1b990 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
1b9a0 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
1b9b0 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20   PRNG..    */.  
1b9c0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1b9d0 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45  STCTRL_PRNG_SAVE
1b9e0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1b9f0 33 50 72 6e 67 53 61 76 65 53 74 61 74 65 28 29  3PrngSaveState()
1ba00 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ba10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1ba20 20 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20   ** Restore the 
1ba30 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e  state of the PRN
1ba40 47 20 74 6f 20 74 68 65 20 6c 61 73 74 20 73 74  G to the last st
1ba50 61 74 65 20 73 61 76 65 64 20 75 73 69 6e 67 0a  ate saved using.
1ba60 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45      ** PRNG_SAVE
1ba70 2e 20 20 49 66 20 50 52 4e 47 5f 53 41 56 45 20  .  If PRNG_SAVE 
1ba80 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65  has never before
1ba90 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68   been called, th
1baa0 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 76  en.    ** this v
1bab0 65 72 62 20 61 63 74 73 20 6c 69 6b 65 20 50 52  erb acts like PR
1bac0 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f  NG_RESET..    */
1bad0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1bae0 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
1baf0 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20  ESTORE: {.      
1bb00 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 74 6f  sqlite3PrngResto
1bb10 72 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20  reState();.     
1bb20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1bb30 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73     /*.    ** Res
1bb40 65 74 20 74 68 65 20 50 52 4e 47 20 62 61 63 6b  et the PRNG back
1bb50 20 74 6f 20 69 74 73 20 75 6e 69 6e 69 74 69 61   to its uninitia
1bb60 6c 69 7a 65 64 20 73 74 61 74 65 2e 20 20 54 68  lized state.  Th
1bb70 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20 20  e next call.    
1bb80 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 61  ** to sqlite3_ra
1bb90 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20  ndomness() will 
1bba0 72 65 73 65 65 64 20 74 68 65 20 50 52 4e 47 20  reseed the PRNG 
1bbb0 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63  using a single c
1bbc0 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  all.    ** to th
1bbd0 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65  e xRandomness me
1bbe0 74 68 6f 64 20 6f 66 20 74 68 65 20 64 65 66 61  thod of the defa
1bbf0 75 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a  ult VFS..    */.
1bc00 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1bc10 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
1bc20 53 45 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  SET: {.      sql
1bc30 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
1bc40 30 2c 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  0,0);.      brea
1bc50 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1bc60 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
1bc70 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49  _test_control(BI
1bc80 54 56 45 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c  TVEC_TEST, size,
1bc90 20 70 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a   program).    **
1bca0 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61 20 74 65  .    ** Run a te
1bcb0 73 74 20 61 67 61 69 6e 73 74 20 61 20 42 69 74  st against a Bit
1bcc0 76 65 63 20 6f 62 6a 65 63 74 20 6f 66 20 73 69  vec object of si
1bcd0 7a 65 2e 20 20 54 68 65 20 70 72 6f 67 72 61 6d  ze.  The program
1bce0 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a   argument.    **
1bcf0 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20   is an array of 
1bd00 69 6e 74 65 67 65 72 73 20 74 68 61 74 20 64 65  integers that de
1bd10 66 69 6e 65 73 20 74 68 65 20 74 65 73 74 2e 20  fines the test. 
1bd20 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a   Return -1 on a.
1bd30 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c      ** memory al
1bd40 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20  location error, 
1bd50 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 72  0 on success, or
1bd60 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e   non-zero for an
1bd70 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53   error..    ** S
1bd80 65 65 20 74 68 65 20 73 71 6c 69 74 65 33 42 69  ee the sqlite3Bi
1bd90 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28  tvecBuiltinTest(
1bda0 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
1bdb0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20   information..  
1bdc0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1bdd0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49  LITE_TESTCTRL_BI
1bde0 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20  TVEC_TEST: {.   
1bdf0 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61     int sz = va_a
1be00 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1be10 20 20 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20     int *aProg = 
1be20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29  va_arg(ap, int*)
1be30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
1be40 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69  ite3BitvecBuilti
1be50 6e 54 65 73 74 28 73 7a 2c 20 61 50 72 6f 67 29  nTest(sz, aProg)
1be60 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1be70 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1be80 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
1be90 74 5f 63 6f 6e 74 72 6f 6c 28 46 41 55 4c 54 5f  t_control(FAULT_
1bea0 49 4e 53 54 41 4c 4c 2c 20 78 43 61 6c 6c 62 61  INSTALL, xCallba
1beb0 63 6b 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ck).    **.    *
1bec0 2a 20 41 72 72 61 6e 67 65 20 74 6f 20 69 6e 76  * Arrange to inv
1bed0 6f 6b 65 20 78 43 61 6c 6c 62 61 63 6b 28 29 20  oke xCallback() 
1bee0 77 68 65 6e 65 76 65 72 20 73 71 6c 69 74 65 33  whenever sqlite3
1bef0 46 61 75 6c 74 53 69 6d 28 29 20 69 73 20 63 61  FaultSim() is ca
1bf00 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a 20 69 66 20  lled,.    ** if 
1bf10 78 43 61 6c 6c 62 61 63 6b 20 69 73 20 6e 6f 74  xCallback is not
1bf20 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a 0a 20 20   NULL..    **.  
1bf30 20 20 2a 2a 20 41 73 20 61 20 74 65 73 74 20 6f    ** As a test o
1bf40 66 20 74 68 65 20 66 61 75 6c 74 20 73 69 6d 75  f the fault simu
1bf50 6c 61 74 6f 72 20 6d 65 63 68 61 6e 69 73 6d 20  lator mechanism 
1bf60 69 74 73 65 6c 66 2c 20 73 71 6c 69 74 65 33 46  itself, sqlite3F
1bf70 61 75 6c 74 53 69 6d 28 30 29 0a 20 20 20 20 2a  aultSim(0).    *
1bf80 2a 20 69 73 20 63 61 6c 6c 65 64 20 69 6d 6d 65  * is called imme
1bf90 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 69 6e  diately after in
1bfa0 73 74 61 6c 6c 69 6e 67 20 74 68 65 20 6e 65 77  stalling the new
1bfb0 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68   callback and th
1bfc0 65 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  e return.    ** 
1bfd0 76 61 6c 75 65 20 66 72 6f 6d 20 73 71 6c 69 74  value from sqlit
1bfe0 65 33 46 61 75 6c 74 53 69 6d 28 30 29 20 62 65  e3FaultSim(0) be
1bff0 63 6f 6d 65 73 20 74 68 65 20 72 65 74 75 72 6e  comes the return
1c000 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c   from.    ** sql
1c010 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1c020 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  l()..    */.    
1c030 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1c040 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54 41  CTRL_FAULT_INSTA
1c050 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d  LL: {.      /* M
1c060 53 56 43 20 69 73 20 70 69 63 6b 79 20 61 62 6f  SVC is picky abo
1c070 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20  ut pulling func 
1c080 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69 73  ptrs from va lis
1c090 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74 74  ts..      ** htt
1c0a0 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72  p://support.micr
1c0b0 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39  osoft.com/kb/479
1c0c0 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  61.      ** sqli
1c0d0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1c0e0 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20  xTestCallback = 
1c0f0 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 28 2a  va_arg(ap, int(*
1c100 29 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 2a  )(int));.      *
1c110 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20  /.      typedef 
1c120 69 6e 74 28 2a 54 45 53 54 43 41 4c 4c 42 41 43  int(*TESTCALLBAC
1c130 4b 46 55 4e 43 5f 74 29 28 69 6e 74 29 3b 0a 20  KFUNC_t)(int);. 
1c140 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1c150 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61  alConfig.xTestCa
1c160 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28  llback = va_arg(
1c170 61 70 2c 20 54 45 53 54 43 41 4c 4c 42 41 43 4b  ap, TESTCALLBACK
1c180 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 72  FUNC_t);.      r
1c190 63 20 3d 20 73 71 6c 69 74 65 33 46 61 75 6c 74  c = sqlite3Fault
1c1a0 53 69 6d 28 30 29 3b 0a 20 20 20 20 20 20 62 72  Sim(0);.      br
1c1b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1c1c0 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1c1d0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1c1e0 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f  BENIGN_MALLOC_HO
1c1f0 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20 78 45 6e  OKS, xBegin, xEn
1c200 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d).    **.    **
1c210 20 52 65 67 69 73 74 65 72 20 68 6f 6f 6b 73 20   Register hooks 
1c220 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e 64 69 63  to call to indic
1c230 61 74 65 20 77 68 69 63 68 20 6d 61 6c 6c 6f 63  ate which malloc
1c240 28 29 20 66 61 69 6c 75 72 65 73 20 0a 20 20 20  () failures .   
1c250 20 2a 2a 20 61 72 65 20 62 65 6e 69 67 6e 2e 0a   ** are benign..
1c260 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1c270 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1c280 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f  BENIGN_MALLOC_HO
1c290 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20 74 79 70  OKS: {.      typ
1c2a0 65 64 65 66 20 76 6f 69 64 20 28 2a 76 6f 69 64  edef void (*void
1c2b0 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f 69 64 29  _function)(void)
1c2c0 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e  ;.      void_fun
1c2d0 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 42 65 67  ction xBenignBeg
1c2e0 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f 66  in;.      void_f
1c2f0 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e 45  unction xBenignE
1c300 6e 64 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67  nd;.      xBenig
1c310 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61 72 67 28  nBegin = va_arg(
1c320 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f  ap, void_functio
1c330 6e 29 3b 0a 20 20 20 20 20 20 78 42 65 6e 69 67  n);.      xBenig
1c340 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67 28 61 70  nEnd = va_arg(ap
1c350 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29  , void_function)
1c360 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
1c370 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73  enignMallocHooks
1c380 28 78 42 65 6e 69 67 6e 42 65 67 69 6e 2c 20 78  (xBenignBegin, x
1c390 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20 20 20 20  BenignEnd);.    
1c3a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1c3b0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
1c3c0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1c3d0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1c3e0 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45  TRL_PENDING_BYTE
1c3f0 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 58  , unsigned int X
1c400 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1c410 53 65 74 20 74 68 65 20 50 45 4e 44 49 4e 47 20  Set the PENDING 
1c420 62 79 74 65 20 74 6f 20 74 68 65 20 76 61 6c 75  byte to the valu
1c430 65 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  e in the argumen
1c440 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20 20 20 2a  t, if X>0..    *
1c450 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
1c460 73 20 69 66 20 58 3d 3d 30 2e 20 20 52 65 74 75  s if X==0.  Retu
1c470 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
1c480 74 68 65 20 70 65 6e 64 69 6e 67 20 62 79 74 65  the pending byte
1c490 0a 20 20 20 20 2a 2a 20 61 73 20 69 74 20 65 78  .    ** as it ex
1c4a0 69 73 74 69 6e 67 20 62 65 66 6f 72 65 20 74 68  isting before th
1c4b0 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
1c4c0 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  alled..    **.  
1c4d0 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e 54 3a 20    ** IMPORTANT: 
1c4e0 20 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45   Changing the PE
1c4f0 4e 44 49 4e 47 20 62 79 74 65 20 66 72 6f 6d 20  NDING byte from 
1c500 30 78 34 30 30 30 30 30 30 30 20 72 65 73 75 6c  0x40000000 resul
1c510 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20 61 6e 20  ts in.    ** an 
1c520 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 64 61 74  incompatible dat
1c530 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 6d 61  abase file forma
1c540 74 2e 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65  t.  Changing the
1c550 20 50 45 4e 44 49 4e 47 20 62 79 74 65 0a 20 20   PENDING byte.  
1c560 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 64    ** while any d
1c570 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1c580 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65 73 75 6c  on is open resul
1c590 74 73 20 69 6e 20 75 6e 64 65 66 69 6e 65 64 20  ts in undefined 
1c5a0 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74  and.    ** delet
1c5b0 65 72 69 6f 75 73 20 62 65 68 61 76 69 6f 72 2e  erious behavior.
1c5c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1c5d0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1c5e0 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a 20 7b  _PENDING_BYTE: {
1c5f0 0a 20 20 20 20 20 20 72 63 20 3d 20 50 45 4e 44  .      rc = PEND
1c600 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66 6e 64 65  ING_BYTE;.#ifnde
1c610 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53  f SQLITE_OMIT_WS
1c620 44 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  D.      {.      
1c630 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e    unsigned int n
1c640 65 77 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61  ewVal = va_arg(a
1c650 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  p, unsigned int)
1c660 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
1c670 77 56 61 6c 20 29 20 73 71 6c 69 74 65 33 50 65  wVal ) sqlite3Pe
1c680 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e 65 77 56  ndingByte = newV
1c690 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  al;.      }.#end
1c6a0 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  if.      break;.
1c6b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1c6c0 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    **  sqlite3_te
1c6d0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1c6e0 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
1c6f0 54 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a  T, int X).    **
1c700 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74  .    ** This act
1c710 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72  ion provides a r
1c720 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20  un-time test to 
1c730 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  see whether or n
1c740 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74  ot.    ** assert
1c750 28 29 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61  () was enabled a
1c760 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
1c770 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e   If X is true an
1c780 64 20 61 73 73 65 72 74 28 29 0a 20 20 20 20 2a  d assert().    *
1c790 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  * is enabled, th
1c7a0 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  en the return va
1c7b0 6c 75 65 20 69 73 20 74 72 75 65 2e 20 20 49 66  lue is true.  If
1c7c0 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 0a 20   X is true and. 
1c7d0 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 69     ** assert() i
1c7e0 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  s disabled, then
1c7f0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
1c800 65 20 69 73 20 7a 65 72 6f 2e 20 20 49 66 20 58  e is zero.  If X
1c810 20 69 73 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65   is.    ** false
1c820 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69 73   and assert() is
1c830 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74   enabled, then t
1c840 68 65 20 61 73 73 65 72 74 69 6f 6e 20 66 69 72  he assertion fir
1c850 65 73 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  es and the.    *
1c860 2a 20 70 72 6f 63 65 73 73 20 61 62 6f 72 74 73  * process aborts
1c870 2e 20 20 49 66 20 58 20 69 73 20 66 61 6c 73 65  .  If X is false
1c880 20 61 6e 64 20 61 73 73 65 72 74 28 29 20 69 73   and assert() is
1c890 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
1c8a0 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72  the.    ** retur
1c8b0 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e  n value is zero.
1c8c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1c8d0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1c8e0 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20 20 20 20  _ASSERT: {.     
1c8f0 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 78 20   volatile int x 
1c900 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 0;.      asser
1c910 74 28 20 2f 2a 73 69 64 65 2d 65 66 66 65 63 74  t( /*side-effect
1c920 73 2d 6f 6b 2a 2f 20 28 78 20 3d 20 76 61 5f 61  s-ok*/ (x = va_a
1c930 72 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29  rg(ap,int))!=0 )
1c940 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a  ;.      rc = x;.
1c950 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c960 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   }...    /*.    
1c970 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
1c980 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1c990 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c  TESTCTRL_ALWAYS,
1c9a0 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
1c9b0 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f     ** This actio
1c9c0 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e  n provides a run
1c9d0 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65  -time test to se
1c9e0 65 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53  e how the ALWAYS
1c9f0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45   and.    ** NEVE
1ca00 52 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65  R macros were de
1ca10 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  fined at compile
1ca20 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  -time..    **.  
1ca30 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20    ** The return 
1ca40 76 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28  value is ALWAYS(
1ca50 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  X).  .    **.   
1ca60 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e   ** The recommen
1ca70 64 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32  ded test is X==2
1ca80 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
1ca90 20 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61   value is 2, tha
1caa0 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41  t means.    ** A
1cab0 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45  LWAYS() and NEVE
1cac0 52 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d  R() are both no-
1cad0 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20  op pass-through 
1cae0 6d 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73  macros, which is
1caf0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
1cb00 75 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66  ult setting.  If
1cb10 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
1cb20 65 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57  e is 1, then ALW
1cb30 41 59 53 28 29 20 69 73 20 65 69 74 68 65 72 0a  AYS() is either.
1cb40 20 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65      ** hard-code
1cb50 64 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73  d to true or els
1cb60 65 20 69 74 20 61 73 73 65 72 74 73 20 69 66 20  e it asserts if 
1cb70 69 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  its argument is 
1cb80 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68  false..    ** Th
1cb90 65 20 66 69 72 73 74 20 62 65 68 61 76 69 6f 72  e first behavior
1cba0 20 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20   (hard-coded to 
1cbb0 74 72 75 65 29 20 69 73 20 74 68 65 20 63 61 73  true) is the cas
1cbc0 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49  e if.    ** SQLI
1cbd0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
1cbe0 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73  RT shows that as
1cbf0 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
1cc00 65 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  ed and the secon
1cc10 64 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f  d.    ** behavio
1cc20 72 20 28 61 73 73 65 72 74 20 69 66 20 74 68 65  r (assert if the
1cc30 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57   argument to ALW
1cc40 41 59 53 28 29 20 69 73 20 66 61 6c 73 65 29 20  AYS() is false) 
1cc50 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20  is the case if. 
1cc60 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53     ** SQLITE_TES
1cc70 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f  TCTRL_ASSERT sho
1cc80 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29  ws that assert()
1cc90 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20   is enabled..   
1cca0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
1ccb0 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f  un-time test pro
1ccc0 63 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f  cedure might loo
1ccd0 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65  k something like
1cce0 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
1ccf0 20 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69    **    if( sqli
1cd00 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1cd10 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1cd20 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29  _ALWAYS, 2)==2 )
1cd30 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
1cd40 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45   ALWAYS() and NE
1cd50 56 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20  VER() are no-op 
1cd60 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63  pass-through mac
1cd70 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65  ros.    **    }e
1cd80 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f  lse if( sqlite3_
1cd90 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1cda0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
1cdb0 45 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a  ERT, 1) ){.    *
1cdc0 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
1cdd0 28 78 29 20 61 73 73 65 72 74 73 20 74 68 61 74  (x) asserts that
1cde0 20 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45   x is true. NEVE
1cdf0 52 28 78 29 20 61 73 73 65 72 74 73 20 78 20 69  R(x) asserts x i
1ce00 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20  s false..    ** 
1ce10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a     }else{.    **
1ce20 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
1ce30 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
1ce40 20 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73   1.  NEVER(x) is
1ce50 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20   a constant 0.. 
1ce60 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a     **    }.    *
1ce70 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1ce80 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
1ce90 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  S: {.      int x
1cea0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
1ceb0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c  );.      rc = AL
1cec0 57 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62  WAYS(x);.      b
1ced0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1cee0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c   /*.    **   sql
1cef0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1cf00 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1cf10 4c 5f 42 59 54 45 4f 52 44 45 52 29 3b 0a 20 20  L_BYTEORDER);.  
1cf20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1cf30 69 6e 74 65 67 65 72 20 72 65 74 75 72 6e 65 64  integer returned
1cf40 20 72 65 76 65 61 6c 73 20 74 68 65 20 62 79 74   reveals the byt
1cf50 65 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 20 63  e-order of the c
1cf60 6f 6d 70 75 74 65 72 20 6f 6e 20 77 68 69 63 68  omputer on which
1cf70 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 69  .    ** SQLite i
1cf80 73 20 72 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a  s running:.    *
1cf90 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 31  *.    **       1
1cfa0 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c       big-endian,
1cfb0 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61      determined a
1cfc0 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a  t run-time.    *
1cfd0 2a 20 20 20 20 20 20 31 30 20 20 20 20 20 6c 69  *      10     li
1cfe0 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74  ttle-endian, det
1cff0 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74  ermined at run-t
1d000 69 6d 65 0a 20 20 20 20 2a 2a 20 20 34 33 32 31  ime.    **  4321
1d010 30 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61  01     big-endia
1d020 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64  n,    determined
1d030 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1d040 0a 20 20 20 20 2a 2a 20 20 31 32 33 34 31 30 20  .    **  123410 
1d050 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61      little-endia
1d060 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74  n, determined at
1d070 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20   compile-time.  
1d080 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 53    */ .    case S
1d090 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
1d0a0 59 54 45 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20  YTEORDER: {.    
1d0b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 59    rc = SQLITE_BY
1d0c0 54 45 4f 52 44 45 52 2a 31 30 30 20 2b 20 53 51  TEORDER*100 + SQ
1d0d0 4c 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41  LITE_LITTLEENDIA
1d0e0 4e 2a 31 30 20 2b 20 53 51 4c 49 54 45 5f 42 49  N*10 + SQLITE_BI
1d0f0 47 45 4e 44 49 41 4e 3b 0a 20 20 20 20 20 20 62  GENDIAN;.      b
1d100 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1d110 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
1d120 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1d130 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
1d140 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  VE, sqlite3 *db,
1d150 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
1d160 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52     ** Set the nR
1d170 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e  eserve size to N
1d180 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
1d190 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61  tabase on the da
1d1a0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f  tabase.    ** co
1d1b0 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20  nnection db..   
1d1c0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1d1d0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53  ITE_TESTCTRL_RES
1d1e0 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ERVE: {.      sq
1d1f0 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
1d200 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
1d210 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  ;.      int x = 
1d220 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
1d230 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
1d240 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1d250 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tex);.      sqli
1d260 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
1d270 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ize(db->aDb[0].p
1d280 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20  Bt, 0, x, 0);.  
1d290 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1d2a0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
1d2b0 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
1d2c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
1d2d0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1d2e0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1d2f0 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
1d300 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  NS, sqlite3 *db,
1d310 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
1d320 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20     ** Enable or 
1d330 64 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20  disable various 
1d340 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f  optimizations fo
1d350 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
1d360 65 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a  es.  The .    **
1d370 20 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61   argument N is a
1d380 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69   bitmask of opti
1d390 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20  mizations to be 
1d3a0 64 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e  disabled.  For n
1d3b0 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65  ormal.    ** ope
1d3c0 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20  ration N should 
1d3d0 62 65 20 30 2e 20 20 54 68 65 20 69 64 65 61 20  be 0.  The idea 
1d3e0 69 73 20 74 68 61 74 20 61 20 74 65 73 74 20 70  is that a test p
1d3f0 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65  rogram (like the
1d400 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69  .    ** SQL Logi
1d410 63 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65  c Test or SLT te
1d420 73 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72  st module) can r
1d430 75 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20  un the same SQL 
1d440 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20  multiple times. 
1d450 20 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f     ** with vario
1d460 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  us optimizations
1d470 20 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72   disabled to ver
1d480 69 66 79 20 74 68 61 74 20 74 68 65 20 73 61 6d  ify that the sam
1d490 65 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20  e answer.    ** 
1d4a0 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65  is obtained in e
1d4b0 76 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a  very case..    *
1d4c0 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1d4d0 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
1d4e0 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20  IZATIONS: {.    
1d4f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1d500 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1d510 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  e3*);.      db->
1d520 64 62 4f 70 74 46 6c 61 67 73 20 3d 20 28 75 31  dbOptFlags = (u1
1d530 36 29 28 76 61 5f 61 72 67 28 61 70 2c 20 69 6e  6)(va_arg(ap, in
1d540 74 29 20 26 20 30 78 66 66 66 66 29 3b 0a 20 20  t) & 0xffff);.  
1d550 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d560 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1d570 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a  N_KEYWORD.    /*
1d580 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1d590 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1d5a0 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c  TCTRL_ISKEYWORD,
1d5b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f   const char *zWo
1d5c0 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rd).    **.    *
1d5d0 2a 20 49 66 20 7a 57 6f 72 64 20 69 73 20 61 20  * If zWord is a 
1d5e0 6b 65 79 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a  keyword recogniz
1d5f0 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
1d600 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  , then return th
1d610 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
1d620 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  of keywords.  Or
1d630 20 69 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74   if zWord is not
1d640 20 61 20 6b 65 79 77 6f 72 64 2c 20 72 65 74 75   a keyword, retu
1d650 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  rn 0..    ** .  
1d660 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 66    ** This test f
1d670 65 61 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 61  eature is only a
1d680 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20  vailable in the 
1d690 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e  amalgamation sin
1d6a0 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 53 51  ce.    ** the SQ
1d6b0 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d  LITE_N_KEYWORD m
1d6c0 61 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66 69  acro is not defi
1d6d0 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ned in this file
1d6e0 20 69 66 20 53 51 4c 69 74 65 0a 20 20 20 20 2a   if SQLite.    *
1d6f0 2a 20 69 73 20 62 75 69 6c 74 20 75 73 69 6e 67  * is built using
1d700 20 73 65 70 61 72 61 74 65 20 73 6f 75 72 63 65   separate source
1d710 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   files..    */. 
1d720 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1d730 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52  ESTCTRL_ISKEYWOR
1d740 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  D: {.      const
1d750 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76   char *zWord = v
1d760 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20  a_arg(ap, const 
1d770 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e  char*);.      in
1d780 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
1d790 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20  len30(zWord);.  
1d7a0 20 20 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65      rc = (sqlite
1d7b0 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 28 75 38  3KeywordCode((u8
1d7c0 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f  *)zWord, n)!=TK_
1d7d0 49 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b  ID) ? SQLITE_N_K
1d7e0 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20  EYWORD : 0;.    
1d7f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
1d800 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20 73  endif ..    /* s
1d810 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1d820 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1d830 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f  TRL_SCRATCHMALLO
1d840 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70 46  C, sz, &pNew, pF
1d850 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ree);.    **.   
1d860 20 2a 2a 20 50 61 73 73 20 70 46 72 65 65 20 69   ** Pass pFree i
1d870 6e 74 6f 20 73 71 6c 69 74 65 33 53 63 72 61 74  nto sqlite3Scrat
1d880 63 68 46 72 65 65 28 29 2e 20 0a 20 20 20 20 2a  chFree(). .    *
1d890 2a 20 49 66 20 73 7a 3e 30 20 74 68 65 6e 20 61  * If sz>0 then a
1d8a0 6c 6c 6f 63 61 74 65 20 61 20 73 63 72 61 74 63  llocate a scratc
1d8b0 68 20 62 75 66 66 65 72 20 69 6e 74 6f 20 70 4e  h buffer into pN
1d8c0 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ew.  .    */.   
1d8d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1d8e0 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c  TCTRL_SCRATCHMAL
1d8f0 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69  LOC: {.      voi
1d900 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e 65  d *pFree, **ppNe
1d910 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  w;.      int sz;
1d920 0a 20 20 20 20 20 20 73 7a 20 3d 20 76 61 5f 61  .      sz = va_a
1d930 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1d940 20 20 20 70 70 4e 65 77 20 3d 20 76 61 5f 61 72     ppNew = va_ar
1d950 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20  g(ap, void**);. 
1d960 20 20 20 20 20 70 46 72 65 65 20 3d 20 76 61 5f       pFree = va_
1d970 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
1d980 20 20 20 20 20 20 69 66 28 20 73 7a 20 29 20 2a        if( sz ) *
1d990 70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53  ppNew = sqlite3S
1d9a0 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a 29  cratchMalloc(sz)
1d9b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
1d9c0 63 72 61 74 63 68 46 72 65 65 28 70 46 72 65 65  cratchFree(pFree
1d9d0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1d9e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
1d9f0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1da00 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1da10 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46  CTRL_LOCALTIME_F
1da20 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29  AULT, int onoff)
1da30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1da40 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f  If parameter ono
1da50 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ff is non-zero, 
1da60 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 77 72  configure the wr
1da70 61 70 70 65 72 73 20 73 6f 20 74 68 61 74 20 61  appers so that a
1da80 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71  ll.    ** subseq
1da90 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f  uent calls to lo
1daa0 63 61 6c 74 69 6d 65 28 29 20 61 6e 64 20 76 61  caltime() and va
1dab0 72 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66 20  riants fail. If 
1dac0 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a 20  onoff is zero,. 
1dad0 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73 20     ** undo this 
1dae0 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  setting..    */.
1daf0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1db00 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
1db10 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20  ME_FAULT: {.    
1db20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1db30 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65  onfig.bLocaltime
1db40 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28 61  Fault = va_arg(a
1db50 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
1db60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1db70 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
1db80 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1db90 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52  E_TESTCTRL_NEVER
1dba0 5f 43 4f 52 52 55 50 54 2c 20 69 6e 74 29 3b 0a  _CORRUPT, int);.
1dbb0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65      **.    ** Se
1dbc0 74 20 6f 72 20 63 6c 65 61 72 20 61 20 66 6c 61  t or clear a fla
1dbd0 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73  g that indicates
1dbe0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1dbf0 73 65 20 66 69 6c 65 20 69 73 20 61 6c 77 61 79  se file is alway
1dc00 73 20 77 65 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66  s well-.    ** f
1dc10 6f 72 6d 65 64 20 61 6e 64 20 6e 65 76 65 72 20  ormed and never 
1dc20 63 6f 72 72 75 70 74 2e 20 20 54 68 69 73 20 66  corrupt.  This f
1dc30 6c 61 67 20 69 73 20 63 6c 65 61 72 20 62 79 20  lag is clear by 
1dc40 64 65 66 61 75 6c 74 2c 20 69 6e 64 69 63 61 74  default, indicat
1dc50 69 6e 67 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ing that.    ** 
1dc60 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 6d  database files m
1dc70 69 67 68 74 20 68 61 76 65 20 61 72 62 69 74 72  ight have arbitr
1dc80 61 72 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ary corruption. 
1dc90 20 53 65 74 74 69 6e 67 20 74 68 65 20 66 6c 61   Setting the fla
1dca0 67 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20  g during.    ** 
1dcb0 74 65 73 74 69 6e 67 20 63 61 75 73 65 73 20 63  testing causes c
1dcc0 65 72 74 61 69 6e 20 61 73 73 65 72 74 28 29 20  ertain assert() 
1dcd0 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68  statements in th
1dce0 65 20 63 6f 64 65 20 74 6f 20 62 65 20 61 63 74  e code to be act
1dcf0 69 76 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 68  ivated.    ** th
1dd00 61 74 20 64 65 6d 6f 6e 73 74 72 61 74 20 69 6e  at demonstrat in
1dd10 76 61 72 69 61 6e 74 73 20 6f 6e 20 77 65 6c 6c  variants on well
1dd20 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
1dd30 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   files..    */. 
1dd40 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1dd50 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f  ESTCTRL_NEVER_CO
1dd60 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 20 20 73  RRUPT: {.      s
1dd70 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1dd80 69 67 2e 6e 65 76 65 72 43 6f 72 72 75 70 74 20  ig.neverCorrupt 
1dd90 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
1dda0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ddb0 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 20      }...    /*  
1ddc0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1ddd0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1dde0 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52  TCTRL_VDBE_COVER
1ddf0 41 47 45 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20  AGE, xCallback, 
1de00 70 74 72 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ptr);.    **.   
1de10 20 2a 2a 20 53 65 74 20 74 68 65 20 56 44 42 45   ** Set the VDBE
1de20 20 63 6f 76 65 72 61 67 65 20 63 61 6c 6c 62 61   coverage callba
1de30 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 78  ck function to x
1de40 43 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 63 6f  Callback with co
1de50 6e 74 65 78 74 20 0a 20 20 20 20 2a 2a 20 70 6f  ntext .    ** po
1de60 69 6e 74 65 72 20 70 74 72 2e 0a 20 20 20 20 2a  inter ptr..    *
1de70 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1de80 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f  E_TESTCTRL_VDBE_
1de90 43 4f 56 45 52 41 47 45 3a 20 7b 0a 23 69 66 64  COVERAGE: {.#ifd
1dea0 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
1deb0 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20 74 79  OVERAGE.      ty
1dec0 70 65 64 65 66 20 76 6f 69 64 20 28 2a 62 72 61  pedef void (*bra
1ded0 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29 28 76 6f  nch_callback)(vo
1dee0 69 64 2a 2c 69 6e 74 2c 75 38 2c 75 38 29 3b 0a  id*,int,u8,u8);.
1def0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1df00 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62 65 42  balConfig.xVdbeB
1df10 72 61 6e 63 68 20 3d 20 76 61 5f 61 72 67 28 61  ranch = va_arg(a
1df20 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63  p,branch_callbac
1df30 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
1df40 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56  3GlobalConfig.pV
1df50 64 62 65 42 72 61 6e 63 68 41 72 67 20 3d 20 76  dbeBranchArg = v
1df60 61 5f 61 72 67 28 61 70 2c 76 6f 69 64 2a 29 3b  a_arg(ap,void*);
1df70 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72  .#endif.      br
1df80 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1df90 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1dfa0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1dfb0 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52  _TESTCTRL_SORTER
1dfc0 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d 61 78 29  _MMAP, db, nMax)
1dfd0 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51  ; */.    case SQ
1dfe0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f  LITE_TESTCTRL_SO
1dff0 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20  RTER_MMAP: {.   
1e000 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1e010 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
1e020 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d  te3*);.      db-
1e030 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20  >nMaxSorterMmap 
1e040 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
1e050 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1e060 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
1e070 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1e080 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1e090 43 54 52 4c 5f 49 53 49 4e 49 54 29 3b 0a 20 20  CTRL_ISINIT);.  
1e0a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74 75    **.    ** Retu
1e0b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
1e0c0 53 51 4c 69 74 65 20 68 61 73 20 62 65 65 6e 20  SQLite has been 
1e0d0 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20  initialized and 
1e0e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 0a  SQLITE_ERROR if.
1e0f0 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20 20      ** not..    
1e100 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1e110 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e  TE_TESTCTRL_ISIN
1e120 49 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  IT: {.      if( 
1e130 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1e140 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 29 20  fig.isInit==0 ) 
1e150 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1e160 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
1e170 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73      }..    /*  s
1e180 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1e190 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1e1a0 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64 62  TRL_IMPOSTER, db
1e1b0 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c  , dbName, onOff,
1e1c0 20 74 6e 75 6d 29 3b 0a 20 20 20 20 2a 2a 0a 20   tnum);.    **. 
1e1d0 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20     ** This test 
1e1e0 63 6f 6e 74 72 6f 6c 20 69 73 20 75 73 65 64 20  control is used 
1e1f0 74 6f 20 63 72 65 61 74 65 20 69 6d 70 6f 73 74  to create impost
1e200 65 72 20 74 61 62 6c 65 73 2e 20 20 22 64 62 22  er tables.  "db"
1e210 20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 20 20   is a pointer.  
1e220 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61    ** to the data
1e230 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
1e240 20 20 64 62 4e 61 6d 65 20 69 73 20 74 68 65 20    dbName is the 
1e250 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 28 65  database name (e
1e260 78 3a 20 22 6d 61 69 6e 22 20 6f 72 0a 20 20 20  x: "main" or.   
1e270 20 2a 2a 20 22 74 65 6d 70 22 29 20 77 68 69 63   ** "temp") whic
1e280 68 20 77 69 6c 6c 20 72 65 63 65 69 76 65 20 74  h will receive t
1e290 68 65 20 69 6d 70 6f 73 74 65 72 2e 20 20 22 6f  he imposter.  "o
1e2a0 6e 4f 66 66 22 20 74 75 72 6e 73 20 69 6d 70 6f  nOff" turns impo
1e2b0 73 74 65 72 20 6d 6f 64 65 20 6f 6e 0a 20 20 20  ster mode on.   
1e2c0 20 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 22 74 6e   ** or off.  "tn
1e2d0 75 6d 22 20 69 73 20 74 68 65 20 72 6f 6f 74 20  um" is the root 
1e2e0 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
1e2f0 65 65 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ee to which the 
1e300 69 6d 70 6f 73 74 65 72 0a 20 20 20 20 2a 2a 20  imposter.    ** 
1e310 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e  table should con
1e320 6e 65 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  nect..    **.   
1e330 20 2a 2a 20 45 6e 61 62 6c 65 20 69 6d 70 6f 73   ** Enable impos
1e340 74 65 72 20 6d 6f 64 65 20 6f 6e 6c 79 20 77 68  ter mode only wh
1e350 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 68 61  en the schema ha
1e360 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70  s already been p
1e370 61 72 73 65 64 2e 20 20 54 68 65 6e 0a 20 20 20  arsed.  Then.   
1e380 20 2a 2a 20 72 75 6e 20 61 20 73 69 6e 67 6c 65   ** run a single
1e390 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
1e3a0 61 74 65 6d 65 6e 74 20 74 6f 20 63 6f 6e 73 74  atement to const
1e3b0 72 75 63 74 20 74 68 65 20 69 6d 70 6f 73 74 65  ruct the imposte
1e3c0 72 20 74 61 62 6c 65 20 69 6e 0a 20 20 20 20 2a  r table in.    *
1e3d0 2a 20 74 68 65 20 70 61 72 73 65 64 20 73 63 68  * the parsed sch
1e3e0 65 6d 61 2e 20 20 54 68 65 6e 20 74 75 72 6e 20  ema.  Then turn 
1e3f0 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 62 61  imposter mode ba
1e400 63 6b 20 6f 66 66 20 61 67 61 69 6e 2e 0a 20 20  ck off again..  
1e410 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6f    **.    ** If o
1e420 6e 4f 66 66 3d 3d 30 20 61 6e 64 20 74 6e 75 6d  nOff==0 and tnum
1e430 3e 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68  >0 then reset th
1e440 65 20 73 63 68 65 6d 61 20 66 6f 72 20 61 6c 6c  e schema for all
1e450 20 64 61 74 61 62 61 73 65 73 2c 20 63 61 75 73   databases, caus
1e460 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  ing.    ** the s
1e470 63 68 65 6d 61 20 74 6f 20 62 65 20 72 65 70 61  chema to be repa
1e480 72 73 65 64 20 74 68 65 20 6e 65 78 74 20 74 69  rsed the next ti
1e490 6d 65 20 69 74 20 69 73 20 6e 65 65 64 65 64 2e  me it is needed.
1e4a0 20 20 54 68 69 73 20 68 61 73 20 74 68 65 0a 20    This has the. 
1e4b0 20 20 20 2a 2a 20 65 66 66 65 63 74 20 6f 66 20     ** effect of 
1e4c0 65 72 61 73 69 6e 67 20 61 6c 6c 20 69 6d 70 6f  erasing all impo
1e4d0 73 74 65 72 20 74 61 62 6c 65 73 2e 0a 20 20 20  ster tables..   
1e4e0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1e4f0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
1e500 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  OSTER: {.      s
1e510 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
1e520 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
1e530 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e540 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1e550 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 64  >mutex);.      d
1e560 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d 20 73 71  b->init.iDb = sq
1e570 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
1e580 64 62 2c 20 76 61 5f 61 72 67 28 61 70 2c 63 6f  db, va_arg(ap,co
1e590 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20  nst char*));.   
1e5a0 20 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79     db->init.busy
1e5b0 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f   = db->init.impo
1e5c0 73 74 65 72 54 61 62 6c 65 20 3d 20 76 61 5f 61  sterTable = va_a
1e5d0 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
1e5e0 20 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e    db->init.newTn
1e5f0 75 6d 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69  um = va_arg(ap,i
1e600 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  nt);.      if( d
1e610 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
1e620 26 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  && db->init.newT
1e630 6e 75 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  num>0 ){.       
1e640 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
1e650 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
1e660 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  ion(db);.      }
1e670 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
1e680 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1e690 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65  utex);.      bre
1e6a0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1e6b0 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64  va_end(ap);.#end
1e6c0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1e6d0 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a  T_BUILTIN_TEST *
1e6e0 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  /.  return rc;.}
1e6f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
1e700 61 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e  a utility routin
1e710 65 2c 20 75 73 65 66 75 6c 20 74 6f 20 56 46 53  e, useful to VFS
1e720 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
1e730 2c 20 74 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a  , that checks.**
1e740 20 74 6f 20 73 65 65 20 69 66 20 61 20 64 61 74   to see if a dat
1e750 61 62 61 73 65 20 66 69 6c 65 20 77 61 73 20 61  abase file was a
1e760 20 55 52 49 20 74 68 61 74 20 63 6f 6e 74 61 69   URI that contai
1e770 6e 65 64 20 61 20 73 70 65 63 69 66 69 63 20 71  ned a specific q
1e780 75 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74  uery .** paramet
1e790 65 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f 62  er, and if so ob
1e7a0 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20  tains the value 
1e7b0 6f 66 20 74 68 65 20 71 75 65 72 79 20 70 61 72  of the query par
1e7c0 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ameter..**.** Th
1e7d0 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75  e zFilename argu
1e7e0 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69 6c 65  ment is the file
1e7f0 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20 70 61 73  name pointer pas
1e800 73 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f 70  sed into the xOp
1e810 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  en().** method o
1e820 66 20 61 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e  f a VFS implemen
1e830 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61  tation.  The zPa
1e840 72 61 6d 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ram argument is 
1e850 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
1e860 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ** query paramet
1e870 65 72 20 77 65 20 73 65 65 6b 2e 20 20 54 68 69  er we seek.  Thi
1e880 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1e890 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
1e8a0 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72  he zParam.** par
1e8b0 61 6d 65 74 65 72 20 69 66 20 69 74 20 65 78 69  ameter if it exi
1e8c0 73 74 73 2e 20 20 49 66 20 74 68 65 20 70 61 72  sts.  If the par
1e8d0 61 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74 20  ameter does not 
1e8e0 65 78 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74  exist, this rout
1e8f0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61  ine.** returns a
1e900 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a   NULL pointer..*
1e910 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1e920 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
1e930 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ter(const char *
1e940 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74  zFilename, const
1e950 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a   char *zParam){.
1e960 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
1e970 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d 3d 30 20  =0 || zParam==0 
1e980 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46  ) return 0;.  zF
1e990 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74  ilename += sqlit
1e9a0 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
1e9b0 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68 69  name) + 1;.  whi
1e9c0 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d  le( zFilename[0]
1e9d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20   ){.    int x = 
1e9e0 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
1e9f0 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a  , zParam);.    z
1ea00 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
1ea10 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
1ea20 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  ename) + 1;.    
1ea30 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74 75 72  if( x==0 ) retur
1ea40 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  n zFilename;.   
1ea50 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
1ea60 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
1ea70 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
1ea80 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1ea90 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1eaa0 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f  boolean value fo
1eab0 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65  r a query parame
1eac0 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ter..*/.int sqli
1ead0 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
1eae0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1eaf0 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61  ename, const cha
1eb00 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62  r *zParam, int b
1eb10 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63  Dflt){.  const c
1eb20 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
1eb30 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a  _uri_parameter(z
1eb40 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d  Filename, zParam
1eb50 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62 44 66  );.  bDflt = bDf
1eb60 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20  lt!=0;.  return 
1eb70 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74 42 6f  z ? sqlite3GetBo
1eb80 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20  olean(z, bDflt) 
1eb90 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  : bDflt;.}../*.*
1eba0 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d 62 69  * Return a 64-bi
1ebb0 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  t integer value 
1ebc0 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61  for a query para
1ebd0 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65  meter..*/.sqlite
1ebe0 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f  3_int64 sqlite3_
1ebf0 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e  uri_int64(.  con
1ec00 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1ec10 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  me,    /* Filena
1ec20 6d 65 20 61 73 20 70 61 73 73 65 64 20 74 6f 20  me as passed to 
1ec30 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  xOpen */.  const
1ec40 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20   char *zParam,  
1ec50 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61 72 61       /* URI para
1ec60 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a  meter sought */.
1ec70 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1ec80 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a 20 72  bDflt       /* r
1ec90 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d 65 74  eturn if paramet
1eca0 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f  er is missing */
1ecb0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1ecc0 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72   *z = sqlite3_ur
1ecd0 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c  i_parameter(zFil
1ece0 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a  ename, zParam);.
1ecf0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1ed00 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 73 71  v;.  if( z && sq
1ed10 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49  lite3DecOrHexToI
1ed20 36 34 28 7a 2c 20 26 76 29 3d 3d 53 51 4c 49 54  64(z, &v)==SQLIT
1ed30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66 6c  E_OK ){.    bDfl
1ed40 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74  t = v;.  }.  ret
1ed50 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a  urn bDflt;.}../*
1ed60 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 42  .** Return the B
1ed70 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69 64 65  tree pointer ide
1ed80 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62 4e 61  ntified by zDbNa
1ed90 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  me.  Return NULL
1eda0 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
1edb0 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74 65 33  /.Btree *sqlite3
1edc0 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 73 71  DbNameToBtree(sq
1edd0 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1ede0 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b   char *zDbName){
1edf0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1ee00 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
1ee10 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62  i++){.    if( db
1ee20 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 0a 20 20 20  ->aDb[i].pBt.   
1ee30 20 20 26 26 20 28 7a 44 62 4e 61 6d 65 3d 3d 30    && (zDbName==0
1ee40 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
1ee50 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 64 62 2d 3e  mp(zDbName, db->
1ee60 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  aDb[i].zName)==0
1ee70 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
1ee80 65 74 75 72 6e 20 64 62 2d 3e 61 44 62 5b 69 5d  eturn db->aDb[i]
1ee90 2e 70 42 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  .pBt;.    }.  }.
1eea0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1eeb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1eec0 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20  filename of the 
1eed0 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
1eee0 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
1eef0 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
1ef00 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  n..*/.const char
1ef10 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c   *sqlite3_db_fil
1ef20 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64  ename(sqlite3 *d
1ef30 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
1ef40 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65  DbName){.  Btree
1ef50 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53 51   *pBt;.#ifdef SQ
1ef60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1ef70 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1ef80 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1ef90 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
1efa0 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
1efb0 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
1efc0 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
1efd0 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44    pBt = sqlite3D
1efe0 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
1eff0 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74   zDbName);.  ret
1f000 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65  urn pBt ? sqlite
1f010 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
1f020 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f  e(pBt) : 0;.}../
1f030 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
1f040 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 61   database is rea
1f050 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20 72  d-only or 0 if r
1f060 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65 74 75  ead/write.  Retu
1f070 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73  rn -1 if.** no s
1f080 75 63 68 20 64 61 74 61 62 61 73 65 20 65 78 69  uch database exi
1f090 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sts..*/.int sqli
1f0a0 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28  te3_db_readonly(
1f0b0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
1f0c0 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
1f0d0 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b  ){.  Btree *pBt;
1f0e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1f0f0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1f100 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1f110 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1f120 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
1f130 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1f140 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
1f150 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74    }.#endif.  pBt
1f160 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65   = sqlite3DbName
1f170 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e  ToBtree(db, zDbN
1f180 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ame);.  return p
1f190 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65  Bt ? sqlite3Btre
1f1a0 65 49 73 52 65 61 64 6f 6e 6c 79 28 70 42 74 29  eIsReadonly(pBt)
1f1b0 20 3a 20 2d 31 3b 0a 7d 0a 0a 23 69 66 64 65 66   : -1;.}..#ifdef
1f1c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1f1d0 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 4f 62  NAPSHOT./*.** Ob
1f1e0 74 61 69 6e 20 61 20 73 6e 61 70 73 68 6f 74 20  tain a snapshot 
1f1f0 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 73  handle for the s
1f200 6e 61 70 73 68 6f 74 20 6f 66 20 64 61 74 61 62  napshot of datab
1f210 61 73 65 20 7a 44 62 20 63 75 72 72 65 6e 74 6c  ase zDb currentl
1f220 79 20 0a 2a 2a 20 62 65 69 6e 67 20 72 65 61 64  y .** being read
1f230 20 62 79 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a   by handle db..*
1f240 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e  /.int sqlite3_sn
1f250 61 70 73 68 6f 74 5f 67 65 74 28 0a 20 20 73 71  apshot_get(.  sq
1f260 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 63 6f  lite3 *db, .  co
1f270 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 0a 20  nst char *zDb,. 
1f280 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
1f290 74 20 2a 2a 70 70 53 6e 61 70 73 68 6f 74 0a 29  t **ppSnapshot.)
1f2a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1f2b0 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69 66 6e 64  ITE_ERROR;.#ifnd
1f2c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1f2d0 41 4c 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 23  AL.  int iDb;..#
1f2e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1f2f0 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1f300 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1f310 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
1f320 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1f330 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1f340 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
1f350 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1f360 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20  (db->mutex);..  
1f370 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
1f380 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29  dDbName(db, zDb)
1f390 3b 0a 20 20 69 66 28 20 69 44 62 3d 3d 30 20 7c  ;.  if( iDb==0 |
1f3a0 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 42  | iDb>1 ){.    B
1f3b0 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
1f3c0 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20  aDb[iDb].pBt;.  
1f3d0 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
1f3e0 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
1f3f0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Bt) ){.      rc 
1f400 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
1f410 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30 29  ginTrans(pBt, 0)
1f420 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1f430 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f440 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f450 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 47 65  3PagerSnapshotGe
1f460 74 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  t(sqlite3BtreePa
1f470 67 65 72 28 70 42 74 29 2c 20 70 70 53 6e 61 70  ger(pBt), ppSnap
1f480 73 68 6f 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  shot);.      }. 
1f490 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
1f4a0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1f4b0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65 6e 64  db->mutex);.#end
1f4c0 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  if   /* SQLITE_O
1f4d0 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72 65 74  MIT_WAL */.  ret
1f4e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1f4f0 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 74 72 61   Open a read-tra
1f500 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
1f510 73 6e 61 70 73 68 6f 74 20 69 64 65 6e 64 69 66  snapshot idendif
1f520 69 65 64 20 62 79 20 70 53 6e 61 70 73 68 6f 74  ied by pSnapshot
1f530 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f540 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a  _snapshot_open(.
1f550 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
1f560 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1f570 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  b, .  sqlite3_sn
1f580 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f  apshot *pSnapsho
1f590 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t.){.  int rc = 
1f5a0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69  SQLITE_ERROR;.#i
1f5b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f5c0 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51  T_WAL..#ifdef SQ
1f5d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
1f5e0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
1f5f0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
1f600 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
1f610 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
1f620 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
1f630 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
1f640 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1f650 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61  ex);.  if( db->a
1f660 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  utoCommit==0 ){.
1f670 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
1f680 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
1f690 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62  ndDbName(db, zDb
1f6a0 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d  );.    if( iDb==
1f6b0 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a 20 20  0 || iDb>1 ){.  
1f6c0 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
1f6d0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
1f6e0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  t;.      if( 0==
1f6f0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
1f700 52 65 61 64 54 72 61 6e 73 28 70 42 74 29 20 29  ReadTrans(pBt) )
1f710 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1f720 71 6c 69 74 65 33 50 61 67 65 72 53 6e 61 70 73  qlite3PagerSnaps
1f730 68 6f 74 4f 70 65 6e 28 73 71 6c 69 74 65 33 42  hotOpen(sqlite3B
1f740 74 72 65 65 50 61 67 65 72 28 70 42 74 29 2c 20  treePager(pBt), 
1f750 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20  pSnapshot);.    
1f760 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f770 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f780 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1f790 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
1f7a0 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  Bt, 0);.        
1f7b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e    sqlite3PagerSn
1f7c0 61 70 73 68 6f 74 4f 70 65 6e 28 73 71 6c 69 74  apshotOpen(sqlit
1f7d0 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
1f7e0 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  ), 0);.        }
1f7f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f800 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   }..  sqlite3_mu
1f810 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1f820 74 65 78 29 3b 0a 23 65 6e 64 69 66 20 20 20 2f  tex);.#endif   /
1f830 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  * SQLITE_OMIT_WA
1f840 4c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  L */.  return rc
1f850 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
1f860 61 20 73 6e 61 70 73 68 6f 74 20 68 61 6e 64 6c  a snapshot handl
1f870 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
1f880 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
1f890 5f 67 65 74 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  _get()..*/.void 
1f8a0 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
1f8b0 5f 66 72 65 65 28 73 71 6c 69 74 65 33 5f 73 6e  _free(sqlite3_sn
1f8c0 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f  apshot *pSnapsho
1f8d0 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t){.  sqlite3_fr
1f8e0 65 65 28 70 53 6e 61 70 73 68 6f 74 29 3b 0a 7d  ee(pSnapshot);.}
1f8f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1f900 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f  E_ENABLE_SNAPSHO
1f910 54 20 2a 2f 0a                                   T */.