/ Hex Artifact Content
Login

Artifact bf26fbebab82069cd7d15c41a58110be8075c87e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64  u.h".#endif.#ifd
0320: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0330: 5f 4a 53 4f 4e 31 0a 69 6e 74 20 73 71 6c 69 74  _JSON1.int sqlit
0340: 65 33 4a 73 6f 6e 31 49 6e 69 74 28 73 71 6c 69  e3Json1Init(sqli
0350: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69  te3*);.#endif.#i
0360: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
0370: 4c 45 5f 46 54 53 35 0a 69 6e 74 20 73 71 6c 69  LE_FTS5.int sqli
0380: 74 65 33 46 74 73 35 49 6e 69 74 28 73 71 6c 69  te3Fts5Init(sqli
0390: 74 65 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  te3*);.#endif..#
03a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d  ifndef SQLITE_AM
03b0: 41 4c 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d  ALGAMATION./* IM
03c0: 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a  PLEMENTATION-OF:
03d0: 20 52 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54   R-46656-45156 T
03e0: 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69  he sqlite3_versi
03f0: 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73  on[] string cons
0400: 74 61 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  tant.** contains
0410: 20 74 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c   the text of SQL
0420: 49 54 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72  ITE_VERSION macr
0430: 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  o. .*/.const cha
0440: 72 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f  r sqlite3_versio
0450: 6e 5b 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52  n[] = SQLITE_VER
0460: 53 49 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  SION;.#endif../*
0470: 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d   IMPLEMENTATION-
0480: 4f 46 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37  OF: R-53536-4257
0490: 35 20 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69  5 The sqlite3_li
04a0: 62 76 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74  bversion() funct
04b0: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61  ion returns.** a
04c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
04d0: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76  to the sqlite3_v
04e0: 65 72 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20  ersion[] string 
04f0: 63 6f 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f  constant. .*/.co
0500: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
0510: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69  3_libversion(voi
0520: 64 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  d){ return sqlit
0530: 65 33 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f  e3_version; }../
0540: 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e  * IMPLEMENTATION
0550: 2d 4f 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33  -OF: R-63124-393
0560: 30 30 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73  00 The sqlite3_s
0570: 6f 75 72 63 65 69 64 28 29 20 66 75 6e 63 74 69  ourceid() functi
0580: 6f 6e 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20  on returns a.** 
0590: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
05a0: 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f  ing constant who
05b0: 73 65 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  se value is the 
05c0: 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53  same as the.** S
05d0: 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20  QLITE_SOURCE_ID 
05e0: 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d  C preprocessor m
05f0: 61 63 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20  acro. .*/.const 
0600: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f  char *sqlite3_so
0610: 75 72 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65  urceid(void){ re
0620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52  turn SQLITE_SOUR
0630: 43 45 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50  CE_ID; }../* IMP
0640: 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
0650: 52 2d 33 35 32 31 30 2d 36 33 35 30 38 20 54 68  R-35210-63508 Th
0660: 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  e sqlite3_libver
0670: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75  sion_number() fu
0680: 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  nction.** return
0690: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75  s an integer equ
06a0: 61 6c 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52  al to SQLITE_VER
06b0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a  SION_NUMBER..*/.
06c0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  int sqlite3_libv
06d0: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f  ersion_number(vo
06e0: 69 64 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49  id){ return SQLI
06f0: 54 45 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  TE_VERSION_NUMBE
0700: 52 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45  R; }../* IMPLEME
0710: 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30  NTATION-OF: R-20
0720: 37 39 30 2d 31 34 30 32 35 20 54 68 65 20 73 71  790-14025 The sq
0730: 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61 66 65  lite3_threadsafe
0740: 28 29 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  () function retu
0750: 72 6e 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61  rns.** zero if a
0760: 6e 64 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74  nd only if SQLit
0770: 65 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77  e was compiled w
0780: 69 74 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64  ith mutexing cod
0790: 65 20 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f  e omitted due to
07a0: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54  .** the SQLITE_T
07b0: 48 52 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c  HREADSAFE compil
07c0: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65  e-time option be
07d0: 69 6e 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f  ing set to 0..*/
07e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72  .int sqlite3_thr
07f0: 65 61 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72  eadsafe(void){ r
0800: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52  eturn SQLITE_THR
0810: 45 41 44 53 41 46 45 3b 20 7d 0a 0a 2f 2a 0a 2a  EADSAFE; }../*.*
0820: 2a 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * When compiling
0830: 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72   the test fixtur
0840: 65 20 6f 72 20 77 69 74 68 20 64 65 62 75 67 67  e or with debugg
0850: 69 6e 67 20 65 6e 61 62 6c 65 64 20 28 6f 6e 20  ing enabled (on 
0860: 57 69 6e 33 32 29 2c 0a 2a 2a 20 74 68 69 73 20  Win32),.** this 
0870: 76 61 72 69 61 62 6c 65 20 62 65 69 6e 67 20 73  variable being s
0880: 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 20 77  et to non-zero w
0890: 69 6c 6c 20 63 61 75 73 65 20 4f 53 54 52 41 43  ill cause OSTRAC
08a0: 45 20 6d 61 63 72 6f 73 20 74 6f 20 65 6d 69 74  E macros to emit
08b0: 0a 2a 2a 20 65 78 74 72 61 20 64 69 61 67 6e 6f  .** extra diagno
08c0: 73 74 69 63 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  stic information
08d0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
08e0: 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
08f0: 0a 23 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  .# ifndef SQLITE
0900: 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45 0a  _DEBUG_OS_TRACE.
0910: 23 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  #   define SQLIT
0920: 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45  E_DEBUG_OS_TRACE
0930: 20 30 0a 23 20 65 6e 64 69 66 0a 20 20 69 6e 74   0.# endif.  int
0940: 20 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 20   sqlite3OSTrace 
0950: 3d 20 53 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f  = SQLITE_DEBUG_O
0960: 53 5f 54 52 41 43 45 3b 0a 23 65 6e 64 69 66 0a  S_TRACE;.#endif.
0970: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
0980: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
0990: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
09a0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
09b0: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  E)./*.** If the 
09c0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
09d0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f  on pointer is no
09e0: 74 20 4e 55 4c 4c 20 61 6e 64 20 69 66 0a 2a 2a  t NULL and if.**
09f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
0a00: 4f 54 52 41 43 45 20 69 73 20 65 6e 61 62 6c 65  OTRACE is enable
0a10: 64 2c 20 74 68 65 6e 20 6d 65 73 73 61 67 65 73  d, then messages
0a20: 20 64 65 73 63 72 69 62 69 6e 67 0a 2a 2a 20 49   describing.** I
0a30: 2f 4f 20 61 63 74 69 76 65 20 61 72 65 20 77 72  /O active are wr
0a40: 69 74 74 65 6e 20 75 73 69 6e 67 20 74 68 69 73  itten using this
0a50: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 73   function.  Thes
0a60: 65 20 6d 65 73 73 61 67 65 73 0a 2a 2a 20 61 72  e messages.** ar
0a70: 65 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 64  e intended for d
0a80: 65 62 75 67 67 69 6e 67 20 61 63 74 69 76 69 74  ebugging activit
0a90: 79 20 6f 6e 6c 79 2e 0a 2a 2f 0a 53 51 4c 49 54  y only..*/.SQLIT
0aa0: 45 5f 41 50 49 20 76 6f 69 64 20 28 53 51 4c 49  E_API void (SQLI
0ab0: 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74 65  TE_CDECL *sqlite
0ac0: 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20  3IoTrace)(const 
0ad0: 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30 3b  char*, ...) = 0;
0ae0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
0af0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0b00: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20  global variable 
0b10: 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72 69  points to a stri
0b20: 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  ng which is the.
0b30: 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72  ** name of a dir
0b40: 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68 61  ectory, then tha
0b50: 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c 6c  t directory will
0b60: 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72   be used to stor
0b70: 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66  e.** temporary f
0b80: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  iles..**.** See 
0b90: 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d 41  also the "PRAGMA
0ba0: 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72 65   temp_store_dire
0bb0: 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d 61  ctory" SQL comma
0bc0: 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nd..*/.char *sql
0bd0: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
0be0: 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ory = 0;../*.** 
0bf0: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0c00: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0c10: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0c20: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0c30: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0c40: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0c50: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0c60: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0c70: 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62 61  re.** all databa
0c80: 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66 69  se files specifi
0c90: 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ed with a relati
0ca0: 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a 0a  ve pathname..**.
0cb0: 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65 20  ** See also the 
0cc0: 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74 6f  "PRAGMA data_sto
0cd0: 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53 51  re_directory" SQ
0ce0: 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68  L command..*/.ch
0cf0: 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74 61  ar *sqlite3_data
0d00: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  _directory = 0;.
0d10: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
0d20: 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a 2a  e SQLite.  .**.*
0d30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0d40: 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74 6f  ust be called to
0d50: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
0d60: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
0d70: 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20 6d  n,.** VFS, and m
0d80: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73 20  utex subsystems 
0d90: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61  prior to doing a
0da0: 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b 20  ny serious work 
0db0: 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e 20  with.** SQLite. 
0dc0: 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73 20   But as long as 
0dd0: 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70 69  you do not compi
0de0: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f  le with SQLITE_O
0df0: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a 20  MIT_AUTOINIT.** 
0e00: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  this routine wil
0e10: 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74 6f  l be called auto
0e20: 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65 79  matically by key
0e30: 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20 61   routines such a
0e40: 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  s.** sqlite3_ope
0e50: 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  n().  .**.** Thi
0e60: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
0e70: 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20 69  o-op except on i
0e80: 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63 61  ts very first ca
0e90: 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63 65  ll for the proce
0ea0: 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74 68  ss,.** or for th
0eb0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66 74  e first call aft
0ec0: 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
0ed0: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a 2a  ite3_shutdown..*
0ee0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
0ef0: 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74 68  hread to call th
0f00: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
0f10: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
0f20: 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65 74  on to.** complet
0f30: 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71 75  ion.  If subsequ
0f40: 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c 6c  ent threads call
0f50: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65   this routine be
0f60: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a  fore the first.*
0f70: 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69 6e  * thread has fin
0f80: 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69 61  ished the initia
0f90: 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73 73  lization process
0fa0: 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73 65  , then the subse
0fb0: 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64 73  quent.** threads
0fc0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fd0: 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65  l the first thre
0fe0: 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74 68  ad finishes with
0ff0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
1000: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
1010: 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67 68  irst thread migh
1020: 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  t call this rout
1030: 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79 2e  ine recursively.
1040: 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20 63    Recursive.** c
1050: 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75  alls to this rou
1060: 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  tine should not 
1070: 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73 65  block, of course
1080: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
1090: 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  .** initializati
10a0: 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c 64  on process would
10b0: 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65 2e   never complete.
10c0: 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65 20  .**.** Let X be 
10d0: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  the first thread
10e0: 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20 72   to enter this r
10f0: 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20 62  outine.  Let Y b
1100: 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  e some other.** 
1110: 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77 68  thread.  Then wh
1120: 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ile the initial 
1130: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74 68  invocation of th
1140: 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58 20  is routine by X 
1150: 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74 65  is.** incomplete
1160: 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65 64  , it is required
1170: 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   that:.**.**    
1180: 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69 73  *  Calls to this
1190: 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59 20   routine from Y 
11a0: 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69 6c  must block until
11b0: 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74 0a   the outer-most.
11c0: 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62 79  **       call by
11d0: 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a 2a   X completes..**
11e0: 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72 73  .**    *  Recurs
11f0: 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68 69  ive calls to thi
1200: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 74  s routine from t
1210: 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20 69  hread X return i
1220: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
1230: 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f 63      without bloc
1240: 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
1250: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1260: 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f 4c  void){.  MUTEX_L
1270: 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
1280: 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20  tex *pMaster; ) 
1290: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
12a0: 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a  n static mutex *
12b0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
12f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1300: 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69 6e  _EXTRA_INIT.  in
1310: 74 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20  t bRunExtraInit 
1320: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
1340: 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  tra initializati
1350: 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65 6e  on needed */.#en
1360: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1370: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63  TE_OMIT_WSD.  rc
1380: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
1390: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
13a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13b0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
13c0: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
13d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 6f 6c  .  /* If the fol
13e0: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20  lowing assert() 
13f0: 66 61 69 6c 73 20 6f 6e 20 73 6f 6d 65 20 6f 62  fails on some ob
1400: 73 63 75 72 65 20 70 72 6f 63 65 73 73 6f 72 2f  scure processor/
1410: 63 6f 6d 70 69 6c 65 72 0a 20 20 2a 2a 20 63 6f  compiler.  ** co
1420: 6d 62 69 6e 61 74 69 6f 6e 2c 20 74 68 65 20 77  mbination, the w
1430: 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 74 6f  ork-around is to
1440: 20 73 65 74 20 74 68 65 20 63 6f 72 72 65 63 74   set the correct
1450: 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 73 69   pointer.  ** si
1460: 7a 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ze at compile-ti
1470: 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  me using -DSQLIT
1480: 45 5f 50 54 52 53 49 5a 45 3d 6e 20 63 6f 6d 70  E_PTRSIZE=n comp
1490: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
14a0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  */.  assert( SQL
14b0: 49 54 45 5f 50 54 52 53 49 5a 45 3d 3d 73 69 7a  ITE_PTRSIZE==siz
14c0: 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 0a 20  eof(char*) );.. 
14d0: 20 2f 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73   /* If SQLite is
14e0: 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c 65 74   already complet
14f0: 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c  ely initialized,
1500: 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 0a   then this call.
1510: 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
1520: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 73 68 6f  initialize() sho
1530: 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70 2e 20  uld be a no-op. 
1540: 20 42 75 74 20 74 68 65 20 69 6e 69 74 69 61 6c   But the initial
1550: 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d 75 73  ization.  ** mus
1560: 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e 20 20  t be complete.  
1570: 53 6f 20 69 73 49 6e 69 74 20 6d 75 73 74 20 6e  So isInit must n
1580: 6f 74 20 62 65 20 73 65 74 20 75 6e 74 69 6c 20  ot be set until 
1590: 74 68 65 20 76 65 72 79 20 65 6e 64 0a 20 20 2a  the very end.  *
15a0: 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * of this routin
15b0: 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  e..  */.  if( sq
15c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15d0: 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72  g.isInit ) retur
15e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
15f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
1600: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
1610: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   is initialized.
1620: 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 0a    If unable to .
1630: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
1640: 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  the mutex subsys
1650: 74 65 6d 2c 20 72 65 74 75 72 6e 20 65 61 72 6c  tem, return earl
1660: 79 20 77 69 74 68 20 74 68 65 20 65 72 72 6f 72  y with the error
1670: 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 79  ..  ** If the sy
1680: 73 74 65 6d 20 69 73 20 73 6f 20 73 69 63 6b 20  stem is so sick 
1690: 74 68 61 74 20 77 65 20 61 72 65 20 75 6e 61 62  that we are unab
16a0: 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61  le to allocate a
16b0: 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20 74 68 65   mutex,.  ** the
16c0: 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 53  re is not much S
16d0: 51 4c 69 74 65 20 69 73 20 67 6f 69 6e 67 20 74  QLite is going t
16e0: 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 2e  o be able to do.
16f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d  .  **.  ** The m
1700: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 20 6d  utex subsystem m
1710: 75 73 74 20 74 61 6b 65 20 63 61 72 65 20 6f 66  ust take care of
1720: 20 73 65 72 69 61 6c 69 7a 69 6e 67 20 69 74 73   serializing its
1730: 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69 74 69 61   own.  ** initia
1740: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  lization..  */. 
1750: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 75 74   rc = sqlite3Mut
1760: 65 78 49 6e 69 74 28 29 3b 0a 20 20 69 66 28 20  exInit();.  if( 
1770: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1780: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1790: 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20 73 79   the malloc() sy
17a0: 73 74 65 6d 20 61 6e 64 20 74 68 65 20 72 65 63  stem and the rec
17b0: 75 72 73 69 76 65 20 70 49 6e 69 74 4d 75 74 65  ursive pInitMute
17c0: 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a 20 54 68  x mutex..  ** Th
17d0: 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  is operation is 
17e0: 70 72 6f 74 65 63 74 65 64 20 62 79 20 74 68 65  protected by the
17f0: 20 53 54 41 54 49 43 5f 4d 41 53 54 45 52 20 6d   STATIC_MASTER m
1800: 75 74 65 78 2e 20 20 4e 6f 74 65 20 74 68 61 74  utex.  Note that
1810: 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c 6c 6f 63  .  ** MutexAlloc
1820: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  () is called for
1830: 20 61 20 73 74 61 74 69 63 20 6d 75 74 65 78 20   a static mutex 
1840: 70 72 69 6f 72 20 74 6f 20 69 6e 69 74 69 61 6c  prior to initial
1850: 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 6d  izing the.  ** m
1860: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20  alloc subsystem 
1870: 2d 20 74 68 69 73 20 69 6d 70 6c 69 65 73 20 74  - this implies t
1880: 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  hat the allocati
1890: 6f 6e 20 6f 66 20 61 20 73 74 61 74 69 63 0a 20  on of a static. 
18a0: 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74 20 6e   ** mutex must n
18b0: 6f 74 20 72 65 71 75 69 72 65 20 73 75 70 70 6f  ot require suppo
18c0: 72 74 20 66 72 6f 6d 20 74 68 65 20 6d 61 6c 6c  rt from the mall
18d0: 6f 63 20 73 75 62 73 79 73 74 65 6d 2e 0a 20 20  oc subsystem..  
18e0: 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  */.  MUTEX_LOGIC
18f0: 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69  ( pMaster = sqli
1900: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
1910: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
1920: 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73  C_MASTER); ).  s
1930: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1940: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
1950: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1960: 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d  ig.isMutexInit =
1970: 20 31 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   1;.  if( !sqlit
1980: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1990: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
19a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d     rc = sqlite3M
19b0: 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a 20 20 7d  allocInit();.  }
19c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
19e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
19f0: 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 31  isMallocInit = 1
1a00: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
1a10: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1a20: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
1a30: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1a40: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
1a50: 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 73  x =.           s
1a60: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1a70: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
1a80: 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 20 20  CURSIVE);.      
1a90: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1aa0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
1ab0: 65 78 20 26 26 20 21 73 71 6c 69 74 65 33 47 6c  ex && !sqlite3Gl
1ac0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1ad0: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
1ae0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1af0: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
1b00: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
1b10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b20: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1b30: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
1b40: 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ex++;.  }.  sqli
1b50: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1b60: 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pMaster);..  /* 
1b70: 49 66 20 72 63 20 69 73 20 6e 6f 74 20 53 51 4c  If rc is not SQL
1b80: 49 54 45 5f 4f 4b 20 61 74 20 74 68 69 73 20 70  ITE_OK at this p
1b90: 6f 69 6e 74 2c 20 74 68 65 6e 20 65 69 74 68 65  oint, then eithe
1ba0: 72 20 74 68 65 20 6d 61 6c 6c 6f 63 0a 20 20 2a  r the malloc.  *
1bb0: 2a 20 73 75 62 73 79 73 74 65 6d 20 63 6f 75 6c  * subsystem coul
1bc0: 64 20 6e 6f 74 20 62 65 20 69 6e 69 74 69 61 6c  d not be initial
1bd0: 69 7a 65 64 20 6f 72 20 74 68 65 20 73 79 73 74  ized or the syst
1be0: 65 6d 20 66 61 69 6c 65 64 20 74 6f 20 61 6c 6c  em failed to all
1bf0: 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70  ocate.  ** the p
1c00: 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65 78 2e  InitMutex mutex.
1c10: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
1c20: 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e   in either case.
1c30: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53    */.  if( rc!=S
1c40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c50: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1c60: 20 20 2f 2a 20 44 6f 20 74 68 65 20 72 65 73 74    /* Do the rest
1c70: 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
1c80: 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20 74 68 65  zation under the
1c90: 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78   recursive mutex
1ca0: 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 77 65   so.  ** that we
1cb0: 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1cc0: 20 68 61 6e 64 6c 65 20 72 65 63 75 72 73 69 76   handle recursiv
1cd0: 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a 20 20 2a  e calls into.  *
1ce0: 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  * sqlite3_initia
1cf0: 6c 69 7a 65 28 29 2e 20 20 54 68 65 20 72 65 63  lize().  The rec
1d00: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6e 6f 72  ursive calls nor
1d10: 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68 72 6f 75  mally come throu
1d20: 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  gh.  ** sqlite3_
1d30: 6f 73 5f 69 6e 69 74 28 29 20 77 68 65 6e 20 69  os_init() when i
1d40: 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65  t invokes sqlite
1d50: 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 29  3_vfs_register()
1d60: 2c 20 62 75 74 20 6f 74 68 65 72 0a 20 20 2a 2a  , but other.  **
1d70: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1d80: 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 70   might also be p
1d90: 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  ossible..  **.  
1da0: 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
1db0: 4e 2d 4f 46 3a 20 52 2d 30 30 31 34 30 2d 33 37  N-OF: R-00140-37
1dc0: 34 34 35 20 53 51 4c 69 74 65 20 61 75 74 6f 6d  445 SQLite autom
1dd0: 61 74 69 63 61 6c 6c 79 20 73 65 72 69 61 6c 69  atically seriali
1de0: 7a 65 73 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 74  zes calls.  ** t
1df0: 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68  o the xInit meth
1e00: 6f 64 2c 20 73 6f 20 74 68 65 20 78 49 6e 69 74  od, so the xInit
1e10: 20 6d 65 74 68 6f 64 20 6e 65 65 64 20 6e 6f 74   method need not
1e20: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2e 0a   be threadsafe..
1e30: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f    **.  ** The fo
1e40: 6c 6c 6f 77 69 6e 67 20 6d 75 74 65 78 20 69 73  llowing mutex is
1e50: 20 77 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73   what serializes
1e60: 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 61   access to the a
1e70: 70 70 64 65 66 20 70 63 61 63 68 65 20 78 49 6e  ppdef pcache xIn
1e80: 69 74 0a 20 20 2a 2a 20 6d 65 74 68 6f 64 73 2e  it.  ** methods.
1e90: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 70 63    The sqlite3_pc
1ea0: 61 63 68 65 5f 6d 65 74 68 6f 64 73 2e 78 49 6e  ache_methods.xIn
1eb0: 69 74 28 29 20 61 6c 6c 20 69 73 20 65 6d 62 65  it() all is embe
1ec0: 64 64 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a  dded in the.  **
1ed0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1ee0: 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65  PcacheInitialize
1ef0: 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ()..  */.  sqlit
1f00: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
1f10: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1f20: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a  ig.pInitMutex);.
1f30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1f40: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
1f50: 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 47 6c  ==0 && sqlite3Gl
1f60: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
1f70: 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20  gress==0 ){.    
1f80: 46 75 6e 63 44 65 66 48 61 73 68 20 2a 70 48 61  FuncDefHash *pHa
1f90: 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28 46 75 6e  sh = &GLOBAL(Fun
1fa0: 63 44 65 66 48 61 73 68 2c 20 73 71 6c 69 74 65  cDefHash, sqlite
1fb0: 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73  3GlobalFunctions
1fc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
1fd0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
1fe0: 67 72 65 73 73 20 3d 20 31 3b 0a 23 69 66 64 65  gress = 1;.#ifde
1ff0: 66 20 53 51 4c 49 54 45 5f 49 4e 49 54 5f 53 51  f SQLITE_INIT_SQ
2000: 4c 4c 4f 47 0a 20 20 20 20 7b 0a 20 20 20 20 20  LLOG.    {.     
2010: 20 65 78 74 65 72 6e 20 76 6f 69 64 20 53 51 4c   extern void SQL
2020: 49 54 45 5f 49 4e 49 54 5f 53 51 4c 4c 4f 47 28  ITE_INIT_SQLLOG(
2030: 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 53 51 4c  void);.      SQL
2040: 49 54 45 5f 49 4e 49 54 5f 53 51 4c 4c 4f 47 28  ITE_INIT_SQLLOG(
2050: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2060: 20 20 20 20 6d 65 6d 73 65 74 28 70 48 61 73 68      memset(pHash
2070: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
2080: 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f  te3GlobalFunctio
2090: 6e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ns));.    sqlite
20a0: 33 52 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46  3RegisterGlobalF
20b0: 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20  unctions();.    
20c0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
20d0: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
20e0: 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Init==0 ){.     
20f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
2100: 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b  cheInitialize();
2110: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2120: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2130: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2140: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
2150: 68 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20  heInit = 1;.    
2160: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2170: 49 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20  Init();.    }.  
2180: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2190: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
21a0: 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65 72  ite3PCacheBuffer
21b0: 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c  Setup( sqlite3Gl
21c0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65  obalConfig.pPage
21d0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
21e0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
21f0: 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33  .szPage, sqlite3
2200: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61  GlobalConfig.nPa
2210: 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ge);.      sqlit
2220: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2230: 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64 65  sInit = 1;.#ifde
2240: 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  f SQLITE_EXTRA_I
2250: 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45 78  NIT.      bRunEx
2260: 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65 6e  traInit = 1;.#en
2270: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  dif.    }.    sq
2280: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2290: 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30  g.inProgress = 0
22a0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
22b0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
22c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
22d0: 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20  pInitMutex);..  
22e0: 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72  /* Go back under
22f0: 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74 65   the static mute
2300: 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74  x and clean up t
2310: 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a  he recursive.  *
2320: 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65  * mutex to preve
2330: 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65  nt a resource le
2340: 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ak..  */.  sqlit
2350: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
2360: 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  Master);.  sqlit
2370: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2380: 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a  RefInitMutex--;.
2390: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
23a0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
23b0: 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20  itMutex<=0 ){.  
23c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
23d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
23e0: 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29  efInitMutex==0 )
23f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
2400: 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33  tex_free(sqlite3
2410: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
2420: 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71  itMutex);.    sq
2430: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2440: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30  g.pInitMutex = 0
2450: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
2460: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
2470: 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ter);..  /* The 
2480: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73  following is jus
2490: 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  t a sanity check
24a0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51   to make sure SQ
24b0: 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65  Lite has.  ** be
24c0: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72  en compiled corr
24d0: 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d  ectly.  It is im
24e0: 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74  portant to run t
24f0: 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20  his code, but.  
2500: 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
2510: 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f   to run it too o
2520: 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70  ften and soak up
2530: 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20   CPU cycles for 
2540: 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20  no.  ** reason. 
2550: 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e   So we run it on
2560: 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61  ce during initia
2570: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  lization..  */.#
2580: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69  ifndef NDEBUG.#i
2590: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
25a0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
25b0: 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69  .  /* This secti
25c0: 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c  on of code's onl
25d0: 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76 69  y "output" is vi
25e0: 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  a assert() state
25f0: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28  ments. */.  if (
2600: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2610: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
2620: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
2630: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
2640: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
2650: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
2660: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
2670: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
2680: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
2690: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
26a0: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
26b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
26c0: 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
26d0: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
26e0: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
26f0: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
2700: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
2710: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
2720: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
2730: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
2740: 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61  .  if( bRunExtra
2750: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
2760: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2770: 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  T(const char*);.
2780: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2790: 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20  EXTRA_INIT(0);. 
27a0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
27b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
27c0: 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74   Undo the effect
27d0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69  s of sqlite3_ini
27e0: 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74  tialize().  Must
27f0: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77   not be called w
2800: 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72  hile.** there ar
2810: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61  e outstanding da
2820: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2830: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
2840: 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77  ocations or.** w
2850: 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66  hile any part of
2860: 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72   SQLite is other
2870: 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61  wise in use in a
2880: 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73  ny thread.  This
2890: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  .** routine is n
28a0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
28b0: 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74  But it is safe t
28c0: 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  o invoke this ro
28d0: 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e  utine.** on when
28e0: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
28f0: 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49  dy shut down.  I
2900: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
2910: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a  ady shut down.**
2920: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2930: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  ne is invoked, t
2940: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2950: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2960: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
2970: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
2980: 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  id){.#ifdef SQLI
2990: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 69 6e  TE_OMIT_WSD.  in
29a0: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77  t rc = sqlite3_w
29b0: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
29c0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
29d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
29e0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
29f0: 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
2a00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2a10: 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20  sInit ){.#ifdef 
2a20: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2a30: 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53  TDOWN.    void S
2a40: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
2a50: 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20  DOWN(void);.    
2a60: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2a70: 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a  TDOWN();.#endif.
2a80: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65      sqlite3_os_e
2a90: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2aa0: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2ab0: 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71  ension();.    sq
2ac0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2ad0: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
2ae0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2af0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
2b00: 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20  acheInit ){.    
2b10: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
2b20: 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c  tdown();.    sql
2b30: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2b40: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2b50: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2b60: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2b70: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
2b80: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
2b90: 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  ocEnd();.    sql
2ba0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2bb0: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20  .isMallocInit = 
2bc0: 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2bd0: 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e  TE_OMIT_SHUTDOWN
2be0: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20  _DIRECTORIES.   
2bf0: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62   /* The heap sub
2c00: 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62  system has now b
2c10: 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64  een shutdown and
2c20: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   these values ar
2c30: 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a  e supposed.    *
2c40: 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20  * to be NULL or 
2c50: 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20  point to memory 
2c60: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
2c70: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2c80: 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20  alloc(),.    ** 
2c90: 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79  which would rely
2ca0: 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75   on that heap su
2cb0: 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f  bsystem; therefo
2cc0: 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  re, make sure th
2cd0: 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ese.    ** value
2ce0: 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74  s cannot refer t
2cf0: 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68  o heap memory th
2d00: 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61  at was just inva
2d10: 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  lidated when the
2d20: 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62  .    ** heap sub
2d30: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
2d40: 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  own.  This is on
2d50: 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63  ly done if the c
2d60: 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  urrent call to. 
2d70: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2d80: 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ion resulted in 
2d90: 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  the heap subsyst
2da0: 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  em actually bein
2db0: 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20  g shutdown..    
2dc0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  */.    sqlite3_d
2dd0: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
2de0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  0;.    sqlite3_t
2df0: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
2e00: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
2e10: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2e20: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2e30: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2e40: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2e50: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2e60: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2e70: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2e80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2e90: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2ea0: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
2eb0: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
2ec0: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
2ed0: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
2ee0: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
2ef0: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
2f00: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2f10: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
2f20: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
2f30: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
2f40: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
2f50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
2f60: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2f70: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
2f80: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
2f90: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
2fa0: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
2fb0: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
2fc0: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
2fd0: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
2fe0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
2ff0: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
3000: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
3010: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
3020: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
3030: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
3040: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
3050: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
3060: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
3070: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
3080: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
3090: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
30a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
30b0: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
30c0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
30d0: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
30e0: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
30f0: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
3100: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
3110: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
3120: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
3130: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
3140: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
3150: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  .    */.#if defi
3160: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
3170: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3180: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f  _THREADSAFE>0  /
3190: 2a 20 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34  * IMP: R-54466-4
31a0: 36 37 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65  6756 */.    case
31b0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
31c0: 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20  INGLETHREAD: {. 
31d0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
31e0: 2d 4f 46 3a 20 52 2d 30 32 37 34 38 2d 31 39 30  -OF: R-02748-190
31f0: 39 36 20 54 68 69 73 20 6f 70 74 69 6f 6e 20 73  96 This option s
3200: 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69 6e  ets the threadin
3210: 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20 20  g mode to.      
3220: 2a 2a 20 53 69 6e 67 6c 65 2d 74 68 72 65 61 64  ** Single-thread
3230: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
3240: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
3250: 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 20 20  CoreMutex = 0;  
3260: 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78  /* Disable mutex
3270: 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20   on core */.    
3280: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3290: 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
32a0: 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c   = 0;  /* Disabl
32b0: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65  e mutex on conne
32c0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ctions */.      
32d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
32e0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
32f0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3300: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3310: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
3320: 3a 20 52 2d 32 30 35 32 30 2d 35 34 30 38 36 20  : R-20520-54086 
3330: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3340: 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54  TE_CONFIG_MULTIT
3350: 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f  HREAD: {.      /
3360: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
3370: 2d 31 34 33 37 34 2d 34 32 34 36 38 20 54 68 69  -14374-42468 Thi
3380: 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68  s option sets th
3390: 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65  e threading mode
33a0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 4d 75 6c   to.      ** Mul
33b0: 74 69 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20  ti-thread. */.  
33c0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
33d0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
33e0: 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62  ex = 1;  /* Enab
33f0: 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65  le mutex on core
3400: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3410: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
3420: 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f  ullMutex = 0;  /
3430: 2a 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20  * Disable mutex 
3440: 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  on connections *
3450: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
3460: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
3470: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
3480: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
3490: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
34a0: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 39 35 39  0 /* IMP: R-5959
34b0: 33 2d 32 31 38 31 30 20 2a 2f 0a 20 20 20 20 63  3-21810 */.    c
34c0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
34d0: 47 5f 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a  G_SERIALIZED: {.
34e0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
34f0: 45 2d 4f 46 3a 20 52 2d 34 31 32 32 30 2d 35 31  E-OF: R-41220-51
3500: 38 30 30 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  800 This option 
3510: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
3520: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3530: 20 2a 2a 20 53 65 72 69 61 6c 69 7a 65 64 2e 20   ** Serialized. 
3540: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3550: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
3560: 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a  reMutex = 1;  /*
3570: 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e   Enable mutex on
3580: 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73   core */.      s
3590: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
35a0: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
35b0: 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75  1;  /* Enable mu
35c0: 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f  tex on connectio
35d0: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ns */.      brea
35e0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
35f0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3600: 54 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26  TE_THREADSAFE) &
3610: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  & SQLITE_THREADS
3620: 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d  AFE>0 /* IMP: R-
3630: 36 33 36 36 36 2d 34 38 37 35 35 20 2a 2f 0a 20  63666-48755 */. 
3640: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3650: 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20  ONFIG_MUTEX: {. 
3660: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
3670: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  an alternative m
3680: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
3690: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ion */.      sql
36a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
36b0: 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67  .mutex = *va_arg
36c0: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74  (ap, sqlite3_mut
36d0: 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20  ex_methods*);.  
36e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
36f0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
3700: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
3710: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
3720: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a  _THREADSAFE>0 /*
3730: 20 49 4d 50 3a 20 52 2d 31 34 34 35 30 2d 33 37   IMP: R-14450-37
3740: 35 39 37 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  597 */.    case 
3750: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
3760: 54 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20  TMUTEX: {.      
3770: 2f 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20  /* Retrieve the 
3780: 63 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d  current mutex im
3790: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  plementation */.
37a0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
37b0: 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  , sqlite3_mutex_
37c0: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
37d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
37e0: 6d 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65  mutex;.      bre
37f0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
3800: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
3810: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a  E_CONFIG_MALLOC:
3820: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3830: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 39 34  ENCE-OF: R-55594
3840: 2d 32 31 30 33 30 20 54 68 65 20 53 51 4c 49 54  -21030 The SQLIT
3850: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 20  E_CONFIG_MALLOC 
3860: 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20  option takes a. 
3870: 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61       ** single a
3880: 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73  rgument which is
3890: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
38a0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
38b0: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
38c0: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74  3_mem_methods st
38d0: 72 75 63 74 75 72 65 2e 20 54 68 65 20 61 72 67  ructure. The arg
38e0: 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65 73 20  ument specifies 
38f0: 61 6c 74 65 72 6e 61 74 69 76 65 0a 20 20 20 20  alternative.    
3900: 20 20 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d    ** low-level m
3910: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
3920: 20 72 6f 75 74 69 6e 65 73 20 74 6f 20 62 65 20   routines to be 
3930: 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66  used in place of
3940: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 20 20 20 20   the memory.    
3950: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20    ** allocation 
3960: 72 6f 75 74 69 6e 65 73 20 62 75 69 6c 74 20 69  routines built i
3970: 6e 74 6f 20 53 51 4c 69 74 65 2e 20 2a 2f 0a 20  nto SQLite. */. 
3980: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3990: 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61  alConfig.m = *va
39a0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
39b0: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a  _mem_methods*);.
39c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
39d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
39e0: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c  TE_CONFIG_GETMAL
39f0: 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOC: {.      /* 
3a00: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
3a10: 31 32 31 33 2d 34 36 34 31 34 20 54 68 65 20 53  1213-46414 The S
3a20: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3a30: 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61  MALLOC option ta
3a40: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
3a50: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
3a60: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
3a70: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
3a80: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
3a90: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
3aa0: 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20  hods structure. 
3ab0: 54 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  The sqlite3_mem_
3ac0: 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75 72  methods structur
3ad0: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 66 69  e is.      ** fi
3ae0: 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 75  lled with the cu
3af0: 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20  rrently defined 
3b00: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
3b10: 6e 20 72 6f 75 74 69 6e 65 73 2e 20 2a 2f 0a 20  n routines. */. 
3b20: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3b30: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78  GlobalConfig.m.x
3b40: 4d 61 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69  Malloc==0 ) sqli
3b50: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
3b60: 28 29 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72  ();.      *va_ar
3b70: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
3b80: 6d 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71  m_methods*) = sq
3b90: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3ba0: 67 2e 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  g.m;.      break
3bb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3bc0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
3bd0: 45 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20  EMSTATUS: {.    
3be0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
3bf0: 3a 20 52 2d 36 31 32 37 35 2d 33 35 31 35 37 20  : R-61275-35157 
3c00: 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  The SQLITE_CONFI
3c10: 47 5f 4d 45 4d 53 54 41 54 55 53 20 6f 70 74 69  G_MEMSTATUS opti
3c20: 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a  on takes.      *
3c30: 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  * single argumen
3c40: 74 20 6f 66 20 74 79 70 65 20 69 6e 74 2c 20 69  t of type int, i
3c50: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61 20  nterpreted as a 
3c60: 62 6f 6f 6c 65 61 6e 2c 20 77 68 69 63 68 20 65  boolean, which e
3c70: 6e 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20  nables.      ** 
3c80: 6f 72 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  or disables the 
3c90: 63 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66 20 6d 65  collection of me
3ca0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
3cb0: 73 74 61 74 69 73 74 69 63 73 2e 20 2a 2f 0a 20  statistics. */. 
3cc0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3cd0: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
3ce0: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
3cf0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
3d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3d10: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
3d20: 43 52 41 54 43 48 3a 20 7b 0a 20 20 20 20 20 20  CRATCH: {.      
3d30: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
3d40: 52 2d 30 38 34 30 34 2d 36 30 38 38 37 20 54 68  R-08404-60887 Th
3d50: 65 72 65 20 61 72 65 20 74 68 72 65 65 20 61 72  ere are three ar
3d60: 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20  guments to.     
3d70: 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   ** SQLITE_CONFI
3d80: 47 5f 53 43 52 41 54 43 48 3a 20 41 20 70 6f 69  G_SCRATCH: A poi
3d90: 6e 74 65 72 20 61 6e 20 38 2d 62 79 74 65 20 61  nter an 8-byte a
3da0: 6c 69 67 6e 65 64 20 6d 65 6d 6f 72 79 20 62 75  ligned memory bu
3db0: 66 66 65 72 20 66 72 6f 6d 0a 20 20 20 20 20 20  ffer from.      
3dc0: 2a 2a 20 77 68 69 63 68 20 74 68 65 20 73 63 72  ** which the scr
3dd0: 61 74 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  atch allocations
3de0: 20 77 69 6c 6c 20 62 65 20 64 72 61 77 6e 2c 20   will be drawn, 
3df0: 74 68 65 20 73 69 7a 65 20 6f 66 20 65 61 63 68  the size of each
3e00: 20 73 63 72 61 74 63 68 0a 20 20 20 20 20 20 2a   scratch.      *
3e10: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 28 73 7a  * allocation (sz
3e20: 29 2c 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  ), and the maxim
3e30: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 73 63 72  um number of scr
3e40: 61 74 63 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  atch allocations
3e50: 20 28 4e 29 2e 20 2a 2f 0a 20 20 20 20 20 20 73   (N). */.      s
3e60: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3e70: 69 67 2e 70 53 63 72 61 74 63 68 20 3d 20 76 61  ig.pScratch = va
3e80: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
3e90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3ea0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72  obalConfig.szScr
3eb0: 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70  atch = va_arg(ap
3ec0: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
3ed0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3ee0: 67 2e 6e 53 63 72 61 74 63 68 20 3d 20 76 61 5f  g.nScratch = va_
3ef0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
3f00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3f10: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3f20: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
3f30: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  E: {.      /* EV
3f40: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31 34  IDENCE-OF: R-314
3f50: 30 38 2d 34 30 35 31 30 20 54 68 65 72 65 20 61  08-40510 There a
3f60: 72 65 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e  re three argumen
3f70: 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53  ts to.      ** S
3f80: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47  QLITE_CONFIG_PAG
3f90: 45 43 41 43 48 45 3a 20 41 20 70 6f 69 6e 74 65  ECACHE: A pointe
3fa0: 72 20 74 6f 20 38 2d 62 79 74 65 20 61 6c 69 67  r to 8-byte alig
3fb0: 6e 65 64 20 6d 65 6d 6f 72 79 2c 20 74 68 65 20  ned memory, the 
3fc0: 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  size.      ** of
3fd0: 20 65 61 63 68 20 70 61 67 65 20 62 75 66 66 65   each page buffe
3fe0: 72 20 28 73 7a 29 2c 20 61 6e 64 20 74 68 65 20  r (sz), and the 
3ff0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
4000: 28 4e 29 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  (N). */.      sq
4010: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4020: 67 2e 70 50 61 67 65 20 3d 20 76 61 5f 61 72 67  g.pPage = va_arg
4030: 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20  (ap, void*);.   
4040: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4050: 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d 20  Config.szPage = 
4060: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
4070: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4080: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65  obalConfig.nPage
4090: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
40a0: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
40b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
40c0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43  SQLITE_CONFIG_PC
40d0: 41 43 48 45 5f 48 44 52 53 5a 3a 20 7b 0a 20 20  ACHE_HDRSZ: {.  
40e0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
40f0: 4f 46 3a 20 52 2d 33 39 31 30 30 2d 32 37 33 31  OF: R-39100-2731
4100: 37 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  7 The SQLITE_CON
4110: 46 49 47 5f 50 43 41 43 48 45 5f 48 44 52 53 5a  FIG_PCACHE_HDRSZ
4120: 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a 20 20   option takes.  
4130: 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20      ** a single 
4140: 70 61 72 61 6d 65 74 65 72 20 77 68 69 63 68 20  parameter which 
4150: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
4160: 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 20 77  an integer and w
4170: 72 69 74 65 73 20 69 6e 74 6f 0a 20 20 20 20 20  rites into.     
4180: 20 2a 2a 20 74 68 61 74 20 69 6e 74 65 67 65 72   ** that integer
4190: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
41a0: 78 74 72 61 20 62 79 74 65 73 20 70 65 72 20 70  xtra bytes per p
41b0: 61 67 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  age required for
41c0: 20 65 61 63 68 20 70 61 67 65 0a 20 20 20 20 20   each page.     
41d0: 20 2a 2a 20 69 6e 20 53 51 4c 49 54 45 5f 43 4f   ** in SQLITE_CO
41e0: 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 2e 20  NFIG_PAGECACHE. 
41f0: 2a 2f 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67  */.      *va_arg
4200: 28 61 70 2c 20 69 6e 74 2a 29 20 3d 20 0a 20 20  (ap, int*) = .  
4210: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
4220: 65 61 64 65 72 53 69 7a 65 42 74 72 65 65 28 29  eaderSizeBtree()
4230: 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   +.          sql
4240: 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 50 63  ite3HeaderSizePc
4250: 61 63 68 65 28 29 20 2b 0a 20 20 20 20 20 20 20  ache() +.       
4260: 20 20 20 73 71 6c 69 74 65 33 48 65 61 64 65 72     sqlite3Header
4270: 53 69 7a 65 50 63 61 63 68 65 31 28 29 3b 0a 20  SizePcache1();. 
4280: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4290: 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  }..    case SQLI
42a0: 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45  TE_CONFIG_PCACHE
42b0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d  : {.      /* no-
42c0: 6f 70 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  op */.      brea
42d0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
42e0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
42f0: 47 45 54 50 43 41 43 48 45 3a 20 7b 0a 20 20 20  GETPCACHE: {.   
4300: 20 20 20 2f 2a 20 6e 6f 77 20 61 6e 20 65 72 72     /* now an err
4310: 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  or */.      rc =
4320: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
4330: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4340: 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  }..    case SQLI
4350: 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45  TE_CONFIG_PCACHE
4360: 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  2: {.      /* EV
4370: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 33  IDENCE-OF: R-633
4380: 32 35 2d 34 38 33 37 38 20 54 68 65 20 53 51 4c  25-48378 The SQL
4390: 49 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48  ITE_CONFIG_PCACH
43a0: 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  E2 option takes 
43b0: 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c  a.      ** singl
43c0: 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68  e argument which
43d0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
43e0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 70 63 61 63   an sqlite3_pcac
43f0: 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20 20  he_methods2.    
4400: 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 54 68 69    ** object. Thi
4410: 73 20 6f 62 6a 65 63 74 20 73 70 65 63 69 66 69  s object specifi
4420: 65 73 20 74 68 65 20 69 6e 74 65 72 66 61 63 65  es the interface
4430: 20 74 6f 20 61 20 63 75 73 74 6f 6d 20 70 61 67   to a custom pag
4440: 65 20 63 61 63 68 65 0a 20 20 20 20 20 20 2a 2a  e cache.      **
4450: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
4460: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
4470: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63  3GlobalConfig.pc
4480: 61 63 68 65 32 20 3d 20 2a 76 61 5f 61 72 67 28  ache2 = *va_arg(
4490: 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63  ap, sqlite3_pcac
44a0: 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29 3b 0a 20  he_methods2*);. 
44b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
44c0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
44d0: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43  E_CONFIG_GETPCAC
44e0: 48 45 32 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  HE2: {.      /* 
44f0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
4500: 32 30 33 35 2d 34 36 31 38 32 20 54 68 65 20 53  2035-46182 The S
4510: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
4520: 50 43 41 43 48 45 32 20 6f 70 74 69 6f 6e 20 74  PCACHE2 option t
4530: 61 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20  akes a.      ** 
4540: 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
4550: 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74  which is a point
4560: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
4570: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32  _pcache_methods2
4580: 0a 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74  .      ** object
4590: 2e 20 53 51 4c 69 74 65 20 63 6f 70 69 65 73 20  . SQLite copies 
45a0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  of the current p
45b0: 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d  age cache implem
45c0: 65 6e 74 61 74 69 6f 6e 20 69 6e 74 6f 0a 20 20  entation into.  
45d0: 20 20 20 20 2a 2a 20 74 68 61 74 20 6f 62 6a 65      ** that obje
45e0: 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ct. */.      if(
45f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4600: 6e 66 69 67 2e 70 63 61 63 68 65 32 2e 78 49 6e  nfig.pcache2.xIn
4610: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
4620: 20 73 71 6c 69 74 65 33 50 43 61 63 68 65 53 65   sqlite3PCacheSe
4630: 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20  tDefault();.    
4640: 20 20 7d 0a 20 20 20 20 20 20 2a 76 61 5f 61 72    }.      *va_ar
4650: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 70 63  g(ap, sqlite3_pc
4660: 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a 29 20  ache_methods2*) 
4670: 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
4680: 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 3b 0a 20  onfig.pcache2;. 
4690: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
46a0: 7d 0a 0a 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  }../* EVIDENCE-O
46b0: 46 3a 20 52 2d 30 36 36 32 36 2d 31 32 39 31 31  F: R-06626-12911
46c0: 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46   The SQLITE_CONF
46d0: 49 47 5f 48 45 41 50 20 6f 70 74 69 6f 6e 20 69  IG_HEAP option i
46e0: 73 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c 61  s only.** availa
46f0: 62 6c 65 20 69 66 20 53 51 4c 69 74 65 20 69 73  ble if SQLite is
4700: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 65   compiled with e
4710: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 45 4e 41  ither SQLITE_ENA
4720: 42 4c 45 5f 4d 45 4d 53 59 53 33 20 6f 72 0a 2a  BLE_MEMSYS3 or.*
4730: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
4740: 4d 45 4d 53 59 53 35 20 61 6e 64 20 72 65 74 75  MEMSYS5 and retu
4750: 72 6e 73 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  rns SQLITE_ERROR
4760: 20 69 66 20 69 6e 76 6f 6b 65 64 20 6f 74 68 65   if invoked othe
4770: 72 77 69 73 65 2e 20 2a 2f 0a 23 69 66 20 64 65  rwise. */.#if de
4780: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
4790: 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20  BLE_MEMSYS3) || 
47a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
47b0: 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20  NABLE_MEMSYS5). 
47c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
47d0: 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20 20  ONFIG_HEAP: {.  
47e0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
47f0: 4f 46 3a 20 52 2d 31 39 38 35 34 2d 34 32 31 32  OF: R-19854-4212
4800: 36 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65  6 There are thre
4810: 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20  e arguments to. 
4820: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43       ** SQLITE_C
4830: 4f 4e 46 49 47 5f 48 45 41 50 3a 20 41 6e 20 38  ONFIG_HEAP: An 8
4840: 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 70 6f  -byte aligned po
4850: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6d 65 6d  inter to the mem
4860: 6f 72 79 2c 20 74 68 65 0a 20 20 20 20 20 20 2a  ory, the.      *
4870: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * number of byte
4880: 73 20 69 6e 20 74 68 65 20 6d 65 6d 6f 72 79 20  s in the memory 
4890: 62 75 66 66 65 72 2c 20 61 6e 64 20 74 68 65 20  buffer, and the 
48a0: 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 69  minimum allocati
48b0: 6f 6e 20 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a  on size..      *
48c0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
48d0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61  lobalConfig.pHea
48e0: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  p = va_arg(ap, v
48f0: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  oid*);.      sql
4900: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4910: 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .nHeap = va_arg(
4920: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
4930: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4940: 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61  fig.mnReq = va_a
4950: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20  rg(ap, int);..  
4960: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
4970: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65  lobalConfig.mnRe
4980: 71 3c 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  q<1 ){.        s
4990: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
49a0: 69 67 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20 20  ig.mnReq = 1;.  
49b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
49c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
49d0: 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29 20  g.mnReq>(1<<12) 
49e0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 61  ){.        /* ca
49f0: 70 20 6d 69 6e 20 72 65 71 75 65 73 74 20 73 69  p min request si
4a00: 7a 65 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20 20  ze at 2^12 */.  
4a10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4a20: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20  balConfig.mnReq 
4a30: 3d 20 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20 20  = (1<<12);.     
4a40: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71   }..      if( sq
4a50: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4a60: 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20  g.pHeap==0 ){.  
4a70: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
4a80: 45 2d 4f 46 3a 20 52 2d 34 39 39 32 30 2d 36 30  E-OF: R-49920-60
4a90: 31 38 39 20 49 66 20 74 68 65 20 66 69 72 73 74  189 If the first
4aa0: 20 70 6f 69 6e 74 65 72 20 28 74 68 65 20 6d 65   pointer (the me
4ab0: 6d 6f 72 79 20 70 6f 69 6e 74 65 72 29 0a 20 20  mory pointer).  
4ac0: 20 20 20 20 20 20 2a 2a 20 69 73 20 4e 55 4c 4c        ** is NULL
4ad0: 2c 20 74 68 65 6e 20 53 51 4c 69 74 65 20 72 65  , then SQLite re
4ae0: 76 65 72 74 73 20 74 6f 20 75 73 69 6e 67 20 69  verts to using i
4af0: 74 73 20 64 65 66 61 75 6c 74 20 6d 65 6d 6f 72  ts default memor
4b00: 79 20 61 6c 6c 6f 63 61 74 6f 72 0a 20 20 20 20  y allocator.    
4b10: 20 20 20 20 2a 2a 20 28 74 68 65 20 73 79 73 74      ** (the syst
4b20: 65 6d 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c  em malloc() impl
4b30: 65 6d 65 6e 74 61 74 69 6f 6e 29 2c 20 75 6e 64  ementation), und
4b40: 6f 69 6e 67 20 61 6e 79 20 70 72 69 6f 72 20 69  oing any prior i
4b50: 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 0a 20 20 20  nvocation of.   
4b60: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 43       ** SQLITE_C
4b70: 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2e 0a 20 20  ONFIG_MALLOC..  
4b80: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
4b90: 20 2a 2a 20 53 65 74 74 69 6e 67 20 73 71 6c 69   ** Setting sqli
4ba0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4bb0: 6d 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 20 77  m to all zeros w
4bc0: 69 6c 6c 20 63 61 75 73 65 20 6d 61 6c 6c 6f 63  ill cause malloc
4bd0: 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 72   to.        ** r
4be0: 65 76 65 72 74 20 74 6f 20 69 74 73 20 64 65 66  evert to its def
4bf0: 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ault implementat
4c00: 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65 33  ion when sqlite3
4c10: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73  _initialize() is
4c20: 20 72 75 6e 0a 20 20 20 20 20 20 20 20 2a 2f 0a   run.        */.
4c30: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
4c40: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4c50: 66 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  fig.m, 0, sizeof
4c60: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  (sqlite3GlobalCo
4c70: 6e 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20  nfig.m));.      
4c80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
4c90: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
4ca0: 2d 36 31 30 30 36 2d 30 38 39 31 38 20 49 66 20  -61006-08918 If 
4cb0: 74 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74  the memory point
4cc0: 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  er is not NULL t
4cd0: 68 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  hen the.        
4ce0: 2a 2a 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  ** alternative m
4cf0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20  emory allocator 
4d00: 69 73 20 65 6e 67 61 67 65 64 20 74 6f 20 68 61  is engaged to ha
4d10: 6e 64 6c 65 20 61 6c 6c 20 6f 66 20 53 51 4c 69  ndle all of SQLi
4d20: 74 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  tes.        ** m
4d30: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
4d40: 20 6e 65 65 64 73 2e 20 2a 2f 0a 23 69 66 64 65   needs. */.#ifde
4d50: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
4d60: 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20 20 20  MEMSYS3.        
4d70: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4d80: 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33  fig.m = *sqlite3
4d90: 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28 29 3b  MemGetMemsys3();
4da0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4db0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
4dc0: 53 59 53 35 0a 20 20 20 20 20 20 20 20 73 71 6c  SYS5.        sql
4dd0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4de0: 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d  .m = *sqlite3Mem
4df0: 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65  GetMemsys5();.#e
4e00: 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
4e10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4e20: 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65  #endif..    case
4e30: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c   SQLITE_CONFIG_L
4e40: 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20  OOKASIDE: {.    
4e50: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4e60: 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64  onfig.szLookasid
4e70: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
4e80: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
4e90: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
4ea0: 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61  Lookaside = va_a
4eb0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
4ec0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4ed0: 20 20 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 6f      .    /* Reco
4ee0: 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rd a pointer to 
4ef0: 74 68 65 20 6c 6f 67 67 65 72 20 66 75 6e 63 74  the logger funct
4f00: 69 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72 73  ion and its firs
4f10: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20  t argument..    
4f20: 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  ** The default i
4f30: 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67  s NULL.  Logging
4f40: 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 66 20   is disabled if 
4f50: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  the function poi
4f60: 6e 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e  nter is.    ** N
4f70: 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ULL..    */.    
4f80: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
4f90: 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20  IG_LOG: {.      
4fa0: 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79  /* MSVC is picky
4fb0: 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66   about pulling f
4fc0: 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61  unc ptrs from va
4fd0: 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a   lists..      **
4fe0: 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e   http://support.
4ff0: 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62  microsoft.com/kb
5000: 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20  /47961.      ** 
5010: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
5020: 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72  fig.xLog = va_ar
5030: 67 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f  g(ap, void(*)(vo
5040: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
5050: 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a  ar*));.      */.
5060: 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
5070: 69 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76  id(*LOGFUNC_t)(v
5080: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63  oid*,int,const c
5090: 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  har*);.      sql
50a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
50b0: 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  .xLog = va_arg(a
50c0: 70 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20  p, LOGFUNC_t);. 
50d0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
50e0: 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67  alConfig.pLogArg
50f0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
5100: 69 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61  id*);.      brea
5110: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
5120: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
5130: 35 35 35 34 38 2d 33 33 38 31 37 20 54 68 65 20  55548-33817 The 
5140: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 73 65 74  compile-time set
5150: 74 69 6e 67 20 66 6f 72 20 55 52 49 20 66 69 6c  ting for URI fil
5160: 65 6e 61 6d 65 73 0a 20 20 20 20 2a 2a 20 63 61  enames.    ** ca
5170: 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 74 20  n be changed at 
5180: 73 74 61 72 74 2d 74 69 6d 65 20 75 73 69 6e 67  start-time using
5190: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69   the.    ** sqli
51a0: 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
51b0: 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 31 29 20  E_CONFIG_URI,1) 
51c0: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
51d0: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
51e0: 43 4f 4e 46 49 47 5f 55 52 49 2c 30 29 20 63 6f  CONFIG_URI,0) co
51f0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 61 6c 6c  nfiguration call
5200: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
5210: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
5220: 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  _URI: {.      /*
5230: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
5240: 32 35 34 35 31 2d 36 31 31 32 35 20 54 68 65 20  25451-61125 The 
5250: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52  SQLITE_CONFIG_UR
5260: 49 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61  I option takes a
5270: 20 73 69 6e 67 6c 65 0a 20 20 20 20 20 20 2a 2a   single.      **
5280: 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 79 70   argument of typ
5290: 65 20 69 6e 74 2e 20 49 66 20 6e 6f 6e 2d 7a 65  e int. If non-ze
52a0: 72 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e  ro, then URI han
52b0: 64 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c  dling is globall
52c0: 79 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c  y.      ** enabl
52d0: 65 64 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d  ed. If the param
52e0: 65 74 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68  eter is zero, th
52f0: 65 6e 20 55 52 49 20 68 61 6e 64 6c 69 6e 67 20  en URI handling 
5300: 69 73 20 67 6c 6f 62 61 6c 6c 79 0a 20 20 20 20  is globally.    
5310: 20 20 2a 2a 20 64 69 73 61 62 6c 65 64 2e 20 2a    ** disabled. *
5320: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
5330: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65  lobalConfig.bOpe
5340: 6e 55 72 69 20 3d 20 76 61 5f 61 72 67 28 61 70  nUri = va_arg(ap
5350: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
5360: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
5370: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
5380: 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44 45  IG_COVERING_INDE
5390: 58 5f 53 43 41 4e 3a 20 7b 0a 20 20 20 20 20 20  X_SCAN: {.      
53a0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
53b0: 52 2d 33 36 35 39 32 2d 30 32 37 37 32 20 54 68  R-36592-02772 Th
53c0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
53d0: 43 4f 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f 53  COVERING_INDEX_S
53e0: 43 41 4e 0a 20 20 20 20 20 20 2a 2a 20 6f 70 74  CAN.      ** opt
53f0: 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e 67  ion takes a sing
5400: 6c 65 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  le integer argum
5410: 65 6e 74 20 77 68 69 63 68 20 69 73 20 69 6e 74  ent which is int
5420: 65 72 70 72 65 74 65 64 20 61 73 20 61 0a 20 20  erpreted as a.  
5430: 20 20 20 20 2a 2a 20 62 6f 6f 6c 65 61 6e 20 69      ** boolean i
5440: 6e 20 6f 72 64 65 72 20 74 6f 20 65 6e 61 62 6c  n order to enabl
5450: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
5460: 20 75 73 65 20 6f 66 20 63 6f 76 65 72 69 6e 67   use of covering
5470: 20 69 6e 64 69 63 65 73 20 66 6f 72 0a 20 20 20   indices for.   
5480: 20 20 20 2a 2a 20 66 75 6c 6c 20 74 61 62 6c 65     ** full table
5490: 20 73 63 61 6e 73 20 69 6e 20 74 68 65 20 71 75   scans in the qu
54a0: 65 72 79 20 6f 70 74 69 6d 69 7a 65 72 2e 20 2a  ery optimizer. *
54b0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
54c0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65  lobalConfig.bUse
54d0: 43 69 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Cis = va_arg(ap,
54e0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
54f0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  ak;.    }..#ifde
5500: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
5510: 53 51 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65 20  SQLLOG.    case 
5520: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51  SQLITE_CONFIG_SQ
5530: 4c 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74 79  LLOG: {.      ty
5540: 70 65 64 65 66 20 76 6f 69 64 28 2a 53 51 4c 4c  pedef void(*SQLL
5550: 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c  OGFUNC_t)(void*,
5560: 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74   sqlite3*, const
5570: 20 63 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20 20   char*, int);.  
5580: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
5590: 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
55a0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 53 51 4c  = va_arg(ap, SQL
55b0: 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20  LOGFUNC_t);.    
55c0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
55d0: 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
55e0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
55f0: 69 64 20 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  id *);.      bre
5600: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
5610: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5620: 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49  E_CONFIG_MMAP_SI
5630: 5a 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  ZE: {.      /* E
5640: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38  VIDENCE-OF: R-58
5650: 30 36 33 2d 33 38 32 35 38 20 53 51 4c 49 54 45  063-38258 SQLITE
5660: 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a  _CONFIG_MMAP_SIZ
5670: 45 20 74 61 6b 65 73 20 74 77 6f 20 36 34 2d 62  E takes two 64-b
5680: 69 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  it.      ** inte
5690: 67 65 72 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  ger (sqlite3_int
56a0: 36 34 29 20 76 61 6c 75 65 73 20 74 68 61 74 20  64) values that 
56b0: 61 72 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  are the default 
56c0: 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d 69 74 0a  mmap size limit.
56d0: 20 20 20 20 20 20 2a 2a 20 28 74 68 65 20 64 65        ** (the de
56e0: 66 61 75 6c 74 20 73 65 74 74 69 6e 67 20 66 6f  fault setting fo
56f0: 72 20 50 52 41 47 4d 41 20 6d 6d 61 70 5f 73 69  r PRAGMA mmap_si
5700: 7a 65 29 20 61 6e 64 20 74 68 65 20 6d 61 78 69  ze) and the maxi
5710: 6d 75 6d 20 61 6c 6c 6f 77 65 64 0a 20 20 20 20  mum allowed.    
5720: 20 20 2a 2a 20 6d 6d 61 70 20 73 69 7a 65 20 6c    ** mmap size l
5730: 69 6d 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 73  imit. */.      s
5740: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
5750: 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  map = va_arg(ap,
5760: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b   sqlite3_int64);
5770: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
5780: 6e 74 36 34 20 6d 78 4d 6d 61 70 20 3d 20 76 61  nt64 mxMmap = va
5790: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
57a0: 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20 20 20 2f  _int64);.      /
57b0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
57c0: 2d 35 33 33 36 37 2d 34 33 31 39 30 20 49 66 20  -53367-43190 If 
57d0: 65 69 74 68 65 72 20 61 72 67 75 6d 65 6e 74 20  either argument 
57e0: 74 6f 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 69  to this option i
57f0: 73 0a 20 20 20 20 20 20 2a 2a 20 6e 65 67 61 74  s.      ** negat
5800: 69 76 65 2c 20 74 68 65 6e 20 74 68 61 74 20 61  ive, then that a
5810: 72 67 75 6d 65 6e 74 20 69 73 20 63 68 61 6e 67  rgument is chang
5820: 65 64 20 74 6f 20 69 74 73 20 63 6f 6d 70 69 6c  ed to its compil
5830: 65 2d 74 69 6d 65 20 64 65 66 61 75 6c 74 2e 0a  e-time default..
5840: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
5850: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5860: 2d 33 34 39 39 33 2d 34 35 30 33 31 20 54 68 65  -34993-45031 The
5870: 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64   maximum allowed
5880: 20 6d 6d 61 70 20 73 69 7a 65 20 77 69 6c 6c 20   mmap size will 
5890: 62 65 0a 20 20 20 20 20 20 2a 2a 20 73 69 6c 65  be.      ** sile
58a0: 6e 74 6c 79 20 74 72 75 6e 63 61 74 65 64 20 69  ntly truncated i
58b0: 66 20 6e 65 63 65 73 73 61 72 79 20 73 6f 20 74  f necessary so t
58c0: 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
58d0: 65 78 63 65 65 64 20 74 68 65 0a 20 20 20 20 20  exceed the.     
58e0: 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   ** compile-time
58f0: 20 6d 61 78 69 6d 75 6d 20 6d 6d 61 70 20 73 69   maximum mmap si
5900: 7a 65 20 73 65 74 20 62 79 20 74 68 65 20 53 51  ze set by the SQ
5910: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
5920: 5a 45 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70  ZE.      ** comp
5930: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e  ile-time option.
5940: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5950: 69 66 28 20 6d 78 4d 6d 61 70 3c 30 20 7c 7c 20  if( mxMmap<0 || 
5960: 6d 78 4d 6d 61 70 3e 53 51 4c 49 54 45 5f 4d 41  mxMmap>SQLITE_MA
5970: 58 5f 4d 4d 41 50 5f 53 49 5a 45 20 29 7b 0a 20  X_MMAP_SIZE ){. 
5980: 20 20 20 20 20 20 20 6d 78 4d 6d 61 70 20 3d 20         mxMmap = 
5990: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
59a0: 53 49 5a 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SIZE;.      }.  
59b0: 20 20 20 20 69 66 28 20 73 7a 4d 6d 61 70 3c 30      if( szMmap<0
59c0: 20 29 20 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49   ) szMmap = SQLI
59d0: 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f  TE_DEFAULT_MMAP_
59e0: 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 66 28 20  SIZE;.      if( 
59f0: 73 7a 4d 6d 61 70 3e 6d 78 4d 6d 61 70 29 20 73  szMmap>mxMmap) s
5a00: 7a 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a  zMmap = mxMmap;.
5a10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
5a20: 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70  balConfig.mxMmap
5a30: 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20   = mxMmap;.     
5a40: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5a50: 6e 66 69 67 2e 73 7a 4d 6d 61 70 20 3d 20 73 7a  nfig.szMmap = sz
5a60: 4d 6d 61 70 3b 0a 20 20 20 20 20 20 62 72 65 61  Mmap;.      brea
5a70: 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 53 51  k;.    }..#if SQ
5a80: 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 26 26 20 64  LITE_OS_WIN && d
5a90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5aa0: 4e 33 32 5f 4d 41 4c 4c 4f 43 29 20 2f 2a 20 49  N32_MALLOC) /* I
5ab0: 4d 50 3a 20 52 2d 30 34 37 38 30 2d 35 35 38 31  MP: R-04780-5581
5ac0: 35 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51  5 */.    case SQ
5ad0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e 33  LITE_CONFIG_WIN3
5ae0: 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b 0a 20 20  2_HEAPSIZE: {.  
5af0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
5b00: 4f 46 3a 20 52 2d 33 34 39 32 36 2d 30 33 33 36  OF: R-34926-0336
5b10: 30 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  0 SQLITE_CONFIG_
5b20: 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 20 74  WIN32_HEAPSIZE t
5b30: 61 6b 65 73 20 61 20 33 32 2d 62 69 74 0a 20 20  akes a 32-bit.  
5b40: 20 20 20 20 2a 2a 20 75 6e 73 69 67 6e 65 64 20      ** unsigned 
5b50: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 74 68  integer value th
5b60: 61 74 20 73 70 65 63 69 66 69 65 73 20 74 68 65  at specifies the
5b70: 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66   maximum size of
5b80: 20 74 68 65 20 63 72 65 61 74 65 64 0a 20 20 20   the created.   
5b90: 20 20 20 2a 2a 20 68 65 61 70 2e 20 2a 2f 0a 20     ** heap. */. 
5ba0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
5bb0: 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d  alConfig.nHeap =
5bc0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
5bd0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5be0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
5bf0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
5c00: 46 49 47 5f 50 4d 41 53 5a 3a 20 7b 0a 20 20 20  FIG_PMASZ: {.   
5c10: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
5c20: 43 6f 6e 66 69 67 2e 73 7a 50 6d 61 20 3d 20 76  Config.szPma = v
5c30: 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e  a_arg(ap, unsign
5c40: 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  ed int);.      b
5c50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
5c60: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
5c70: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
5c80: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
5c90: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
5ca0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
5cb0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5cc0: 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61  Set up the looka
5cd0: 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f 72  side buffers for
5ce0: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
5cf0: 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72  ection..** Retur
5d00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
5d10: 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20  uccess.  .** If 
5d20: 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c 72  lookaside is alr
5d30: 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65 74  eady active, ret
5d40: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
5d50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61  .**.** The sz pa
5d60: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e  rameter is the n
5d70: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
5d80: 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65  n each lookaside
5d90: 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e   slot..** The cn
5da0: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
5db0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f  he number of slo
5dc0: 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20 69  ts.  If pStart i
5dd0: 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70  s NULL the.** sp
5de0: 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b  ace for the look
5df0: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20  aside memory is 
5e00: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
5e10: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
5e20: 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73 20  ** If pStart is 
5e30: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74  not NULL then it
5e40: 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65 73   is sz*cnt bytes
5e50: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73   of memory to us
5e60: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f  e for.** the loo
5e70: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a  kaside memory..*
5e80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
5e90: 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69  upLookaside(sqli
5ea0: 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70  te3 *db, void *p
5eb0: 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  Buf, int sz, int
5ec0: 20 63 6e 74 29 7b 0a 23 69 66 6e 64 65 66 20 53   cnt){.#ifndef S
5ed0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41  QLITE_OMIT_LOOKA
5ee0: 53 49 44 45 0a 20 20 76 6f 69 64 20 2a 70 53 74  SIDE.  void *pSt
5ef0: 61 72 74 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6c  art;.  if( db->l
5f00: 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29 7b  ookaside.nOut ){
5f10: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5f20: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f  TE_BUSY;.  }.  /
5f30: 2a 20 46 72 65 65 20 61 6e 79 20 65 78 69 73 74  * Free any exist
5f40: 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75  ing lookaside bu
5f50: 66 66 65 72 20 66 6f 72 20 74 68 69 73 20 68 61  ffer for this ha
5f60: 6e 64 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a  ndle before.  **
5f70: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   allocating a ne
5f80: 77 20 6f 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27  w one so we don'
5f90: 74 20 68 61 76 65 20 74 6f 20 68 61 76 65 20 73  t have to have s
5fa0: 70 61 63 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62  pace for .  ** b
5fb0: 6f 74 68 20 61 74 20 74 68 65 20 73 61 6d 65 20  oth at the same 
5fc0: 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  time..  */.  if(
5fd0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
5fe0: 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20  Malloced ){.    
5ff0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
6000: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72  >lookaside.pStar
6010: 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65  t);.  }.  /* The
6020: 20 73 69 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61   size of a looka
6030: 73 69 64 65 20 73 6c 6f 74 20 61 66 74 65 72 20  side slot after 
6040: 52 4f 55 4e 44 44 4f 57 4e 38 20 6e 65 65 64 73  ROUNDDOWN8 needs
6050: 20 74 6f 20 62 65 20 6c 61 72 67 65 72 0a 20 20   to be larger.  
6060: 2a 2a 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65  ** than a pointe
6070: 72 20 74 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a  r to be useful..
6080: 20 20 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f 55 4e    */.  sz = ROUN
6090: 44 44 4f 57 4e 38 28 73 7a 29 3b 20 20 2f 2a 20  DDOWN8(sz);  /* 
60a0: 49 4d 50 3a 20 52 2d 33 33 30 33 38 2d 30 39 33  IMP: R-33038-093
60b0: 38 32 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d  82 */.  if( sz<=
60c0: 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b  (int)sizeof(Look
60d0: 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a  asideSlot*) ) sz
60e0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c   = 0;.  if( cnt<
60f0: 30 20 29 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  0 ) cnt = 0;.  i
6100: 66 28 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d  f( sz==0 || cnt=
6110: 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30  =0 ){.    sz = 0
6120: 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 30  ;.    pStart = 0
6130: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
6140: 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  uf==0 ){.    sql
6150: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
6160: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 70 53 74  alloc();.    pSt
6170: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  art = sqlite3Mal
6180: 6c 6f 63 28 20 73 7a 2a 63 6e 74 20 29 3b 20 20  loc( sz*cnt );  
6190: 2f 2a 20 49 4d 50 3a 20 52 2d 36 31 39 34 39 2d  /* IMP: R-61949-
61a0: 33 35 37 32 37 20 2a 2f 0a 20 20 20 20 73 71 6c  35727 */.    sql
61b0: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
61c0: 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20 70  loc();.    if( p
61d0: 53 74 61 72 74 20 29 20 63 6e 74 20 3d 20 73 71  Start ) cnt = sq
61e0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28  lite3MallocSize(
61f0: 70 53 74 61 72 74 29 2f 73 7a 3b 0a 20 20 7d 65  pStart)/sz;.  }e
6200: 6c 73 65 7b 0a 20 20 20 20 70 53 74 61 72 74 20  lse{.    pStart 
6210: 3d 20 70 42 75 66 3b 0a 20 20 7d 0a 20 20 64 62  = pBuf;.  }.  db
6220: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61  ->lookaside.pSta
6230: 72 74 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 64  rt = pStart;.  d
6240: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72  b->lookaside.pFr
6250: 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f  ee = 0;.  db->lo
6260: 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28 75 31  okaside.sz = (u1
6270: 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53 74 61  6)sz;.  if( pSta
6280: 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  rt ){.    int i;
6290: 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c  .    LookasideSl
62a0: 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72  ot *p;.    asser
62b0: 74 28 20 73 7a 20 3e 20 28 69 6e 74 29 73 69 7a  t( sz > (int)siz
62c0: 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f  eof(LookasideSlo
62d0: 74 2a 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 28  t*) );.    p = (
62e0: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70  LookasideSlot*)p
62f0: 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72 28 69  Start;.    for(i
6300: 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  =cnt-1; i>=0; i-
6310: 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65  -){.      p->pNe
6320: 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  xt = db->lookasi
6330: 64 65 2e 70 46 72 65 65 3b 0a 20 20 20 20 20 20  de.pFree;.      
6340: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46  db->lookaside.pF
6350: 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ree = p;.      p
6360: 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f   = (LookasideSlo
6370: 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73 7a 5d  t*)&((u8*)p)[sz]
6380: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
6390: 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d  lookaside.pEnd =
63a0: 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b   p;.    db->look
63b0: 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d  aside.bEnabled =
63c0: 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b   1;.    db->look
63d0: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
63e0: 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a  = pBuf==0 ?1:0;.
63f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d    }else{.    db-
6400: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72  >lookaside.pStar
6410: 74 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e  t = db;.    db->
6420: 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d  lookaside.pEnd =
6430: 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f   db;.    db->loo
6440: 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20  kaside.bEnabled 
6450: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  = 0;.    db->loo
6460: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
6470: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
6480: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
6490: 4c 4f 4f 4b 41 53 49 44 45 20 2a 2f 0a 20 20 72  LOOKASIDE */.  r
64a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
64b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
64c0: 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63   the mutex assoc
64d0: 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
64e0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
64f0: 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74  ..*/.sqlite3_mut
6500: 65 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d  ex *sqlite3_db_m
6510: 75 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62  utex(sqlite3 *db
6520: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
6530: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
6540: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
6550: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
6560: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
6570: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
6580: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
6590: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
65a0: 74 75 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a  turn db->mutex;.
65b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70  }../*.** Free up
65c0: 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20   as much memory 
65d0: 61 73 20 77 65 20 63 61 6e 20 66 72 6f 6d 20 74  as we can from t
65e0: 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73  he given databas
65f0: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
6600: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
6610: 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  db_release_memor
6620: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  y(sqlite3 *db){.
6630: 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66    int i;..#ifdef
6640: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
6650: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
6660: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
6670: 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
6680: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
6690: 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
66a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
66b0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
66c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
66d0: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72  erAll(db);.  for
66e0: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
66f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65   i++){.    Btree
6700: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
6710: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
6720: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67  pBt ){.      Pag
6730: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
6740: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
6750: 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Bt);.      sqlit
6760: 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28 70 50  e3PagerShrink(pP
6770: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
6780: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
6790: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73  eaveAll(db);.  s
67a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
67b0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
67c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
67d0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73  K;.}../*.** Flus
67e0: 68 20 61 6e 79 20 64 69 72 74 79 20 70 61 67 65  h any dirty page
67f0: 73 20 69 6e 20 74 68 65 20 70 61 67 65 72 2d 63  s in the pager-c
6800: 61 63 68 65 20 66 6f 72 20 61 6e 79 20 61 74 74  ache for any att
6810: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a 2a  ached database.*
6820: 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e  * to disk..*/.in
6830: 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63  t sqlite3_db_cac
6840: 68 65 66 6c 75 73 68 28 73 71 6c 69 74 65 33 20  heflush(sqlite3 
6850: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
6860: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
6870: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 62 53 65 65 6e  _OK;.  int bSeen
6880: 42 75 73 79 20 3d 20 30 3b 0a 0a 23 69 66 64 65  Busy = 0;..#ifde
6890: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
68a0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
68b0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
68c0: 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
68d0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
68e0: 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
68f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
6900: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
6910: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
6920: 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f  terAll(db);.  fo
6930: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
6940: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
6950: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; i++){.    Btr
6960: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
6970: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
6980: 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33  ( pBt && sqlite3
6990: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
69a0: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 50 61 67  Bt) ){.      Pag
69b0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c  er *pPager = sql
69c0: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
69d0: 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Bt);.      rc = 
69e0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 6c 75 73  sqlite3PagerFlus
69f0: 68 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  h(pPager);.     
6a00: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6a10: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
6a20: 62 53 65 65 6e 42 75 73 79 20 3d 20 31 3b 0a 20  bSeenBusy = 1;. 
6a30: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
6a40: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
6a50: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
6a60: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
6a70: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  db);.  sqlite3_m
6a80: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
6a90: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
6aa0: 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ((rc==SQLITE_OK 
6ab0: 26 26 20 62 53 65 65 6e 42 75 73 79 29 20 3f 20  && bSeenBusy) ? 
6ac0: 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63  SQLITE_BUSY : rc
6ad0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  );.}../*.** Conf
6ae0: 69 67 75 72 61 74 69 6f 6e 20 73 65 74 74 69 6e  iguration settin
6af0: 67 73 20 66 6f 72 20 61 6e 20 69 6e 64 69 76 69  gs for an indivi
6b00: 64 75 61 6c 20 64 61 74 61 62 61 73 65 20 63 6f  dual database co
6b10: 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20  nnection.*/.int 
6b20: 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
6b30: 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  g(sqlite3 *db, i
6b40: 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76  nt op, ...){.  v
6b50: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74  a_list ap;.  int
6b60: 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   rc;.  va_start(
6b70: 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63  ap, op);.  switc
6b80: 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
6b90: 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  e SQLITE_DBCONFI
6ba0: 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20  G_LOOKASIDE: {. 
6bb0: 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75 66 20       void *pBuf 
6bc0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
6bd0: 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32  d*); /* IMP: R-2
6be0: 36 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a 20 20  6835-10964 */.  
6bf0: 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f      int sz = va_
6c00: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20  arg(ap, int);   
6c10: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 37      /* IMP: R-47
6c20: 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20 20 20  871-25994 */.   
6c30: 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76 61 5f     int cnt = va_
6c40: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20  arg(ap, int);   
6c50: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 34     /* IMP: R-044
6c60: 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20 20 20  60-53386 */.    
6c70: 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f 6f 6b    rc = setupLook
6c80: 61 73 69 64 65 28 64 62 2c 20 70 42 75 66 2c 20  aside(db, pBuf, 
6c90: 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20  sz, cnt);.      
6ca0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6cb0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
6cc0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
6cd0: 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20 20  truct {.        
6ce0: 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f 2a 20  int op;      /* 
6cf0: 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  The opcode */.  
6d00: 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 20        u32 mask; 
6d10: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 68     /* Mask of th
6d20: 65 20 62 69 74 20 69 6e 20 73 71 6c 69 74 65 33  e bit in sqlite3
6d30: 2e 66 6c 61 67 73 20 74 6f 20 73 65 74 2f 63 6c  .flags to set/cl
6d40: 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d 20 61  ear */.      } a
6d50: 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  FlagOp[] = {.   
6d60: 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
6d70: 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b  CONFIG_ENABLE_FK
6d80: 45 59 2c 20 20 20 20 53 51 4c 49 54 45 5f 46 6f  EY,    SQLITE_Fo
6d90: 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d 2c 0a  reignKeys    },.
6da0: 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45          { SQLITE
6db0: 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
6dc0: 5f 54 52 49 47 47 45 52 2c 20 53 51 4c 49 54 45  _TRIGGER, SQLITE
6dd0: 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20 20  _EnableTrigger  
6de0: 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20  },.      };.    
6df0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
6e00: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
6e10: 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 49 4d  ITE_ERROR; /* IM
6e20: 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33 37 32  P: R-42790-23372
6e30: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
6e40: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
6e50: 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20  FlagOp); i++){. 
6e60: 20 20 20 20 20 20 20 69 66 28 20 61 46 6c 61 67         if( aFlag
6e70: 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b 0a  Op[i].op==op ){.
6e80: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6e            int on
6e90: 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  off = va_arg(ap,
6ea0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20   int);.         
6eb0: 20 69 6e 74 20 2a 70 52 65 73 20 3d 20 76 61 5f   int *pRes = va_
6ec0: 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20  arg(ap, int*);. 
6ed0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6c 64           int old
6ee0: 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67  Flags = db->flag
6ef0: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  s;.          if(
6f00: 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20 20 20   onoff>0 ){.    
6f10: 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
6f20: 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69 5d 2e  s |= aFlagOp[i].
6f30: 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  mask;.          
6f40: 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66 66 3d  }else if( onoff=
6f50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6f60: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
6f70: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b  aFlagOp[i].mask;
6f80: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6f90: 20 20 20 20 20 20 20 69 66 28 20 6f 6c 64 46 6c         if( oldFl
6fa0: 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29  ags!=db->flags )
6fb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
6fc0: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
6fd0: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
6fe0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
6ff0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65           if( pRe
7000: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
7010: 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c   *pRes = (db->fl
7020: 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d  ags & aFlagOp[i]
7030: 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20  .mask)!=0;.     
7040: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7050: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7060: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
7070: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7080: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7090: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
70a0: 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72  end(ap);.  retur
70b0: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
70c0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
70d0: 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e  he buffer z[0..n
70e0: 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  -1] contains all
70f0: 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74   spaces..*/.stat
7100: 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63 65 73  ic int allSpaces
7110: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
7120: 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28  int n){.  while(
7130: 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d   n>0 && z[n-1]==
7140: 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  ' ' ){ n--; }.  
7150: 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a  return n==0;.}..
7160: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
7170: 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
7180: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  ing function nam
7190: 65 64 20 22 42 49 4e 41 52 59 22 20 77 68 69 63  ed "BINARY" whic
71a0: 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61  h is always.** a
71b0: 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
71c0: 49 66 20 74 68 65 20 70 61 64 46 6c 61 67 20 61  If the padFlag a
71d0: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
71e0: 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65 20 70  ULL then space p
71f0: 61 64 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e  adding at the en
7200: 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73 20  d.** of strings 
7210: 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69  is ignored.  Thi
7220: 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  s implements the
7230: 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e   RTRIM collation
7240: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7250: 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76  binCollFunc(.  v
7260: 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20  oid *padFlag,.  
7270: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
7280: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
7290: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
72a0: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
72b0: 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e    int rc, n;.  n
72c0: 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f   = nKey1<nKey2 ?
72d0: 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a   nKey1 : nKey2;.
72e0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
72f0: 3a 20 52 2d 36 35 30 33 33 2d 32 38 34 34 39 20  : R-65033-28449 
7300: 54 68 65 20 62 75 69 6c 74 2d 69 6e 20 42 49 4e  The built-in BIN
7310: 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 6f  ARY collation co
7320: 6d 70 61 72 65 73 0a 20 20 2a 2a 20 73 74 72 69  mpares.  ** stri
7330: 6e 67 73 20 62 79 74 65 20 62 79 20 62 79 74 65  ngs byte by byte
7340: 20 75 73 69 6e 67 20 74 68 65 20 6d 65 6d 63 6d   using the memcm
7350: 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f  p() function fro
7360: 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 43  m the standard C
7370: 0a 20 20 2a 2a 20 6c 69 62 72 61 72 79 2e 20 2a  .  ** library. *
7380: 2f 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28  /.  rc = memcmp(
7390: 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29  pKey1, pKey2, n)
73a0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
73b0: 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c 61 67  .    if( padFlag
73c0: 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63  .     && allSpac
73d0: 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31  es(((char*)pKey1
73e0: 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20  )+n, nKey1-n).  
73f0: 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28     && allSpaces(
7400: 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e  ((char*)pKey2)+n
7410: 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29  , nKey2-n).    )
7420: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
7430: 4e 43 45 2d 4f 46 3a 20 52 2d 33 31 36 32 34 2d  NCE-OF: R-31624-
7440: 32 34 37 33 37 20 52 54 52 49 4d 20 69 73 20 6c  24737 RTRIM is l
7450: 69 6b 65 20 42 49 4e 41 52 59 20 65 78 63 65 70  ike BINARY excep
7460: 74 20 74 68 61 74 20 65 78 74 72 61 0a 20 20 20  t that extra.   
7470: 20 20 20 2a 2a 20 73 70 61 63 65 73 20 61 74 20     ** spaces at 
7480: 74 68 65 20 65 6e 64 20 6f 66 20 65 69 74 68 65  the end of eithe
7490: 72 20 73 74 72 69 6e 67 20 64 6f 20 6e 6f 74 20  r string do not 
74a0: 63 68 61 6e 67 65 20 74 68 65 20 72 65 73 75 6c  change the resul
74b0: 74 2e 20 49 6e 20 6f 74 68 65 72 0a 20 20 20 20  t. In other.    
74c0: 20 20 2a 2a 20 77 6f 72 64 73 2c 20 73 74 72 69    ** words, stri
74d0: 6e 67 73 20 77 69 6c 6c 20 63 6f 6d 70 61 72 65  ngs will compare
74e0: 20 65 71 75 61 6c 20 74 6f 20 6f 6e 65 20 61 6e   equal to one an
74f0: 6f 74 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73  other as long as
7500: 20 74 68 65 79 0a 20 20 20 20 20 20 2a 2a 20 64   they.      ** d
7510: 69 66 66 65 72 20 6f 6e 6c 79 20 69 6e 20 74 68  iffer only in th
7520: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 70 61 63  e number of spac
7530: 65 73 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 20  es at the end.. 
7540: 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73       */.    }els
7550: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b  e{.      rc = nK
7560: 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20  ey1 - nKey2;.   
7570: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
7580: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f  rc;.}../*.** Ano
7590: 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f  ther built-in co
75a0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
75b0: 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a  : NOCASE. .**.**
75c0: 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20   This collating 
75d0: 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65  sequence is inte
75e0: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
75f0: 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65  for "case indepe
7600: 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69  ndent.** compari
7610: 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b  son". SQLite's k
7620: 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65  nowledge of uppe
7630: 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65  r and lower case
7640: 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20   equivalents.** 
7650: 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20  extends only to 
7660: 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72  the 26 character
7670: 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e  s used in the En
7680: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a  glish language..
7690: 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d  **.** At the mom
76a0: 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  ent there is onl
76b0: 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d  y a UTF-8 implem
76c0: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
76d0: 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f  tic int nocaseCo
76e0: 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76  llatingFunc(.  v
76f0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
7700: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
7710: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
7720: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
7730: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
7740: 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65    int r = sqlite
7750: 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20  3StrNICmp(.     
7760: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
7770: 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  Key1, (const cha
7780: 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79  r *)pKey2, (nKey
7790: 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e  1<nKey2)?nKey1:n
77a0: 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Key2);.  UNUSED_
77b0: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
77c0: 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29  d);.  if( 0==r )
77d0: 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d  {.    r = nKey1-
77e0: 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
77f0: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
7800: 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44  Return the ROWID
7810: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
7820: 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71  ent insert.*/.sq
7830: 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74  lite_int64 sqlit
7840: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
7850: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
7860: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
7870: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
7880: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
7890: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
78a0: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
78b0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
78c0: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
78d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
78e0: 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f 77  turn db->lastRow
78f0: 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  id;.}../*.** Ret
7900: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
7910: 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68 65  f changes in the
7920: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c   most recent cal
7930: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65  l to sqlite3_exe
7940: 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  c()..*/.int sqli
7950: 74 65 33 5f 63 68 61 6e 67 65 73 28 73 71 6c 69  te3_changes(sqli
7960: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66  te3 *db){.#ifdef
7970: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
7980: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
7990: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
79a0: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
79b0: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
79c0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
79d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
79e0: 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  if.  return db->
79f0: 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
7a00: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
7a10: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73  ber of changes s
7a20: 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61 73  ince the databas
7a30: 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65  e handle was ope
7a40: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
7a50: 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65  te3_total_change
7a60: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
7a70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7a80: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
7a90: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
7aa0: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
7ab0: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
7ac0: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
7ad0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
7ae0: 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
7af0: 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e  n db->nTotalChan
7b00: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ge;.}../*.** Clo
7b10: 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65  se all open save
7b20: 70 6f 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e  points. This fun
7b30: 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70  ction only manip
7b40: 75 6c 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66  ulates fields of
7b50: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
7b60: 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20   handle object, 
7b70: 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73  it does not clos
7b80: 65 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73  e any savepoints
7b90: 20 74 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65   that may be ope
7ba0: 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72  n.** at the b-tr
7bb0: 65 65 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a  ee/pager level..
7bc0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
7bd0: 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73  loseSavepoints(s
7be0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77  qlite3 *db){.  w
7bf0: 68 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70  hile( db->pSavep
7c00: 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65  oint ){.    Save
7c10: 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62  point *pTmp = db
7c20: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20  ->pSavepoint;.  
7c30: 20 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74    db->pSavepoint
7c40: 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a   = pTmp->pNext;.
7c50: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
7c60: 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d  e(db, pTmp);.  }
7c70: 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  .  db->nSavepoin
7c80: 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74  t = 0;.  db->nSt
7c90: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64  atement = 0;.  d
7ca0: 62 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e  b->isTransaction
7cb0: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d  Savepoint = 0;.}
7cc0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74  ../*.** Invoke t
7cd0: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75  he destructor fu
7ce0: 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65  nction associate
7cf0: 64 20 77 69 74 68 20 46 75 6e 63 44 65 66 20 70  d with FuncDef p
7d00: 2c 20 69 66 20 61 6e 79 2e 20 45 78 63 65 70 74  , if any. Except
7d10: 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20  ,.** if this is 
7d20: 6e 6f 74 20 74 68 65 20 6c 61 73 74 20 63 6f 70  not the last cop
7d30: 79 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  y of the functio
7d40: 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65  n, do not invoke
7d50: 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65 0a 2a 2a   it. Multiple.**
7d60: 20 63 6f 70 69 65 73 20 6f 66 20 61 20 73 69 6e   copies of a sin
7d70: 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  gle function are
7d80: 20 63 72 65 61 74 65 64 20 77 68 65 6e 20 63 72   created when cr
7d90: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 20  eate_function() 
7da0: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 69 74  is called.** wit
7db0: 68 20 53 51 4c 49 54 45 5f 41 4e 59 20 61 73 20  h SQLITE_ANY as 
7dc0: 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f  the encoding..*/
7dd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 75 6e  .static void fun
7de0: 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 73 71 6c  ctionDestroy(sql
7df0: 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65  ite3 *db, FuncDe
7e00: 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63 44 65 73  f *p){.  FuncDes
7e10: 74 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75  tructor *pDestru
7e20: 63 74 6f 72 20 3d 20 70 2d 3e 70 44 65 73 74 72  ctor = p->pDestr
7e30: 75 63 74 6f 72 3b 0a 20 20 69 66 28 20 70 44 65  uctor;.  if( pDe
7e40: 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
7e50: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
7e60: 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 44 65  f--;.    if( pDe
7e70: 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 3d 3d  structor->nRef==
7e80: 30 20 29 7b 0a 20 20 20 20 20 20 70 44 65 73 74  0 ){.      pDest
7e90: 72 75 63 74 6f 72 2d 3e 78 44 65 73 74 72 6f 79  ructor->xDestroy
7ea0: 28 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 70 55  (pDestructor->pU
7eb0: 73 65 72 44 61 74 61 29 3b 0a 20 20 20 20 20 20  serData);.      
7ec0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
7ed0: 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a  , pDestructor);.
7ee0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
7ef0: 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74 20 61 6c  ** Disconnect al
7f00: 6c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 6f  l sqlite3_vtab o
7f10: 62 6a 65 63 74 73 20 74 68 61 74 20 62 65 6c 6f  bjects that belo
7f20: 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ng to database c
7f30: 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 64 62 2e  onnection.** db.
7f40: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
7f50: 77 68 65 6e 20 64 62 20 69 73 20 62 65 69 6e 67  when db is being
7f60: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
7f70: 69 63 20 76 6f 69 64 20 64 69 73 63 6f 6e 6e 65  ic void disconne
7f80: 63 74 41 6c 6c 56 74 61 62 28 73 71 6c 69 74 65  ctAllVtab(sqlite
7f90: 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66 20  3 *db){.#ifndef 
7fa0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7fb0: 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e 74 20 69  UALTABLE.  int i
7fc0: 3b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b  ;.  HashElem *p;
7fd0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
7fe0: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66  nterAll(db);.  f
7ff0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
8000: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 53 63 68  b; i++){.    Sch
8010: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64  ema *pSchema = d
8020: 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d  b->aDb[i].pSchem
8030: 61 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  a;.    if( db->a
8040: 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[i].pSchema ){
8050: 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c  .      for(p=sql
8060: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53  iteHashFirst(&pS
8070: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
8080: 20 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68   p; p=sqliteHash
8090: 4e 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20  Next(p)){.      
80a0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
80b0: 28 54 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 48  (Table *)sqliteH
80c0: 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20  ashData(p);.    
80d0: 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
80e0: 6c 28 70 54 61 62 29 20 29 20 73 71 6c 69 74 65  l(pTab) ) sqlite
80f0: 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28  3VtabDisconnect(
8100: 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
8110: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   }.    }.  }.  f
8120: 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46  or(p=sqliteHashF
8130: 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  irst(&db->aModul
8140: 65 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74 65 48  e); p; p=sqliteH
8150: 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20 20 20  ashNext(p)){.   
8160: 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20   Module *pMod = 
8170: 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65  (Module *)sqlite
8180: 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20  HashData(p);.   
8190: 20 69 66 28 20 70 4d 6f 64 2d 3e 70 45 70 6f 54   if( pMod->pEpoT
81a0: 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ab ){.      sqli
81b0: 74 65 33 56 74 61 62 44 69 73 63 6f 6e 6e 65 63  te3VtabDisconnec
81c0: 74 28 64 62 2c 20 70 4d 6f 64 2d 3e 70 45 70 6f  t(db, pMod->pEpo
81d0: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
81e0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c    sqlite3VtabUnl
81f0: 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73  ockList(db);.  s
8200: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
8210: 41 6c 6c 28 64 62 29 3b 0a 23 65 6c 73 65 0a 20  All(db);.#else. 
8220: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
8230: 52 28 64 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  R(db);.#endif.}.
8240: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
8250: 55 45 20 69 66 20 64 61 74 61 62 61 73 65 20 63  UE if database c
8260: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 73  onnection db has
8270: 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65   unfinalized pre
8280: 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65  pared.** stateme
8290: 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65  nts or unfinishe
82a0: 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  d sqlite3_backup
82b0: 20 6f 62 6a 65 63 74 73 2e 20 20 0a 2a 2f 0a 73   objects.  .*/.s
82c0: 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 6e 65 63  tatic int connec
82d0: 74 69 6f 6e 49 73 42 75 73 79 28 73 71 6c 69 74  tionIsBusy(sqlit
82e0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6a  e3 *db){.  int j
82f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
8300: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
8310: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  b->mutex) );.  i
8320: 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 20 72  f( db->pVdbe ) r
8330: 65 74 75 72 6e 20 31 3b 0a 20 20 66 6f 72 28 6a  eturn 1;.  for(j
8340: 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a  =0; j<db->nDb; j
8350: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
8360: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d  pBt = db->aDb[j]
8370: 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42  .pBt;.    if( pB
8380: 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  t && sqlite3Btre
8390: 65 49 73 49 6e 42 61 63 6b 75 70 28 70 42 74 29  eIsInBackup(pBt)
83a0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
83b0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
83c0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65  /*.** Close an e
83d0: 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64  xisting SQLite d
83e0: 61 74 61 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69  atabase.*/.stati
83f0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 43 6c 6f  c int sqlite3Clo
8400: 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  se(sqlite3 *db, 
8410: 69 6e 74 20 66 6f 72 63 65 5a 6f 6d 62 69 65 29  int forceZombie)
8420: 7b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20  {.  if( !db ){. 
8430: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
8440: 46 3a 20 52 2d 36 33 32 35 37 2d 31 31 37 34 30  F: R-63257-11740
8450: 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   Calling sqlite3
8460: 5f 63 6c 6f 73 65 28 29 20 6f 72 0a 20 20 20 20  _close() or.    
8470: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  ** sqlite3_close
8480: 5f 76 32 28 29 20 77 69 74 68 20 61 20 4e 55 4c  _v2() with a NUL
8490: 4c 20 70 6f 69 6e 74 65 72 20 61 72 67 75 6d 65  L pointer argume
84a0: 6e 74 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  nt is a harmless
84b0: 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 20 20 72   no-op. */.    r
84c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
84d0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
84e0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
84f0: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
8500: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8510: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
8520: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
8530: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
8540: 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78  );..  /* Force x
8550: 44 69 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73  Disconnect calls
8560: 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c 20   on all virtual 
8570: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63  tables */.  disc
8580: 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 64 62  onnectAllVtab(db
8590: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72  );..  /* If a tr
85a0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65  ansaction is ope
85b0: 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e 6e 65 63  n, the disconnec
85c0: 74 41 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c 20  tAllVtab() call 
85d0: 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20  above.  ** will 
85e0: 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20  not have called 
85f0: 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28  the xDisconnect(
8600: 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20  ) method on any 
8610: 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62  virtual.  ** tab
8620: 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61  les in the db->a
8630: 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20  VTrans[] array. 
8640: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  The following sq
8650: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
8660: 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69  k().  ** call wi
8670: 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65  ll do so. We nee
8680: 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66  d to do this bef
8690: 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f  ore the check fo
86a0: 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51  r active.  ** SQ
86b0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c  L statements bel
86c0: 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62  ow, as the v-tab
86d0: 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  le implementatio
86e0: 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67  n may be storing
86f0: 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61  .  ** some prepa
8700: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69  red statements i
8710: 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  nternally..  */.
8720: 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c    sqlite3VtabRol
8730: 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a  lback(db);..  /*
8740: 20 4c 65 67 61 63 79 20 62 65 68 61 76 69 6f 72   Legacy behavior
8750: 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28   (sqlite3_close(
8760: 29 20 62 65 68 61 76 69 6f 72 29 20 69 73 20 74  ) behavior) is t
8770: 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  o return.  ** SQ
8780: 4c 49 54 45 5f 42 55 53 59 20 69 66 20 74 68 65  LITE_BUSY if the
8790: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20   connection can 
87a0: 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d  not be closed im
87b0: 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  mediately..  */.
87c0: 20 20 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62    if( !forceZomb
87d0: 69 65 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e  ie && connection
87e0: 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20  IsBusy(db) ){.  
87f0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
8800: 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45  thMsg(db, SQLITE
8810: 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c 65 20 74  _BUSY, "unable t
8820: 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75  o close due to u
8830: 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a 20 20 20  nfinalized ".   
8840: 20 20 20 20 22 73 74 61 74 65 6d 65 6e 74 73 20      "statements 
8850: 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61  or unfinished ba
8860: 63 6b 75 70 73 22 29 3b 0a 20 20 20 20 73 71 6c  ckups");.    sql
8870: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
8880: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
8890: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
88a0: 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  USY;.  }..#ifdef
88b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
88c0: 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73 71 6c 69  QLLOG.  if( sqli
88d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
88e0: 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20 20 20 2f  xSqllog ){.    /
88f0: 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65 20 68 61  * Closing the ha
8900: 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20 70 61 72  ndle. Fourth par
8910: 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64  ameter is passed
8920: 20 74 68 65 20 76 61 6c 75 65 20 32 2e 20 2a 2f   the value 2. */
8930: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
8940: 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
8950: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  (sqlite3GlobalCo
8960: 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c  nfig.pSqllogArg,
8970: 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20 20 7d 0a   db, 0, 2);.  }.
8980: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e  #endif..  /* Con
8990: 76 65 72 74 20 74 68 65 20 63 6f 6e 6e 65 63 74  vert the connect
89a0: 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f 6d 62 69  ion into a zombi
89b0: 65 20 61 6e 64 20 74 68 65 6e 20 63 6c 6f 73 65  e and then close
89c0: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e   it..  */.  db->
89d0: 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
89e0: 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73  AGIC_ZOMBIE;.  s
89f0: 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78  qlite3LeaveMutex
8a00: 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 64  AndCloseZombie(d
8a10: 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  b);.  return SQL
8a20: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
8a30: 20 54 77 6f 20 76 61 72 69 61 74 69 6f 6e 73 20   Two variations 
8a40: 6f 6e 20 74 68 65 20 70 75 62 6c 69 63 20 69 6e  on the public in
8a50: 74 65 72 66 61 63 65 20 66 6f 72 20 63 6c 6f 73  terface for clos
8a60: 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ing a database.*
8a70: 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68  * connection. Th
8a80: 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  e sqlite3_close(
8a90: 29 20 76 65 72 73 69 6f 6e 20 72 65 74 75 72 6e  ) version return
8aa0: 73 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  s SQLITE_BUSY an
8ab0: 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74 68 65 20  d.** leaves the 
8ac0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 74 69 6f  connection optio
8ad0: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 75  n if there are u
8ae0: 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61  nfinalized prepa
8af0: 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  red.** statement
8b00: 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20  s or unfinished 
8b10: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 73 2e  sqlite3_backups.
8b20: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c    The sqlite3_cl
8b30: 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76 65 72 73  ose_v2().** vers
8b40: 69 6f 6e 20 66 6f 72 63 65 73 20 74 68 65 20 63  ion forces the c
8b50: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 63  onnection to bec
8b60: 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20 69 66 20  ome a zombie if 
8b70: 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 75 6e 63  there are.** unc
8b80: 6c 6f 73 65 64 20 72 65 73 6f 75 72 63 65 73 2c  losed resources,
8b90: 20 61 6e 64 20 61 72 72 61 6e 67 65 73 20 66 6f   and arranges fo
8ba0: 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f 6e 20 77  r deallocation w
8bb0: 68 65 6e 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  hen the last.** 
8bc0: 70 72 65 70 61 72 65 20 73 74 61 74 65 6d 65 6e  prepare statemen
8bd0: 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63  t or sqlite3_bac
8be0: 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69  kup closes..*/.i
8bf0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  nt sqlite3_close
8c00: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72  (sqlite3 *db){ r
8c10: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f  eturn sqlite3Clo
8c20: 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69 6e 74 20  se(db,0); }.int 
8c30: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
8c40: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 20 72  (sqlite3 *db){ r
8c50: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 43 6c 6f  eturn sqlite3Clo
8c60: 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a  se(db,1); }.../*
8c70: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 6d 75  .** Close the mu
8c80: 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20  tex on database 
8c90: 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 2a  connection db..*
8ca0: 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d 6f 72 65  *.** Furthermore
8cb0: 2c 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f  , if database co
8cc0: 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20 61  nnection db is a
8cd0: 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e 69 6e 67   zombie (meaning
8ce0: 20 74 68 61 74 20 74 68 65 72 65 0a 2a 2a 20 68   that there.** h
8cf0: 61 73 20 62 65 65 6e 20 61 20 70 72 69 6f 72 20  as been a prior 
8d00: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
8d10: 63 6c 6f 73 65 28 64 62 29 20 6f 72 20 73 71 6c  close(db) or sql
8d20: 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62  ite3_close_v2(db
8d30: 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65 72 79 20  )) and.** every 
8d40: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 61 73  sqlite3_stmt has
8d50: 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e 61 6c 69   now been finali
8d60: 7a 65 64 20 61 6e 64 20 65 76 65 72 79 20 73 71  zed and every sq
8d70: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 68 61 73  lite3_backup has
8d80: 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c 20 74 68  .** finished, th
8d90: 65 6e 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f  en free all reso
8da0: 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  urces..*/.void s
8db0: 71 6c 69 74 65 33 4c 65 61 76 65 4d 75 74 65 78  qlite3LeaveMutex
8dc0: 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69 65 28 73  AndCloseZombie(s
8dd0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48  qlite3 *db){.  H
8de0: 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20 20 20 20  ashElem *i;     
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8e00: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 69 74 65  * Hash table ite
8e10: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6a  rator */.  int j
8e20: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
8e30: 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
8e40: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f 72   sqlite3_stmt or
8e50: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
8e60: 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20 6f 72 20  objects.  ** or 
8e70: 69 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  if the connectio
8e80: 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  n has not yet be
8e90: 65 6e 20 63 6c 6f 73 65 64 20 62 79 20 73 71 6c  en closed by sql
8ea0: 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 2c  ite3_close_v2(),
8eb0: 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75 73 74 20  .  ** then just 
8ec0: 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65 78 20  leave the mutex 
8ed0: 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
8ee0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 67 69 63  .  if( db->magic
8ef0: 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a  !=SQLITE_MAGIC_Z
8f00: 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e 65 63 74  OMBIE || connect
8f10: 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b  ionIsBusy(db) ){
8f20: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
8f30: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
8f40: 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ex);.    return;
8f50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
8f60: 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
8f70: 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
8f80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
8f90: 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a 20 20 2a  nnection has.  *
8fa0: 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20 73 71 6c  * closed all sql
8fb0: 69 74 65 33 5f 73 74 6d 74 20 61 6e 64 20 73 71  ite3_stmt and sq
8fc0: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a  lite3_backup obj
8fd0: 65 63 74 73 20 61 6e 64 20 68 61 73 20 62 65 65  ects and has bee
8fe0: 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f  n.  ** passed to
8ff0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20 28   sqlite3_close (
9000: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20  meaning that it 
9010: 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e 20 20 54  is a zombie).  T
9020: 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a 2a 20 67  herefore,.  ** g
9030: 6f 20 61 68 65 61 64 20 61 6e 64 20 66 72 65 65  o ahead and free
9040: 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a   all resources..
9050: 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 61 20    */..  /* If a 
9060: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
9070: 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20 62 61 63  pen, roll it bac
9080: 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20 65 6e 73  k. This also ens
9090: 75 72 65 73 20 74 68 61 74 20 69 66 0a 20 20 2a  ures that if.  *
90a0: 2a 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 73  * any database s
90b0: 63 68 65 6d 61 73 20 68 61 76 65 20 62 65 65 6e  chemas have been
90c0: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 61 6e 20   modified by an 
90d0: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74 72 61 6e  uncommitted tran
90e0: 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 68 65  saction.  ** the
90f0: 79 20 61 72 65 20 72 65 73 65 74 2e 20 41 6e 64  y are reset. And
9100: 20 74 68 61 74 20 74 68 65 20 72 65 71 75 69 72   that the requir
9110: 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  ed b-tree mutex 
9120: 69 73 20 68 65 6c 64 20 74 6f 20 6d 61 6b 65 0a  is held to make.
9130: 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 72    ** the pager r
9140: 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65  ollback and sche
9150: 6d 61 20 72 65 73 65 74 20 61 6e 20 61 74 6f 6d  ma reset an atom
9160: 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e 20 2a 2f  ic operation. */
9170: 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  .  sqlite3Rollba
9180: 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
9190: 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  _OK);..  /* Free
91a0: 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   any outstanding
91b0: 20 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63   Savepoint struc
91c0: 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  tures. */.  sqli
91d0: 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
91e0: 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c  ts(db);..  /* Cl
91f0: 6f 73 65 20 61 6c 6c 20 64 61 74 61 62 61 73 65  ose all database
9200: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
9210: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d    for(j=0; j<db-
9220: 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  >nDb; j++){.    
9230: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
9240: 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20   &db->aDb[j];.  
9250: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29    if( pDb->pBt )
9260: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
9270: 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70  treeClose(pDb->p
9280: 42 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  Bt);.      pDb->
9290: 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  pBt = 0;.      i
92a0: 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20  f( j!=1 ){.     
92b0: 20 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20     pDb->pSchema 
92c0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
92d0: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43 6c 65 61   }.  }.  /* Clea
92e0: 72 20 74 68 65 20 54 45 4d 50 20 73 63 68 65 6d  r the TEMP schem
92f0: 61 20 73 65 70 61 72 61 74 65 6c 79 20 61 6e 64  a separately and
9300: 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66 28 20 64   last */.  if( d
9310: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
9320: 61 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  a ){.    sqlite3
9330: 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62 2d 3e  SchemaClear(db->
9340: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
9350: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74  .  }.  sqlite3Vt
9360: 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29  abUnlockList(db)
9370: 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 75 70 20  ;..  /* Free up 
9380: 74 68 65 20 61 72 72 61 79 20 6f 66 20 61 75 78  the array of aux
9390: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
93a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c   */.  sqlite3Col
93b0: 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72  lapseDatabaseArr
93c0: 61 79 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74  ay(db);.  assert
93d0: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a  ( db->nDb<=2 );.
93e0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
93f0: 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63  b==db->aDbStatic
9400: 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c 6c 20 74   );..  /* Tell t
9410: 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f 74 69 66  he code in notif
9420: 79 2e 63 20 74 68 61 74 20 74 68 65 20 63 6f 6e  y.c that the con
9430: 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65  nection no longe
9440: 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20 20 2a 2a  r holds any.  **
9450: 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f 65 73 20   locks and does 
9460: 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79 20  not require any 
9470: 66 75 72 74 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e  further unlock-n
9480: 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e  otify callbacks.
9490: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  .  */.  sqlite3C
94a0: 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73 65 64 28  onnectionClosed(
94b0: 64 62 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  db);..  for(j=0;
94c0: 20 6a 3c 41 72 72 61 79 53 69 7a 65 28 64 62 2d   j<ArraySize(db-
94d0: 3e 61 46 75 6e 63 2e 61 29 3b 20 6a 2b 2b 29 7b  >aFunc.a); j++){
94e0: 0a 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 4e  .    FuncDef *pN
94f0: 65 78 74 2c 20 2a 70 48 61 73 68 2c 20 2a 70 3b  ext, *pHash, *p;
9500: 0a 20 20 20 20 66 6f 72 28 70 3d 64 62 2d 3e 61  .    for(p=db->a
9510: 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70 3b 20 70 3d  Func.a[j]; p; p=
9520: 70 48 61 73 68 29 7b 0a 20 20 20 20 20 20 70 48  pHash){.      pH
9530: 61 73 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a  ash = p->pHash;.
9540: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20 29        while( p )
9550: 7b 0a 20 20 20 20 20 20 20 20 66 75 6e 63 74 69  {.        functi
9560: 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29  onDestroy(db, p)
9570: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 20  ;.        pNext 
9580: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
9590: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
95a0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
95b0: 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20    p = pNext;.   
95c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
95d0: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
95e0: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 43 6f 6c  hFirst(&db->aCol
95f0: 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73 71 6c 69  lSeq); i; i=sqli
9600: 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
9610: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
9620: 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71 20 2a 29  ll = (CollSeq *)
9630: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
9640: 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65  );.    /* Invoke
9650: 20 61 6e 79 20 64 65 73 74 72 75 63 74 6f 72 73   any destructors
9660: 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20   registered for 
9670: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9680: 63 65 20 75 73 65 72 20 64 61 74 61 2e 20 2a 2f  ce user data. */
9690: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
96a0: 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  3; j++){.      i
96b0: 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c  f( pColl[j].xDel
96c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
96d0: 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b  l[j].xDel(pColl[
96e0: 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20 20 20 20  j].pUser);.     
96f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
9700: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
9710: 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Coll);.  }.  sql
9720: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
9730: 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69  b->aCollSeq);.#i
9740: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9750: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
9760: 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
9770: 68 46 69 72 73 74 28 26 64 62 2d 3e 61 4d 6f 64  hFirst(&db->aMod
9780: 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74  ule); i; i=sqlit
9790: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
97a0: 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f 64 20     Module *pMod 
97b0: 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73 71 6c 69  = (Module *)sqli
97c0: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
97d0: 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e 78 44 65     if( pMod->xDe
97e0: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 20 20 70  stroy ){.      p
97f0: 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 28 70 4d  Mod->xDestroy(pM
9800: 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d  od->pAux);.    }
9810: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
9820: 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 43 6c  EponymousTableCl
9830: 65 61 72 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20  ear(db, pMod);. 
9840: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9850: 28 64 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a  (db, pMod);.  }.
9860: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
9870: 61 72 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  ar(&db->aModule)
9880: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
9890: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
98a0: 49 54 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61 6c  ITE_OK); /* Deal
98b0: 6c 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63 68  locates any cach
98c0: 65 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73  ed error strings
98d0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 61  . */.  sqlite3Va
98e0: 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72  lueFree(db->pErr
98f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73  );.  sqlite3Clos
9900: 65 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b  eExtensions(db);
9910: 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52  .#if SQLITE_USER
9920: 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
9930: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
9940: 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 55 73 65  b->auth.zAuthUse
9950: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
9960: 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74  ee(db->auth.zAut
9970: 68 50 57 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  hPW);.#endif..  
9980: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
9990: 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a  TE_MAGIC_ERROR;.
99a0: 0a 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64  .  /* The temp-d
99b0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69  atabase schema i
99c0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66  s allocated diff
99d0: 65 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65  erently from the
99e0: 20 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20   other schema.  
99f0: 2a 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e  ** objects (usin
9a00: 67 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  g sqliteMalloc()
9a10: 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65   directly, inste
9a20: 61 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  ad of sqlite3Btr
9a30: 65 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a  eeSchema())..  *
9a40: 2a 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  * So it needs to
9a50: 20 62 65 20 66 72 65 65 64 20 68 65 72 65 2e 20   be freed here. 
9a60: 54 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f  Todo: Why not ro
9a70: 6c 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68 65  ll the temp sche
9a80: 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  ma into.  ** the
9a90: 20 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c   same sqliteMall
9aa0: 6f 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20  oc() as the one 
9ab0: 74 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74  that allocates t
9ac0: 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a  he database .  *
9ad0: 2a 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a  * structure?.  *
9ae0: 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  /.  sqlite3DbFre
9af0: 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d  e(db, db->aDb[1]
9b00: 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c  .pSchema);.  sql
9b10: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9b20: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
9b30: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
9b40: 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a  E_MAGIC_CLOSED;.
9b50: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9b60: 66 72 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  free(db->mutex);
9b70: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c  .  assert( db->l
9b80: 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30  ookaside.nOut==0
9b90: 20 29 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e   );  /* Fails on
9ba0: 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d   a lookaside mem
9bb0: 6f 72 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66  ory leak */.  if
9bc0: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
9bd0: 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20  bMalloced ){.   
9be0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
9bf0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61  ->lookaside.pSta
9c00: 72 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  rt);.  }.  sqlit
9c10: 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a  e3_free(db);.}..
9c20: 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
9c30: 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ll database file
9c40: 73 2e 20 20 49 66 20 74 72 69 70 43 6f 64 65 20  s.  If tripCode 
9c50: 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
9c60: 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 77 72  , then.** any wr
9c70: 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
9c80: 69 6e 76 61 6c 69 64 61 74 65 64 20 28 22 74 72  invalidated ("tr
9c90: 69 70 70 65 64 22 20 2d 20 61 73 20 69 6e 20 22  ipped" - as in "
9ca0: 74 72 69 70 70 69 6e 67 20 61 20 63 69 72 63 75  tripping a circu
9cb0: 69 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29 20  it.** breaker") 
9cc0: 61 6e 64 20 6d 61 64 65 20 74 6f 20 72 65 74 75  and made to retu
9cd0: 72 6e 20 74 72 69 70 43 6f 64 65 20 69 66 20 74  rn tripCode if t
9ce0: 68 65 72 65 20 61 72 65 20 61 6e 79 20 66 75 72  here are any fur
9cf0: 74 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73  ther.** attempts
9d00: 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 75 72   to use that cur
9d10: 73 6f 72 2e 20 20 52 65 61 64 20 63 75 72 73 6f  sor.  Read curso
9d20: 72 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e 20 61  rs remain open a
9d30: 6e 64 20 76 61 6c 69 64 0a 2a 2a 20 62 75 74 20  nd valid.** but 
9d40: 61 72 65 20 22 73 61 76 65 64 22 20 69 6e 20 63  are "saved" in c
9d50: 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 70 61  ase the table pa
9d60: 67 65 73 20 61 72 65 20 6d 6f 76 65 64 20 61 72  ges are moved ar
9d70: 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ound..*/.void sq
9d80: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
9d90: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
9da0: 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20 20 69  t tripCode){.  i
9db0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72  nt i;.  int inTr
9dc0: 61 6e 73 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73  ans = 0;.  int s
9dd0: 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20 20 61  chemaChange;.  a
9de0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9df0: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
9e00: 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
9e10: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
9e20: 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61  oc();..  /* Obta
9e30: 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d 75  in all b-tree mu
9e40: 74 65 78 65 73 20 62 65 66 6f 72 65 20 6d 61 6b  texes before mak
9e50: 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f  ing any calls to
9e60: 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
9e70: 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  . .  ** This is 
9e80: 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63 61 73  important in cas
9e90: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
9ea0: 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  n being rolled b
9eb0: 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f 64  ack has.  ** mod
9ec0: 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61  ified the databa
9ed0: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 74 68  se schema. If th
9ee0: 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73  e b-tree mutexes
9ef0: 20 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a 20   are not taken. 
9f00: 20 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e 20 61   ** here, then a
9f10: 6e 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61  nother shared-ca
9f20: 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  che connection m
9f30: 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 20 62 65  ight sneak in be
9f40: 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 64  tween.  ** the d
9f50: 61 74 61 62 61 73 65 20 72 6f 6c 6c 62 61 63 6b  atabase rollback
9f60: 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65   and schema rese
9f70: 74 2c 20 77 68 69 63 68 20 63 61 6e 20 63 61 75  t, which can cau
9f80: 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63 6f  se false.  ** co
9f90: 72 72 75 70 74 69 6f 6e 20 72 65 70 6f 72 74 73  rruption reports
9fa0: 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e 20   in some cases. 
9fb0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
9fc0: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
9fd0: 20 20 73 63 68 65 6d 61 43 68 61 6e 67 65 20 3d    schemaChange =
9fe0: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
9ff0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
a000: 65 73 29 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e  es)!=0 && db->in
a010: 69 74 2e 62 75 73 79 3d 3d 30 3b 0a 0a 20 20 66  it.busy==0;..  f
a020: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
a030: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; i++){.    Btr
a040: 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b  ee *p = db->aDb[
a050: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20  i].pBt;.    if( 
a060: 70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  p ){.      if( s
a070: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
a080: 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20  rans(p) ){.     
a090: 20 20 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a     inTrans = 1;.
a0a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
a0b0: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
a0c0: 63 6b 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20  ck(p, tripCode, 
a0d0: 21 73 63 68 65 6d 61 43 68 61 6e 67 65 29 3b 0a  !schemaChange);.
a0e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
a0f0: 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28  te3VtabRollback(
a100: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e  db);.  sqlite3En
a110: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
a120: 0a 0a 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61  ..  if( (db->fla
a130: 67 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  gs&SQLITE_Intern
a140: 43 68 61 6e 67 65 73 29 21 3d 30 20 26 26 20 64  Changes)!=0 && d
a150: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
a160: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
a170: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
a180: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
a190: 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53  sqlite3ResetAllS
a1a0: 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69  chemasOfConnecti
a1b0: 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71  on(db);.  }.  sq
a1c0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
a1d0: 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e  ll(db);..  /* An
a1e0: 79 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  y deferred const
a1f0: 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73  raint violations
a200: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72   have now been r
a210: 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62  esolved. */.  db
a220: 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
a230: 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65  = 0;.  db->nDefe
a240: 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b  rredImmCons = 0;
a250: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
a260: 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73  ~SQLITE_DeferFKs
a270: 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68  ;..  /* If one h
a280: 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72  as been configur
a290: 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72  ed, invoke the r
a2a0: 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c  ollback-hook cal
a2b0: 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64  lback */.  if( d
a2c0: 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c  b->xRollbackCall
a2d0: 62 61 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73  back && (inTrans
a2e0: 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d   || !db->autoCom
a2f0: 6d 69 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e  mit) ){.    db->
a300: 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
a310: 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41  k(db->pRollbackA
a320: 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  rg);.  }.}../*.*
a330: 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69  * Return a stati
a340: 63 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  c string contain
a350: 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 63 6f 72  ing the name cor
a360: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
a370: 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20  e error code.** 
a380: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
a390: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69   argument..*/.#i
a3a0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
a3b0: 5f 4e 45 45 44 5f 45 52 52 5f 4e 41 4d 45 29 0a  _NEED_ERR_NAME).
a3c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
a3d0: 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 20 72  te3ErrName(int r
a3e0: 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  c){.  const char
a3f0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *zName = 0;.  i
a400: 6e 74 20 69 2c 20 6f 72 69 67 52 63 20 3d 20 72  nt i, origRc = r
a410: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
a420: 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69  2 && zName==0; i
a430: 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66 66 29 7b  ++, rc &= 0xff){
a440: 0a 20 20 20 20 73 77 69 74 63 68 28 20 72 63 20  .    switch( rc 
a450: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  ){.      case SQ
a460: 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20  LITE_OK:        
a470: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
a480: 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20   "SQLITE_OK";   
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
a4a0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a4b0: 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20  QLITE_ERROR:    
a4c0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a4d0: 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22  = "SQLITE_ERROR"
a4e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
a4f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a500: 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a  SQLITE_INTERNAL:
a510: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
a520: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52   = "SQLITE_INTER
a530: 4e 41 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62  NAL";          b
a540: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a550: 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20   SQLITE_PERM:   
a560: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
a570: 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45 52 4d  e = "SQLITE_PERM
a580: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
a590: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a5a0: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20  e SQLITE_ABORT: 
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
a5c0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f  me = "SQLITE_ABO
a5d0: 52 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  RT";            
a5e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a5f0: 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  se SQLITE_ABORT_
a600: 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a 4e  ROLLBACK:     zN
a610: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42  ame = "SQLITE_AB
a620: 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 20  ORT_ROLLBACK";  
a630: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a640: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a  ase SQLITE_BUSY:
a650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
a660: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42  Name = "SQLITE_B
a670: 55 53 59 22 3b 20 20 20 20 20 20 20 20 20 20 20  USY";           
a680: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a690: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59  case SQLITE_BUSY
a6a0: 5f 52 45 43 4f 56 45 52 59 3a 20 20 20 20 20 20  _RECOVERY:      
a6b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a6c0: 42 55 53 59 5f 52 45 43 4f 56 45 52 59 22 3b 20  BUSY_RECOVERY"; 
a6d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a6e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53   case SQLITE_BUS
a6f0: 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20 20 20  Y_SNAPSHOT:     
a700: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a710: 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 22 3b  _BUSY_SNAPSHOT";
a720: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a730: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f    case SQLITE_LO
a740: 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20 20 20  CKED:           
a750: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a760: 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20  E_LOCKED";      
a770: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a780: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
a790: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
a7a0: 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  E: zName = "SQLI
a7b0: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
a7c0: 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20  CACHE";break;.  
a7d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a7e0: 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 20  NOMEM:          
a7f0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a800: 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20  ITE_NOMEM";     
a810: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a820: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a830: 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20  _READONLY:      
a840: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a850: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20  LITE_READONLY"; 
a860: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a870: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a880: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56  E_READONLY_RECOV
a890: 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ERY:  zName = "S
a8a0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
a8b0: 45 43 4f 56 45 52 59 22 3b 20 62 72 65 61 6b 3b  ECOVERY"; break;
a8c0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a8d0: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54  TE_READONLY_CANT
a8e0: 4c 4f 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  LOCK:  zName = "
a8f0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
a900: 43 41 4e 54 4c 4f 43 4b 22 3b 20 62 72 65 61 6b  CANTLOCK"; break
a910: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a920: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c  ITE_READONLY_ROL
a930: 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20  LBACK:  zName = 
a940: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
a950: 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61  _ROLLBACK"; brea
a960: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a970: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
a980: 4d 4f 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20 3d  MOVED:   zName =
a990: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
a9a0: 59 5f 44 42 4d 4f 56 45 44 22 3b 20 20 62 72 65  Y_DBMOVED";  bre
a9b0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a9c0: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a  QLITE_INTERRUPT:
a9d0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a9e0: 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  = "SQLITE_INTERR
a9f0: 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 62 72  UPT";         br
aa00: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
aa10: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20  SQLITE_IOERR:   
aa20: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
aa30: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
aa40: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
aa50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
aa60: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
aa70: 41 44 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  AD:         zNam
aa80: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
aa90: 52 5f 52 45 41 44 22 3b 20 20 20 20 20 20 20 20  R_READ";        
aaa0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
aab0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
aac0: 48 4f 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e 61  HORT_READ:   zNa
aad0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
aae0: 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b 20  RR_SHORT_READ"; 
aaf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ab00: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
ab10: 57 52 49 54 45 3a 20 20 20 20 20 20 20 20 7a 4e  WRITE:        zN
ab20: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
ab30: 45 52 52 5f 57 52 49 54 45 22 3b 20 20 20 20 20  ERR_WRITE";     
ab40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ab50: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
ab60: 5f 46 53 59 4e 43 3a 20 20 20 20 20 20 20 20 7a  _FSYNC:        z
ab70: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
ab80: 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20 20 20 20  OERR_FSYNC";    
ab90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
aba0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
abb0: 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20 20 20  R_DIR_FSYNC:    
abc0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
abd0: 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 22  IOERR_DIR_FSYNC"
abe0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
abf0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
ac00: 52 52 5f 54 52 55 4e 43 41 54 45 3a 20 20 20 20  RR_TRUNCATE:    
ac10: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ac20: 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 22  _IOERR_TRUNCATE"
ac30: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
ac40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
ac50: 45 52 52 5f 46 53 54 41 54 3a 20 20 20 20 20 20  ERR_FSTAT:      
ac60: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ac70: 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 22 3b 20  E_IOERR_FSTAT"; 
ac80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ac90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
aca0: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20  OERR_UNLOCK:    
acb0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
acc0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22  TE_IOERR_UNLOCK"
acd0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
ace0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
acf0: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20 20  IOERR_RDLOCK:   
ad00: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ad10: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
ad20: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
ad30: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ad40: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20 20  _IOERR_DELETE:  
ad50: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ad60: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
ad70: 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  E";      break;.
ad80: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ad90: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20  E_IOERR_NOMEM:  
ada0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
adb0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
adc0: 4d 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  M";       break;
add0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ade0: 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3a  TE_IOERR_ACCESS:
adf0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ae00: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
ae10: 45 53 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b  ESS";      break
ae20: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ae30: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
ae40: 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20 20  ESERVEDLOCK:.   
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae60: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
ae70: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
ae80: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
ae90: 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LOCK"; break;.  
aea0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
aeb0: 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20 20  IOERR_LOCK:     
aec0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
aed0: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b  ITE_IOERR_LOCK";
aee0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
aef0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
af00: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20 20  _IOERR_CLOSE:   
af10: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
af20: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
af30: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
af40: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
af50: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
af60: 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  E:    zName = "S
af70: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
af80: 43 4c 4f 53 45 22 3b 20 20 20 62 72 65 61 6b 3b  CLOSE";   break;
af90: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
afa0: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
afb0: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
afc0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
afd0: 4f 50 45 4e 22 3b 20 20 20 20 20 62 72 65 61 6b  OPEN";     break
afe0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
aff0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
b000: 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  E:      zName = 
b010: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
b020: 4d 53 49 5a 45 22 3b 20 20 20 20 20 62 72 65 61  MSIZE";     brea
b030: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b040: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f  LITE_IOERR_SHMLO
b050: 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  CK:      zName =
b060: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
b070: 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72 65  HMLOCK";     bre
b080: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b090: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
b0a0: 41 50 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  AP:       zName 
b0b0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b0c0: 53 48 4d 4d 41 50 22 3b 20 20 20 20 20 20 62 72  SHMMAP";      br
b0d0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b0e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
b0f0: 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  K:         zName
b100: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b110: 5f 53 45 45 4b 22 3b 20 20 20 20 20 20 20 20 62  _SEEK";        b
b120: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b130: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
b140: 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d  LETE_NOENT: zNam
b150: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b160: 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b  R_DELETE_NOENT";
b170: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b180: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  e SQLITE_IOERR_M
b190: 4d 41 50 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  MAP:         zNa
b1a0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
b1b0: 52 52 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20 20  RR_MMAP";       
b1c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b1d0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
b1e0: 47 45 54 54 45 4d 50 50 41 54 48 3a 20 20 7a 4e  GETTEMPPATH:  zN
b1f0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b200: 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 22  ERR_GETTEMPPATH"
b210: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
b220: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b230: 5f 43 4f 4e 56 50 41 54 48 3a 20 20 20 20 20 7a  _CONVPATH:     z
b240: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b250: 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 22 3b 20  OERR_CONVPATH"; 
b260: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b270: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52  case SQLITE_CORR
b280: 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  UPT:            
b290: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b2a0: 43 4f 52 52 55 50 54 22 3b 20 20 20 20 20 20 20  CORRUPT";       
b2b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b2c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52   case SQLITE_COR
b2d0: 52 55 50 54 5f 56 54 41 42 3a 20 20 20 20 20 20  RUPT_VTAB:      
b2e0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b2f0: 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 22 3b 20  _CORRUPT_VTAB"; 
b300: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b310: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
b320: 54 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20 20  TFOUND:         
b330: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b340: 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20  E_NOTFOUND";    
b350: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b360: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
b370: 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20  ULL:            
b380: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b390: 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20 20  TE_FULL";       
b3a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b3b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b3c0: 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20 20  CANTOPEN:       
b3d0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b3e0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20  ITE_CANTOPEN";  
b3f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b400: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b410: 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50  _CANTOPEN_NOTEMP
b420: 44 49 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  DIR: zName = "SQ
b430: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f  LITE_CANTOPEN_NO
b440: 54 45 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b 0a  TEMPDIR";break;.
b450: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b460: 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
b470: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
b480: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
b490: 53 44 49 52 22 3b 20 20 20 20 62 72 65 61 6b 3b  SDIR";    break;
b4a0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b4b0: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
b4c0: 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  PATH:  zName = "
b4d0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
b4e0: 46 55 4c 4c 50 41 54 48 22 3b 20 62 72 65 61 6b  FULLPATH"; break
b4f0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b500: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e  ITE_CANTOPEN_CON
b510: 56 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20  VPATH:  zName = 
b520: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
b530: 5f 43 4f 4e 56 50 41 54 48 22 3b 20 62 72 65 61  _CONVPATH"; brea
b540: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b550: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20  LITE_PROTOCOL:  
b560: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b570: 20 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f   "SQLITE_PROTOCO
b580: 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  L";          bre
b590: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b5a0: 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20  QLITE_EMPTY:    
b5b0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b5c0: 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59 22  = "SQLITE_EMPTY"
b5d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
b5e0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b5f0: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20  SQLITE_SCHEMA:  
b600: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b610: 20 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45 4d   = "SQLITE_SCHEM
b620: 41 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  A";            b
b630: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b640: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20   SQLITE_TOOBIG: 
b650: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b660: 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42  e = "SQLITE_TOOB
b670: 49 47 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  IG";            
b680: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b690: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
b6a0: 49 4e 54 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  INT:         zNa
b6b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
b6c0: 53 54 52 41 49 4e 54 22 3b 20 20 20 20 20 20 20  STRAINT";       
b6d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b6e0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
b6f0: 41 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a 4e  AINT_UNIQUE:  zN
b700: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b710: 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 22  NSTRAINT_UNIQUE"
b720: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
b730: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
b740: 52 41 49 4e 54 5f 54 52 49 47 47 45 52 3a 20 7a  RAINT_TRIGGER: z
b750: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b760: 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45  ONSTRAINT_TRIGGE
b770: 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  R";break;.      
b780: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
b790: 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
b7a0: 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:.             
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7c0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b7d0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
b7e0: 52 45 49 47 4e 4b 45 59 22 3b 20 20 20 62 72 65  REIGNKEY";   bre
b7f0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b800: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b810: 5f 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65 20  _CHECK:   zName 
b820: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
b830: 41 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62 72  AINT_CHECK";  br
b840: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b850: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b860: 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20  T_PRIMARYKEY:.  
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
b890: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b8a0: 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
b8b0: 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  KEY";   break;. 
b8c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b8d0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e  _CONSTRAINT_NOTN
b8e0: 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  ULL: zName = "SQ
b8f0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b900: 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a  NOTNULL";break;.
b910: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b920: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d  E_CONSTRAINT_COM
b930: 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20 20  MITHOOK:.       
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b950: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b960: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
b970: 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b  INT_COMMITHOOK";
b980: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b990: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
b9a0: 54 52 41 49 4e 54 5f 56 54 41 42 3a 20 20 20 20  TRAINT_VTAB:    
b9b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b9c0: 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 22  CONSTRAINT_VTAB"
b9d0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
b9e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
b9f0: 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e  STRAINT_FUNCTION
ba00: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ba30: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e  E_CONSTRAINT_FUN
ba40: 43 54 49 4f 4e 22 3b 20 20 20 20 20 62 72 65 61  CTION";     brea
ba50: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ba60: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
ba70: 52 4f 57 49 44 3a 20 20 20 7a 4e 61 6d 65 20 3d  ROWID:   zName =
ba80: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
ba90: 49 4e 54 5f 52 4f 57 49 44 22 3b 20 20 62 72 65  INT_ROWID";  bre
baa0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bab0: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20  QLITE_MISMATCH: 
bac0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bad0: 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  = "SQLITE_MISMAT
bae0: 43 48 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  CH";          br
baf0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bb00: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20  SQLITE_MISUSE:  
bb10: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bb20: 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 55 53   = "SQLITE_MISUS
bb30: 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  E";            b
bb40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bb50: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20   SQLITE_NOLFS:  
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
bb70: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46  e = "SQLITE_NOLF
bb80: 53 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  S";             
bb90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bba0: 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20  e SQLITE_AUTH:  
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
bbc0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55 54  me = "SQLITE_AUT
bbd0: 48 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  H";             
bbe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bbf0: 73 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  se SQLITE_FORMAT
bc00: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
bc10: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f  ame = "SQLITE_FO
bc20: 52 4d 41 54 22 3b 20 20 20 20 20 20 20 20 20 20  RMAT";          
bc30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bc40: 61 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45  ase SQLITE_RANGE
bc50: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
bc60: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
bc70: 41 4e 47 45 22 3b 20 20 20 20 20 20 20 20 20 20  ANGE";          
bc80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
bc90: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41  case SQLITE_NOTA
bca0: 44 42 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  DB:             
bcb0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bcc0: 4e 4f 54 41 44 42 22 3b 20 20 20 20 20 20 20 20  NOTADB";        
bcd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bce0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f 57   case SQLITE_ROW
bcf0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
bd00: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bd10: 5f 52 4f 57 22 3b 20 20 20 20 20 20 20 20 20 20  _ROW";          
bd20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bd30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
bd40: 54 49 43 45 3a 20 20 20 20 20 20 20 20 20 20 20  TICE:           
bd50: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bd60: 45 5f 4e 4f 54 49 43 45 22 3b 20 20 20 20 20 20  E_NOTICE";      
bd70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bd80: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
bd90: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41  OTICE_RECOVER_WA
bda0: 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  L: zName = "SQLI
bdb0: 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
bdc0: 52 5f 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20 20  R_WAL";break;.  
bdd0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bde0: 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52  NOTICE_RECOVER_R
bdf0: 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20 20  OLLBACK:.       
be00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be10: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
be20: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f   "SQLITE_NOTICE_
be30: 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b  RECOVER_ROLLBACK
be40: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
be50: 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e  case SQLITE_WARN
be60: 49 4e 47 3a 20 20 20 20 20 20 20 20 20 20 20 20  ING:            
be70: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
be80: 57 41 52 4e 49 4e 47 22 3b 20 20 20 20 20 20 20  WARNING";       
be90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bea0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52   case SQLITE_WAR
beb0: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a 20  NING_AUTOINDEX: 
bec0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bed0: 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44  _WARNING_AUTOIND
bee0: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
bef0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f    case SQLITE_DO
bf00: 4e 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  NE:             
bf10: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bf20: 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20 20  E_DONE";        
bf30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bf40: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61   }.  }.  if( zNa
bf50: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  me==0 ){.    sta
bf60: 74 69 63 20 63 68 61 72 20 7a 42 75 66 5b 35 30  tic char zBuf[50
bf70: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
bf80: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
bf90: 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 53 51 4c  Buf), zBuf, "SQL
bfa0: 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29 22  ITE_UNKNOWN(%d)"
bfb0: 2c 20 6f 72 69 67 52 63 29 3b 0a 20 20 20 20 7a  , origRc);.    z
bfc0: 4e 61 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20 7d  Name = zBuf;.  }
bfd0: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
bfe0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
bff0: 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63   Return a static
c000: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
c010: 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20  cribes the kind 
c020: 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69  of error specifi
c030: 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67  ed in the.** arg
c040: 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ument..*/.const 
c050: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72  char *sqlite3Err
c060: 53 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 73  Str(int rc){.  s
c070: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c080: 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d  * const aMsg[] =
c090: 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45   {.    /* SQLITE
c0a0: 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f 20  _OK          */ 
c0b0: 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a  "not an error",.
c0c0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52      /* SQLITE_ER
c0d0: 52 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53 51  ROR       */ "SQ
c0e0: 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72  L logic error or
c0f0: 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61 73   missing databas
c100: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
c110: 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f  E_INTERNAL    */
c120: 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54   0,.    /* SQLIT
c130: 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a 2f  E_PERM        */
c140: 20 22 61 63 63 65 73 73 20 70 65 72 6d 69 73 73   "access permiss
c150: 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20  ion denied",.   
c160: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54   /* SQLITE_ABORT
c170: 20 20 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62         */ "callb
c180: 61 63 6b 20 72 65 71 75 65 73 74 65 64 20 71 75  ack requested qu
c190: 65 72 79 20 61 62 6f 72 74 22 2c 0a 20 20 20 20  ery abort",.    
c1a0: 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20  /* SQLITE_BUSY  
c1b0: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
c1c0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20  se is locked",. 
c1d0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43     /* SQLITE_LOC
c1e0: 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74  KED      */ "dat
c1f0: 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c  abase table is l
c200: 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ocked",.    /* S
c210: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20  QLITE_NOMEM     
c220: 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d    */ "out of mem
c230: 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ory",.    /* SQL
c240: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20  ITE_READONLY    
c250: 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77  */ "attempt to w
c260: 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20  rite a readonly 
c270: 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f  database",.    /
c280: 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  * SQLITE_INTERRU
c290: 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75  PT   */ "interru
c2a0: 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  pted",.    /* SQ
c2b0: 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20  LITE_IOERR      
c2c0: 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72   */ "disk I/O er
c2d0: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
c2e0: 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20  ITE_CORRUPT     
c2f0: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64 69 73  */ "database dis
c300: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
c310: 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rmed",.    /* SQ
c320: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20  LITE_NOTFOUND   
c330: 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65   */ "unknown ope
c340: 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20  ration",.    /* 
c350: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20  SQLITE_FULL     
c360: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
c370: 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22  or disk is full"
c380: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c390: 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22  CANTOPEN    */ "
c3a0: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
c3b0: 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20  atabase file",. 
c3c0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f     /* SQLITE_PRO
c3d0: 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63  TOCOL    */ "loc
c3e0: 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a  king protocol",.
c3f0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d      /* SQLITE_EM
c400: 50 54 59 20 20 20 20 20 20 20 2a 2f 20 22 74 61  PTY       */ "ta
c410: 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  ble contains no 
c420: 64 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51  data",.    /* SQ
c430: 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20 20  LITE_SCHEMA     
c440: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73 63   */ "database sc
c450: 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64  hema has changed
c460: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c470: 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f 20  _TOOBIG      */ 
c480: 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20  "string or blob 
c490: 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a  too big",.    /*
c4a0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
c4b0: 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69  NT  */ "constrai
c4c0: 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20 20  nt failed",.    
c4d0: 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  /* SQLITE_MISMAT
c4e0: 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74 79  CH    */ "dataty
c4f0: 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20  pe mismatch",.  
c500: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55    /* SQLITE_MISU
c510: 53 45 20 20 20 20 20 20 2a 2f 20 22 6c 69 62 72  SE      */ "libr
c520: 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c  ary routine call
c530: 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e  ed out of sequen
c540: 63 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ce",.    /* SQLI
c550: 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a  TE_NOLFS       *
c560: 2f 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75  / "large file su
c570: 70 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65  pport is disable
c580: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
c590: 45 5f 41 55 54 48 20 20 20 20 20 20 20 20 2a 2f  E_AUTH        */
c5a0: 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20   "authorization 
c5b0: 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20  denied",.    /* 
c5c0: 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20 20  SQLITE_FORMAT   
c5d0: 20 20 20 2a 2f 20 22 61 75 78 69 6c 69 61 72 79     */ "auxiliary
c5e0: 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74   database format
c5f0: 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20   error",.    /* 
c600: 53 51 4c 49 54 45 5f 52 41 4e 47 45 20 20 20 20  SQLITE_RANGE    
c610: 20 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63     */ "bind or c
c620: 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20  olumn index out 
c630: 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f  of range",.    /
c640: 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20  * SQLITE_NOTADB 
c650: 20 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69 73       */ "file is
c660: 20 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69 73   encrypted or is
c670: 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65 22   not a database"
c680: 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63  ,.  };.  const c
c690: 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b  har *zErr = "unk
c6a0: 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73  nown error";.  s
c6b0: 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20  witch( rc ){.   
c6c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f   case SQLITE_ABO
c6d0: 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20  RT_ROLLBACK: {. 
c6e0: 20 20 20 20 20 7a 45 72 72 20 3d 20 22 61 62 6f       zErr = "abo
c6f0: 72 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41  rt due to ROLLBA
c700: 43 4b 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  CK";.      break
c710: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
c720: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  ult: {.      rc 
c730: 26 3d 20 30 78 66 66 3b 0a 20 20 20 20 20 20 69  &= 0xff;.      i
c740: 66 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30 29  f( ALWAYS(rc>=0)
c750: 20 26 26 20 72 63 3c 41 72 72 61 79 53 69 7a 65   && rc<ArraySize
c760: 28 61 4d 73 67 29 20 26 26 20 61 4d 73 67 5b 72  (aMsg) && aMsg[r
c770: 63 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  c]!=0 ){.       
c780: 20 7a 45 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d   zErr = aMsg[rc]
c790: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c7a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
c7b0: 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a  .  return zErr;.
c7c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
c7d0: 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
c7e0: 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b   a busy callback
c7f0: 20 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64   that sleeps and
c800: 20 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20   tries.** again 
c810: 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20  until a timeout 
c820: 76 61 6c 75 65 20 69 73 20 72 65 61 63 68 65 64  value is reached
c830: 2e 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76  .  The timeout v
c840: 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e  alue is.** an in
c850: 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  teger number of 
c860: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73  milliseconds pas
c870: 73 65 64 20 69 6e 20 61 73 20 74 68 65 20 66 69  sed in as the fi
c880: 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  rst.** argument.
c890: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
c8a0: 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79  qliteDefaultBusy
c8b0: 43 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20  Callback(. void 
c8c0: 2a 70 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  *ptr,           
c8d0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
c8e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69  connection */. i
c8f0: 6e 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20  nt count        
c900: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c910: 72 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65  r of times table
c920: 20 68 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a   has been busy *
c930: 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  /.){.#if SQLITE_
c940: 4f 53 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f 55  OS_WIN || HAVE_U
c950: 53 4c 45 45 50 0a 20 20 73 74 61 74 69 63 20 63  SLEEP.  static c
c960: 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d  onst u8 delays[]
c970: 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20   =.     { 1, 2, 
c980: 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32  5, 10, 15, 20, 2
c990: 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c  5, 25,  25,  50,
c9a0: 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73    50, 100 };.  s
c9b0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74  tatic const u8 t
c9c0: 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  otals[] =.     {
c9d0: 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38   0, 1, 3,  8, 18
c9e0: 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30  , 33, 53, 78, 10
c9f0: 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38  3, 128, 178, 228
ca00: 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45   };.# define NDE
ca10: 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28 64 65  LAY ArraySize(de
ca20: 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20  lays).  sqlite3 
ca30: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
ca40: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65  )ptr;.  int time
ca50: 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69  out = db->busyTi
ca60: 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c  meout;.  int del
ca70: 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73  ay, prior;..  as
ca80: 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29  sert( count>=0 )
ca90: 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20  ;.  if( count < 
caa0: 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65  NDELAY ){.    de
cab0: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75  lay = delays[cou
cac0: 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  nt];.    prior =
cad0: 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a   totals[count];.
cae0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c    }else{.    del
caf0: 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c  ay = delays[NDEL
cb00: 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72  AY-1];.    prior
cb10: 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59   = totals[NDELAY
cb20: 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75  -1] + delay*(cou
cb30: 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a  nt-(NDELAY-1));.
cb40: 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20    }.  if( prior 
cb50: 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75  + delay > timeou
cb60: 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  t ){.    delay =
cb70: 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72   timeout - prior
cb80: 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c  ;.    if( delay<
cb90: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
cba0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c   }.  sqlite3OsSl
cbb0: 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65  eep(db->pVfs, de
cbc0: 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74  lay*1000);.  ret
cbd0: 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73  urn 1;.#else.  s
cbe0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71  qlite3 *db = (sq
cbf0: 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69  lite3 *)ptr;.  i
cc00: 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73  nt timeout = ((s
cc10: 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62  qlite3 *)ptr)->b
cc20: 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66  usyTimeout;.  if
cc30: 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30  ( (count+1)*1000
cc40: 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20   > timeout ){.  
cc50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
cc60: 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70    sqlite3OsSleep
cc70: 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30  (db->pVfs, 10000
cc80: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  00);.  return 1;
cc90: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
cca0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
ccb0: 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a  n busy handler..
ccc0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ccd0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
cce0: 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66  n an operation f
ccf0: 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63  ailed with a loc
cd00: 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  k..** If this ro
cd10: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f  utine returns no
cd20: 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
cd30: 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66   is retried.  If
cd40: 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30   it.** returns 0
cd50: 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  , the operation 
cd60: 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53  aborts with an S
cd70: 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
cd80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
cd90: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
cda0: 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  r(BusyHandler *p
cdb0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
cdc0: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c  f( NEVER(p==0) |
cdd0: 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c  | p->xFunc==0 ||
cde0: 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65   p->nBusy<0 ) re
cdf0: 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70  turn 0;.  rc = p
ce00: 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c  ->xFunc(p->pArg,
ce10: 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66   p->nBusy);.  if
ce20: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc==0 ){.    p
ce30: 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20  ->nBusy = -1;.  
ce40: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42  }else{.    p->nB
ce50: 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  usy++;.  }.  ret
ce60: 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  urn rc; .}../*.*
ce70: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
ce80: 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c  ets the busy cal
ce90: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
cea0: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
ceb0: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
cec0: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
ced0: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
cee0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
cef0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
cf00: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
cf10: 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73  db,.  int (*xBus
cf20: 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20  y)(void*,int),. 
cf30: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23   void *pArg.){.#
cf40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
cf50: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
cf60: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
cf70: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
cf80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
cf90: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
cfa0: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
cfb0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
cfc0: 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  x);.  db->busyHa
cfd0: 6e 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42  ndler.xFunc = xB
cfe0: 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48  usy;.  db->busyH
cff0: 61 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41  andler.pArg = pA
d000: 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  rg;.  db->busyHa
d010: 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b  ndler.nBusy = 0;
d020: 0a 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f  .  db->busyTimeo
d030: 75 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ut = 0;.  sqlite
d040: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
d050: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
d060: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d070: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d080: 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41  OMIT_PROGRESS_CA
d090: 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69  LLBACK./*.** Thi
d0a0: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
d0b0: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
d0c0: 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69  back for an Sqli
d0d0: 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74  te database to t
d0e0: 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c  he.** given call
d0f0: 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69  back function wi
d100: 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67  th the given arg
d110: 75 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72  ument. The progr
d120: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c  ess callback wil
d130: 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20  l.** be invoked 
d140: 65 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64  every nOps opcod
d150: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
d160: 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e  te3_progress_han
d170: 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20  dler(.  sqlite3 
d180: 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73  *db, .  int nOps
d190: 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72  ,.  int (*xProgr
d1a0: 65 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20  ess)(void*), .  
d1b0: 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 23 69  void *pArg.){.#i
d1c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
d1d0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
d1e0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
d1f0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
d200: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
d210: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
d220: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
d230: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
d240: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
d250: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70  utex);.  if( nOp
d260: 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78  s>0 ){.    db->x
d270: 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67  Progress = xProg
d280: 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50  ress;.    db->nP
d290: 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 28 75 6e  rogressOps = (un
d2a0: 73 69 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20 20  signed)nOps;.   
d2b0: 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72   db->pProgressAr
d2c0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73  g = pArg;.  }els
d2d0: 65 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67  e{.    db->xProg
d2e0: 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62  ress = 0;.    db
d2f0: 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d  ->nProgressOps =
d300: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f   0;.    db->pPro
d310: 67 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20  gressArg = 0;.  
d320: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
d330: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
d340: 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  x);.}.#endif.../
d350: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d360: 65 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66  e installs a def
d370: 61 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65  ault busy handle
d380: 72 20 74 68 61 74 20 77 61 69 74 73 20 66 6f 72  r that waits for
d390: 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65   the.** specifie
d3a0: 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  d number of mill
d3b0: 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20  iseconds before 
d3c0: 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a  returning 0..*/.
d3d0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79  int sqlite3_busy
d3e0: 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33  _timeout(sqlite3
d3f0: 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 23   *db, int ms){.#
d400: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
d410: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
d420: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
d430: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
d440: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
d450: 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
d460: 66 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a  f.  if( ms>0 ){.
d470: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
d480: 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c  _handler(db, sql
d490: 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61  iteDefaultBusyCa
d4a0: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64  llback, (void*)d
d4b0: 62 29 3b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79  b);.    db->busy
d4c0: 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20  Timeout = ms;.  
d4d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
d4e0: 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  e3_busy_handler(
d4f0: 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  db, 0, 0);.  }. 
d500: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d510: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73  K;.}../*.** Caus
d520: 65 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70  e any pending op
d530: 65 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20  eration to stop 
d540: 61 74 20 69 74 73 20 65 61 72 6c 69 65 73 74 20  at its earliest 
d550: 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a  opportunity..*/.
d560: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74  void sqlite3_int
d570: 65 72 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a  errupt(sqlite3 *
d580: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
d590: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
d5a0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
d5b0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
d5c0: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
d5d0: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
d5e0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
d5f0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 64 62  .  }.#endif.  db
d600: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74  ->u1.isInterrupt
d610: 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ed = 1;.}.../*.*
d620: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d630: 69 73 20 65 78 61 63 74 6c 79 20 74 68 65 20 73  is exactly the s
d640: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63  ame as sqlite3_c
d650: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29  reate_function()
d660: 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74  , except.** that
d670: 20 69 74 20 69 73 20 64 65 73 69 67 6e 65 64 20   it is designed 
d680: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20  to be called by 
d690: 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54  internal code. T
d6a0: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73  he difference is
d6b0: 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61  .** that if a ma
d6c0: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20  lloc() fails in 
d6d0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
d6e0: 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72  unction(), an er
d6f0: 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72  ror code.** is r
d700: 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
d710: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
d720: 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69  g cleared. .*/.i
d730: 6e 74 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  nt sqlite3Create
d740: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20  Func(.  sqlite3 
d750: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
d760: 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  r *zFunctionName
d770: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
d780: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
d790: 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f  *pUserData,.  vo
d7a0: 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  id (*xFunc)(sqli
d7b0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
d7c0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
d7d0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
d7e0: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
d7f0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
d800: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
d810: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
d820: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a  ite3_context*),.
d830: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
d840: 20 2a 70 44 65 73 74 72 75 63 74 6f 72 0a 29 7b   *pDestructor.){
d850: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20  .  FuncDef *p;. 
d860: 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e   int nName;.  in
d870: 74 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20  t extraFlags;.. 
d880: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d890: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
d8a0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
d8b0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30  zFunctionName==0
d8c0: 20 7c 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63   ||.      (xFunc
d8d0: 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78   && (xFinal || x
d8e0: 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20  Step)) || .     
d8f0: 20 28 21 78 46 75 6e 63 20 26 26 20 28 78 46 69   (!xFunc && (xFi
d900: 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29 29 20  nal && !xStep)) 
d910: 7c 7c 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63  ||.      (!xFunc
d920: 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20   && (!xFinal && 
d930: 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20  xStep)) ||.     
d940: 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72   (nArg<-1 || nAr
d950: 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  g>SQLITE_MAX_FUN
d960: 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20  CTION_ARG) ||.  
d970: 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20      (255<(nName 
d980: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
d990: 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  0( zFunctionName
d9a0: 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ))) ){.    retur
d9b0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
d9c0: 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  BKPT;.  }..  ass
d9d0: 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
d9e0: 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c 49 54  _CONSTANT==SQLIT
d9f0: 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20  E_DETERMINISTIC 
da00: 29 3b 0a 20 20 65 78 74 72 61 46 6c 61 67 73 20  );.  extraFlags 
da10: 3d 20 65 6e 63 20 26 20 20 53 51 4c 49 54 45 5f  = enc &  SQLITE_
da20: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a 20  DETERMINISTIC;. 
da30: 20 65 6e 63 20 26 3d 20 28 53 51 4c 49 54 45 5f   enc &= (SQLITE_
da40: 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c  FUNC_ENCMASK|SQL
da50: 49 54 45 5f 41 4e 59 29 3b 0a 20 20 0a 23 69 66  ITE_ANY);.  .#if
da60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
da70: 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53  _UTF16.  /* If S
da80: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73  QLITE_UTF16 is s
da90: 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20  pecified as the 
daa0: 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74  encoding type, t
dab0: 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20  ransform this.  
dac0: 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c  ** to one of SQL
dad0: 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53  ITE_UTF16LE or S
dae0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73  QLITE_UTF16BE us
daf0: 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c  ing the.  ** SQL
db00: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20  ITE_UTF16NATIVE 
db10: 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54  macro. SQLITE_UT
db20: 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20  F16 is not used 
db30: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a  internally..  **
db40: 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  ** If SQLITE_
db50: 41 4e 59 20 69 73 20 73 70 65 63 69 66 69 65 64  ANY is specified
db60: 2c 20 61 64 64 20 74 68 72 65 65 20 76 65 72 73  , add three vers
db70: 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63  ions of the func
db80: 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tion.  ** to the
db90: 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a   hash table..  *
dba0: 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c  /.  if( enc==SQL
dbb0: 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20  ITE_UTF16 ){.   
dbc0: 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54   enc = SQLITE_UT
dbd0: 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c  F16NATIVE;.  }el
dbe0: 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49  se if( enc==SQLI
dbf0: 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e  TE_ANY ){.    in
dc00: 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  t rc;.    rc = s
dc10: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
dc20: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
dc30: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
dc40: 5f 55 54 46 38 7c 65 78 74 72 61 46 6c 61 67 73  _UTF8|extraFlags
dc50: 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73 65 72  ,.         pUser
dc60: 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74  Data, xFunc, xSt
dc70: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73  ep, xFinal, pDes
dc80: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66  tructor);.    if
dc90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
dca0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
dcb0: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
dcc0: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
dcd0: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
dce0: 55 54 46 31 36 4c 45 7c 65 78 74 72 61 46 6c 61  UTF16LE|extraFla
dcf0: 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 70 55  gs,.          pU
dd00: 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20  serData, xFunc, 
dd10: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70  xStep, xFinal, p
dd20: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
dd30: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
dd40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
dd50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
dd60: 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c   }.    enc = SQL
dd70: 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d  ITE_UTF16BE;.  }
dd80: 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53  .#else.  enc = S
dd90: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64  QLITE_UTF8;.#end
dda0: 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  if.  .  /* Check
ddb0: 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   if an existing 
ddc0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  function is bein
ddd0: 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20  g overridden or 
dde0: 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a  deleted. If so,.
ddf0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61    ** and there a
de00: 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74  re active VMs, t
de10: 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54  hen return SQLIT
de20: 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e  E_BUSY. If a fun
de30: 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65  ction.  ** is be
de40: 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64  ing overridden/d
de50: 65 6c 65 74 65 64 20 62 75 74 20 74 68 65 72 65  eleted but there
de60: 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56   are no active V
de70: 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20  Ms, allow the.  
de80: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ** operation to 
de90: 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76  continue but inv
dea0: 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63  alidate all prec
deb0: 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
dec0: 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73  ts..  */.  p = s
ded0: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
dee0: 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  on(db, zFunction
def0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72  Name, nName, nAr
df00: 67 2c 20 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a  g, (u8)enc, 0);.
df10: 20 20 69 66 28 20 70 20 26 26 20 28 70 2d 3e 66    if( p && (p->f
df20: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
df30: 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 3d  E_FUNC_ENCMASK)=
df40: 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d  =enc && p->nArg=
df50: 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28  =nArg ){.    if(
df60: 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
df70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
df80: 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
df90: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a  , SQLITE_BUSY, .
dfa0: 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20          "unable 
dfb0: 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79  to delete/modify
dfc0: 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64   user-function d
dfd0: 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61  ue to active sta
dfe0: 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20  tements");.     
dff0: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
e000: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
e010: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e020: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73  E_BUSY;.    }els
e030: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
e040: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
e050: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
e060: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73    }.  }..  p = s
e070: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
e080: 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  on(db, zFunction
e090: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72  Name, nName, nAr
e0a0: 67 2c 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a  g, (u8)enc, 1);.
e0b0: 20 20 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62    assert(p || db
e0c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b  ->mallocFailed);
e0d0: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
e0e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e0f0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
e100: 49 66 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73  If an older vers
e110: 69 6f 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ion of the funct
e120: 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69  ion with a confi
e130: 67 75 72 65 64 20 64 65 73 74 72 75 63 74 6f 72  gured destructor
e140: 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72   is.  ** being r
e150: 65 70 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74  eplaced invoke t
e160: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75  he destructor fu
e170: 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a  nction here. */.
e180: 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f    functionDestro
e190: 79 28 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28  y(db, p);..  if(
e1a0: 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a   pDestructor ){.
e1b0: 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d      pDestructor-
e1c0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70  >nRef++;.  }.  p
e1d0: 2d 3e 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20  ->pDestructor = 
e1e0: 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70  pDestructor;.  p
e1f0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70  ->funcFlags = (p
e200: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
e210: 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53  LITE_FUNC_ENCMAS
e220: 4b 29 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b  K) | extraFlags;
e230: 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e  .  testcase( p->
e240: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
e250: 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43  TE_DETERMINISTIC
e260: 20 29 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d   );.  p->xFunc =
e270: 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74   xFunc;.  p->xSt
e280: 65 70 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d  ep = xStep;.  p-
e290: 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69  >xFinalize = xFi
e2a0: 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44  nal;.  p->pUserD
e2b0: 61 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b  ata = pUserData;
e2c0: 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31  .  p->nArg = (u1
e2d0: 36 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e  6)nArg;.  return
e2e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
e2f0: 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20  *.** Create new 
e300: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  user functions..
e310: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
e320: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
e330: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
e340: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
e350: 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  nc,.  int nArg,.
e360: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69    int enc,.  voi
e370: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
e380: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
e390: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
e3a0: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
e3b0: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
e3c0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
e3d0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
e3e0: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
e3f0: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
e400: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65  ontext*).){.  re
e410: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  turn sqlite3_cre
e420: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
e430: 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c  db, zFunc, nArg,
e440: 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20   enc, p, xFunc, 
e450: 78 53 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20  xStep,.         
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 20 20 20 20 20 20 20 20 20 20 20 78 46 69 6e 61             xFina
e480: 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71  l, 0);.}..int sq
e490: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
e4a0: 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69  ction_v2(.  sqli
e4b0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
e4c0: 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20   char *zFunc,.  
e4d0: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
e4e0: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a  enc,.  void *p,.
e4f0: 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28    void (*xFunc)(
e500: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
e510: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
e520: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
e530: 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f  *xStep)(sqlite3_
e540: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
e550: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
e560: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
e570: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e580: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  *),.  void (*xDe
e590: 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29  stroy)(void *).)
e5a0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
e5b0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e  ITE_ERROR;.  Fun
e5c0: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72  cDestructor *pAr
e5d0: 67 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  g = 0;..#ifdef S
e5e0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
e5f0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
e600: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
e610: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
e620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
e630: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e  SE_BKPT;.  }.#en
e640: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
e650: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
e660: 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65 73  tex);.  if( xDes
e670: 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72 67  troy ){.    pArg
e680: 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63 74   = (FuncDestruct
e690: 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  or *)sqlite3DbMa
e6a0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
e6b0: 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63 74  eof(FuncDestruct
e6c0: 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70  or));.    if( !p
e6d0: 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44 65  Arg ){.      xDe
e6e0: 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20 20  stroy(p);.      
e6f0: 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d 0a  goto out;.    }.
e700: 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74 72      pArg->xDestr
e710: 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a 20  oy = xDestroy;. 
e720: 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44 61     pArg->pUserDa
e730: 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 63  ta = p;.  }.  rc
e740: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
e750: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c 20  Func(db, zFunc, 
e760: 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46  nArg, enc, p, xF
e770: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
e780: 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66 28  al, pArg);.  if(
e790: 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 6e   pArg && pArg->n
e7a0: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  Ref==0 ){.    as
e7b0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
e7c0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73 74  _OK );.    xDest
e7d0: 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  roy(p);.    sqli
e7e0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 41  te3DbFree(db, pA
e7f0: 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a  rg);.  }.. out:.
e800: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
e810: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
e820: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
e830: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
e840: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e850: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e860: 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73  OMIT_UTF16.int s
e870: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
e880: 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69  nction16(.  sqli
e890: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
e8a0: 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e   void *zFunction
e8b0: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
e8c0: 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70  ,.  int eTextRep
e8d0: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
e8e0: 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
e8f0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
e900: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
e910: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
e920: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
e930: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
e940: 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69  _value**),.  voi
e950: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
e960: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
e970: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
e980: 72 20 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69 66 64  r *zFunc8;..#ifd
e990: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e9a0: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
e9b0: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
e9c0: 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 46  heckOk(db) || zF
e9d0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29  unctionName==0 )
e9e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
e9f0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
ea00: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
ea10: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
ea20: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
ea30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ea40: 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73   );.  zFunc8 = s
ea50: 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
ea60: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
ea70: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
ea80: 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20  16NATIVE);.  rc 
ea90: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
eaa0: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20  unc(db, zFunc8, 
eab0: 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20  nArg, eTextRep, 
eac0: 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  p, xFunc, xStep,
ead0: 20 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71   xFinal,0);.  sq
eae0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
eaf0: 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20  zFunc8);.  rc = 
eb00: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
eb10: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
eb20: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
eb30: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
eb40: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
eb50: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20  ../*.** Declare 
eb60: 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  that a function 
eb70: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61  has been overloa
eb80: 64 65 64 20 62 79 20 61 20 76 69 72 74 75 61 6c  ded by a virtual
eb90: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
eba0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c   the function al
ebb0: 72 65 61 64 79 20 65 78 69 73 74 73 20 61 73 20  ready exists as 
ebc0: 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c  a regular global
ebd0: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a   function, then.
ebe0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
ebf0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20  is a no-op.  If 
ec00: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
ec10: 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
ec20: 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65  n create.** a ne
ec30: 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77 61 79  w one that alway
ec40: 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e 2d 74  s throws a run-t
ec50: 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a  ime error.  .**.
ec60: 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61 6c 20  ** When virtual 
ec70: 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f  tables intend to
ec80: 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76 65 72   provide an over
ec90: 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c  loaded function,
eca0: 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20   they.** should 
ecb0: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
ecc0: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
ecd0: 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  he global functi
ece0: 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20  on exists..** A 
ecf0: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20  global function 
ed00: 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20 6f 72  must exist in or
ed10: 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72 65 73  der for name res
ed20: 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a  olution to work.
ed30: 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a  ** properly..*/.
ed40: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76 65 72  int sqlite3_over
ed50: 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  load_function(. 
ed60: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
ed70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
ed80: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b  e,.  int nArg.){
ed90: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73  .  int nName = s
eda0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
edb0: 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63 20  Name);.  int rc 
edc0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69  = SQLITE_OK;..#i
edd0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
ede0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
edf0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
ee00: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20  yCheckOk(db) || 
ee10: 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20 6e 41 72 67  zName==0 || nArg
ee20: 3c 2d 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <-2 ){.    retur
ee30: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
ee40: 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
ee50: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
ee60: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
ee70: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
ee80: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
ee90: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e   zName, nName, n
eea0: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
eeb0: 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  , 0)==0 ){.    r
eec0: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
eed0: 65 46 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c  eFunc(db, zName,
eee0: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
eef0: 46 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  F8,.            
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
ef10: 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64  , sqlite3Invalid
ef20: 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20  Function, 0, 0, 
ef30: 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  0);.  }.  rc = s
ef40: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
ef50: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
ef60: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
ef70: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
ef80: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
ef90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
efa0: 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  CE./*.** Registe
efb0: 72 20 61 20 74 72 61 63 65 20 66 75 6e 63 74 69  r a trace functi
efc0: 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72  on.  The pArg fr
efd0: 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  om the previousl
efe0: 79 20 72 65 67 69 73 74 65 72 65 64 20 74 72 61  y registered tra
eff0: 63 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  ce.** is returne
f000: 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  d.  .**.** A NUL
f010: 4c 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e  L trace function
f020: 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 74   means that no t
f030: 72 61 63 69 6e 67 20 69 73 20 65 78 65 63 75 74  racing is execut
f040: 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a  es.  A non-NULL.
f050: 2a 2a 20 74 72 61 63 65 20 69 73 20 61 20 70 6f  ** trace is a po
f060: 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
f070: 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f  ion that is invo
f080: 6b 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  ked at the start
f090: 20 6f 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20   of each.** SQL 
f0a0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
f0b0: 69 64 20 2a 73 71 6c 69 74 65 33 5f 74 72 61 63  id *sqlite3_trac
f0c0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76  e(sqlite3 *db, v
f0d0: 6f 69 64 20 28 2a 78 54 72 61 63 65 29 28 76 6f  oid (*xTrace)(vo
f0e0: 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
f0f0: 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
f100: 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69   void *pOld;..#i
f110: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
f120: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
f130: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
f140: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
f150: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
f160: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
f170: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
f180: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
f190: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
f1a0: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
f1b0: 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 3b  = db->pTraceArg;
f1c0: 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20  .  db->xTrace = 
f1d0: 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54  xTrace;.  db->pT
f1e0: 72 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  raceArg = pArg;.
f1f0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f200: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
f210: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b  ;.  return pOld;
f220: 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  .}./*.** Registe
f230: 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e 63  r a profile func
f240: 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20  tion.  The pArg 
f250: 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
f260: 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 0a  sly registered .
f270: 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74  ** profile funct
f280: 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ion is returned.
f290: 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20    .**.** A NULL 
f2a0: 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e  profile function
f2b0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 70   means that no p
f2c0: 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65 63  rofiling is exec
f2d0: 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c  utes.  A non-NUL
f2e0: 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73 20  L.** profile is 
f2f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
f300: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20  unction that is 
f310: 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63  invoked at the c
f320: 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20  onclusion of.** 
f330: 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65  each SQL stateme
f340: 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e 0a  nt that is run..
f350: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
f360: 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69  _profile(.  sqli
f370: 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20  te3 *db,.  void 
f380: 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69 64  (*xProfile)(void
f390: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71  *,const char*,sq
f3a0: 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20  lite_uint64),.  
f3b0: 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20  void *pArg.){.  
f3c0: 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66  void *pOld;..#if
f3d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
f3e0: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
f3f0: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
f400: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
f410: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
f420: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
f430: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
f440: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
f450: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
f460: 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d  mutex);.  pOld =
f470: 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67   db->pProfileArg
f480: 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c 65  ;.  db->xProfile
f490: 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20 64   = xProfile;.  d
f4a0: 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20 3d  b->pProfileArg =
f4b0: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
f4c0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
f4d0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
f4e0: 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66  n pOld;.}.#endif
f4f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
f500: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TRACE */../*.** 
f510: 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63 74  Register a funct
f520: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ion to be invoke
f530: 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
f540: 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a  tion commits..**
f550: 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20   If the invoked 
f560: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
f570: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
f580: 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d  the commit becom
f590: 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  es a.** rollback
f5a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
f5b0: 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a  e3_commit_hook(.
f5c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
f5e0: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
f5f0: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
f600: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c  */.  int (*xCall
f610: 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f  back)(void*),  /
f620: 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e  * Function to in
f630: 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d  voke on each com
f640: 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  mit */.  void *p
f650: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
f660: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
f670: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
f680: 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  /.){.  void *pOl
f690: 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d;..#ifdef SQLIT
f6a0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
f6b0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
f6c0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
f6d0: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
f6e0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
f6f0: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
f700: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
f710: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
f720: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
f730: 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d   pOld = db->pCom
f740: 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43  mitArg;.  db->xC
f750: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20  ommitCallback = 
f760: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
f770: 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41  >pCommitArg = pA
f780: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
f790: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
f7a0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
f7b0: 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Old;.}../*.** Re
f7c0: 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
f7d0: 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
f7e0: 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20  each time a row 
f7f0: 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69  is updated,.** i
f800: 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74  nserted or delet
f810: 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61  ed using this da
f820: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
f830: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
f840: 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28  te3_update_hook(
f850: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f870: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
f880: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
f890: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61   */.  void (*xCa
f8a0: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e  llback)(void*,in
f8b0: 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63  t,char const *,c
f8c0: 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69  har const *,sqli
f8d0: 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69  te_int64),.  voi
f8e0: 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
f8f0: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
f900: 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
f910: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  on */.){.  void 
f920: 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66 20 53  *pRet;..#ifdef S
f930: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
f940: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
f950: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
f960: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
f970: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
f980: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
f990: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
f9a0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f9b0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
f9c0: 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
f9d0: 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62  pUpdateArg;.  db
f9e0: 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61 63  ->xUpdateCallbac
f9f0: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
fa00: 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 20   db->pUpdateArg 
fa10: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
fa20: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
fa30: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
fa40: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
fa50: 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c  * Register a cal
fa60: 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f  lback to be invo
fa70: 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20  ked each time a 
fa80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
fa90: 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79  olled.** back by
faa0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
fab0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
fac0: 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c  id *sqlite3_roll
fad0: 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  back_hook(.  sql
fae0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
faf0: 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
fb00: 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
fb10: 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
fb20: 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b  void (*xCallback
fb30: 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c  )(void*), /* Cal
fb40: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a  lback function *
fb50: 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  /.  void *pArg  
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fb70: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
fb80: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
fb90: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23    void *pRet;..#
fba0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
fbb0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
fbc0: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
fbd0: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
fbe0: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
fbf0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
fc00: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
fc10: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
fc20: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
fc30: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74  ->mutex);.  pRet
fc40: 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b   = db->pRollback
fc50: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c  Arg;.  db->xRoll
fc60: 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78  backCallback = x
fc70: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
fc80: 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70  pRollbackArg = p
fc90: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
fca0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
fcb0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
fcc0: 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  pRet;.}..#ifndef
fcd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
fce0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  ./*.** The sqlit
fcf0: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61  e3_wal_hook() ca
fd00: 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72 65  llback registere
fd10: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77 61 6c  d by sqlite3_wal
fd20: 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
fd30: 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c  )..** Invoke sql
fd40: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
fd50: 69 6e 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65  int if the numbe
fd60: 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74  r of frames in t
fd70: 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69  he log file.** i
fd80: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 73  s greater than s
fd90: 71 6c 69 74 65 33 2e 70 57 61 6c 41 72 67 20 63  qlite3.pWalArg c
fda0: 61 73 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ast to an intege
fdb0: 72 20 28 74 68 65 20 76 61 6c 75 65 20 63 6f 6e  r (the value con
fdc0: 66 69 67 75 72 65 64 20 62 79 0a 2a 2a 20 77 61  figured by.** wa
fdd0: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
fde0: 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c  ())..*/ .int sql
fdf0: 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f  ite3WalDefaultHo
fe00: 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69  ok(.  void *pCli
fe10: 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20  entData,     /* 
fe20: 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71  Argument */.  sq
fe30: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
fe40: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
fe50: 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
fe60: 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f  ar *zDb,       /
fe70: 2a 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  * Database */.  
fe80: 69 6e 74 20 6e 46 72 61 6d 65 20 20 20 20 20 20  int nFrame      
fe90: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
fea0: 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66  f WAL */.){.  if
feb0: 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45  ( nFrame>=SQLITE
fec0: 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69  _PTR_TO_INT(pCli
fed0: 65 6e 74 44 61 74 61 29 20 29 7b 0a 20 20 20 20  entData) ){.    
fee0: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
fef0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
ff00: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
ff10: 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b  kpoint(db, zDb);
ff20: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
ff30: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
ff40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
ff50: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
ff60: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
ff70: 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  AL */../*.** Con
ff80: 66 69 67 75 72 65 20 61 6e 20 73 71 6c 69 74 65  figure an sqlite
ff90: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c  3_wal_hook() cal
ffa0: 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74  lback to automat
ffb0: 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e  ically checkpoin
ffc0: 74 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20  t.** a database 
ffd0: 61 66 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67  after committing
ffe0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
fff0: 66 20 74 68 65 72 65 20 61 72 65 20 6e 46 72 61  f there are nFra
10000 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72  me or.** more fr
10010 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20  ames in the log 
10020 66 69 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a 65  file. Passing ze
10030 72 6f 20 6f 72 20 61 20 6e 65 67 61 74 69 76 65  ro or a negative
10040 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a   value as the.**
10050 20 6e 46 72 61 6d 65 20 70 61 72 61 6d 65 74 65   nFrame paramete
10060 72 20 64 69 73 61 62 6c 65 73 20 61 75 74 6f 6d  r disables autom
10070 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 73  atic checkpoints
10080 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a   entirely..**.**
10090 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65   The callback re
100a0 67 69 73 74 65 72 65 64 20 62 79 20 74 68 69 73  gistered by this
100b0 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63   function replac
100c0 65 73 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  es any existing 
100d0 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69  callback.** regi
100e0 73 74 65 72 65 64 20 75 73 69 6e 67 20 73 71 6c  stered using sql
100f0 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e  ite3_wal_hook().
10100 20 4c 69 6b 65 77 69 73 65 2c 20 72 65 67 69 73   Likewise, regis
10110 74 65 72 69 6e 67 20 61 20 63 61 6c 6c 62 61 63  tering a callbac
10120 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74  k.** using sqlit
10130 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69  e3_wal_hook() di
10140 73 61 62 6c 65 73 20 74 68 65 20 61 75 74 6f 6d  sables the autom
10150 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 20  atic checkpoint 
10160 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e  mechanism.** con
10170 66 69 67 75 72 65 64 20 62 79 20 74 68 69 73 20  figured by this 
10180 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
10190 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
101a0 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69  ocheckpoint(sqli
101b0 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72  te3 *db, int nFr
101c0 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ame){.#ifdef SQL
101d0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55  ITE_OMIT_WAL.  U
101e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
101f0 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  db);.  UNUSED_PA
10200 52 41 4d 45 54 45 52 28 6e 46 72 61 6d 65 29 3b  RAMETER(nFrame);
10210 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 53 51  .#else.#ifdef SQ
10220 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
10230 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
10240 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
10250 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
10260 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
10270 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  T;.#endif.  if( 
10280 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20  nFrame>0 ){.    
10290 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
102a0 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44  (db, sqlite3WalD
102b0 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49  efaultHook, SQLI
102c0 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46  TE_INT_TO_PTR(nF
102d0 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  rame));.  }else{
102e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
102f0 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b  _hook(db, 0, 0);
10300 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
10310 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10320 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
10330 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
10340 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
10350 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
10360 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  on is written.**
10370 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d   into the write-
10380 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69  ahead-log by thi
10390 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
103a0 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
103b0 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
103c0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
103d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103e0 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
103f0 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
10400 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  b handle */.  in
10410 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f  t(*xCallback)(vo
10420 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  id *, sqlite3*, 
10430 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
10440 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  ),.  void *pArg 
10450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10460 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
10470 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
10480 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a   xCallback() */.
10490 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
104a0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69  E_OMIT_WAL.  voi
104b0 64 20 2a 70 52 65 74 3b 0a 23 69 66 64 65 66 20  d *pRet;.#ifdef 
104c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
104d0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
104e0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
104f0 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
10500 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
10510 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
10520 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
10530 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
10540 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
10550 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
10560 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e  >pWalArg;.  db->
10570 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78  xWalCallback = x
10580 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
10590 70 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a  pWalArg = pArg;.
105a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
105b0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
105c0 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
105d0 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
105e0 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  0;.#endif.}../*.
105f0 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61  ** Checkpoint da
10600 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69  tabase zDb..*/.i
10610 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  nt sqlite3_wal_c
10620 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20  heckpoint_v2(.  
10630 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10650 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
10660 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
10670 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20  ar *zDb,        
10680 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
10690 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61  of attached data
106a0 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a  base (or NULL) *
106b0 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20  /.  int eMode,  
106c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106d0 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48      /* SQLITE_CH
106e0 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65  ECKPOINT_* value
106f0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67   */.  int *pnLog
10700 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10710 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69        /* OUT: Si
10720 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e  ze of WAL log in
10730 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74   frames */.  int
10740 20 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20   *pnCkpt        
10750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10760 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65  OUT: Total numbe
10770 72 20 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63  r of frames chec
10780 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23  kpointed */.){.#
10790 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
107a0 54 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53  T_WAL.  return S
107b0 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a  QLITE_OK;.#else.
107c0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
107d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
107f0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20   */.  int iDb = 
10800 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
10810 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33  HED;  /* sqlite3
10820 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20  .aDb[] index of 
10830 64 62 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74  db to checkpoint
10840 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
10850 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
10860 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
10870 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
10880 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
10890 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
108a0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e  .#endif..  /* In
108b0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74  itialize the out
108c0 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f  put variables to
108d0 20 2d 31 20 69 6e 20 63 61 73 65 20 61 6e 20 65   -1 in case an e
108e0 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
108f0 20 20 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70    if( pnLog ) *p
10900 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28  nLog = -1;.  if(
10910 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70   pnCkpt ) *pnCkp
10920 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72  t = -1;..  asser
10930 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
10940 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30 20  OINT_PASSIVE==0 
10950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
10960 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
10970 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ULL==1 );.  asse
10980 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
10990 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32  POINT_RESTART==2
109a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
109b0 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
109c0 54 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 20  TRUNCATE==3 );. 
109d0 20 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54   if( eMode<SQLIT
109e0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
109f0 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51  SIVE || eMode>SQ
10a00 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
10a10 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20  TRUNCATE ){.    
10a20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
10a30 52 2d 30 33 39 39 36 2d 31 32 30 38 38 20 54 68  R-03996-12088 Th
10a40 65 20 4d 20 70 61 72 61 6d 65 74 65 72 20 6d 75  e M parameter mu
10a50 73 74 20 62 65 20 61 20 76 61 6c 69 64 20 63 68  st be a valid ch
10a60 65 63 6b 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20  eckpoint.    ** 
10a70 6d 6f 64 65 3a 20 2a 2f 0a 20 20 20 20 72 65 74  mode: */.    ret
10a80 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
10a90 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  E;.  }..  sqlite
10aa0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
10ab0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
10ac0 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b  zDb && zDb[0] ){
10ad0 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
10ae0 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c  e3FindDbName(db,
10af0 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28   zDb);.  }.  if(
10b00 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63   iDb<0 ){.    rc
10b10 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
10b20 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
10b30 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c  rWithMsg(db, SQL
10b40 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e  ITE_ERROR, "unkn
10b50 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73  own database: %s
10b60 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65  ", zDb);.  }else
10b70 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79 48 61  {.    db->busyHa
10b80 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b  ndler.nBusy = 0;
10b90 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10ba0 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  3Checkpoint(db, 
10bb0 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f  iDb, eMode, pnLo
10bc0 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20  g, pnCkpt);.    
10bd0 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
10be0 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   rc);.  }.  rc =
10bf0 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
10c00 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
10c10 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
10c20 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
10c30 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
10c40 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f  .../*.** Checkpo
10c50 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44 62  int database zDb
10c60 2e 20 49 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c  . If zDb is NULL
10c70 2c 20 6f 72 20 69 66 20 74 68 65 20 62 75 66 66  , or if the buff
10c80 65 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a  er zDb points.**
10c90 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a   to contains a z
10ca0 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e  ero-length strin
10cb0 67 2c 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  g, all attached 
10cc0 64 61 74 61 62 61 73 65 73 20 61 72 65 20 0a 2a  databases are .*
10cd0 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a  * checkpointed..
10ce0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
10cf0 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71  al_checkpoint(sq
10d00 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
10d10 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 2f   char *zDb){.  /
10d20 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
10d30 2d 34 31 36 31 33 2d 32 30 35 35 33 20 54 68 65  -41613-20553 The
10d40 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
10d50 63 6b 70 6f 69 6e 74 28 44 2c 58 29 20 69 73 20  ckpoint(D,X) is 
10d60 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20  equivalent to.  
10d70 2a 2a 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  ** sqlite3_wal_c
10d80 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 44 2c 58  heckpoint_v2(D,X
10d90 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  ,SQLITE_CHECKPOI
10da0 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30 29 2e  NT_PASSIVE,0,0).
10db0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   */.  return sql
10dc0 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
10dd0 69 6e 74 5f 76 32 28 64 62 2c 7a 44 62 2c 53 51  int_v2(db,zDb,SQ
10de0 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
10df0 50 41 53 53 49 56 45 2c 30 2c 30 29 3b 0a 7d 0a  PASSIVE,0,0);.}.
10e00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10e10 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52  OMIT_WAL./*.** R
10e20 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20  un a checkpoint 
10e30 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  on database iDb.
10e40 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
10e50 20 69 66 20 64 61 74 61 62 61 73 65 20 69 44 62   if database iDb
10e60 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65   is.** not curre
10e70 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c  ntly open in WAL
10e80 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   mode..**.** If 
10e90 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
10ea0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
10eb0 61 62 61 73 65 20 62 65 69 6e 67 20 63 68 65 63  abase being chec
10ec0 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20 0a  kpointed, this .
10ed0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
10ee0 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rns SQLITE_LOCKE
10ef0 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f 69  D and a checkpoi
10f00 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  nt is not attemp
10f10 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65  ted. If .** an e
10f20 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
10f30 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 68  e running the ch
10f40 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c  eckpoint, an SQL
10f50 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
10f60 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 28  s .** returned (
10f70 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  i.e. SQLITE_IOER
10f80 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  R). Otherwise, S
10f90 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
10fa0 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74  The mutex on dat
10fb0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 20  abase handle db 
10fc0 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 62  should be held b
10fd0 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68  y the caller. Th
10fe0 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63  e mutex.** assoc
10ff0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73  iated with the s
11000 70 65 63 69 66 69 63 20 62 2d 74 72 65 65 20 62  pecific b-tree b
11010 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65  eing checkpointe
11020 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a  d is taken by.**
11030 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
11040 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f  hile the checkpo
11050 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a  int is running..
11060 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73 20  **.** If iDb is 
11070 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d 41  passed SQLITE_MA
11080 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65 6e  X_ATTACHED, then
11090 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
110a0 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20 63  tabases are.** c
110b0 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20  heckpointed. If 
110c0 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
110d0 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 72 65  untered it is re
110e0 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  turned immediate
110f0 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d  ly -.** no attem
11100 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68  pt is made to ch
11110 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d  eckpoint any rem
11120 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65 73  aining databases
11130 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
11140 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f  r eMode is one o
11150 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  f SQLITE_CHECKPO
11160 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c  INT_PASSIVE, FUL
11170 4c 20 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a 2f  L or RESTART..*/
11180 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
11190 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a  kpoint(sqlite3 *
111a0 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  db, int iDb, int
111b0 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c   eMode, int *pnL
111c0 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29  og, int *pnCkpt)
111d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
111e0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
111f0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
11200 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  de */.  int i;  
11210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11220 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
11230 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
11240 67 68 20 61 74 74 61 63 68 65 64 20 64 62 73 20  gh attached dbs 
11250 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d  */.  int bBusy =
11260 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
11270 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
11280 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20  SQLITE_BUSY has 
11290 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
112a0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
112b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
112c0 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
112d0 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67    assert( !pnLog
112e0 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29   || *pnLog==-1 )
112f0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 43  ;.  assert( !pnC
11300 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d  kpt || *pnCkpt==
11310 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  -1 );..  for(i=0
11320 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72  ; i<db->nDb && r
11330 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
11340 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69  +){.    if( i==i
11350 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54  Db || iDb==SQLIT
11360 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29  E_MAX_ATTACHED )
11370 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
11380 69 74 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f  ite3BtreeCheckpo
11390 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  int(db->aDb[i].p
113a0 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67  Bt, eMode, pnLog
113b0 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20  , pnCkpt);.     
113c0 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20   pnLog = 0;.    
113d0 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20    pnCkpt = 0;.  
113e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
113f0 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
11400 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20     bBusy = 1;.  
11410 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
11420 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
11430 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
11440 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
11450 20 26 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c   && bBusy) ? SQL
11460 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d  ITE_BUSY : rc;.}
11470 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11480 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
11490 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
114a0 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65 20  on returns true 
114b0 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73  if main-memory s
114c0 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e  hould be used in
114d0 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65  stead of.** a te
114e0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72  mporary file for
114f0 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72   transient pager
11500 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65   files and state
11510 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a  ment journals..*
11520 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
11530 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20  rned depends on 
11540 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d  the value of db-
11550 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e  >temp_store (run
11560 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65  time.** paramete
11570 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  r) and the compi
11580 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66  le time value of
11590 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
115a0 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  RE. The.** follo
115b0 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
115c0 69 62 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f  ibes the relatio
115d0 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 74 68  nship between th
115e0 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a  ese two values.*
115f0 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  * and this funct
11600 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75  ions return valu
11610 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54  e..**.**   SQLIT
11620 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20  E_TEMP_STORE    
11630 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
11640 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20      Location of 
11650 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
11660 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  se.**   --------
11670 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
11680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
11690 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
116a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
116b0 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
116c0 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20             any  
116d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
116e0 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
116f0 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  0).**   1       
11700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
11710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11720 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
11730 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 0).**   1    
11740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11750 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
11760 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
11770 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20  eturn 1).**   1 
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11790 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
117a0 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
117b0 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
117c0 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
117d0 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
117e0 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
117f0 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
11800 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
11810 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
11830 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
11840 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
11850 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11870 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
11880 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20  n 1).**   3     
11890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118a0 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20  any             
118b0 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
118c0 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73  turn 1).*/.int s
118d0 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
118e0 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ry(const sqlite3
118f0 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54   *db){.#if SQLIT
11900 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a  E_TEMP_STORE==1.
11910 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74    return ( db->t
11920 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a  emp_store==2 );.
11930 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
11940 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a  E_TEMP_STORE==2.
11950 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74    return ( db->t
11960 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a  emp_store!=1 );.
11970 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
11980 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a  E_TEMP_STORE==3.
11990 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
119a0 45 52 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e  ER(db);.  return
119b0 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   1;.#endif.#if S
119c0 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
119d0 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45 4d  <1 || SQLITE_TEM
119e0 50 5f 53 54 4f 52 45 3e 33 0a 20 20 55 4e 55 53  P_STORE>3.  UNUS
119f0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
11a00 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ;.  return 0;.#e
11a10 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
11a20 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64  turn UTF-8 encod
11a30 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  ed English langu
11a40 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20  age explanation 
11a50 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
11a60 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a  nt.** error..*/.
11a70 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
11a80 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74  te3_errmsg(sqlit
11a90 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74  e3 *db){.  const
11aa0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
11ab0 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !db ){.    retur
11ac0 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
11ad0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
11ae0 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
11af0 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
11b00 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
11b10 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
11b20 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55  rStr(SQLITE_MISU
11b30 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20  SE_BKPT);.  }.  
11b40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
11b50 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
11b60 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
11b70 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20  Failed ){.    z 
11b80 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  = sqlite3ErrStr(
11b90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
11ba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65 73 74   }else{.    test
11bb0 63 61 73 65 28 20 64 62 2d 3e 70 45 72 72 3d 3d  case( db->pErr==
11bc0 30 20 29 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68  0 );.    z = (ch
11bd0 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
11be0 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72 29  e_text(db->pErr)
11bf0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64  ;.    assert( !d
11c00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11c10 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
11c20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  ){.      z = sql
11c30 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
11c40 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  rrCode);.    }. 
11c50 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
11c60 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
11c70 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  ex);.  return z;
11c80 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
11c90 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
11ca0 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31  .** Return UTF-1
11cb0 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73  6 encoded Englis
11cc0 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61  h language expla
11cd0 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nation of the mo
11ce0 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72  st recent.** err
11cf0 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  or..*/.const voi
11d00 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  d *sqlite3_errms
11d10 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29  g16(sqlite3 *db)
11d20 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
11d30 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20   u16 outOfMem[] 
11d40 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27  = {.    'o', 'u'
11d50 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c  , 't', ' ', 'o',
11d60 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20   'f', ' ', 'm', 
11d70 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27  'e', 'm', 'o', '
11d80 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a  r', 'y', 0.  };.
11d90 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
11da0 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a  16 misuse[] = {.
11db0 20 20 20 20 27 6c 27 2c 20 27 69 27 2c 20 27 62      'l', 'i', 'b
11dc0 27 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 72 27  ', 'r', 'a', 'r'
11dd0 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'y', ' ', .   
11de0 20 27 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c 20   'r', 'o', 'u', 
11df0 27 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20 27  't', 'i', 'n', '
11e00 65 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 63  e', ' ', .    'c
11e10 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c 27  ', 'a', 'l', 'l'
11e20 2c 20 27 65 27 2c 20 27 64 27 2c 20 27 20 27 2c  , 'e', 'd', ' ',
11e30 20 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20   .    'o', 'u', 
11e40 27 74 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  't', ' ', .    '
11e50 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a 20  o', 'f', ' ', . 
11e60 20 20 20 27 73 27 2c 20 27 65 27 2c 20 27 71 27     's', 'e', 'q'
11e70 2c 20 27 75 27 2c 20 27 65 27 2c 20 27 6e 27 2c  , 'u', 'e', 'n',
11e80 20 27 63 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d   'c', 'e', 0.  }
11e90 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  ;..  const void 
11ea0 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b  *z;.  if( !db ){
11eb0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69  .    return (voi
11ec0 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20  d *)outOfMem;.  
11ed0 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
11ee0 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
11ef0 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
11f00 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69  eturn (void *)mi
11f10 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  suse;.  }.  sqli
11f20 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
11f30 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
11f40 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
11f50 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76  ed ){.    z = (v
11f60 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a  oid *)outOfMem;.
11f70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d    }else{.    z =
11f80 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
11f90 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b  ext16(db->pErr);
11fa0 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
11fb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
11fc0 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 64  rorWithMsg(db, d
11fd0 62 2d 3e 65 72 72 43 6f 64 65 2c 20 73 71 6c 69  b->errCode, sqli
11fe0 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72  te3ErrStr(db->er
11ff0 72 43 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 7a  rCode));.      z
12000 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
12010 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72  _text16(db->pErr
12020 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
12030 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68  A malloc() may h
12040 61 76 65 20 66 61 69 6c 65 64 20 77 69 74 68 69  ave failed withi
12050 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  n the call to sq
12060 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
12070 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76  16().    ** abov
12080 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
12090 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
120a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
120b0 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a  d flag needs to.
120c0 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65      ** be cleare
120d0 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
120e0 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65  ng. Do this dire
120f0 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66  ctly, instead of
12100 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69   via.    ** sqli
12110 74 65 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f  te3ApiExit(), to
12120 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74   avoid setting t
12130 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
12140 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  le error message
12150 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 62 2d  ..    */.    db-
12160 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
12170 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
12180 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
12190 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
121a0 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n z;.}.#endif /*
121b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
121c0 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  16 */../*.** Ret
121d0 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63  urn the most rec
121e0 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67  ent error code g
121f0 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20 53  enerated by an S
12200 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49  QLite routine. I
12210 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73  f NULL is.** pas
12220 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
12230 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20  tion, we assume 
12240 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65  a malloc() faile
12250 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  d during sqlite3
12260 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _open()..*/.int 
12270 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
12280 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
12290 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74  if( db && !sqlit
122a0 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
122b0 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
122c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
122d0 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
122e0 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
122f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
12300 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12310 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
12320 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f  return db->errCo
12330 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b  de & db->errMask
12340 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ;.}.int sqlite3_
12350 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
12360 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
12370 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69   if( db && !sqli
12380 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
12390 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
123a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
123b0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
123c0 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62  .  if( !db || db
123d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
123e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
123f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
12400 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43   return db->errC
12410 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ode;.}../*.** Re
12420 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68  turn a string th
12430 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
12440 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73   kind of error s
12450 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a  pecified in the.
12460 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 46 6f  ** argument.  Fo
12470 72 20 6e 6f 77 2c 20 74 68 69 73 20 73 69 6d 70  r now, this simp
12480 6c 79 20 63 61 6c 6c 73 20 74 68 65 20 69 6e 74  ly calls the int
12490 65 72 6e 61 6c 20 73 71 6c 69 74 65 33 45 72 72  ernal sqlite3Err
124a0 53 74 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  Str().** functio
124b0 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  n..*/.const char
124c0 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 73 74 72   *sqlite3_errstr
124d0 28 69 6e 74 20 72 63 29 7b 0a 20 20 72 65 74 75  (int rc){.  retu
124e0 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  rn sqlite3ErrStr
124f0 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  (rc);.}../*.** C
12500 72 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c  reate a new coll
12510 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66  ating function f
12520 6f 72 20 64 61 74 61 62 61 73 65 20 22 64 62 22  or database "db"
12530 2e 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20 7a  .  The name is z
12540 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  Name.** and the 
12550 65 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e  encoding is enc.
12560 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
12570 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a  reateCollation(.
12580 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a 20    sqlite3* db,. 
12590 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
125a0 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a 20  me, .  u8 enc,. 
125b0 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
125c0 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
125d0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
125e0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
125f0 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44  id*),.  void(*xD
12600 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  el)(void*).){.  
12610 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
12620 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 0a 20    int enc2;.  . 
12630 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12640 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
12650 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
12660 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  If SQLITE_UTF16 
12670 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
12680 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70  the encoding typ
12690 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69  e, transform thi
126a0 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66  s.  ** to one of
126b0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
126c0 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  or SQLITE_UTF16B
126d0 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  E using the.  **
126e0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
126f0 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54  IVE macro. SQLIT
12700 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75  E_UTF16 is not u
12710 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  sed internally..
12720 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e    */.  enc2 = en
12730 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65  c;.  testcase( e
12740 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
12750 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6 );.  testcase(
12760 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
12770 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20  F16_ALIGNED );. 
12780 20 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54   if( enc2==SQLIT
12790 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d  E_UTF16 || enc2=
127a0 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  =SQLITE_UTF16_AL
127b0 49 47 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e 63  IGNED ){.    enc
127c0 32 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  2 = SQLITE_UTF16
127d0 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66  NATIVE;.  }.  if
127e0 28 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54  ( enc2<SQLITE_UT
127f0 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54  F8 || enc2>SQLIT
12800 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20  E_UTF16BE ){.   
12810 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
12820 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
12830 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
12840 68 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f  his call is remo
12850 76 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e  ving or replacin
12860 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f  g an existing co
12870 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65  llation .  ** se
12880 71 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61  quence. If so, a
12890 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74  nd there are act
128a0 69 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20  ive VMs, return 
128b0 62 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20  busy. If there. 
128c0 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76   ** are no activ
128d0 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74  e VMs, invalidat
128e0 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c  e any pre-compil
128f0 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
12900 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71   */.  pColl = sq
12910 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
12920 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a  (db, (u8)enc2, z
12930 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Name, 0);.  if( 
12940 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e  pColl && pColl->
12950 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20  xCmp ){.    if( 
12960 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20  db->nVdbeActive 
12970 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12980 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
12990 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20   SQLITE_BUSY, . 
129a0 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
129b0 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20  o delete/modify 
129c0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
129d0 63 65 20 64 75 65 20 74 6f 20 61 63 74 69 76 65  ce due to active
129e0 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20   statements");. 
129f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12a00 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
12a10 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
12a20 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
12a30 74 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20  ts(db);..    /* 
12a40 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  If collation seq
12a50 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20  uence pColl was 
12a60 63 72 65 61 74 65 64 20 64 69 72 65 63 74 6c 79  created directly
12a70 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20   by a call to.  
12a80 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65    ** sqlite3_cre
12a90 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61  ate_collation, a
12aa0 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64  nd not generated
12ab0 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71   by synthCollSeq
12ac0 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  (),.    ** then 
12ad0 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20  any copies made 
12ae0 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28  by synthCollSeq(
12af0 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76  ) need to be inv
12b00 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a  alidated..    **
12b10 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e   Also, collation
12b20 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f   destructor - Co
12b30 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66  llSeq.xDel() - f
12b40 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64  unction may need
12b50 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61  .    ** to be ca
12b60 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20  lled..    */ .  
12b70 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e    if( (pColl->en
12b80 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31  c & ~SQLITE_UTF1
12b90 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32  6_ALIGNED)==enc2
12ba0 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65   ){.      CollSe
12bb0 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *aColl = sqlit
12bc0 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
12bd0 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 29  aCollSeq, zName)
12be0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
12bf0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
12c00 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  3; j++){.       
12c10 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61   CollSeq *p = &a
12c20 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
12c30 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f   if( p->enc==pCo
12c40 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20  ll->enc ){.     
12c50 20 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c       if( p->xDel
12c60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12c70 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72  p->xDel(p->pUser
12c80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
12c90 20 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70           p->xCmp
12ca0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
12cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12cc0 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  }..  pColl = sql
12cd0 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
12ce0 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e  db, (u8)enc2, zN
12cf0 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70  ame, 1);.  if( p
12d00 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Coll==0 ) return
12d10 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12d20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78   pColl->xCmp = x
12d30 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c  Compare;.  pColl
12d40 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b 0a  ->pUser = pCtx;.
12d50 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20    pColl->xDel = 
12d60 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65  xDel;.  pColl->e
12d70 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20 7c  nc = (u8)(enc2 |
12d80 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f 55   (enc & SQLITE_U
12d90 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a  TF16_ALIGNED));.
12da0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
12db0 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
12dc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12dd0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  K;.}.../*.** Thi
12de0 73 20 61 72 72 61 79 20 64 65 66 69 6e 65 73 20  s array defines 
12df0 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64  hard upper bound
12e00 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65  s on limit value
12e10 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69  s.  The.** initi
12e20 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65 20 6b  alizer must be k
12e30 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74 68  ept in sync with
12e40 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49   the SQLITE_LIMI
12e50 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20  T_*.** #defines 
12e60 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f  in sqlite3.h..*/
12e70 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e  .static const in
12e80 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d  t aHardLimit[] =
12e90 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f   {.  SQLITE_MAX_
12ea0 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
12eb0 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c  _MAX_SQL_LENGTH,
12ec0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  .  SQLITE_MAX_CO
12ed0 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  LUMN,.  SQLITE_M
12ee0 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a 20  AX_EXPR_DEPTH,. 
12ef0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
12f00 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53  OUND_SELECT,.  S
12f10 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
12f20 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  P,.  SQLITE_MAX_
12f30 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20  FUNCTION_ARG,.  
12f40 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
12f50 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  HED,.  SQLITE_MA
12f60 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
12f70 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  ENGTH,.  SQLITE_
12f80 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
12f90 42 45 52 2c 20 20 20 20 20 20 2f 2a 20 49 4d 50  BER,      /* IMP
12fa0 3a 20 52 2d 33 38 30 39 31 2d 33 32 33 35 32 20  : R-38091-32352 
12fb0 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  */.  SQLITE_MAX_
12fc0 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c 0a 20  TRIGGER_DEPTH,. 
12fd0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b   SQLITE_MAX_WORK
12fe0 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d 3b 0a 0a  ER_THREADS,.};..
12ff0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
13000 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20  the hard limits 
13010 61 72 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f  are set to reaso
13020 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a  nable values.*/.
13030 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  #if SQLITE_MAX_L
13040 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f  ENGTH<100.# erro
13050 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  r SQLITE_MAX_LEN
13060 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
13070 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a  east 100.#endif.
13080 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  #if SQLITE_MAX_S
13090 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20  QL_LENGTH<100.# 
130a0 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
130b0 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _SQL_LENGTH must
130c0 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30   be at least 100
130d0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
130e0 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
130f0 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  H>SQLITE_MAX_LEN
13100 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  GTH.# error SQLI
13110 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
13120 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72  H must not be gr
13130 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54  eater than SQLIT
13140 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e  E_MAX_LENGTH.#en
13150 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
13160 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
13170 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c  CT<2.# error SQL
13180 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
13190 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20  _SELECT must be 
131a0 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69  at least 2.#endi
131b0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
131c0 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72  _VDBE_OP<40.# er
131d0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ror SQLITE_MAX_V
131e0 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61  DBE_OP must be a
131f0 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69  t least 40.#endi
13200 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
13210 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20  _FUNCTION_ARG<0 
13220 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  || SQLITE_MAX_FU
13230 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a  NCTION_ARG>1000.
13240 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
13250 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
13260 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
13270 30 20 61 6e 64 20 31 30 30 30 0a 23 65 6e 64 69  0 and 1000.#endi
13280 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
13290 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53  _ATTACHED<0 || S
132a0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
132b0 45 44 3e 31 32 35 0a 23 20 65 72 72 6f 72 20 53  ED>125.# error S
132c0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
132d0 45 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  ED must be betwe
132e0 65 6e 20 30 20 61 6e 64 20 31 32 35 0a 23 65 6e  en 0 and 125.#en
132f0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
13300 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
13310 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72  LENGTH<1.# error
13320 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
13330 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
13340 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
13350 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   1.#endif.#if SQ
13360 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e  LITE_MAX_COLUMN>
13370 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51  32767.# error SQ
13380 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20  LITE_MAX_COLUMN 
13390 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20  must not exceed 
133a0 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66  32767.#endif.#if
133b0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47   SQLITE_MAX_TRIG
133c0 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72  GER_DEPTH<1.# er
133d0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54  ror SQLITE_MAX_T
133e0 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73  RIGGER_DEPTH mus
133f0 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a  t be at least 1.
13400 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
13410 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
13420 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49 54 45  EADS<0 || SQLITE
13430 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
13440 41 44 53 3e 35 30 0a 23 20 65 72 72 6f 72 20 53  ADS>50.# error S
13450 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
13460 5f 54 48 52 45 41 44 53 20 6d 75 73 74 20 62 65  _THREADS must be
13470 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 35   between 0 and 5
13480 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
13490 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
134a0 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20 52  e of a limit.  R
134b0 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61  eport the old va
134c0 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  lue..** If an in
134d0 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64 65  valid limit inde
134e0 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 72  x is supplied, r
134f0 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b  eport -1..** Mak
13500 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75 74  e no changes but
13510 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74 68   still report th
13520 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20 74  e old value if t
13530 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20  he.** new limit 
13540 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  is negative..**.
13550 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c  ** A new lower l
13560 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73 68  imit does not sh
13570 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63 6f  rink existing co
13580 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20  nstructs..** It 
13590 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73 20  merely prevents 
135a0 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20 74  new constructs t
135b0 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20 6c  hat exceed the l
135c0 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72  imit.** from for
135d0 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ming..*/.int sql
135e0 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74  ite3_limit(sqlit
135f0 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69  e3 *db, int limi
13600 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69  tId, int newLimi
13610 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d  t){.  int oldLim
13620 69 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  it;..#ifdef SQLI
13630 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
13640 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
13650 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
13660 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
13670 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
13680 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
13690 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  -1;.  }.#endif..
136a0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
136b0 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20  : R-30189-54097 
136c0 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63  For each limit c
136d0 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c  ategory SQLITE_L
136e0 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74  IMIT_NAME.  ** t
136f0 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20 75  here is a hard u
13700 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61  pper bound set a
13710 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62  t compile-time b
13720 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73 73  y a C preprocess
13730 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61  or.  ** macro ca
13740 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lled SQLITE_MAX_
13750 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d  NAME. (The "_LIM
13760 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  IT_" in the name
13770 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20   is changed to. 
13780 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20   ** "_MAX_".).  
13790 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  */.  assert( aHa
137a0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
137b0 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51  IMIT_LENGTH]==SQ
137c0 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
137d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
137e0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
137f0 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d  IMIT_SQL_LENGTH]
13800 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  ==SQLITE_MAX_SQL
13810 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
13820 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
13830 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
13840 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  UMN]==SQLITE_MAX
13850 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73  _COLUMN );.  ass
13860 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
13870 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
13880 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45  R_DEPTH]==SQLITE
13890 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20  _MAX_EXPR_DEPTH 
138a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
138b0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
138c0 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
138d0 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LECT]==SQLITE_MA
138e0 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
138f0 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  T);.  assert( aH
13900 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
13910 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d  LIMIT_VDBE_OP]==
13920 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
13930 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OP );.  assert( 
13940 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
13950 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
13960 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  _ARG]==SQLITE_MA
13970 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29  X_FUNCTION_ARG )
13980 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
13990 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
139a0 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53  MIT_ATTACHED]==S
139b0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
139c0 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
139d0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
139e0 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
139f0 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20  TERN_LENGTH]==. 
13a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
13a30 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
13a40 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a  TTERN_LENGTH );.
13a50 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
13a60 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
13a70 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
13a80 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56  R]==SQLITE_MAX_V
13a90 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b  ARIABLE_NUMBER);
13aa0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
13ab0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
13ac0 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
13ad0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  ]==SQLITE_MAX_TR
13ae0 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20  IGGER_DEPTH );. 
13af0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
13b00 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
13b10 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d  _WORKER_THREADS]
13b20 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  ==SQLITE_MAX_WOR
13b30 4b 45 52 5f 54 48 52 45 41 44 53 20 29 3b 0a 20  KER_THREADS );. 
13b40 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
13b50 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
13b60 45 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f  EADS==(SQLITE_N_
13b70 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20  LIMIT-1) );...  
13b80 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c  if( limitId<0 ||
13b90 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45   limitId>=SQLITE
13ba0 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  _N_LIMIT ){.    
13bb0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
13bc0 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e   oldLimit = db->
13bd0 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  aLimit[limitId];
13be0 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e  .  if( newLimit>
13bf0 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
13c00 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
13c10 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f  R-52476-28732 */
13c20 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  .    if( newLimi
13c30 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  t>aHardLimit[lim
13c40 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e  itId] ){.      n
13c50 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c  ewLimit = aHardL
13c60 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20  imit[limitId];  
13c70 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d  /* IMP: R-51463-
13c80 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20  25634 */.    }. 
13c90 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69     db->aLimit[li
13ca0 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69  mitId] = newLimi
13cb0 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
13cc0 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  oldLimit;       
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13ce0 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35   IMP: R-53341-35
13cf0 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  419 */.}../*.** 
13d00 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
13d10 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20 62   used to parse b
13d20 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e  oth URIs and non
13d30 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70  -URI filenames p
13d40 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  assed by the.** 
13d50 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63  user to API func
13d60 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70  tions sqlite3_op
13d70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  en() or sqlite3_
13d80 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66  open_v2(), and f
13d90 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55  or database.** U
13da0 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61 73  RIs specified as
13db0 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48 20   part of ATTACH 
13dc0 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
13dd0 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
13de0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
13df0 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d  ction is the nam
13e00 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
13e10 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c  use (or.** a NUL
13e20 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65  L to signify the
13e30 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69 66   default VFS) if
13e40 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f   the URI does no
13e50 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73  t contain a "vfs
13e60 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70  =xxx".** query p
13e70 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65  arameter. The se
13e80 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f  cond argument co
13e90 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20 28  ntains the URI (
13ea0 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e  or non-URI filen
13eb0 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20  ame).** itself. 
13ec0 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
13ed0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  on is called the
13ee0 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c   *pFlags variabl
13ef0 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  e should contain
13f00 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20  .** the default 
13f10 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68  flags to open th
13f20 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
13f30 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75  e with. The valu
13f40 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a  e stored in.** *
13f50 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70  pFlags may be up
13f60 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74  dated before ret
13f70 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52  urning if the UR
13f80 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61  I filename conta
13f90 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78  ins .** "cache=x
13fa0 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78  xx" or "mode=xxx
13fb0 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  " query paramete
13fc0 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  rs..**.** If suc
13fd0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
13fe0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
13ff0 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70 70  In this case *pp
14000 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Vfs is set to po
14010 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46  int to.** the VF
14020 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  S that should be
14030 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68   used to open th
14040 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
14050 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20   *pzFile is set 
14060 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  to.** point to a
14070 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
14080 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ng the name of t
14090 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  he file to open.
140a0 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
140b0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
140c0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
140d0 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73  ventually call s
140e0 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f  qlite3_free() to
140f0 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
14100 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   buffer..**.** I
14110 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
14120 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74  s, then an SQLit
14130 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
14140 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a  returned and *pz
14150 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65  ErrMsg.** may be
14160 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
14170 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
14180 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20  ning an English 
14190 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a  language error .
141a0 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  ** message. It i
141b0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
141c0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
141d0 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
141e0 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
141f0 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69   buffer by calli
14200 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
14210 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
14220 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e  3ParseUri(.  con
14230 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c  st char *zDefaul
14240 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20  tVfs,        /* 
14250 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f  VFS to use if no
14260 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72 79   "vfs=xxx" query
14270 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e   option */.  con
14280 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20  st char *zUri,  
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
142a0 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55  Nul-terminated U
142b0 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20  RI to parse */. 
142c0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70   unsigned int *p
142d0 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
142e0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49   /* IN/OUT: SQLI
142f0 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
14300 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  s */.  sqlite3_v
14310 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20  fs **ppVfs,     
14320 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
14330 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20  FS to use */ .  
14340 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20  char **pzFile,  
14350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14360 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65  /* OUT: Filename
14370 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52   component of UR
14380 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  I */.  char **pz
14390 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20  ErrMsg          
143a0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
143b0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66  rror message (if
143c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc!=SQLITE_OK) 
143d0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
143e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
143f0 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73  signed int flags
14400 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f   = *pFlags;.  co
14410 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d  nst char *zVfs =
14420 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20   zDefaultVfs;.  
14430 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
14440 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72  har c;.  int nUr
14450 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
14460 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73  n30(zUri);..  as
14470 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d  sert( *pzErrMsg=
14480 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66  =0 );..  if( ((f
14490 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
144a0 45 4e 5f 55 52 49 29 20 20 20 20 20 20 20 20 20  EN_URI)         
144b0 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 38      /* IMP: R-48
144c0 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a 20 20 20  725-32206 */.   
144d0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
144e0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
144f0 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20 49 4d 50  bOpenUri) /* IMP
14500 3a 20 52 2d 35 31 36 38 39 2d 34 36 35 34 38 20  : R-51689-46548 
14510 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d 35  */.   && nUri>=5
14520 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c   && memcmp(zUri,
14530 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20   "file:", 5)==0 
14540 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38 34 2d  /* IMP: R-57884-
14550 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a 20 20  37496 */.  ){.  
14560 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20    char *zOpt;.  
14570 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20    int eState;   
14580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14590 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65 20  /* Parser state 
145a0 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49  when parsing URI
145b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b   */.    int iIn;
145c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145d0 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63        /* Input c
145e0 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
145f0 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d  /.    int iOut =
14600 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
14610 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68      /* Output ch
14620 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f  aracter index */
14630 0a 20 20 20 20 75 36 34 20 6e 42 79 74 65 20 3d  .    u64 nByte =
14640 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20   nUri+2;        
14650 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
14660 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  pace to allocate
14670 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65   */..    /* Make
14680 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54 45   sure the SQLITE
14690 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69  _OPEN_URI flag i
146a0 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74  s set to indicat
146b0 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70  e to the VFS xOp
146c0 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  en .    ** metho
146d0 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79  d that there may
146e0 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d 65   be extra parame
146f0 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ters following t
14700 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a  he file-name.  *
14710 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  /.    flags |= S
14720 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a  QLITE_OPEN_URI;.
14730 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20  .    for(iIn=0; 
14740 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29  iIn<nUri; iIn++)
14750 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b   nByte += (zUri[
14760 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20  iIn]=='&');.    
14770 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  zFile = sqlite3_
14780 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65 29 3b  malloc64(nByte);
14790 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20  .    if( !zFile 
147a0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
147b0 4e 4f 4d 45 4d 3b 0a 0a 20 20 20 20 69 49 6e 20  NOMEM;..    iIn 
147c0 3d 20 35 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 5;.#ifdef SQLI
147d0 54 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54  TE_ALLOW_URI_AUT
147e0 48 4f 52 49 54 59 0a 20 20 20 20 69 66 28 20 73  HORITY.    if( s
147f0 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20 22  trncmp(zUri+5, "
14800 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20  ///", 3)==0 ){. 
14810 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20       iIn = 7;.  
14820 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
14830 77 69 6e 67 20 63 6f 6e 64 69 74 69 6f 6e 20 63  wing condition c
14840 61 75 73 65 73 20 55 52 49 73 20 77 69 74 68 20  auses URIs with 
14850 66 69 76 65 20 6c 65 61 64 69 6e 67 20 2f 20 63  five leading / c
14860 68 61 72 61 63 74 65 72 73 0a 20 20 20 20 20 20  haracters.      
14870 2a 2a 20 6c 69 6b 65 20 66 69 6c 65 3a 2f 2f 2f  ** like file:///
14880 2f 2f 68 6f 73 74 2f 70 61 74 68 20 74 6f 20 62  //host/path to b
14890 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
148a0 20 55 4e 43 73 20 6c 69 6b 65 20 2f 2f 68 6f 73   UNCs like //hos
148b0 74 2f 70 61 74 68 2e 0a 20 20 20 20 20 20 2a 2a  t/path..      **
148c0 20 54 68 65 20 63 6f 72 72 65 63 74 20 55 52 49   The correct URI
148d0 20 66 6f 72 20 74 68 61 74 20 55 4e 43 20 68 61   for that UNC ha
148e0 73 20 6f 6e 6c 79 20 74 77 6f 20 6f 72 20 66 6f  s only two or fo
148f0 75 72 20 6c 65 61 64 69 6e 67 20 2f 20 63 68 61  ur leading / cha
14900 72 61 63 74 65 72 73 0a 20 20 20 20 20 20 2a 2a  racters.      **
14910 20 66 69 6c 65 3a 2f 2f 68 6f 73 74 2f 70 61 74   file://host/pat
14920 68 20 6f 72 20 66 69 6c 65 3a 2f 2f 2f 2f 68 6f  h or file:////ho
14930 73 74 2f 70 61 74 68 2e 20 20 42 75 74 20 35 20  st/path.  But 5 
14940 6c 65 61 64 69 6e 67 20 73 6c 61 73 68 65 73 20  leading slashes 
14950 69 73 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63  is a .      ** c
14960 6f 6d 6d 6f 6e 20 65 72 72 6f 72 2c 20 77 65 20  ommon error, we 
14970 61 72 65 20 74 6f 6c 64 2c 20 73 6f 20 77 65 20  are told, so we 
14980 68 61 6e 64 6c 65 20 69 74 20 61 73 20 61 20 73  handle it as a s
14990 70 65 63 69 61 6c 20 63 61 73 65 2e 20 2a 2f 0a  pecial case. */.
149a0 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
149b0 70 28 7a 55 72 69 2b 37 2c 20 22 2f 2f 2f 22 2c  p(zUri+7, "///",
149c0 20 33 29 3d 3d 30 20 29 7b 20 69 49 6e 2b 2b 3b   3)==0 ){ iIn++;
149d0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
149e0 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c   strncmp(zUri+5,
149f0 20 22 2f 2f 6c 6f 63 61 6c 68 6f 73 74 2f 22 2c   "//localhost/",
14a00 20 31 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   12)==0 ){.     
14a10 20 69 49 6e 20 3d 20 31 36 3b 0a 20 20 20 20 7d   iIn = 16;.    }
14a20 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 44 69  .#else.    /* Di
14a30 73 63 61 72 64 20 74 68 65 20 73 63 68 65 6d 65  scard the scheme
14a40 20 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73   and authority s
14a50 65 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55  egments of the U
14a60 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  RI. */.    if( z
14a70 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a  Uri[5]=='/' && z
14a80 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20  Uri[6]=='/' ){. 
14a90 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20       iIn = 7;.  
14aa0 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b      while( zUri[
14ab0 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e  iIn] && zUri[iIn
14ac0 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a  ]!='/' ) iIn++;.
14ad0 20 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37        if( iIn!=7
14ae0 20 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20   && (iIn!=16 || 
14af0 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73  memcmp("localhos
14b00 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29  t", &zUri[7], 9)
14b10 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a  ) ){.        *pz
14b20 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
14b30 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69  _mprintf("invali
14b40 64 20 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a  d uri authority:
14b50 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20   %.*s", .       
14b60 20 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72       iIn-7, &zUr
14b70 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  i[7]);.        r
14b80 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
14b90 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
14ba0 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20  arse_uri_out;.  
14bb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
14bc0 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  if..    /* Copy 
14bd0 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  the filename and
14be0 20 61 6e 79 20 71 75 65 72 79 20 70 61 72 61 6d   any query param
14bf0 65 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 7a  eters into the z
14c00 46 69 6c 65 20 62 75 66 66 65 72 2e 20 0a 20 20  File buffer. .  
14c10 20 20 2a 2a 20 44 65 63 6f 64 65 20 25 48 48 20    ** Decode %HH 
14c20 65 73 63 61 70 65 20 63 6f 64 65 73 20 61 6c 6f  escape codes alo
14c30 6e 67 20 74 68 65 20 77 61 79 2e 20 0a 20 20 20  ng the way. .   
14c40 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 69   **.    ** Withi
14c50 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72  n this loop, var
14c60 69 61 62 6c 65 20 65 53 74 61 74 65 20 6d 61 79  iable eState may
14c70 20 62 65 20 73 65 74 20 74 6f 20 30 2c 20 31 20   be set to 0, 1 
14c80 6f 72 20 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a  or 2, depending.
14c90 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61      ** on the pa
14ca0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41  rsing context. A
14cb0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
14cc0 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20 50 61  *.    **   0: Pa
14cd0 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e  rsing file-name.
14ce0 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20 50 61 72  .    **   1: Par
14cf0 73 69 6e 67 20 6e 61 6d 65 20 73 65 63 74 69 6f  sing name sectio
14d00 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75  n of a name=valu
14d10 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  e query paramete
14d20 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20 50  r..    **   2: P
14d30 61 72 73 69 6e 67 20 76 61 6c 75 65 20 73 65 63  arsing value sec
14d40 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76  tion of a name=v
14d50 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d  alue query param
14d60 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eter..    */.   
14d70 20 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20   eState = 0;.   
14d80 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72   while( (c = zUr
14d90 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21  i[iIn])!=0 && c!
14da0 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69 49  ='#' ){.      iI
14db0 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63  n++;.      if( c
14dc0 3d 3d 27 25 27 20 0a 20 20 20 20 20 20 20 26 26  =='%' .       &&
14dd0 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74   sqlite3Isxdigit
14de0 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20  (zUri[iIn]) .   
14df0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73      && sqlite3Is
14e00 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b  xdigit(zUri[iIn+
14e10 31 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  1]) .      ){.  
14e20 20 20 20 20 20 20 69 6e 74 20 6f 63 74 65 74 20        int octet 
14e30 3d 20 28 73 71 6c 69 74 65 33 48 65 78 54 6f 49  = (sqlite3HexToI
14e40 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20  nt(zUri[iIn++]) 
14e50 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6f  << 4);.        o
14e60 63 74 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 48  ctet += sqlite3H
14e70 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e  exToInt(zUri[iIn
14e80 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 61  ++]);..        a
14e90 73 73 65 72 74 28 20 6f 63 74 65 74 3e 3d 30 20  ssert( octet>=0 
14ea0 26 26 20 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a  && octet<256 );.
14eb0 20 20 20 20 20 20 20 20 69 66 28 20 6f 63 74 65          if( octe
14ec0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
14ed0 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
14ee0 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 22   is taken when "
14ef0 25 30 30 22 20 61 70 70 65 61 72 73 20 77 69 74  %00" appears wit
14f00 68 69 6e 20 74 68 65 20 55 52 49 2e 20 49 6e 20  hin the URI. In 
14f10 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
14f20 2a 20 63 61 73 65 20 77 65 20 69 67 6e 6f 72 65  * case we ignore
14f30 20 61 6c 6c 20 74 65 78 74 20 69 6e 20 74 68 65   all text in the
14f40 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
14f50 65 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a  e path, name or.
14f60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c            ** val
14f70 75 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ue currently bei
14f80 6e 67 20 70 61 72 73 65 64 2e 20 53 6f 20 69 67  ng parsed. So ig
14f90 6e 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  nore the current
14fa0 20 63 68 61 72 61 63 74 65 72 0a 20 20 20 20 20   character.     
14fb0 20 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70       ** and skip
14fc0 20 74 6f 20 74 68 65 20 6e 65 78 74 20 22 3f 22   to the next "?"
14fd0 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c 20 61 73  , "=" or "&", as
14fe0 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f   appropriate. */
14ff0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
15000 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d  ( (c = zUri[iIn]
15010 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 0a  )!=0 && c!='#' .
15020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
15030 20 28 65 53 74 61 74 65 21 3d 30 20 7c 7c 20 63   (eState!=0 || c
15040 21 3d 27 3f 27 29 0a 20 20 20 20 20 20 20 20 20  !='?').         
15050 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21       && (eState!
15060 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26  =1 || (c!='=' &&
15070 20 63 21 3d 27 26 27 29 29 0a 20 20 20 20 20 20   c!='&')).      
15080 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
15090 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29  te!=2 || c!='&')
150a0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
150b0 20 20 20 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b            iIn++;
150c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
150d0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
150e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
150f0 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20     c = octet;.  
15100 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53      }else if( eS
15110 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27  tate==1 && (c=='
15120 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b  &' || c=='=') ){
15130 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69  .        if( zFi
15140 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b  le[iOut-1]==0 ){
15150 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  .          /* An
15160 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61   empty option na
15170 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69 73 20  me. Ignore this 
15180 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65  option altogethe
15190 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  r. */.          
151a0 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d  while( zUri[iIn]
151b0 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27   && zUri[iIn]!='
151c0 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31  #' && zUri[iIn-1
151d0 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a  ]!='&' ) iIn++;.
151e0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
151f0 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
15200 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 26 27        if( c=='&'
15210 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46   ){.          zF
15220 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
15230 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0';.        }els
15240 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74  e{.          eSt
15250 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  ate = 2;.       
15260 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30   }.        c = 0
15270 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
15280 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26 26 20  ( (eState==0 && 
15290 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74 61  c=='?') || (eSta
152a0 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27 29  te==2 && c=='&')
152b0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
152c0 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  0;.        eStat
152d0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
152e0 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b       zFile[iOut+
152f0 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20  +] = c;.    }.  
15300 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20    if( eState==1 
15310 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20  ) zFile[iOut++] 
15320 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c  = '\0';.    zFil
15330 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
15340 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74  ;.    zFile[iOut
15350 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20  ++] = '\0';..   
15360 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
15370 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70 74 69  re were any opti
15380 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20 74 68  ons specified th
15390 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 74  at should be int
153a0 65 72 70 72 65 74 65 64 20 0a 20 20 20 20 2a 2a  erpreted .    **
153b0 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74   here. Options t
153c0 68 61 74 20 61 72 65 20 69 6e 74 65 72 70 72 65  hat are interpre
153d0 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75 64 65  ted here include
153e0 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f 73 65   "vfs" and those
153f0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72   that.    ** cor
15400 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73  respond to flags
15410 20 74 68 61 74 20 6d 61 79 20 62 65 20 70 61 73   that may be pas
15420 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  sed to the sqlit
15430 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20  e3_open_v2().   
15440 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20   ** method. */. 
15450 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65     zOpt = &zFile
15460 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
15470 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20  (zFile)+1];.    
15480 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29  while( zOpt[0] )
15490 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74  {.      int nOpt
154a0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
154b0 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20  30(zOpt);.      
154c0 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f  char *zVal = &zO
154d0 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20  pt[nOpt+1];.    
154e0 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c    int nVal = sql
154f0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 56 61  ite3Strlen30(zVa
15500 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e  l);..      if( n
15510 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70  Opt==3 && memcmp
15520 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29  ("vfs", zOpt, 3)
15530 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
15540 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20  Vfs = zVal;.    
15550 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15560 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
15570 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   {.          con
15580 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
15590 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a        int mode;.
155a0 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65          } *aMode
155b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
155c0 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20  ar *zModeType = 
155d0 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d  0;.        int m
155e0 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ask = 0;.       
155f0 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a   int limit = 0;.
15600 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70  .        if( nOp
15610 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==5 && memcmp("
15620 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29  cache", zOpt, 5)
15630 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
15640 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f   static struct O
15650 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f  penMode aCacheMo
15660 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  de[] = {.       
15670 20 20 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c       { "shared",
15680 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48    SQLITE_OPEN_SH
15690 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20  AREDCACHE },.   
156a0 20 20 20 20 20 20 20 20 20 7b 20 22 70 72 69 76           { "priv
156b0 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ate", SQLITE_OPE
156c0 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d  N_PRIVATECACHE }
156d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
156e0 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20  0, 0 }.         
156f0 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d   };..          m
15700 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ask = SQLITE_OPE
15710 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c 53 51  N_SHAREDCACHE|SQ
15720 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
15730 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20  ECACHE;.        
15740 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65    aMode = aCache
15750 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Mode;.          
15760 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20  limit = mask;.  
15770 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70          zModeTyp
15780 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20  e = "cache";.   
15790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
157a0 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65  f( nOpt==4 && me
157b0 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70  mcmp("mode", zOp
157c0 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, 4)==0 ){.    
157d0 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72        static str
157e0 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70  uct OpenMode aOp
157f0 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20  enMode[] = {.   
15800 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c           { "ro",
15810 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
15820 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20  ADONLY },.      
15830 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53        { "rw",  S
15840 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
15850 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20  RITE }, .       
15860 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51       { "rwc", SQ
15870 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
15880 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
15890 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20  N_CREATE },.    
158a0 20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72          { "memor
158b0 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  y", SQLITE_OPEN_
158c0 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20  MEMORY },.      
158d0 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20        { 0, 0 }. 
158e0 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20           };..   
158f0 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51         mask = SQ
15900 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
15910 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  LY | SQLITE_OPEN
15920 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20 20 20  _READWRITE.     
15930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
15940 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
15950 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
15960 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20  _MEMORY;.       
15970 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e     aMode = aOpen
15980 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Mode;.          
15990 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66  limit = mask & f
159a0 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lags;.          
159b0 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63  zModeType = "acc
159c0 65 73 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ess";.        }.
159d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f  .        if( aMo
159e0 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
159f0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
15a00 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20   int mode = 0;. 
15a10 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
15a20 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b  ; aMode[i].z; i+
15a30 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
15a40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
15a50 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20  aMode[i].z;.    
15a60 20 20 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c          if( nVal
15a70 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
15a80 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  0(z) && 0==memcm
15a90 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29  p(zVal, z, nVal)
15aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15ab0 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69    mode = aMode[i
15ac0 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ].mode;.        
15ad0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15ae0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15b00 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a   if( mode==0 ){.
15b10 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
15b20 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
15b30 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68  mprintf("no such
15b40 20 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a   %s mode: %s", z
15b50 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b  ModeType, zVal);
15b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
15b70 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
15b80 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
15b90 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a   parse_uri_out;.
15ba0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15bb0 20 20 20 20 20 20 69 66 28 20 28 6d 6f 64 65 20        if( (mode 
15bc0 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & ~SQLITE_OPEN_M
15bd0 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a  EMORY)>limit ){.
15be0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
15bf0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
15c00 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65  mprintf("%s mode
15c10 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73   not allowed: %s
15c20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
15c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c40 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65             zMode
15c50 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20  Type, zVal);.   
15c60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
15c70 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20  LITE_PERM;.     
15c80 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73         goto pars
15c90 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20  e_uri_out;.     
15ca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15cb0 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20   flags = (flags 
15cc0 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b  & ~mask) | mode;
15cd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15ce0 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d   }..      zOpt =
15cf0 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a   &zVal[nVal+1];.
15d00 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
15d10 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69      zFile = sqli
15d20 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 55 72  te3_malloc64(nUr
15d30 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  i+2);.    if( !z
15d40 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51  File ) return SQ
15d50 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
15d60 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55  memcpy(zFile, zU
15d70 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 7a  ri, nUri);.    z
15d80 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30  File[nUri] = '\0
15d90 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72  ';.    zFile[nUr
15da0 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  i+1] = '\0';.   
15db0 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
15dc0 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a  E_OPEN_URI;.  }.
15dd0 0a 20 20 2a 70 70 56 66 73 20 3d 20 73 71 6c 69  .  *ppVfs = sqli
15de0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66  te3_vfs_find(zVf
15df0 73 29 3b 0a 20 20 69 66 28 20 2a 70 70 56 66 73  s);.  if( *ppVfs
15e00 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72  ==0 ){.    *pzEr
15e10 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
15e20 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20  printf("no such 
15e30 76 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b  vfs: %s", zVfs);
15e40 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
15e50 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72  _ERROR;.  }. par
15e60 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66  se_uri_out:.  if
15e70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15e80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
15e90 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20  ree(zFile);.    
15ea0 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zFile = 0;.  }. 
15eb0 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61 67 73   *pFlags = flags
15ec0 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46  ;.  *pzFile = zF
15ed0 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ile;.  return rc
15ee0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
15ef0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
15f00 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e  e work of openin
15f10 67 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20  g a database on 
15f20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c  behalf of.** sql
15f30 69 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20  ite3_open() and 
15f40 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29  sqlite3_open16()
15f50 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  . The database f
15f60 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61  ilename "zFilena
15f70 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d  me"  .** is UTF-
15f80 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74  8 encoded..*/.st
15f90 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74  atic int openDat
15fa0 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63  abase(.  const c
15fb0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
15fc0 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
15fd0 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64  name UTF-8 encod
15fe0 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ed */.  sqlite3 
15ff0 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f  **ppDb,        /
16000 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20  * OUT: Returned 
16010 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
16020 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  */.  unsigned in
16030 74 20 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f  t flags,    /* O
16040 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73  perational flags
16050 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
16060 20 2a 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20   *zVfs       /* 
16070 4e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  Name of the VFS 
16080 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73  to use */.){.  s
16090 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
160b0 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65  * Store allocate
160c0 64 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  d handle here */
160d0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
160e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
16100 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68 72  e */.  int isThr
16110 65 61 64 73 61 66 65 3b 20 20 20 20 20 20 20 20  eadsafe;        
16120 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
16130 6f 72 20 74 68 72 65 61 64 73 61 66 65 20 63 6f  or threadsafe co
16140 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63  nnections */.  c
16150 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20  har *zOpen = 0; 
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16170 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d  * Filename argum
16180 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 42  ent to pass to B
16190 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  treeOpen() */.  
161a0 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
161b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
161c0 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  /* Error message
161d0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 50 61 72   from sqlite3Par
161e0 73 65 55 72 69 28 29 20 2a 2f 0a 0a 23 69 66 64  seUri() */..#ifd
161f0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
16200 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
16210 20 70 70 44 62 3d 3d 30 20 29 20 72 65 74 75 72   ppDb==0 ) retur
16220 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
16230 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a  BKPT;.#endif.  *
16240 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65  ppDb = 0;.#ifnde
16250 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
16260 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71  TOINIT.  rc = sq
16270 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
16280 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ();.  if( rc ) r
16290 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
162a0 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f  ..  /* Only allo
162b0 77 20 73 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69  w sensible combi
162c0 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69 74 73 20  nations of bits 
162d0 69 6e 20 74 68 65 20 66 6c 61 67 73 20 61 72 67  in the flags arg
162e0 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68  ument.  .  ** Th
162f0 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20  row an error if 
16300 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f  any non-sense co
16310 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20 75 73 65  mbination is use
16320 64 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 64  d.  If we.  ** d
16330 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65  o not block ille
16340 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  gal combinations
16350 20 68 65 72 65 2c 20 69 74 20 63 6f 75 6c 64 20   here, it could 
16360 74 72 69 67 67 65 72 0a 20 20 2a 2a 20 61 73 73  trigger.  ** ass
16370 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
16380 20 69 6e 20 64 65 65 70 65 72 20 6c 61 79 65 72   in deeper layer
16390 73 2e 20 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d  s.  Sensible com
163a0 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61  binations.  ** a
163b0 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31  re:.  **.  **  1
163c0 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  :  SQLITE_OPEN_R
163d0 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a  EADONLY.  **  2:
163e0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
163f0 41 44 57 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a  ADWRITE.  **  6:
16400 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
16410 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
16420 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a  _OPEN_CREATE.  *
16430 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  /.  assert( SQLI
16440 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
16450 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20 61    == 0x01 );.  a
16460 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50  ssert( SQLITE_OP
16470 45 4e 5f 52 45 41 44 57 52 49 54 45 20 3d 3d 20  EN_READWRITE == 
16480 30 78 30 32 20 29 3b 0a 20 20 61 73 73 65 72 74  0x02 );.  assert
16490 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  ( SQLITE_OPEN_CR
164a0 45 41 54 45 20 20 20 20 3d 3d 20 30 78 30 34 20  EATE    == 0x04 
164b0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  );.  testcase( (
164c0 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
164d0 78 30 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e  x02 ); /* READON
164e0 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  LY */.  testcase
164f0 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
16500 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20 52 45 41  ==0x04 ); /* REA
16510 44 57 52 49 54 45 20 2a 2f 0a 20 20 74 65 73 74  DWRITE */.  test
16520 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73  case( (1<<(flags
16530 26 37 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a  &7))==0x40 ); /*
16540 20 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45   READWRITE | CRE
16550 41 54 45 20 2a 2f 0a 20 20 69 66 28 20 28 28 31  ATE */.  if( ((1
16560 3c 3c 28 66 6c 61 67 73 26 37 29 29 20 26 20 30  <<(flags&7)) & 0
16570 78 34 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  x46)==0 ){.    r
16580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
16590 55 53 45 5f 42 4b 50 54 3b 20 20 2f 2a 20 49 4d  USE_BKPT;  /* IM
165a0 50 3a 20 52 2d 36 35 34 39 37 2d 34 34 35 39 34  P: R-65497-44594
165b0 20 2a 2f 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73   */.  }..  if( s
165c0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
165d0 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30  ig.bCoreMutex==0
165e0 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64   ){.    isThread
165f0 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  safe = 0;.  }els
16600 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
16610 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
16620 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  X ){.    isThrea
16630 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dsafe = 0;.  }el
16640 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
16650 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
16660 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68  UTEX ){.    isTh
16670 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20 20  readsafe = 1;.  
16680 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68 72  }else{.    isThr
16690 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74 65  eadsafe = sqlite
166a0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
166b0 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 20 20  ullMutex;.  }.  
166c0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
166d0 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
166e0 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c 61 67  ACHE ){.    flag
166f0 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
16700 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  N_SHAREDCACHE;. 
16710 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
16720 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
16730 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
16740 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  d ){.    flags |
16750 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  = SQLITE_OPEN_SH
16760 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
16770 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d    /* Remove harm
16780 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74 68  ful bits from th
16790 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
167a0 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  r.  **.  ** The 
167b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
167c0 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  TEX and SQLITE_O
167d0 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c  PEN_FULLMUTEX fl
167e0 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20 64 65  ags were.  ** de
167f0 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68 65 20  alt with in the 
16800 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20 62 6c  previous code bl
16810 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20 74 68  ock.  Besides th
16820 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20  ese, the only.  
16830 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74 20 66  ** valid input f
16840 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33  lags for sqlite3
16850 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65 20 53  _open_v2() are S
16860 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
16870 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45  NLY,.  ** SQLITE
16880 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 2c  _OPEN_READWRITE,
16890 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
168a0 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ATE, SQLITE_OPEN
168b0 5f 53 48 41 52 45 44 43 41 43 48 45 2c 0a 20 20  _SHAREDCACHE,.  
168c0 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  ** SQLITE_OPEN_P
168d0 52 49 56 41 54 45 43 41 43 48 45 2c 20 61 6e 64  RIVATECACHE, and
168e0 20 73 6f 6d 65 20 72 65 73 65 72 76 65 64 20 62   some reserved b
168f0 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d  its.  Silently m
16900 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c  ask.  ** off all
16910 20 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a 20 20   other flags..  
16920 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20 20 7e  */.  flags &=  ~
16930 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  ( SQLITE_OPEN_DE
16940 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20  LETEONCLOSE |.  
16950 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
16960 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
16970 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  VE |.           
16980 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
16990 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20  MAIN_DB |.      
169a0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
169b0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a  OPEN_TEMP_DB | .
169c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
169d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
169e0 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20 20  IENT_DB | .     
169f0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
16a00 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
16a10 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  AL | .          
16a20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16a30 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20  _TEMP_JOURNAL | 
16a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16a50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
16a60 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
16a70 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
16a80 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
16a90 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20 20 20 20  NAL |.          
16aa0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16ab0 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20 20  _NOMUTEX |.     
16ac0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
16ad0 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20  _OPEN_FULLMUTEX 
16ae0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
16af0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
16b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  .             );
16b10 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
16b20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61 20  the sqlite data 
16b30 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 64  structure */.  d
16b40 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  b = sqlite3Mallo
16b50 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 73 71  cZero( sizeof(sq
16b60 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66 28 20  lite3) );.  if( 
16b70 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65  db==0 ) goto ope
16b80 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69  ndb_out;.  if( i
16b90 73 54 68 72 65 61 64 73 61 66 65 20 29 7b 0a 20  sThreadsafe ){. 
16ba0 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73     db->mutex = s
16bb0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
16bc0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
16bd0 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69 66  CURSIVE);.    if
16be0 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  ( db->mutex==0 )
16bf0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
16c00 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20 20  free(db);.      
16c10 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f  db = 0;.      go
16c20 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
16c30 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
16c40 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
16c50 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
16c60 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b  >errMask = 0xff;
16c70 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a  .  db->nDb = 2;.
16c80 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
16c90 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b  LITE_MAGIC_BUSY;
16ca0 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d  .  db->aDb = db-
16cb0 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a 20 20 61  >aDbStatic;..  a
16cc0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62  ssert( sizeof(db
16cd0 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f  ->aLimit)==sizeo
16ce0 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b  f(aHardLimit) );
16cf0 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c  .  memcpy(db->aL
16d00 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74  imit, aHardLimit
16d10 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69  , sizeof(db->aLi
16d20 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 4c 69  mit));.  db->aLi
16d30 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
16d40 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d  _WORKER_THREADS]
16d50 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
16d60 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
16d70 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  ;.  db->autoComm
16d80 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65  it = 1;.  db->ne
16d90 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a  xtAutovac = -1;.
16da0 20 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73    db->szMmap = s
16db0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16dc0 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d  ig.szMmap;.  db-
16dd0 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20  >nextPagesize = 
16de0 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72  0;.  db->nMaxSor
16df0 74 65 72 4d 6d 61 70 20 3d 20 30 78 37 46 46 46  terMmap = 0x7FFF
16e00 46 46 46 46 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  FFFF;.  db->flag
16e10 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72  s |= SQLITE_Shor
16e20 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49  tColNames | SQLI
16e30 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72  TE_EnableTrigger
16e40 20 7c 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53   | SQLITE_CacheS
16e50 70 69 6c 6c 0a 23 69 66 20 21 64 65 66 69 6e 65  pill.#if !define
16e60 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  d(SQLITE_DEFAULT
16e70 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
16e80 29 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 46 41  ) || SQLITE_DEFA
16e90 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  ULT_AUTOMATIC_IN
16ea0 44 45 58 0a 20 20 20 20 20 20 20 20 20 20 20 20  DEX.            
16eb0 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 75       | SQLITE_Au
16ec0 74 6f 49 6e 64 65 78 0a 23 65 6e 64 69 66 0a 23  toIndex.#endif.#
16ed0 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
16ee0 54 5f 43 4b 50 54 46 55 4c 4c 46 53 59 4e 43 0a  T_CKPTFULLFSYNC.
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f00 20 7c 20 53 51 4c 49 54 45 5f 43 6b 70 74 46 75   | SQLITE_CkptFu
16f10 6c 6c 46 53 79 6e 63 0a 23 65 6e 64 69 66 0a 23  llFSync.#endif.#
16f20 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
16f30 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a  T_FILE_FORMAT<4.
16f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f50 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79   | SQLITE_Legacy
16f60 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23  FileFmt.#endif.#
16f70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
16f80 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  BLE_LOAD_EXTENSI
16f90 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ON.             
16fa0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61      | SQLITE_Loa
16fb0 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69  dExtension.#endi
16fc0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  f.#if SQLITE_DEF
16fd0 41 55 4c 54 5f 52 45 43 55 52 53 49 56 45 5f 54  AULT_RECURSIVE_T
16fe0 52 49 47 47 45 52 53 0a 20 20 20 20 20 20 20 20  RIGGERS.        
16ff0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
17000 45 5f 52 65 63 54 72 69 67 67 65 72 73 0a 23 65  E_RecTriggers.#e
17010 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
17020 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
17030 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29 20 26 26  FOREIGN_KEYS) &&
17040 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
17050 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20  FOREIGN_KEYS.   
17060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
17070 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65  SQLITE_ForeignKe
17080 79 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  ys.#endif.#if de
17090 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 52 45 56  fined(SQLITE_REV
170a0 45 52 53 45 5f 55 4e 4f 52 44 45 52 45 44 5f 53  ERSE_UNORDERED_S
170b0 45 4c 45 43 54 53 29 0a 20 20 20 20 20 20 20 20  ELECTS).        
170c0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
170d0 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 0a 23  E_ReverseOrder.#
170e0 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
170f0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
17100 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
17110 45 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20 20  ECK).           
17120 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 43        | SQLITE_C
17130 65 6c 6c 53 69 7a 65 43 6b 0a 23 65 6e 64 69 66  ellSizeCk.#endif
17140 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74  .      ;.  sqlit
17150 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e  e3HashInit(&db->
17160 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64  aCollSeq);.#ifnd
17170 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
17180 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71  IRTUALTABLE.  sq
17190 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
171a0 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
171b0 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68  dif..  /* Add th
171c0 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
171d0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e  ion sequence BIN
171e0 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b  ARY. BINARY work
171f0 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38  s for both UTF-8
17200 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36  .  ** and UTF-16
17210 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72 73 69  , so add a versi
17220 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61  on for each to a
17230 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73  void any unneces
17240 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72  sary.  ** conver
17250 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20  sions. The only 
17260 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f  error that can o
17270 63 63 75 72 20 68 65 72 65 20 69 73 20 61 20 6d  ccur here is a m
17280 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e  alloc() failure.
17290 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 56 49 44 45  .  **.  ** EVIDE
172a0 4e 43 45 2d 4f 46 3a 20 52 2d 35 32 37 38 36 2d  NCE-OF: R-52786-
172b0 34 34 38 37 38 20 53 51 4c 69 74 65 20 64 65 66  44878 SQLite def
172c0 69 6e 65 73 20 74 68 72 65 65 20 62 75 69 6c 74  ines three built
172d0 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20  -in collating.  
172e0 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 20 20  ** functions:.  
172f0 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  */.  createColla
17300 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59  tion(db, "BINARY
17310 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
17320 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20  0, binCollFunc, 
17330 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c  0);.  createColl
17340 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52  ation(db, "BINAR
17350 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  Y", SQLITE_UTF16
17360 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75  BE, 0, binCollFu
17370 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
17380 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42  Collation(db, "B
17390 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55  INARY", SQLITE_U
173a0 54 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f  TF16LE, 0, binCo
173b0 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
173c0 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
173d0 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49  , "NOCASE", SQLI
173e0 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61  TE_UTF8, 0, noca
173f0 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c  seCollatingFunc,
17400 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
17410 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49  lation(db, "RTRI
17420 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  M", SQLITE_UTF8,
17430 20 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f   (void*)1, binCo
17440 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66  llFunc, 0);.  if
17450 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
17460 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f  ed ){.    goto o
17470 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20  pendb_out;.  }. 
17480 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
17490 20 52 2d 30 38 33 30 38 2d 31 37 32 32 34 20 54   R-08308-17224 T
174a0 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
174b0 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ting function fo
174c0 72 20 61 6c 6c 0a 20 20 2a 2a 20 73 74 72 69 6e  r all.  ** strin
174d0 67 73 20 69 73 20 42 49 4e 41 52 59 2e 20 0a 20  gs is BINARY. . 
174e0 20 2a 2f 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43   */.  db->pDfltC
174f0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
17500 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c  dCollSeq(db, SQL
17510 49 54 45 5f 55 54 46 38 2c 20 22 42 49 4e 41 52  ITE_UTF8, "BINAR
17520 59 22 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  Y", 0);.  assert
17530 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21  ( db->pDfltColl!
17540 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73  =0 );..  /* Pars
17550 65 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f 55  e the filename/U
17560 52 49 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a  RI argument. */.
17570 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20    db->openFlags 
17580 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63 20 3d 20  = flags;.  rc = 
17590 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28  sqlite3ParseUri(
175a0 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  zVfs, zFilename,
175b0 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70 56   &flags, &db->pV
175c0 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45 72  fs, &zOpen, &zEr
175d0 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63 21  rMsg);.  if( rc!
175e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
175f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17600 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d 61 6c  _NOMEM ) db->mal
17610 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
17620 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
17630 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 7a  ithMsg(db, rc, z
17640 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20  ErrMsg ? "%s" : 
17650 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  0, zErrMsg);.   
17660 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
17670 72 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f 74 6f  rrMsg);.    goto
17680 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
17690 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
176a0 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61 73 65  backend database
176b0 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72 63 20   driver */.  rc 
176c0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  = sqlite3BtreeOp
176d0 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a 4f 70  en(db->pVfs, zOp
176e0 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61 44 62  en, db, &db->aDb
176f0 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20 20 20  [0].pBt, 0,.    
17700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17710 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51 4c 49      flags | SQLI
17720 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
17730 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17740 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
17750 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
17760 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  R_NOMEM ){.     
17770 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
17780 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  EM;.    }.    sq
17790 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
177a0 63 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65  c);.    goto ope
177b0 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 73  ndb_out;.  }.  s
177c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
177d0 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
177e0 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ;.  db->aDb[0].p
177f0 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33  Schema = sqlite3
17800 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 64 62  SchemaGet(db, db
17810 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
17820 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
17830 46 61 69 6c 65 64 20 29 20 45 4e 43 28 64 62 29  Failed ) ENC(db)
17840 20 3d 20 53 43 48 45 4d 41 5f 45 4e 43 28 64 62   = SCHEMA_ENC(db
17850 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
17860 65 4c 65 61 76 65 28 64 62 2d 3e 61 44 62 5b 30  eLeave(db->aDb[0
17870 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44  ].pBt);.  db->aD
17880 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73  b[1].pSchema = s
17890 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28  qlite3SchemaGet(
178a0 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 54 68  db, 0);..  /* Th
178b0 65 20 64 65 66 61 75 6c 74 20 73 61 66 65 74 79  e default safety
178c0 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d  _level for the m
178d0 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
178e0 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20  'full'; for the 
178f0 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61  temp.  ** databa
17900 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e  se it is 'NONE'.
17910 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
17920 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64 65  e pager layer de
17930 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20  faults.  .  */. 
17940 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d   db->aDb[0].zNam
17950 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62  e = "main";.  db
17960 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f  ->aDb[0].safety_
17970 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20 64 62 2d  level = 3;.  db-
17980 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20  >aDb[1].zName = 
17990 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44  "temp";.  db->aD
179a0 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  b[1].safety_leve
179b0 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61  l = 1;..  db->ma
179c0 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
179d0 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64  IC_OPEN;.  if( d
179e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
179f0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
17a00 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  db_out;.  }..  /
17a10 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62  * Register all b
17a20 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e  uilt-in function
17a30 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74  s, but do not at
17a40 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68  tempt to read th
17a50 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
17a60 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73  schema yet. This
17a70 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69   is delayed unti
17a80 6c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  l the first time
17a90 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
17aa0 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a  ** is accessed..
17ab0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72    */.  sqlite3Er
17ac0 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
17ad0 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67  K);.  sqlite3Reg
17ae0 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63  isterBuiltinFunc
17af0 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a  tions(db);..  /*
17b00 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20   Load automatic 
17b10 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74  extensions - ext
17b20 65 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76  ensions that hav
17b30 65 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65  e been registere
17b40 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  d.  ** using the
17b50 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74   sqlite3_automat
17b60 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41  ic_extension() A
17b70 50 49 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  PI..  */.  rc = 
17b80 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
17b90 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  db);.  if( rc==S
17ba0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17bb0 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64 45  sqlite3AutoLoadE
17bc0 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20  xtensions(db);. 
17bd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
17be0 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 20  errcode(db);.   
17bf0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17c00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
17c10 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20   opendb_out;.   
17c20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
17c30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
17c40 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  1.  if( !db->mal
17c50 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
17c60 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
17c70 74 65 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69  te3Fts1Init(sqli
17c80 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  te3*);.    rc = 
17c90 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28  sqlite3Fts1Init(
17ca0 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
17cb0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17cc0 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28  NABLE_FTS2.  if(
17cd0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
17ce0 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
17cf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72  _OK ){.    exter
17d00 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  n int sqlite3Fts
17d10 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b  2Init(sqlite3*);
17d20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17d30 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20  3Fts2Init(db);. 
17d40 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
17d50 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17d60 46 54 53 33 20 2f 2a 20 61 75 74 6f 6d 61 74 69  FTS3 /* automati
17d70 63 61 6c 6c 79 20 64 65 66 69 6e 65 64 20 62 79  cally defined by
17d80 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
17d90 54 53 34 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  TS4 */.  if( !db
17da0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
17db0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
17dc0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
17dd0 74 65 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b  te3Fts3Init(db);
17de0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
17df0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
17e00 45 5f 46 54 53 35 0a 20 20 69 66 28 20 21 64 62  E_FTS5.  if( !db
17e10 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
17e20 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
17e30 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
17e40 74 65 33 46 74 73 35 49 6e 69 74 28 64 62 29 3b  te3Fts5Init(db);
17e50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
17e60 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
17e70 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62 2d  E_ICU.  if( !db-
17e80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
17e90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17ea0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
17eb0 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a 20  e3IcuInit(db);. 
17ec0 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
17ed0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17ee0 52 54 52 45 45 0a 20 20 69 66 28 20 21 64 62 2d  RTREE.  if( !db-
17ef0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
17f00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b   rc==SQLITE_OK){
17f10 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17f20 33 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b 0a  3RtreeInit(db);.
17f30 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
17f40 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17f50 5f 44 42 53 54 41 54 5f 56 54 41 42 0a 20 20 69  _DBSTAT_VTAB.  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 44 62 73 74 61 74 52 65   sqlite3DbstatRe
17fa0 67 69 73 74 65 72 28 64 62 29 3b 0a 20 20 7d 0a  gister(db);.  }.
17fb0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
17fc0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4a 53 4f  QLITE_ENABLE_JSO
17fd0 4e 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  N1.  if( !db->ma
17fe0 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
17ff0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20  ==SQLITE_OK){.  
18000 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 73    rc = sqlite3Js
18010 6f 6e 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  on1Init(db);.  }
18020 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 2d 44  .#endif..  /* -D
18030 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
18040 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61  OCKING_MODE=1 ma
18050 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20 74 68  kes EXCLUSIVE th
18060 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
18070 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44  g.  ** mode.  -D
18080 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
18090 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61  OCKING_MODE=0 ma
180a0 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65  ke NORMAL the de
180b0 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20  fault locking.  
180c0 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20  ** mode.  Doing 
180d0 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61  nothing at all a
180e0 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c  lso makes NORMAL
180f0 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20   the default..  
18100 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
18110 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
18120 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74  _MODE.  db->dflt
18130 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54  LockMode = SQLIT
18140 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
18150 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65  G_MODE;.  sqlite
18160 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
18170 65 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  e(sqlite3BtreePa
18180 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ger(db->aDb[0].p
18190 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Bt),.           
181a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
181b0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
181c0 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e  CKING_MODE);.#en
181d0 64 69 66 0a 0a 20 20 69 66 28 20 72 63 20 29 20  dif..  if( rc ) 
181e0 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
181f0 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62   rc);..  /* Enab
18200 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  le the lookaside
18210 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65  -malloc subsyste
18220 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b  m */.  setupLook
18230 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c  aside(db, 0, sql
18240 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
18250 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20  .szLookaside,.  
18260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18270 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
18280 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61  balConfig.nLooka
18290 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65  side);..  sqlite
182a0 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
182b0 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f  oint(db, SQLITE_
182c0 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f  DEFAULT_WAL_AUTO
182d0 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70  CHECKPOINT);..op
182e0 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  endb_out:.  sqli
182f0 74 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e 29 3b  te3_free(zOpen);
18300 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20 20  .  if( db ){.   
18310 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75 74   assert( db->mut
18320 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65 61  ex!=0 || isThrea
18330 64 73 61 66 65 3d 3d 30 0a 20 20 20 20 20 20 20  dsafe==0.       
18340 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c      || sqlite3Gl
18350 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
18360 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Mutex==0 );.    
18370 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
18380 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
18390 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
183a0 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
183b0 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
183c0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
183d0 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  MEM );.  if( rc=
183e0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
183f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
18400 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d  se(db);.    db =
18410 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
18420 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18430 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
18440 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49   SQLITE_MAGIC_SI
18450 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20  CK;.  }.  *ppDb 
18460 3d 20 64 62 3b 0a 23 69 66 64 65 66 20 53 51 4c  = db;.#ifdef SQL
18470 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
18480 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  G.  if( sqlite3G
18490 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
184a0 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  log ){.    /* Op
184b0 65 6e 69 6e 67 20 61 20 64 62 20 68 61 6e 64 6c  ening a db handl
184c0 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65  e. Fourth parame
184d0 74 65 72 20 69 73 20 70 61 73 73 65 64 20 30 2e  ter is passed 0.
184e0 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 41   */.    void *pA
184f0 72 67 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  rg = sqlite3Glob
18500 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
18510 41 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Arg;.    sqlite3
18520 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
18530 6c 6c 6f 67 28 70 41 72 67 2c 20 64 62 2c 20 7a  llog(pArg, db, z
18540 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  Filename, 0);.  
18550 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
18560 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53 5f  ined(SQLITE_HAS_
18570 43 4f 44 45 43 29 0a 20 20 69 66 28 20 72 63 3d  CODEC).  if( rc=
18580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18590 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 48    const char *zH
185a0 65 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f  exKey = sqlite3_
185b0 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 4f  uri_parameter(zO
185c0 70 65 6e 2c 20 22 68 65 78 6b 65 79 22 29 3b 0a  pen, "hexkey");.
185d0 20 20 20 20 69 66 28 20 7a 48 65 78 4b 65 79 20      if( zHexKey 
185e0 26 26 20 7a 48 65 78 4b 65 79 5b 30 5d 20 29 7b  && zHexKey[0] ){
185f0 0a 20 20 20 20 20 20 75 38 20 69 42 79 74 65 3b  .      u8 iByte;
18600 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
18610 20 20 20 20 63 68 61 72 20 7a 4b 65 79 5b 34 30      char zKey[40
18620 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ];.      for(i=0
18630 2c 20 69 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a  , iByte=0; i<siz
18640 65 6f 66 28 7a 4b 65 79 29 2a 32 20 26 26 20 73  eof(zKey)*2 && s
18650 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a  qlite3Isxdigit(z
18660 48 65 78 4b 65 79 5b 69 5d 29 3b 20 69 2b 2b 29  HexKey[i]); i++)
18670 7b 0a 20 20 20 20 20 20 20 20 69 42 79 74 65 20  {.        iByte 
18680 3d 20 28 69 42 79 74 65 3c 3c 34 29 20 2b 20 73  = (iByte<<4) + s
18690 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a  qlite3HexToInt(z
186a0 48 65 78 4b 65 79 5b 69 5d 29 3b 0a 20 20 20 20  HexKey[i]);.    
186b0 20 20 20 20 69 66 28 20 28 69 26 31 29 21 3d 30      if( (i&1)!=0
186c0 20 29 20 7a 4b 65 79 5b 69 2f 32 5d 20 3d 20 69   ) zKey[i/2] = i
186d0 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Byte;.      }.  
186e0 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 5f      sqlite3_key_
186f0 76 32 28 64 62 2c 20 30 2c 20 7a 4b 65 79 2c 20  v2(db, 0, zKey, 
18700 69 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  i/2);.    }.  }.
18710 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
18720 72 63 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a  rc & 0xff;.}../*
18730 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64  .** Open a new d
18740 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a  atabase handle..
18750 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
18760 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  pen(.  const cha
18770 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20  r *zFilename, . 
18780 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20   sqlite3 **ppDb 
18790 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  .){.  return ope
187a0 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e  nDatabase(zFilen
187b0 61 6d 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20  ame, ppDb,.     
187c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
187e0 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
187f0 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b  OPEN_CREATE, 0);
18800 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  .}.int sqlite3_o
18810 70 65 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20  pen_v2(.  const 
18820 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20  char *filename, 
18830 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
18840 6c 65 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a  lename (UTF-8) *
18850 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70  /.  sqlite3 **pp
18860 44 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  Db,         /* O
18870 55 54 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61  UT: SQLite db ha
18880 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ndle */.  int fl
18890 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
188a0 20 20 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20    /* Flags */.  
188b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
188c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
188d0 6f 66 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f  of VFS module to
188e0 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74   use */.){.  ret
188f0 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65  urn openDatabase
18900 28 66 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c  (filename, ppDb,
18910 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66   (unsigned int)f
18920 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a  lags, zVfs);.}..
18930 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18940 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
18950 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
18960 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
18970 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  nt sqlite3_open1
18980 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  6(.  const void 
18990 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
189a0 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b  qlite3 **ppDb.){
189b0 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
189c0 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20  Filename8;   /* 
189d0 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65  zFilename encode
189e0 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65  d in UTF-8 inste
189f0 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a  ad of UTF-16 */.
18a00 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
18a10 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  *pVal;.  int rc;
18a20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
18a30 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
18a40 0a 20 20 69 66 28 20 70 70 44 62 3d 3d 30 20 29  .  if( ppDb==0 )
18a50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
18a60 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
18a70 69 66 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a  if.  *ppDb = 0;.
18a80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18a90 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72  MIT_AUTOINIT.  r
18aa0 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  c = sqlite3_init
18ab0 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20  ialize();.  if( 
18ac0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
18ad0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 46 69  #endif.  if( zFi
18ae0 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 7a 46 69 6c  lename==0 ) zFil
18af0 65 6e 61 6d 65 20 3d 20 22 5c 30 30 30 5c 30 30  ename = "\000\00
18b00 30 22 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  0";.  pVal = sql
18b10 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
18b20 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
18b30 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
18b40 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54  zFilename, SQLIT
18b50 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53  E_UTF16NATIVE, S
18b60 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
18b70 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71   zFilename8 = sq
18b80 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70  lite3ValueText(p
18b90 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Val, SQLITE_UTF8
18ba0 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
18bb0 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me8 ){.    rc = 
18bc0 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69  openDatabase(zFi
18bd0 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20  lename8, ppDb,. 
18be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bf0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
18c00 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
18c10 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
18c20 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
18c30 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51   *ppDb || rc==SQ
18c40 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
18c50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18c60 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f  _OK && !DbHasPro
18c70 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20  perty(*ppDb, 0, 
18c80 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
18c90 20 29 7b 0a 20 20 20 20 20 20 53 43 48 45 4d 41   ){.      SCHEMA
18ca0 5f 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 45 4e  _ENC(*ppDb) = EN
18cb0 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49 54  C(*ppDb) = SQLIT
18cc0 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
18cd0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
18ce0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
18cf0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  MEM;.  }.  sqlit
18d00 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
18d10 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 20  );..  return rc 
18d20 26 20 30 78 66 66 3b 0a 7d 0a 23 65 6e 64 69 66  & 0xff;.}.#endif
18d30 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
18d40 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
18d50 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
18d60 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
18d70 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
18d80 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
18d90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
18da0 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a  eate_collation(.
18db0 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
18dc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
18dd0 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c  ame, .  int enc,
18de0 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
18df0 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
18e00 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
18e10 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
18e20 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 72 65 74   void*).){.  ret
18e30 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61  urn sqlite3_crea
18e40 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
18e50 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20  db, zName, enc, 
18e60 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
18e70 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  0);.}../*.** Reg
18e80 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
18e90 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
18ea0 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
18eb0 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
18ec0 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
18ed0 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a  e_collation_v2(.
18ee0 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
18ef0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
18f00 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c  ame, .  int enc,
18f10 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
18f20 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
18f30 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
18f40 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
18f50 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28   void*),.  void(
18f60 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b  *xDel)(void*).){
18f70 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64  .  int rc;..#ifd
18f80 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
18f90 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
18fa0 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
18fb0 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e  heckOk(db) || zN
18fc0 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ame==0 ) return 
18fd0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
18fe0 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
18ff0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
19000 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
19010 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
19020 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63  ocFailed );.  rc
19030 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69   = createCollati
19040 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75  on(db, zName, (u
19050 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  8)enc, pCtx, xCo
19060 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20  mpare, xDel);.  
19070 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
19080 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
19090 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
190a0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
190b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
190c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
190d0 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
190e0 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
190f0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
19100 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
19110 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
19120 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
19130 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28  ate_collation16(
19140 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
19150 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
19160 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  Name,.  int enc,
19170 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
19180 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
19190 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
191a0 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
191b0 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74   void*).){.  int
191c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
191d0 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b  .  char *zName8;
191e0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
191f0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
19200 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
19210 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
19220 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72   || zName==0 ) r
19230 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
19240 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
19250 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
19260 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
19270 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
19280 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
19290 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c  ;.  zName8 = sql
192a0 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c  ite3Utf16to8(db,
192b0 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
192c0 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
192d0 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b  .  if( zName8 ){
192e0 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65  .    rc = create
192f0 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
19300 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 70  ame8, (u8)enc, p
19310 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30  Ctx, xCompare, 0
19320 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
19330 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29  Free(db, zName8)
19340 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
19350 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
19360 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
19370 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
19380 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
19390 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
193a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
193b0 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  6 */../*.** Regi
193c0 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e  ster a collation
193d0 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
193e0 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  y callback with 
193f0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
19400 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61  dle.** db. Repla
19410 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c  ce any previousl
19420 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c  y installed coll
19430 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
19440 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73  actory..*/.int s
19450 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
19460 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74  _needed(.  sqlit
19470 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20  e3 *db, .  void 
19480 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c  *pCollNeededArg,
19490 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e   .  void(*xCollN
194a0 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c  eeded)(void*,sql
194b0 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52  ite3*,int eTextR
194c0 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a  ep,const char*).
194d0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
194e0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
194f0 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
19500 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
19510 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
19520 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
19530 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
19540 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
19550 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43  mutex);.  db->xC
19560 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c  ollNeeded = xCol
19570 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78  lNeeded;.  db->x
19580 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30  CollNeeded16 = 0
19590 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65  ;.  db->pCollNee
195a0 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65  dedArg = pCollNe
195b0 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74  ededArg;.  sqlit
195c0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
195d0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
195e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
195f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
19600 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
19610 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c  * Register a col
19620 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
19630 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b  factory callback
19640 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
19650 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
19660 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65   Replace any pre
19670 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65  viously installe
19680 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
19690 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f  ence factory..*/
196a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  .int sqlite3_col
196b0 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28  lation_needed16(
196c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
196d0 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65  .  void *pCollNe
196e0 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64  ededArg, .  void
196f0 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29  (*xCollNeeded16)
19700 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c  (void*,sqlite3*,
19710 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e  int eTextRep,con
19720 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 23 69 66  st void*).){.#if
19730 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
19740 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
19750 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
19760 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
19770 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
19780 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
19790 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
197a0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
197b0 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
197c0 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78  ded = 0;.  db->x
197d0 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78  CollNeeded16 = x
197e0 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20  CollNeeded16;.  
197f0 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41  db->pCollNeededA
19800 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64  rg = pCollNeeded
19810 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
19820 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
19830 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
19840 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
19850 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
19860 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66  IT_UTF16 */..#if
19870 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19880 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a  _DEPRECATED./*.*
19890 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
198a0 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72  is now an anachr
198b0 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74  onism. It used t
198c0 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 63  o be used to rec
198d0 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d  over from a.** m
198e0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c  alloc() failure,
198f0 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20   but SQLite now 
19900 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61  does this automa
19910 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  tically..*/.int 
19920 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72  sqlite3_global_r
19930 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20  ecover(void){.  
19940 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19950 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
19960 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77 68  * Test to see wh
19970 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
19980 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
19990 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63  tion is in autoc
199a0 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20  ommit.** mode.  
199b0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  Return TRUE if i
199c0 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69  t is and FALSE i
199d0 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d  f not.  Autocomm
199e0 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a  it mode is on.**
199f0 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75   by default.  Au
19a00 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61  tocommit is disa
19a10 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e 20  bled by a BEGIN 
19a20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65  statement and re
19a30 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68  enabled.** by th
19a40 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72  e next COMMIT or
19a50 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69 6e   ROLLBACK..*/.in
19a60 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  t sqlite3_get_au
19a70 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33  tocommit(sqlite3
19a80 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
19a90 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
19aa0 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
19ab0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
19ac0 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
19ad0 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
19ae0 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
19af0 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
19b00 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74    return db->aut
19b10 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  oCommit;.}../*.*
19b20 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
19b30 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75 62  routines are sub
19b40 73 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e  stitutes for con
19b50 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f  stants SQLITE_CO
19b60 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45  RRUPT,.** SQLITE
19b70 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f  _MISUSE, SQLITE_
19b80 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45  CANTOPEN, SQLITE
19b90 5f 49 4f 45 52 52 20 61 6e 64 20 70 6f 73 73 69  _IOERR and possi
19ba0 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a  bly other error.
19bb0 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54  ** constants.  T
19bc0 68 65 79 20 73 65 72 76 65 20 74 77 6f 20 70 75  hey serve two pu
19bd0 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  rposes:.**.**   
19be0 31 2e 20 20 53 65 72 76 65 20 61 73 20 61 20 63  1.  Serve as a c
19bf0 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
19c00 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
19c10 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67 65  int in a debugge
19c20 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65  r.**       to de
19c30 74 65 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f  tect when versio
19c40 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  n error conditio
19c50 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ns occurs..**.**
19c60 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71     2.  Invoke sq
19c70 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70  lite3_log() to p
19c80 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72 63  rovide the sourc
19c90 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20  e code location 
19ca0 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61  where.**       a
19cb0 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
19cc0 20 69 73 20 66 69 72 73 74 20 64 65 74 65 63 74   is first detect
19cd0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
19ce0 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69  e3CorruptError(i
19cf0 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
19d00 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
19d10 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
19d20 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
19d30 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52  _log(SQLITE_CORR
19d40 55 50 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  UPT,.           
19d50 20 20 20 22 64 61 74 61 62 61 73 65 20 63 6f 72     "database cor
19d60 72 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20  ruption at line 
19d70 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a  %d of [%.10s]",.
19d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69                li
19d90 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33  neno, 20+sqlite3
19da0 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20  _sourceid());.  
19db0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
19dc0 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c  RRUPT;.}.int sql
19dd0 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28  ite3MisuseError(
19de0 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
19df0 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
19e00 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
19e10 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  g!=0 );.  sqlite
19e20 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53  3_log(SQLITE_MIS
19e30 55 53 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  USE, .          
19e40 20 20 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c      "misuse at l
19e50 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73  ine %d of [%.10s
19e60 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]",.            
19e70 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c    lineno, 20+sql
19e80 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
19e90 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
19ea0 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20  E_MISUSE;.}.int 
19eb0 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45  sqlite3CantopenE
19ec0 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
19ed0 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
19ee0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
19ef0 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
19f00 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
19f10 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20  E_CANTOPEN, .   
19f20 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
19f30 6f 74 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20  ot open file at 
19f40 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
19f50 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
19f60 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
19f70 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
19f80 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
19f90 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a  TE_CANTOPEN;.}..
19fa0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19fb0 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
19fc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
19fd0 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74  convenience rout
19fe0 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73  ine that makes s
19ff0 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72  ure that all thr
1a000 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  ead-specific.** 
1a010 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68  data for this th
1a020 72 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65  read has been de
1a030 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
1a040 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65   SQLite no longe
1a050 72 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70  r uses thread-sp
1a060 65 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74  ecific data so t
1a070 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
1a080 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20  ow a.** no-op.  
1a090 49 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66  It is retained f
1a0a0 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f  or historical co
1a0b0 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a  mpatibility..*/.
1a0c0 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72  void sqlite3_thr
1a0d0 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64  ead_cleanup(void
1a0e0 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ){.}.#endif../*.
1a0f0 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69  ** Return meta i
1a100 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
1a110 20 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75   a specific colu
1a120 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  mn of a database
1a130 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63   table..** See c
1a140 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65  omment in sqlite
1a150 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e  3.h (sqlite.h.in
1a160 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
1a170 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 61  /.int sqlite3_ta
1a180 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
1a190 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ata(.  sqlite3 *
1a1a0 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
1a1b0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1a1c0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e   handle */.  con
1a1d0 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
1a1e0 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ,        /* Data
1a1f0 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c  base name or NUL
1a200 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  L */.  const cha
1a210 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20  r *zTableName,  
1a220 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65     /* Table name
1a230 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1a240 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20   *zColumnName,  
1a250 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
1a260 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   */.  char const
1a270 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c 20 20   **pzDataType,  
1a280 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44 65 63    /* OUTPUT: Dec
1a290 6c 61 72 65 64 20 64 61 74 61 20 74 79 70 65 20  lared data type 
1a2a0 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
1a2b0 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20  **pzCollSeq,    
1a2c0 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c   /* OUTPUT: Coll
1a2d0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
1a2e0 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e  ame */.  int *pN
1a2f0 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20 20 20  otNull,         
1a300 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
1a310 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c  True if NOT NULL
1a320 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 69 73   constraint exis
1a330 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72  ts */.  int *pPr
1a340 69 6d 61 72 79 4b 65 79 2c 20 20 20 20 20 20 20  imaryKey,       
1a350 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54      /* OUTPUT: T
1a360 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61  rue if column pa
1a370 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e  rt of PK */.  in
1a380 74 20 2a 70 41 75 74 6f 69 6e 63 20 20 20 20 20  t *pAutoinc     
1a390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1a3a0 50 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c  PUT: True if col
1a3b0 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e 63 72  umn is auto-incr
1a3c0 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ement */.){.  in
1a3d0 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45  t rc;.  char *zE
1a3e0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54 61 62  rrMsg = 0;.  Tab
1a3f0 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20  le *pTab = 0;.  
1a400 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30  Column *pCol = 0
1a410 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 30  ;.  int iCol = 0
1a420 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
1a430 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20  zDataType = 0;. 
1a440 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
1a450 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74  llSeq = 0;.  int
1a460 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20   notnull = 0;.  
1a470 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d  int primarykey =
1a480 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e   0;.  int autoin
1a490 63 20 3d 20 30 3b 0a 0a 0a 23 69 66 64 65 66 20  c = 0;...#ifdef 
1a4a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1a4b0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1a4c0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1a4d0 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 54 61 62 6c  kOk(db) || zTabl
1a4e0 65 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  eName==0 ){.    
1a4f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1a500 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
1a510 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 73 75  endif..  /* Ensu
1a520 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
1a530 73 63 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20  schema has been 
1a540 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69  loaded */.  sqli
1a550 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1a560 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71  db->mutex);.  sq
1a570 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
1a580 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73  ll(db);.  rc = s
1a590 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26  qlite3Init(db, &
1a5a0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
1a5b0 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
1a5c0 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
1a5d0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  out;.  }..  /* L
1a5e0 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
1a5f0 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20  in question */. 
1a600 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
1a610 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61  indTable(db, zTa
1a620 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65  bleName, zDbName
1a630 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c  );.  if( !pTab |
1a640 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
1a650 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b  ){.    pTab = 0;
1a660 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
1a670 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  out;.  }..  /* F
1a680 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66  ind the column f
1a690 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73  or which info is
1a6a0 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20   requested */.  
1a6b0 69 66 28 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 3d  if( zColumnName=
1a6c0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 51 75 65  =0 ){.    /* Que
1a6d0 72 79 20 66 6f 72 20 65 78 69 73 74 61 6e 63 65  ry for existance
1a6e0 20 6f 66 20 74 61 62 6c 65 20 6f 6e 6c 79 20 2a   of table only *
1a6f0 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  /.  }else{.    f
1a700 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
1a710 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
1a720 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20  ++){.      pCol 
1a730 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
1a740 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  ol];.      if( 0
1a750 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
1a760 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  (pCol->zName, zC
1a770 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20  olumnName) ){.  
1a780 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a790 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1a7a0 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e  f( iCol==pTab->n
1a7b0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Col ){.      if(
1a7c0 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
1a7d0 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  && sqlite3IsRowi
1a7e0 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29  d(zColumnName) )
1a7f0 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d  {.        iCol =
1a800 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
1a810 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 69 43 6f        pCol = iCo
1a820 6c 3e 3d 30 20 3f 20 26 70 54 61 62 2d 3e 61 43  l>=0 ? &pTab->aC
1a830 6f 6c 5b 69 43 6f 6c 5d 20 3a 20 30 3b 0a 20 20  ol[iCol] : 0;.  
1a840 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a850 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20     pTab = 0;.   
1a860 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
1a870 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
1a880 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
1a890 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
1a8a0 20 73 74 6f 72 65 73 20 74 68 65 20 6d 65 74 61   stores the meta
1a8b0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61   information tha
1a8c0 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  t will be return
1a8d0 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 63  ed.  ** to the c
1a8e0 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76  aller in local v
1a8f0 61 72 69 61 62 6c 65 73 20 7a 44 61 74 61 54 79  ariables zDataTy
1a900 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f  pe, zCollSeq, no
1a910 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65  tnull, primaryke
1a920 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69  y.  ** and autoi
1a930 6e 63 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  nc. At this poin
1a940 74 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  t there are two 
1a950 70 6f 73 73 69 62 69 6c 69 74 69 65 73 3a 0a 20  possibilities:. 
1a960 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e   ** .  **     1.
1a970 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20 63   The specified c
1a980 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72  olumn name was r
1a990 6f 77 69 64 22 2c 20 22 6f 69 64 22 20 6f 72 20  owid", "oid" or 
1a9a0 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20  "_rowid_" .  ** 
1a9b0 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 72 65         and there
1a9c0 20 69 73 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c   is no explicitl
1a9d0 79 20 64 65 63 6c 61 72 65 64 20 49 50 4b 20 63  y declared IPK c
1a9e0 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a  olumn. .  **.  *
1a9f0 2a 20 20 20 20 20 32 2e 20 54 68 65 20 74 61 62  *     2. The tab
1aa00 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65 77  le is not a view
1aa10 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20   and the column 
1aa20 6e 61 6d 65 20 69 64 65 6e 74 69 66 69 65 64 20  name identified 
1aa30 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  an .  **        
1aa40 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61  explicitly decla
1aa50 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79  red column. Copy
1aa60 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
1aa70 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20  n from *pCol..  
1aa80 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c 20 29  */ .  if( pCol )
1aa90 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20  {.    zDataType 
1aaa0 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20  = pCol->zType;. 
1aab0 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43     zCollSeq = pC
1aac0 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e  ol->zColl;.    n
1aad0 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e  otnull = pCol->n
1aae0 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70  otNull!=0;.    p
1aaf0 72 69 6d 61 72 79 6b 65 79 20 20 3d 20 28 70 43  rimarykey  = (pC
1ab00 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43  ol->colFlags & C
1ab10 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21  OLFLAG_PRIMKEY)!
1ab20 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63 20  =0;.    autoinc 
1ab30 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69  = pTab->iPKey==i
1ab40 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e 74 61  Col && (pTab->ta
1ab50 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
1ab60 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20  increment)!=0;. 
1ab70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74   }else{.    zDat
1ab80 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  aType = "INTEGER
1ab90 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65  ";.    primaryke
1aba0 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  y = 1;.  }.  if(
1abb0 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20   !zCollSeq ){.  
1abc0 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 22 42 49    zCollSeq = "BI
1abd0 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f  NARY";.  }..erro
1abe0 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  r_out:.  sqlite3
1abf0 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
1ac00 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72  );..  /* Whether
1ac10 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61   the function ca
1ac20 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72 20  ll succeeded or 
1ac30 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20  failed, set the 
1ac40 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
1ac50 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76  s.  ** to whatev
1ac60 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63  er their local c
1ac70 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74  ounterparts cont
1ac80 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ain. If an error
1ac90 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a   did occur,.  **
1aca0 20 74 68 69 73 20 68 61 73 20 74 68 65 20 65 66   this has the ef
1acb0 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20  fect of zeroing 
1acc0 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d  all output param
1acd0 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eters..  */.  if
1ace0 28 20 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a  ( pzDataType ) *
1acf0 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61  pzDataType = zDa
1ad00 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a  taType;.  if( pz
1ad10 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c  CollSeq ) *pzCol
1ad20 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b  lSeq = zCollSeq;
1ad30 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20  .  if( pNotNull 
1ad40 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f  ) *pNotNull = no
1ad50 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72  tnull;.  if( pPr
1ad60 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69  imaryKey ) *pPri
1ad70 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72  maryKey = primar
1ad80 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74  ykey;.  if( pAut
1ad90 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63  oinc ) *pAutoinc
1ada0 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69   = autoinc;..  i
1adb0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63  f( SQLITE_OK==rc
1adc0 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20   && !pTab ){.   
1add0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1ade0 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b, zErrMsg);.   
1adf0 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74   zErrMsg = sqlit
1ae00 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e  e3MPrintf(db, "n
1ae10 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c  o such table col
1ae20 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61  umn: %s.%s", zTa
1ae30 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  bleName,.       
1ae40 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20   zColumnName);. 
1ae50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
1ae60 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  RROR;.  }.  sqli
1ae70 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
1ae80 64 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67  db, rc, (zErrMsg
1ae90 3f 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73  ?"%s":0), zErrMs
1aea0 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
1aeb0 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
1aec0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1aed0 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
1aee0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1aef0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1af00 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1af10 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  }../*.** Sleep f
1af20 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
1af30 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
1af40 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
1af50 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ept..*/.int sqli
1af60 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73  te3_sleep(int ms
1af70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
1af80 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63   *pVfs;.  int rc
1af90 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74  ;.  pVfs = sqlit
1afa0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
1afb0 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20    if( pVfs==0 ) 
1afc0 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
1afd0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f  This function wo
1afe0 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f  rks in milliseco
1aff0 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64  nds, but the und
1b000 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28  erlying OsSleep(
1b010 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73  ) .  ** API uses
1b020 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48   microseconds. H
1b030 65 6e 63 65 20 74 68 65 20 31 30 30 30 27 73 2e  ence the 1000's.
1b040 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71  .  */.  rc = (sq
1b050 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66  lite3OsSleep(pVf
1b060 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30  s, 1000*ms)/1000
1b070 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1b080 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  }../*.** Enable 
1b090 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 65  or disable the e
1b0a0 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63  xtended result c
1b0b0 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  odes..*/.int sql
1b0c0 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65  ite3_extended_re
1b0d0 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74  sult_codes(sqlit
1b0e0 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66  e3 *db, int onof
1b0f0 66 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  f){.#ifdef SQLIT
1b100 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1b110 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1b120 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1b130 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
1b140 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1b150 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
1b160 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
1b170 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65  >mutex);.  db->e
1b180 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f  rrMask = onoff ?
1b190 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 78   0xffffffff : 0x
1b1a0 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ff;.  sqlite3_mu
1b1b0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1b1c0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
1b1d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1b1e0 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46  ** Invoke the xF
1b1f0 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  ileControl metho
1b200 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61  d on a particula
1b210 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  r database..*/.i
1b220 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  nt sqlite3_file_
1b230 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20  control(sqlite3 
1b240 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1b250 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70  *zDbName, int op
1b260 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
1b270 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1b280 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20  _ERROR;.  Btree 
1b290 2a 70 42 74 72 65 65 3b 0a 0a 23 69 66 64 65 66  *pBtree;..#ifdef
1b2a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
1b2b0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
1b2c0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
1b2d0 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
1b2e0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1b2f0 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
1b300 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1b310 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1b320 20 70 42 74 72 65 65 20 3d 20 73 71 6c 69 74 65   pBtree = sqlite
1b330 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64  3DbNameToBtree(d
1b340 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69  b, zDbName);.  i
1b350 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
1b360 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
1b370 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
1b380 20 2a 66 64 3b 0a 20 20 20 20 73 71 6c 69 74 65   *fd;.    sqlite
1b390 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
1b3a0 65 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20  ee);.    pPager 
1b3b0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
1b3c0 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ger(pBtree);.   
1b3d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
1b3e0 3d 30 20 29 3b 0a 20 20 20 20 66 64 20 3d 20 73  =0 );.    fd = s
1b3f0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
1b400 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  pPager);.    ass
1b410 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20  ert( fd!=0 );.  
1b420 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45    if( op==SQLITE
1b430 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e  _FCNTL_FILE_POIN
1b440 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73  TER ){.      *(s
1b450 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41  qlite3_file**)pA
1b460 72 67 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 72  rg = fd;.      r
1b470 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b480 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 64 2d     }else if( fd-
1b490 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
1b4a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b4b0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c  sFileControl(fd,
1b4c0 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20   op, pArg);.    
1b4d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1b4e0 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
1b4f0 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  D;.    }.    sql
1b500 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1b510 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Btree);.  }.  sq
1b520 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1b530 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1b540 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b550 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f  .** Interface to
1b560 20 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67   the testing log
1b570 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ic..*/.int sqlit
1b580 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1b590 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20  int op, ...){.  
1b5a0 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 64  int rc = 0;.#ifd
1b5b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
1b5c0 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20 55 4e  UILTIN_TEST.  UN
1b5d0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6f  USED_PARAMETER(o
1b5e0 70 29 3b 0a 23 65 6c 73 65 0a 20 20 76 61 5f 6c  p);.#else.  va_l
1b5f0 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74 61  ist ap;.  va_sta
1b600 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
1b610 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20  itch( op ){..   
1b620 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65 20   /*.    ** Save 
1b630 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
1b640 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a 20  e of the PRNG.. 
1b650 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1b660 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
1b670 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20  RNG_SAVE: {.    
1b680 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61 76    sqlite3PrngSav
1b690 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20  eState();.      
1b6a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1b6b0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74    /*.    ** Rest
1b6c0 6f 72 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ore the state of
1b6d0 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68 65   the PRNG to the
1b6e0 20 6c 61 73 74 20 73 74 61 74 65 20 73 61 76 65   last state save
1b6f0 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50  d using.    ** P
1b700 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50 52  RNG_SAVE.  If PR
1b710 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76 65  NG_SAVE has neve
1b720 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63 61  r before been ca
1b730 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a  lled, then.    *
1b740 2a 20 74 68 69 73 20 76 65 72 62 20 61 63 74 73  * this verb acts
1b750 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45 54   like PRNG_RESET
1b760 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1b770 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1b780 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20  L_PRNG_RESTORE: 
1b790 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1b7a0 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65 28  rngRestoreState(
1b7b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b7c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1b7d0 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20 50    ** Reset the P
1b7e0 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73 20  RNG back to its 
1b7f0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74  uninitialized st
1b800 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20 63  ate.  The next c
1b810 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
1b820 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
1b830 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20 74  () will reseed t
1b840 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61 20  he PRNG using a 
1b850 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20  single call.    
1b860 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64 6f  ** to the xRando
1b870 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66 20  mness method of 
1b880 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e  the default VFS.
1b890 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1b8a0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1b8b0 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20  _PRNG_RESET: {. 
1b8c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e       sqlite3_ran
1b8d0 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20  domness(0,0);.  
1b8e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b8f0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1b900 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1b910 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45 53  ntrol(BITVEC_TES
1b920 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d  T, size, program
1b930 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1b940 52 75 6e 20 61 20 74 65 73 74 20 61 67 61 69 6e  Run a test again
1b950 73 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a 65  st a Bitvec obje
1b960 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68 65  ct of size.  The
1b970 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e   program argumen
1b980 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20 61  t.    ** is an a
1b990 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72 73  rray of integers
1b9a0 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
1b9b0 65 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e 20  e test.  Return 
1b9c0 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d  -1 on a.    ** m
1b9d0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1b9e0 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63   error, 0 on suc
1b9f0 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  cess, or non-zer
1ba00 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a  o for an error..
1ba10 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20 73      ** See the s
1ba20 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69 6c  qlite3BitvecBuil
1ba30 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61 64  tinTest() for ad
1ba40 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
1ba50 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
1ba60 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1ba70 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45 53  TCTRL_BITVEC_TES
1ba80 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  T: {.      int s
1ba90 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  z = va_arg(ap, i
1baa0 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a  nt);.      int *
1bab0 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  aProg = va_arg(a
1bac0 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20  p, int*);.      
1bad0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
1bae0 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73 7a  ecBuiltinTest(sz
1baf0 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20 20  , aProg);.      
1bb00 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1bb10 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
1bb20 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1bb30 6c 28 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c  l(FAULT_INSTALL,
1bb40 20 78 43 61 6c 6c 62 61 63 6b 29 0a 20 20 20 20   xCallback).    
1bb50 2a 2a 0a 20 20 20 20 2a 2a 20 41 72 72 61 6e 67  **.    ** Arrang
1bb60 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 43 61 6c  e to invoke xCal
1bb70 6c 62 61 63 6b 28 29 20 77 68 65 6e 65 76 65 72  lback() whenever
1bb80 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d   sqlite3FaultSim
1bb90 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20  () is called,.  
1bba0 20 20 2a 2a 20 69 66 20 78 43 61 6c 6c 62 61 63    ** if xCallbac
1bbb0 6b 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20  k is not NULL.. 
1bbc0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73 20     **.    ** As 
1bbd0 61 20 74 65 73 74 20 6f 66 20 74 68 65 20 66 61  a test of the fa
1bbe0 75 6c 74 20 73 69 6d 75 6c 61 74 6f 72 20 6d 65  ult simulator me
1bbf0 63 68 61 6e 69 73 6d 20 69 74 73 65 6c 66 2c 20  chanism itself, 
1bc00 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
1bc10 30 29 0a 20 20 20 20 2a 2a 20 69 73 20 63 61 6c  0).    ** is cal
1bc20 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  led immediately 
1bc30 61 66 74 65 72 20 69 6e 73 74 61 6c 6c 69 6e 67  after installing
1bc40 20 74 68 65 20 6e 65 77 20 63 61 6c 6c 62 61 63   the new callbac
1bc50 6b 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 6e  k and the return
1bc60 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 66 72  .    ** value fr
1bc70 6f 6d 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53  om sqlite3FaultS
1bc80 69 6d 28 30 29 20 62 65 63 6f 6d 65 73 20 74 68  im(0) becomes th
1bc90 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 0a 20 20  e return from.  
1bca0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    ** sqlite3_tes
1bcb0 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20 20  t_control()..   
1bcc0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1bcd0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46 41 55  ITE_TESTCTRL_FAU
1bce0 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20  LT_INSTALL: {.  
1bcf0 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70      /* MSVC is p
1bd00 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69  icky about pulli
1bd10 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f  ng func ptrs fro
1bd20 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20  m va lists..    
1bd30 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70    ** http://supp
1bd40 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f  ort.microsoft.co
1bd50 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20  m/kb/47961.     
1bd60 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   ** sqlite3Globa
1bd70 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43 61 6c  lConfig.xTestCal
1bd80 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67 28 61  lback = va_arg(a
1bd90 70 2c 20 69 6e 74 28 2a 29 28 69 6e 74 29 29 3b  p, int(*)(int));
1bda0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1bdb0 74 79 70 65 64 65 66 20 69 6e 74 28 2a 54 45 53  typedef int(*TES
1bdc0 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29  TCALLBACKFUNC_t)
1bdd0 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  (int);.      sql
1bde0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1bdf0 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d  .xTestCallback =
1be00 20 76 61 5f 61 72 67 28 61 70 2c 20 54 45 53 54   va_arg(ap, TEST
1be10 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 3b  CALLBACKFUNC_t);
1be20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1be30 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 3b 0a  te3FaultSim(0);.
1be40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1be50 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1be60 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1be70 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d  control(BENIGN_M
1be80 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65  ALLOC_HOOKS, xBe
1be90 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a  gin, xEnd).    *
1bea0 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65  *.    ** Registe
1beb0 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20  r hooks to call 
1bec0 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63  to indicate whic
1bed0 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  h malloc() failu
1bee0 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20  res .    ** are 
1bef0 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20  benign..    */. 
1bf00 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1bf10 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d  ESTCTRL_BENIGN_M
1bf20 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20  ALLOC_HOOKS: {. 
1bf30 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
1bf40 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f  d (*void_functio
1bf50 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20  n)(void);.      
1bf60 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
1bf70 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20  enignBegin;.    
1bf80 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20    void_function 
1bf90 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20  xBenignEnd;.    
1bfa0 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d    xBenignBegin =
1bfb0 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
1bfc0 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20  _function);.    
1bfd0 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76    xBenignEnd = v
1bfe0 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
1bff0 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
1c000 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c  sqlite3BenignMal
1c010 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e  locHooks(xBenign
1c020 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e  Begin, xBenignEn
1c030 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
1c040 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1c050 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
1c060 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1c070 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44  TE_TESTCTRL_PEND
1c080 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e  ING_BYTE, unsign
1c090 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a  ed int X).    **
1c0a0 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20  .    ** Set the 
1c0b0 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20  PENDING byte to 
1c0c0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65  the value in the
1c0d0 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e   argument, if X>
1c0e0 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e  0..    ** Make n
1c0f0 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d  o changes if X==
1c100 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 76  0.  Return the v
1c110 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64  alue of the pend
1c120 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  ing byte.    ** 
1c130 61 73 20 69 74 20 65 78 69 73 74 69 6e 67 20 62  as it existing b
1c140 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
1c150 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20  ne was called.. 
1c160 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50     **.    ** IMP
1c170 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e  ORTANT:  Changin
1c180 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  g the PENDING by
1c190 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30  te from 0x400000
1c1a0 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20  00 results in.  
1c1b0 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74    ** an incompat
1c1c0 69 62 6c 65 20 64 61 74 61 62 61 73 65 20 66 69  ible database fi
1c1d0 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e  le format.  Chan
1c1e0 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47  ging the PENDING
1c1f0 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69   byte.    ** whi
1c200 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  le any database 
1c210 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70  connection is op
1c220 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e  en results in un
1c230 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20  defined and.    
1c240 2a 2a 20 64 65 6c 65 74 65 72 69 6f 75 73 20 62  ** deleterious b
1c250 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a  ehavior..    */.
1c260 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1c270 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47  TESTCTRL_PENDING
1c280 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72  _BYTE: {.      r
1c290 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  c = PENDING_BYTE
1c2a0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1c2b0 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20  _OMIT_WSD.      
1c2c0 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  {.        unsign
1c2d0 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20  ed int newVal = 
1c2e0 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67  va_arg(ap, unsig
1c2f0 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ned int);.      
1c300 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73    if( newVal ) s
1c310 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74  qlite3PendingByt
1c320 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20  e = newVal;.    
1c330 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
1c340 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1c350 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
1c360 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1c370 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1c380 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58  RL_ASSERT, int X
1c390 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
1c3a0 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76  This action prov
1c3b0 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20  ides a run-time 
1c3c0 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74  test to see whet
1c3d0 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a  her or not.    *
1c3e0 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20 65  * assert() was e
1c3f0 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
1c400 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73  e-time.  If X is
1c410 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72 74   true and assert
1c420 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61  ().    ** is ena
1c430 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  bled, then the r
1c440 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
1c450 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74 72  rue.  If X is tr
1c460 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73  ue and.    ** as
1c470 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
1c480 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  ed, then the ret
1c490 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72  urn value is zer
1c4a0 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20 20  o.  If X is.    
1c4b0 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  ** false and ass
1c4c0 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
1c4d0 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65 72  , then the asser
1c4e0 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74  tion fires and t
1c4f0 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  he.    ** proces
1c500 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20  s aborts.  If X 
1c510 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  is false and ass
1c520 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
1c530 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  d, then the.    
1c540 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
1c550 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a  is zero..    */.
1c560 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1c570 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a  TESTCTRL_ASSERT:
1c580 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c   {.      volatil
1c590 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20  e int x = 0;.   
1c5a0 20 20 20 61 73 73 65 72 74 28 20 28 78 20 3d 20     assert( (x = 
1c5b0 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29 21  va_arg(ap,int))!
1c5c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
1c5d0 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   x;.      break;
1c5e0 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a  .    }...    /*.
1c5f0 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1c600 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1c610 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
1c620 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20 20  AYS, int X).    
1c630 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61  **.    ** This a
1c640 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61  ction provides a
1c650 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74   run-time test t
1c660 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41 4c  o see how the AL
1c670 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20  WAYS and.    ** 
1c680 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65 72  NEVER macros wer
1c690 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d  e defined at com
1c6a0 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a  pile-time..    *
1c6b0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 74  *.    ** The ret
1c6c0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c 57  urn value is ALW
1c6d0 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a  AYS(X).  .    **
1c6e0 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f  .    ** The reco
1c6f0 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73 20  mmended test is 
1c700 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72 65  X==2.  If the re
1c710 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32 2c  turn value is 2,
1c720 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20   that means.    
1c730 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20  ** ALWAYS() and 
1c740 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74 68  NEVER() are both
1c750 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f   no-op pass-thro
1c760 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69 63  ugh macros, whic
1c770 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  h is the.    ** 
1c780 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 2e  default setting.
1c790 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20    If the return 
1c7a0 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65 6e  value is 1, then
1c7b0 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69 74   ALWAYS() is eit
1c7c0 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d  her.    ** hard-
1c7d0 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f 72  coded to true or
1c7e0 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74 73   else it asserts
1c7f0 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74   if its argument
1c800 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a   is false..    *
1c810 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68 61  * The first beha
1c820 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65 64  vior (hard-coded
1c830 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68 65   to true) is the
1c840 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20   case if.    ** 
1c850 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1c860 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61  ASSERT shows tha
1c870 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  t assert() is di
1c880 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 73  sabled and the s
1c890 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68  econd.    ** beh
1c8a0 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69 66  avior (assert if
1c8b0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
1c8c0 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61 6c   ALWAYS() is fal
1c8d0 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20  se) is the case 
1c8e0 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  if.    ** SQLITE
1c8f0 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
1c900 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65   shows that asse
1c910 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2e  rt() is enabled.
1c920 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1c930 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74  he run-time test
1c940 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74   procedure might
1c950 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20   look something 
1c960 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
1c970 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28 20  *.    **    if( 
1c980 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1c990 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1c9a0 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d  CTRL_ALWAYS, 2)=
1c9b0 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20  =2 ){.    **    
1c9c0 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61 6e    // ALWAYS() an
1c9d0 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e 6f  d NEVER() are no
1c9e0 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68  -op pass-through
1c9f0 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20   macros.    **  
1ca00 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
1ca10 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1ca20 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1ca30 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a 20  _ASSERT, 1) ){. 
1ca40 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
1ca50 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73 20  WAYS(x) asserts 
1ca60 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e 20  that x is true. 
1ca70 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74 73  NEVER(x) asserts
1ca80 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20   x is false..   
1ca90 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   **    }else{.  
1caa0 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
1cab0 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e 73  AYS(x) is a cons
1cac0 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28 78  tant 1.  NEVER(x
1cad0 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  ) is a constant 
1cae0 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20  0..    **    }. 
1caf0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1cb00 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1cb10 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20 69  LWAYS: {.      i
1cb20 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70  nt x = va_arg(ap
1cb30 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20  ,int);.      rc 
1cb40 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20 20  = ALWAYS(x);.   
1cb50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1cb60 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1cb70 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1cb80 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1cb90 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 29  TCTRL_BYTEORDER)
1cba0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1cbb0 54 68 65 20 69 6e 74 65 67 65 72 20 72 65 74 75  The integer retu
1cbc0 72 6e 65 64 20 72 65 76 65 61 6c 73 20 74 68 65  rned reveals the
1cbd0 20 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74   byte-order of t
1cbe0 68 65 20 63 6f 6d 70 75 74 65 72 20 6f 6e 20 77  he computer on w
1cbf0 68 69 63 68 0a 20 20 20 20 2a 2a 20 53 51 4c 69  hich.    ** SQLi
1cc00 74 65 20 69 73 20 72 75 6e 6e 69 6e 67 3a 0a 20  te is running:. 
1cc10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1cc20 20 20 20 31 20 20 20 20 20 62 69 67 2d 65 6e 64     1     big-end
1cc30 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e  ian,    determin
1cc40 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20  ed at run-time. 
1cc50 20 20 20 2a 2a 20 20 20 20 20 20 31 30 20 20 20     **      10   
1cc60 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c    little-endian,
1cc70 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72   determined at r
1cc80 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20  un-time.    **  
1cc90 34 33 32 31 30 31 20 20 20 20 20 62 69 67 2d 65  432101     big-e
1cca0 6e 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d  ndian,    determ
1ccb0 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  ined at compile-
1ccc0 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 31 32 33  time.    **  123
1ccd0 34 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65  410     little-e
1cce0 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65  ndian, determine
1ccf0 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1cd00 65 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 63 61  e.    */ .    ca
1cd10 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1cd20 52 4c 5f 42 59 54 45 4f 52 44 45 52 3a 20 7b 0a  RL_BYTEORDER: {.
1cd30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1cd40 45 5f 42 59 54 45 4f 52 44 45 52 2a 31 30 30 20  E_BYTEORDER*100 
1cd50 2b 20 53 51 4c 49 54 45 5f 4c 49 54 54 4c 45 45  + SQLITE_LITTLEE
1cd60 4e 44 49 41 4e 2a 31 30 20 2b 20 53 51 4c 49 54  NDIAN*10 + SQLIT
1cd70 45 5f 42 49 47 45 4e 44 49 41 4e 3b 0a 20 20 20  E_BIGENDIAN;.   
1cd80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1cd90 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1cda0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1cdb0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52  QLITE_TESTCTRL_R
1cdc0 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20  ESERVE, sqlite3 
1cdd0 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
1cde0 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68  **.    ** Set th
1cdf0 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20  e nReserve size 
1ce00 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69  to N for the mai
1ce10 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68  n database on th
1ce20 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
1ce30 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  * connection db.
1ce40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1ce50 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1ce60 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20  _RESERVE: {.    
1ce70 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1ce80 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1ce90 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  e3*);.      int 
1cea0 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
1ceb0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1cec0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1ced0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
1cee0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
1cef0 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b  ageSize(db->aDb[
1cf00 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29  0].pBt, 0, x, 0)
1cf10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1cf20 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1cf30 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72  mutex);.      br
1cf40 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1cf50 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  /*  sqlite3_test
1cf60 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1cf70 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
1cf80 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20  ATIONS, sqlite3 
1cf90 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
1cfa0 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65  **.    ** Enable
1cfb0 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72 69   or disable vari
1cfc0 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
1cfd0 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  s for testing pu
1cfe0 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20  rposes.  The .  
1cff0 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20    ** argument N 
1d000 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
1d010 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f  optimizations to
1d020 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46   be disabled.  F
1d030 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a  or normal.    **
1d040 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f   operation N sho
1d050 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 69  uld be 0.  The i
1d060 64 65 61 20 69 73 20 74 68 61 74 20 61 20 74 65  dea is that a te
1d070 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65  st program (like
1d080 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20   the.    ** SQL 
1d090 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c  Logic Test or SL
1d0a0 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63  T test module) c
1d0b0 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20  an run the same 
1d0c0 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  SQL multiple tim
1d0d0 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76  es.    ** with v
1d0e0 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
1d0f0 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f  ions disabled to
1d100 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
1d110 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20   same answer.   
1d120 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20   ** is obtained 
1d130 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20  in every case.. 
1d140 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1d150 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
1d160 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a  PTIMIZATIONS: {.
1d170 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
1d180 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
1d190 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
1d1a0 64 62 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d  db->dbOptFlags =
1d1b0 20 28 75 31 36 29 28 76 61 5f 61 72 67 28 61 70   (u16)(va_arg(ap
1d1c0 2c 20 69 6e 74 29 20 26 20 30 78 66 66 66 66 29  , int) & 0xffff)
1d1d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d1e0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
1d1f0 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20  ITE_N_KEYWORD.  
1d200 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    /* sqlite3_tes
1d210 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1d220 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57  _TESTCTRL_ISKEYW
1d230 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ORD, const char 
1d240 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20  *zWord).    **. 
1d250 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69     ** If zWord i
1d260 73 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f  s a keyword reco
1d270 67 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70 61  gnized by the pa
1d280 72 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72  rser, then retur
1d290 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  n the.    ** num
1d2a0 62 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e  ber of keywords.
1d2b0 20 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73    Or if zWord is
1d2c0 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20   not a keyword, 
1d2d0 72 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a  return 0..    **
1d2e0 20 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65   .    ** This te
1d2f0 73 74 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e  st feature is on
1d300 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ly available in 
1d310 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e  the amalgamation
1d320 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68   since.    ** th
1d330 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  e SQLITE_N_KEYWO
1d340 52 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20  RD macro is not 
1d350 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
1d360 66 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20  file if SQLite. 
1d370 20 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75     ** is built u
1d380 73 69 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f  sing separate so
1d390 75 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20  urce files..    
1d3a0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1d3b0 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45  TE_TESTCTRL_ISKE
1d3c0 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63  YWORD: {.      c
1d3d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64  onst char *zWord
1d3e0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f   = va_arg(ap, co
1d3f0 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
1d400 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
1d410 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29  3Strlen30(zWord)
1d420 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 71  ;.      rc = (sq
1d430 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
1d440 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21  ((u8*)zWord, n)!
1d450 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45  =TK_ID) ? SQLITE
1d460 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a  _N_KEYWORD : 0;.
1d470 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d480 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20 20   }.#endif ..    
1d490 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  /* sqlite3_test_
1d4a0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1d4b0 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d  ESTCTRL_SCRATCHM
1d4c0 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77  ALLOC, sz, &pNew
1d4d0 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a  , pFree);.    **
1d4e0 0a 20 20 20 20 2a 2a 20 50 61 73 73 20 70 46 72  .    ** Pass pFr
1d4f0 65 65 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 53  ee into sqlite3S
1d500 63 72 61 74 63 68 46 72 65 65 28 29 2e 20 0a 20  cratchFree(). . 
1d510 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68     ** If sz>0 th
1d520 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 73 63  en allocate a sc
1d530 72 61 74 63 68 20 62 75 66 66 65 72 20 69 6e 74  ratch buffer int
1d540 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f  o pNew.  .    */
1d550 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1d560 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43  _TESTCTRL_SCRATC
1d570 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20  HMALLOC: {.     
1d580 20 76 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a   void *pFree, **
1d590 70 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74  ppNew;.      int
1d5a0 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20   sz;.      sz = 
1d5b0 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1d5c0 0a 20 20 20 20 20 20 70 70 4e 65 77 20 3d 20 76  .      ppNew = v
1d5d0 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a  a_arg(ap, void**
1d5e0 29 3b 0a 20 20 20 20 20 20 70 46 72 65 65 20 3d  );.      pFree =
1d5f0 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
1d600 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  *);.      if( sz
1d610 20 29 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69   ) *ppNew = sqli
1d620 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
1d630 28 73 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  (sz);.      sqli
1d640 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 70  te3ScratchFree(p
1d650 46 72 65 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Free);.      bre
1d660 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1d670 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1d680 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1d690 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
1d6a0 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e  ME_FAULT, int on
1d6b0 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  off);.    **.   
1d6c0 20 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72   ** If parameter
1d6d0 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65   onoff is non-ze
1d6e0 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65 20 74 68  ro, configure th
1d6f0 65 20 77 72 61 70 70 65 72 73 20 73 6f 20 74 68  e wrappers so th
1d700 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75  at all.    ** su
1d710 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
1d720 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e  o localtime() an
1d730 64 20 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e  d variants fail.
1d740 20 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72   If onoff is zer
1d750 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74  o,.    ** undo t
1d760 68 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20  his setting..   
1d770 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1d780 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
1d790 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a  ALTIME_FAULT: {.
1d7a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1d7b0 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c  balConfig.bLocal
1d7c0 74 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61  timeFault = va_a
1d7d0 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
1d7e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d7f0 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
1d800 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1d810 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e  QLITE_TESTCTRL_N
1d820 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 69 6e  EVER_CORRUPT, in
1d830 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  t);.    **.    *
1d840 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61  * Set or clear a
1d850 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63   flag that indic
1d860 61 74 65 73 20 74 68 61 74 20 74 68 65 20 64 61  ates that the da
1d870 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 61  tabase file is a
1d880 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20 20  lways well-.    
1d890 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e 65  ** formed and ne
1d8a0 76 65 72 20 63 6f 72 72 75 70 74 2e 20 20 54 68  ver corrupt.  Th
1d8b0 69 73 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  is flag is clear
1d8c0 20 62 79 20 64 65 66 61 75 6c 74 2c 20 69 6e 64   by default, ind
1d8d0 69 63 61 74 69 6e 67 20 74 68 61 74 0a 20 20 20  icating that.   
1d8e0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1d8f0 65 73 20 6d 69 67 68 74 20 68 61 76 65 20 61 72  es might have ar
1d900 62 69 74 72 61 72 79 20 63 6f 72 72 75 70 74 69  bitrary corrupti
1d910 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65  on.  Setting the
1d920 20 66 6c 61 67 20 64 75 72 69 6e 67 0a 20 20 20   flag during.   
1d930 20 2a 2a 20 74 65 73 74 69 6e 67 20 63 61 75 73   ** testing caus
1d940 65 73 20 63 65 72 74 61 69 6e 20 61 73 73 65 72  es certain asser
1d950 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69  t() statements i
1d960 6e 20 74 68 65 20 63 6f 64 65 20 74 6f 20 62 65  n the code to be
1d970 20 61 63 74 69 76 61 74 65 64 0a 20 20 20 20 2a   activated.    *
1d980 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73 74 72 61  * that demonstra
1d990 74 20 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20  t invariants on 
1d9a0 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
1d9b0 62 61 73 65 20 66 69 6c 65 73 2e 0a 20 20 20 20  base files..    
1d9c0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1d9d0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45  TE_TESTCTRL_NEVE
1d9e0 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20 20  R_CORRUPT: {.   
1d9f0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1da00 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f 72 72  Config.neverCorr
1da10 75 70 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  upt = va_arg(ap,
1da20 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
1da30 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20  ak;.    }...    
1da40 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1da50 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1da60 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43  _TESTCTRL_VDBE_C
1da70 4f 56 45 52 41 47 45 2c 20 78 43 61 6c 6c 62 61  OVERAGE, xCallba
1da80 63 6b 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a  ck, ptr);.    **
1da90 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20  .    ** Set the 
1daa0 56 44 42 45 20 63 6f 76 65 72 61 67 65 20 63 61  VDBE coverage ca
1dab0 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
1dac0 74 6f 20 78 43 61 6c 6c 62 61 63 6b 20 77 69 74  to xCallback wit
1dad0 68 20 63 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a  h context .    *
1dae0 2a 20 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20  * pointer ptr.. 
1daf0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1db00 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56  QLITE_TESTCTRL_V
1db10 44 42 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a  DBE_COVERAGE: {.
1db20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44  #ifdef SQLITE_VD
1db30 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20  BE_COVERAGE.    
1db40 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28    typedef void (
1db50 2a 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b  *branch_callback
1db60 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c 75  )(void*,int,u8,u
1db70 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  8);.      sqlite
1db80 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56  3GlobalConfig.xV
1db90 64 62 65 42 72 61 6e 63 68 20 3d 20 76 61 5f 61  dbeBranch = va_a
1dba0 72 67 28 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c  rg(ap,branch_cal
1dbb0 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 73 71  lback);.      sq
1dbc0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1dbd0 67 2e 70 56 64 62 65 42 72 61 6e 63 68 41 72 67  g.pVdbeBranchArg
1dbe0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 76 6f 69   = va_arg(ap,voi
1dbf0 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  d*);.#endif.    
1dc00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1dc10 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
1dc20 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1dc30 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f  LITE_TESTCTRL_SO
1dc40 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e  RTER_MMAP, db, n
1dc50 4d 61 78 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73  Max); */.    cas
1dc60 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1dc70 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b  L_SORTER_MMAP: {
1dc80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
1dc90 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  db = va_arg(ap, 
1dca0 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20  sqlite3*);.     
1dcb0 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d   db->nMaxSorterM
1dcc0 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  map = va_arg(ap,
1dcd0 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
1dce0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1dcf0 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1dd00 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1dd10 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 29  TESTCTRL_ISINIT)
1dd20 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1dd30 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1dd40 20 69 66 20 53 51 4c 69 74 65 20 68 61 73 20 62   if SQLite has b
1dd50 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  een initialized 
1dd60 61 6e 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  and SQLITE_ERROR
1dd70 20 69 66 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a   if.    ** not..
1dd80 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1dd90 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1dda0 49 53 49 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20  ISINIT: {.      
1ddb0 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1ddc0 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d  lConfig.isInit==
1ddd0 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  0 ) rc = SQLITE_
1dde0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
1ddf0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1de00 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1de10 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1de20 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
1de30 2c 20 64 62 2c 20 64 62 4e 61 6d 65 2c 20 6f 6e  , db, dbName, on
1de40 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20  Off, tnum);.    
1de50 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74  **.    ** This t
1de60 65 73 74 20 63 6f 6e 74 72 6f 6c 20 69 73 20 75  est control is u
1de70 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 69 6d  sed to create im
1de80 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20  poster tables.  
1de90 22 64 62 22 20 69 73 20 61 20 70 6f 69 6e 74 65  "db" is a pointe
1dea0 72 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  r.    ** to the 
1deb0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1dec0 69 6f 6e 2e 20 20 64 62 4e 61 6d 65 20 69 73 20  ion.  dbName is 
1ded0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1dee0 65 20 28 65 78 3a 20 22 6d 61 69 6e 22 20 6f 72  e (ex: "main" or
1def0 0a 20 20 20 20 2a 2a 20 22 74 65 6d 70 22 29 20  .    ** "temp") 
1df00 77 68 69 63 68 20 77 69 6c 6c 20 72 65 63 65 69  which will recei
1df10 76 65 20 74 68 65 20 69 6d 70 6f 73 74 65 72 2e  ve the imposter.
1df20 20 20 22 6f 6e 4f 66 66 22 20 74 75 72 6e 73 20    "onOff" turns 
1df30 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e  imposter mode on
1df40 0a 20 20 20 20 2a 2a 20 6f 72 20 6f 66 66 2e 20  .    ** or off. 
1df50 20 22 74 6e 75 6d 22 20 69 73 20 74 68 65 20 72   "tnum" is the r
1df60 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
1df70 62 2d 74 72 65 65 20 74 6f 20 77 68 69 63 68 20  b-tree to which 
1df80 74 68 65 20 69 6d 70 6f 73 74 65 72 0a 20 20 20  the imposter.   
1df90 20 2a 2a 20 74 61 62 6c 65 20 73 68 6f 75 6c 64   ** table should
1dfa0 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 2a 2a   connect..    **
1dfb0 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 69  .    ** Enable i
1dfc0 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 6f 6e 6c  mposter mode onl
1dfd0 79 20 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d  y when the schem
1dfe0 61 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  a has already be
1dff0 65 6e 20 70 61 72 73 65 64 2e 20 20 54 68 65 6e  en parsed.  Then
1e000 0a 20 20 20 20 2a 2a 20 72 75 6e 20 61 20 73 69  .    ** run a si
1e010 6e 67 6c 65 20 43 52 45 41 54 45 20 54 41 42 4c  ngle CREATE TABL
1e020 45 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 63  E statement to c
1e030 6f 6e 73 74 72 75 63 74 20 74 68 65 20 69 6d 70  onstruct the imp
1e040 6f 73 74 65 72 20 74 61 62 6c 65 20 69 6e 0a 20  oster table in. 
1e050 20 20 20 2a 2a 20 74 68 65 20 70 61 72 73 65 64     ** the parsed
1e060 20 73 63 68 65 6d 61 2e 20 20 54 68 65 6e 20 74   schema.  Then t
1e070 75 72 6e 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64  urn imposter mod
1e080 65 20 62 61 63 6b 20 6f 66 66 20 61 67 61 69 6e  e back off again
1e090 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1e0a0 49 66 20 6f 6e 4f 66 66 3d 3d 30 20 61 6e 64 20  If onOff==0 and 
1e0b0 74 6e 75 6d 3e 30 20 74 68 65 6e 20 72 65 73 65  tnum>0 then rese
1e0c0 74 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  t the schema for
1e0d0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 2c 20   all databases, 
1e0e0 63 61 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 74  causing.    ** t
1e0f0 68 65 20 73 63 68 65 6d 61 20 74 6f 20 62 65 20  he schema to be 
1e100 72 65 70 61 72 73 65 64 20 74 68 65 20 6e 65 78  reparsed the nex
1e110 74 20 74 69 6d 65 20 69 74 20 69 73 20 6e 65 65  t time it is nee
1e120 64 65 64 2e 20 20 54 68 69 73 20 68 61 73 20 74  ded.  This has t
1e130 68 65 0a 20 20 20 20 2a 2a 20 65 66 66 65 63 74  he.    ** effect
1e140 20 6f 66 20 65 72 61 73 69 6e 67 20 61 6c 6c 20   of erasing all 
1e150 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e  imposter tables.
1e160 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1e170 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1e180 5f 49 4d 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20  _IMPOSTER: {.   
1e190 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1e1a0 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
1e1b0 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  te3*);.      sql
1e1c0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1e1d0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
1e1e0 20 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20     db->init.iDb 
1e1f0 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  = sqlite3FindDbN
1e200 61 6d 65 28 64 62 2c 20 76 61 5f 61 72 67 28 61  ame(db, va_arg(a
1e210 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b  p,const char*));
1e220 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e  .      db->init.
1e230 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  busy = db->init.
1e240 69 6d 70 6f 73 74 65 72 54 61 62 6c 65 20 3d 20  imposterTable = 
1e250 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
1e260 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 6e        db->init.n
1e270 65 77 54 6e 75 6d 20 3d 20 76 61 5f 61 72 67 28  ewTnum = va_arg(
1e280 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  ap,int);.      i
1e290 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
1e2a0 3d 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e  ==0 && db->init.
1e2b0 6e 65 77 54 6e 75 6d 3e 30 20 29 7b 0a 20 20 20  newTnum>0 ){.   
1e2c0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65       sqlite3Rese
1e2d0 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
1e2e0 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20  nection(db);.   
1e2f0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1e300 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
1e310 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  b->mutex);.     
1e320 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1e330 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
1e340 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1e350 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45  _OMIT_BUILTIN_TE
1e360 53 54 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  ST */.  return r
1e370 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1e380 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f   is a utility ro
1e390 75 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f  utine, useful to
1e3a0 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
1e3b0 69 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b  ions, that check
1e3c0 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61  s.** to see if a
1e3d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
1e3e0 61 73 20 61 20 55 52 49 20 74 68 61 74 20 63 6f  as a URI that co
1e3f0 6e 74 61 69 6e 65 64 20 61 20 73 70 65 63 69 66  ntained a specif
1e400 69 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72  ic query .** par
1e410 61 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73  ameter, and if s
1e420 6f 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61  o obtains the va
1e430 6c 75 65 20 6f 66 20 74 68 65 20 71 75 65 72 79  lue of the query
1e440 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a   parameter..**.*
1e450 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
1e460 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
1e470 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72  filename pointer
1e480 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65   passed into the
1e490 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68   xOpen().** meth
1e4a0 6f 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c  od of a VFS impl
1e4b0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65  ementation.  The
1e4c0 20 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74   zParam argument
1e4d0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
1e4e0 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72  the.** query par
1e4f0 61 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20  ameter we seek. 
1e500 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
1e510 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20  turns the value 
1e520 6f 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a  of the zParam.**
1e530 20 70 61 72 61 6d 65 74 65 72 20 69 66 20 69 74   parameter if it
1e540 20 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65   exists.  If the
1e550 20 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20   parameter does 
1e560 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20  not exist, this 
1e570 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
1e580 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  ns a NULL pointe
1e590 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  r..*/.const char
1e5a0 20 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61   *sqlite3_uri_pa
1e5b0 72 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68  rameter(const ch
1e5c0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63  ar *zFilename, c
1e5d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
1e5e0 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e  m){.  if( zFilen
1e5f0 61 6d 65 3d 3d 30 20 7c 7c 20 7a 50 61 72 61 6d  ame==0 || zParam
1e600 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1e610 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
1e620 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1e630 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
1e640 20 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d   while( zFilenam
1e650 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20  e[0] ){.    int 
1e660 78 20 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  x = strcmp(zFile
1e670 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20  name, zParam);. 
1e680 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20     zFilename += 
1e690 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1e6a0 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a  zFilename) + 1;.
1e6b0 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29 20 72      if( x==0 ) r
1e6c0 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b  eturn zFilename;
1e6d0 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  .    zFilename +
1e6e0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1e6f0 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
1e700 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1e710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1e720 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  n a boolean valu
1e730 65 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61  e for a query pa
1e740 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  rameter..*/.int 
1e750 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
1e760 65 61 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ean(const char *
1e770 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74  zFilename, const
1e780 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69   char *zParam, i
1e790 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e  nt bDflt){.  con
1e7a0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c  st char *z = sql
1e7b0 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
1e7c0 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  er(zFilename, zP
1e7d0 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d  aram);.  bDflt =
1e7e0 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74   bDflt!=0;.  ret
1e7f0 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65 33 47  urn z ? sqlite3G
1e800 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66  etBoolean(z, bDf
1e810 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a  lt) : bDflt;.}..
1e820 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36  /*.** Return a 6
1e830 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 76 61  4-bit integer va
1e840 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20  lue for a query 
1e850 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71  parameter..*/.sq
1e860 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69  lite3_int64 sqli
1e870 74 65 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20  te3_uri_int64(. 
1e880 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
1e890 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69  lename,    /* Fi
1e8a0 6c 65 6e 61 6d 65 20 61 73 20 70 61 73 73 65 64  lename as passed
1e8b0 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63   to xOpen */.  c
1e8c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
1e8d0 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55 52 49 20  m,       /* URI 
1e8e0 70 61 72 61 6d 65 74 65 72 20 73 6f 75 67 68 74  parameter sought
1e8f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1e900 74 36 34 20 62 44 66 6c 74 20 20 20 20 20 20 20  t64 bDflt       
1e910 2f 2a 20 72 65 74 75 72 6e 20 69 66 20 70 61 72  /* return if par
1e920 61 6d 65 74 65 72 20 69 73 20 6d 69 73 73 69 6e  ameter is missin
1e930 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  g */.){.  const 
1e940 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
1e950 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
1e960 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61  zFilename, zPara
1e970 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  m);.  sqlite3_in
1e980 74 36 34 20 76 3b 0a 20 20 69 66 28 20 7a 20 26  t64 v;.  if( z &
1e990 26 20 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65  & sqlite3DecOrHe
1e9a0 78 54 6f 49 36 34 28 7a 2c 20 26 76 29 3d 3d 53  xToI64(z, &v)==S
1e9b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e9c0 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20  bDflt = v;.  }. 
1e9d0 20 72 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d   return bDflt;.}
1e9e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1e9f0 68 65 20 42 74 72 65 65 20 70 6f 69 6e 74 65 72  he Btree pointer
1ea00 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a   identified by z
1ea10 44 62 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20  DbName.  Return 
1ea20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
1ea30 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c  d..*/.Btree *sql
1ea40 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
1ea50 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
1ea60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1ea70 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
1ea80 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
1ea90 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
1eaa0 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ( db->aDb[i].pBt
1eab0 0a 20 20 20 20 20 26 26 20 28 7a 44 62 4e 61 6d  .     && (zDbNam
1eac0 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53  e==0 || sqlite3S
1ead0 74 72 49 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20  trICmp(zDbName, 
1eae0 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65  db->aDb[i].zName
1eaf0 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )==0).    ){.   
1eb00 20 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 44     return db->aD
1eb10 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 7d 0a  b[i].pBt;.    }.
1eb20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1eb30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1eb40 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20  the filename of 
1eb50 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
1eb60 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
1eb70 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
1eb80 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ction..*/.const 
1eb90 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 62  char *sqlite3_db
1eba0 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65  _filename(sqlite
1ebb0 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1ebc0 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42  r *zDbName){.  B
1ebd0 74 72 65 65 20 2a 70 42 74 3b 0a 23 69 66 64 65  tree *pBt;.#ifde
1ebe0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1ebf0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1ec00 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1ec10 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
1ec20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
1ec30 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
1ec40 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
1ec50 64 69 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69  dif.  pBt = sqli
1ec60 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65  te3DbNameToBtree
1ec70 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  (db, zDbName);. 
1ec80 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71   return pBt ? sq
1ec90 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
1eca0 65 6e 61 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a  ename(pBt) : 0;.
1ecb0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1ecc0 31 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73  1 if database is
1ecd0 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20   read-only or 0 
1ece0 69 66 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  if read/write.  
1ecf0 52 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20  Return -1 if.** 
1ed00 6e 6f 20 73 75 63 68 20 64 61 74 61 62 61 73 65  no such database
1ed10 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20   exists..*/.int 
1ed20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f  sqlite3_db_reado
1ed30 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  nly(sqlite3 *db,
1ed40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1ed50 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a  Name){.  Btree *
1ed60 70 42 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  pBt;.#ifdef SQLI
1ed70 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1ed80 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1ed90 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1eda0 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
1edb0 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
1edc0 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
1edd0 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  -1;.  }.#endif. 
1ede0 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62   pBt = sqlite3Db
1edf0 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20  NameToBtree(db, 
1ee00 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  zDbName);.  retu
1ee10 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33  rn pBt ? sqlite3
1ee20 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28  BtreeIsReadonly(
1ee30 70 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a           pBt) : -1;.}.