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

Artifact f393acc6e5d604cbe0054376d62f668a5560b3f1:


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 20 20 20 20 6d  gress = 1;.    m
1ff0: 65 6d 73 65 74 28 70 48 61 73 68 2c 20 30 2c 20  emset(pHash, 0, 
2000: 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c  sizeof(sqlite3Gl
2010: 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 29 29 3b  obalFunctions));
2020: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 67 69  .    sqlite3Regi
2030: 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e 63 74 69  sterGlobalFuncti
2040: 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28 20 73  ons();.    if( s
2050: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2060: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 3d  ig.isPCacheInit=
2070: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
2080: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 49 6e   sqlite3PcacheIn
2090: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20  itialize();.    
20a0: 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
20b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20c0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
20d0: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
20e0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  t = 1;.      rc 
20f0: 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69 74 28  = sqlite3OsInit(
2100: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2110: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2120: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
2130: 43 61 63 68 65 42 75 66 66 65 72 53 65 74 75 70  CacheBufferSetup
2140: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
2150: 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20 0a 20 20  onfig.pPage, .  
2160: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
2170: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
2180: 67 65 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ge, sqlite3Globa
2190: 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 29 3b 0a  lConfig.nPage);.
21a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
21b0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
21c0: 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 1;.#ifdef SQL
21d0: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20  ITE_EXTRA_INIT. 
21e0: 20 20 20 20 20 62 52 75 6e 45 78 74 72 61 49 6e       bRunExtraIn
21f0: 69 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20  it = 1;.#endif. 
2200: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2210: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
2220: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 7d  rogress = 0;.  }
2230: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2240: 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 47 6c  _leave(sqlite3Gl
2250: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
2260: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f  Mutex);..  /* Go
2270: 20 62 61 63 6b 20 75 6e 64 65 72 20 74 68 65 20   back under the 
2280: 73 74 61 74 69 63 20 6d 75 74 65 78 20 61 6e 64  static mutex and
2290: 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65   clean up the re
22a0: 63 75 72 73 69 76 65 0a 20 20 2a 2a 20 6d 75 74  cursive.  ** mut
22b0: 65 78 20 74 6f 20 70 72 65 76 65 6e 74 20 61 20  ex to prevent a 
22c0: 72 65 73 6f 75 72 63 65 20 6c 65 61 6b 2e 0a 20  resource leak.. 
22d0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
22e0: 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
22f0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f  r);.  sqlite3Glo
2300: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
2310: 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20 69 66 28  itMutex--;.  if(
2320: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2330: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
2340: 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ex<=0 ){.    ass
2350: 65 72 74 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ert( sqlite3Glob
2360: 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69  alConfig.nRefIni
2370: 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20  tMutex==0 );.   
2380: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
2390: 72 65 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ree(sqlite3Globa
23a0: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
23b0: 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
23c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
23d0: 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 7d  itMutex = 0;.  }
23e0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
23f0: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
2400: 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
2410: 77 69 6e 67 20 69 73 20 6a 75 73 74 20 61 20 73  wing is just a s
2420: 61 6e 69 74 79 20 63 68 65 63 6b 20 74 6f 20 6d  anity check to m
2430: 61 6b 65 20 73 75 72 65 20 53 51 4c 69 74 65 20  ake sure SQLite 
2440: 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f  has.  ** been co
2450: 6d 70 69 6c 65 64 20 63 6f 72 72 65 63 74 6c 79  mpiled correctly
2460: 2e 20 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  .  It is importa
2470: 6e 74 20 74 6f 20 72 75 6e 20 74 68 69 73 20 63  nt to run this c
2480: 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a 20 77 65  ode, but.  ** we
2490: 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72   don't want to r
24a0: 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74 65 6e 20  un it too often 
24b0: 61 6e 64 20 73 6f 61 6b 20 75 70 20 43 50 55 20  and soak up CPU 
24c0: 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f 0a 20 20  cycles for no.  
24d0: 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53 6f 20 77  ** reason.  So w
24e0: 65 20 72 75 6e 20 69 74 20 6f 6e 63 65 20 64 75  e run it once du
24f0: 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74  ring initializat
2500: 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ion..  */.#ifnde
2510: 66 20 4e 44 45 42 55 47 0a 23 69 66 6e 64 65 66  f NDEBUG.#ifndef
2520: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
2530: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a  ATING_POINT.  /*
2540: 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 6f 66   This section of
2550: 20 63 6f 64 65 27 73 20 6f 6e 6c 79 20 22 6f 75   code's only "ou
2560: 74 70 75 74 22 20 69 73 20 76 69 61 20 61 73 73  tput" is via ass
2570: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
2580: 2e 20 2a 2f 0a 20 20 69 66 20 28 20 72 63 3d 3d  . */.  if ( rc==
2590: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25a0: 20 75 36 34 20 78 20 3d 20 28 28 28 75 36 34 29   u64 x = (((u64)
25b0: 31 29 3c 3c 36 33 29 2d 31 3b 0a 20 20 20 20 64  1)<<63)-1;.    d
25c0: 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20 61 73 73  ouble y;.    ass
25d0: 65 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 38  ert(sizeof(x)==8
25e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73 69  );.    assert(si
25f0: 7a 65 6f 66 28 78 29 3d 3d 73 69 7a 65 6f 66 28  zeof(x)==sizeof(
2600: 79 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  y));.    memcpy(
2610: 26 79 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20  &y, &x, 8);.    
2620: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 49  assert( sqlite3I
2630: 73 4e 61 4e 28 79 29 20 29 3b 0a 20 20 7d 0a 23  sNaN(y) );.  }.#
2640: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
2650: 2f 2a 20 44 6f 20 65 78 74 72 61 20 69 6e 69 74  /* Do extra init
2660: 69 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73  ialization steps
2670: 20 72 65 71 75 65 73 74 65 64 20 62 79 20 74 68   requested by th
2680: 65 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  e SQLITE_EXTRA_I
2690: 4e 49 54 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65  NIT.  ** compile
26a0: 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20 20  -time option..  
26b0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
26c0: 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69 66  _EXTRA_INIT.  if
26d0: 28 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20  ( bRunExtraInit 
26e0: 29 7b 0a 20 20 20 20 69 6e 74 20 53 51 4c 49 54  ){.    int SQLIT
26f0: 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 63 6f 6e  E_EXTRA_INIT(con
2700: 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 72  st char*);.    r
2710: 63 20 3d 20 53 51 4c 49 54 45 5f 45 58 54 52 41  c = SQLITE_EXTRA
2720: 5f 49 4e 49 54 28 30 29 3b 0a 20 20 7d 0a 23 65  _INIT(0);.  }.#e
2730: 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
2740: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f  c;.}../*.** Undo
2750: 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66 20   the effects of 
2760: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
2770: 7a 65 28 29 2e 20 20 4d 75 73 74 20 6e 6f 74 20  ze().  Must not 
2780: 62 65 20 63 61 6c 6c 65 64 20 77 68 69 6c 65 0a  be called while.
2790: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  ** there are out
27a0: 73 74 61 6e 64 69 6e 67 20 64 61 74 61 62 61 73  standing databas
27b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
27c0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
27d0: 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68 69 6c 65 20  ons or.** while 
27e0: 61 6e 79 20 70 61 72 74 20 6f 66 20 53 51 4c 69  any part of SQLi
27f0: 74 65 20 69 73 20 6f 74 68 65 72 77 69 73 65 20  te is otherwise 
2800: 69 6e 20 75 73 65 20 69 6e 20 61 6e 79 20 74 68  in use in any th
2810: 72 65 61 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72  read.  This.** r
2820: 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 20 74 68  outine is not th
2830: 72 65 61 64 73 61 66 65 2e 20 20 42 75 74 20 69  readsafe.  But i
2840: 74 20 69 73 20 73 61 66 65 20 74 6f 20 69 6e 76  t is safe to inv
2850: 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oke this routine
2860: 0a 2a 2a 20 6f 6e 20 77 68 65 6e 20 53 51 4c 69  .** on when SQLi
2870: 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 73 68  te is already sh
2880: 75 74 20 64 6f 77 6e 2e 20 20 49 66 20 53 51 4c  ut down.  If SQL
2890: 69 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 73  ite is already s
28a0: 68 75 74 20 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e  hut down.** when
28b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
28c0: 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65 6e 20 74   invoked, then t
28d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
28e0: 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
28f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
2900: 73 68 75 74 64 6f 77 6e 28 76 6f 69 64 29 7b 0a  shutdown(void){.
2910: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
2920: 49 54 5f 57 53 44 0a 20 20 69 6e 74 20 72 63 20  IT_WSD.  int rc 
2930: 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69 6e  = sqlite3_wsd_in
2940: 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20 20  it(4096, 24);.  
2950: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2960: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
2970: 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
2980: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2990: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
29a0: 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
29b0: 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e  E_EXTRA_SHUTDOWN
29c0: 0a 20 20 20 20 76 6f 69 64 20 53 51 4c 49 54 45  .    void SQLITE
29d0: 5f 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e 28  _EXTRA_SHUTDOWN(
29e0: 76 6f 69 64 29 3b 0a 20 20 20 20 53 51 4c 49 54  void);.    SQLIT
29f0: 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f 57 4e  E_EXTRA_SHUTDOWN
2a00: 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  ();.#endif.    s
2a10: 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 3b  qlite3_os_end();
2a20: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
2a30: 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e 73 69 6f  et_auto_extensio
2a40: 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n();.    sqlite3
2a50: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
2a60: 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  nit = 0;.  }.  i
2a70: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
2a80: 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49  Config.isPCacheI
2a90: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2aa0: 65 33 50 63 61 63 68 65 53 68 75 74 64 6f 77 6e  e3PcacheShutdown
2ab0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47  ();.    sqlite3G
2ac0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
2ad0: 61 63 68 65 49 6e 69 74 20 3d 20 30 3b 0a 20 20  acheInit = 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 4d 61  lobalConfig.isMa
2b00: 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20  llocInit ){.    
2b10: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e 64  sqlite3MallocEnd
2b20: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47  ();.    sqlite3G
2b30: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61  lobalConfig.isMa
2b40: 6c 6c 6f 63 49 6e 69 74 20 3d 20 30 3b 0a 0a 23  llocInit = 0;..#
2b50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b60: 49 54 5f 53 48 55 54 44 4f 57 4e 5f 44 49 52 45  IT_SHUTDOWN_DIRE
2b70: 43 54 4f 52 49 45 53 0a 20 20 20 20 2f 2a 20 54  CTORIES.    /* T
2b80: 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74 65  he heap subsyste
2b90: 6d 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 73  m has now been s
2ba0: 68 75 74 64 6f 77 6e 20 61 6e 64 20 74 68 65 73  hutdown and thes
2bb0: 65 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70  e values are sup
2bc0: 70 6f 73 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20  posed.    ** to 
2bd0: 62 65 20 4e 55 4c 4c 20 6f 72 20 70 6f 69 6e 74  be NULL or point
2be0: 20 74 6f 20 6d 65 6d 6f 72 79 20 74 68 61 74 20   to memory that 
2bf0: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
2c00: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
2c10: 28 29 2c 0a 20 20 20 20 2a 2a 20 77 68 69 63 68  (),.    ** which
2c20: 20 77 6f 75 6c 64 20 72 65 6c 79 20 6f 6e 20 74   would rely on t
2c30: 68 61 74 20 68 65 61 70 20 73 75 62 73 79 73 74  hat heap subsyst
2c40: 65 6d 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 6d  em; therefore, m
2c50: 61 6b 65 20 73 75 72 65 20 74 68 65 73 65 0a 20  ake sure these. 
2c60: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 63 61 6e     ** values can
2c70: 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 68 65 61  not refer to hea
2c80: 70 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61  p memory that wa
2c90: 73 20 6a 75 73 74 20 69 6e 76 61 6c 69 64 61 74  s just invalidat
2ca0: 65 64 20 77 68 65 6e 20 74 68 65 0a 20 20 20 20  ed when the.    
2cb0: 2a 2a 20 68 65 61 70 20 73 75 62 73 79 73 74 65  ** heap subsyste
2cc0: 6d 20 77 61 73 20 73 68 75 74 64 6f 77 6e 2e 20  m was shutdown. 
2cd0: 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 64 6f   This is only do
2ce0: 6e 65 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ne if the curren
2cf0: 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  t call to.    **
2d00: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
2d10: 65 73 75 6c 74 65 64 20 69 6e 20 74 68 65 20 68  esulted in the h
2d20: 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 61 63  eap subsystem ac
2d30: 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 73 68 75  tually being shu
2d40: 74 64 6f 77 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  tdown..    */.  
2d50: 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
2d60: 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 20 20  irectory = 0;.  
2d70: 20 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64    sqlite3_temp_d
2d80: 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23 65  irectory = 0;.#e
2d90: 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66 28 20 73  ndif.  }.  if( s
2da0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2db0: 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 29  ig.isMutexInit )
2dc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74  {.    sqlite3Mut
2dd0: 65 78 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  exEnd();.    sql
2de0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2df0: 2e 69 73 4d 75 74 65 78 49 6e 69 74 20 3d 20 30  .isMutexInit = 0
2e00: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2e10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2e20: 0a 2a 2a 20 54 68 69 73 20 41 50 49 20 61 6c 6c  .** This API all
2e30: 6f 77 73 20 61 70 70 6c 69 63 61 74 69 6f 6e 73  ows applications
2e40: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 67   to modify the g
2e50: 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  lobal configurat
2e60: 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 53 51  ion of.** the SQ
2e70: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 61 74 20  Lite library at 
2e80: 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  run-time..**.** 
2e90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
2ea0: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
2eb0: 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
2ec0: 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
2ed0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
2ee0: 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f  nections or memo
2ef0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20  ry allocations. 
2f00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2f10: 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 61   not.** threadsa
2f20: 66 65 2e 20 20 46 61 69 6c 75 72 65 20 74 6f 20  fe.  Failure to 
2f30: 68 65 65 64 20 74 68 65 73 65 20 77 61 72 6e 69  heed these warni
2f40: 6e 67 73 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  ngs can lead to 
2f50: 75 6e 70 72 65 64 69 63 74 61 62 6c 65 0a 2a 2a  unpredictable.**
2f60: 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e   behavior..*/.in
2f70: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  t sqlite3_config
2f80: 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20  (int op, ...){. 
2f90: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
2fa0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2fb0: 4b 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33  K;..  /* sqlite3
2fc0: 5f 63 6f 6e 66 69 67 28 29 20 73 68 61 6c 6c 20  _config() shall 
2fd0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
2fe0: 53 55 53 45 20 69 66 20 69 74 20 69 73 20 69 6e  SUSE if it is in
2ff0: 76 6f 6b 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a  voked while.  **
3000: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
3010: 61 72 79 20 69 73 20 69 6e 20 75 73 65 2e 20 2a  ary is in use. *
3020: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  /.  if( sqlite3G
3030: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
3040: 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  it ) return SQLI
3050: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
3060: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
3070: 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  op);.  switch( o
3080: 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4d 75 74  p ){..    /* Mut
3090: 65 78 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ex configuration
30a0: 20 6f 70 74 69 6f 6e 73 20 61 72 65 20 6f 6e 6c   options are onl
30b0: 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61  y available in a
30c0: 20 74 68 72 65 61 64 73 61 66 65 0a 20 20 20 20   threadsafe.    
30d0: 2a 2a 20 63 6f 6d 70 69 6c 65 2e 0a 20 20 20 20  ** compile..    
30e0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
30f0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
3100: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
3110: 41 44 53 41 46 45 3e 30 20 20 2f 2a 20 49 4d 50  ADSAFE>0  /* IMP
3120: 3a 20 52 2d 35 34 34 36 36 2d 34 36 37 35 36 20  : R-54466-46756 
3130: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
3140: 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45  TE_CONFIG_SINGLE
3150: 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20  THREAD: {.      
3160: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
3170: 52 2d 30 32 37 34 38 2d 31 39 30 39 36 20 54 68  R-02748-19096 Th
3180: 69 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20 74  is option sets t
3190: 68 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f 64  he threading mod
31a0: 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53 69  e to.      ** Si
31b0: 6e 67 6c 65 2d 74 68 72 65 61 64 2e 20 2a 2f 0a  ngle-thread. */.
31c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
31d0: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
31e0: 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a 20 44 69  utex = 0;  /* Di
31f0: 73 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63  sable mutex on c
3200: 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ore */.      sql
3210: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3220: 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b  .bFullMutex = 0;
3230: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 6d 75 74    /* Disable mut
3240: 65 78 20 6f 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e  ex on connection
3250: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
3260: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
3270: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3280: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
3290: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
32a0: 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 32  FE>0 /* IMP: R-2
32b0: 30 35 32 30 2d 35 34 30 38 36 20 2a 2f 0a 20 20  0520-54086 */.  
32c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
32d0: 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44  NFIG_MULTITHREAD
32e0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
32f0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 33 37  DENCE-OF: R-1437
3300: 34 2d 34 32 34 36 38 20 54 68 69 73 20 6f 70 74  4-42468 This opt
3310: 69 6f 6e 20 73 65 74 73 20 74 68 65 20 74 68 72  ion sets the thr
3320: 65 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f 0a 20  eading mode to. 
3330: 20 20 20 20 20 2a 2a 20 4d 75 6c 74 69 2d 74 68       ** Multi-th
3340: 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73  read. */.      s
3350: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3360: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
3370: 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75  1;  /* Enable mu
3380: 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20  tex on core */. 
3390: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
33a0: 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
33b0: 74 65 78 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73  tex = 0;  /* Dis
33c0: 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f  able mutex on co
33d0: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  nnections */.   
33e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
33f0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
3400: 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ed(SQLITE_THREAD
3410: 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f  SAFE) && SQLITE_
3420: 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a 20  THREADSAFE>0 /* 
3430: 49 4d 50 3a 20 52 2d 35 39 35 39 33 2d 32 31 38  IMP: R-59593-218
3440: 31 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  10 */.    case S
3450: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45 52  QLITE_CONFIG_SER
3460: 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20 20  IALIZED: {.     
3470: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
3480: 20 52 2d 34 31 32 32 30 2d 35 31 38 30 30 20 54   R-41220-51800 T
3490: 68 69 73 20 6f 70 74 69 6f 6e 20 73 65 74 73 20  his option sets 
34a0: 74 68 65 20 74 68 72 65 61 64 69 6e 67 20 6d 6f  the threading mo
34b0: 64 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53  de to.      ** S
34c0: 65 72 69 61 6c 69 7a 65 64 2e 20 2a 2f 0a 20 20  erialized. */.  
34d0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
34e0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
34f0: 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e 61 62  ex = 1;  /* Enab
3500: 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65  le mutex on core
3510: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3520: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
3530: 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 20 20 2f  ullMutex = 1;  /
3540: 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20 6f  * Enable mutex o
3550: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  n connections */
3560: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3570: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
3580: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48  efined(SQLITE_TH
3590: 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c  READSAFE) && SQL
35a0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
35b0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 33 36 36 36   /* IMP: R-63666
35c0: 2d 34 38 37 35 35 20 2a 2f 0a 20 20 20 20 63 61  -48755 */.    ca
35d0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
35e0: 5f 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20  _MUTEX: {.      
35f0: 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c  /* Specify an al
3600: 74 65 72 6e 61 74 69 76 65 20 6d 75 74 65 78 20  ternative mutex 
3610: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
3620: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3630: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65  lobalConfig.mute
3640: 78 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  x = *va_arg(ap, 
3650: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65  sqlite3_mutex_me
3660: 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62  thods*);.      b
3670: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
3680: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
3690: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
36a0: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
36b0: 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a  ADSAFE>0 /* IMP:
36c0: 20 52 2d 31 34 34 35 30 2d 33 37 35 39 37 20 2a   R-14450-37597 *
36d0: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
36e0: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54 45  E_CONFIG_GETMUTE
36f0: 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65  X: {.      /* Re
3700: 74 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65  trieve the curre
3710: 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65  nt mutex impleme
3720: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
3730: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
3740: 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f  ite3_mutex_metho
3750: 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  ds*) = sqlite3Gl
3760: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78  obalConfig.mutex
3770: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3780: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
3790: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
37a0: 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  FIG_MALLOC: {.  
37b0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
37c0: 4f 46 3a 20 52 2d 35 35 35 39 34 2d 32 31 30 33  OF: R-55594-2103
37d0: 30 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  0 The SQLITE_CON
37e0: 46 49 47 5f 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f  FIG_MALLOC optio
37f0: 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20 20  n takes a.      
3800: 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65  ** single argume
3810: 6e 74 20 77 68 69 63 68 20 69 73 20 61 20 70 6f  nt which is a po
3820: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
3830: 61 6e 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20  ance of the.    
3840: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d    ** sqlite3_mem
3850: 5f 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74 75  _methods structu
3860: 72 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  re. The argument
3870: 20 73 70 65 63 69 66 69 65 73 20 61 6c 74 65 72   specifies alter
3880: 6e 61 74 69 76 65 0a 20 20 20 20 20 20 2a 2a 20  native.      ** 
3890: 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79  low-level memory
38a0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74   allocation rout
38b0: 69 6e 65 73 20 74 6f 20 62 65 20 75 73 65 64 20  ines to be used 
38c0: 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  in place of the 
38d0: 6d 65 6d 6f 72 79 0a 20 20 20 20 20 20 2a 2a 20  memory.      ** 
38e0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69  allocation routi
38f0: 6e 65 73 20 62 75 69 6c 74 20 69 6e 74 6f 20 53  nes built into S
3900: 51 4c 69 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20  QLite. */.      
3910: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3920: 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67 28  fig.m = *va_arg(
3930: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  ap, sqlite3_mem_
3940: 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20  methods*);.     
3950: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3960: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3970: 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20  NFIG_GETMALLOC: 
3980: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
3990: 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 32 31 33 2d  NCE-OF: R-51213-
39a0: 34 36 34 31 34 20 54 68 65 20 53 51 4c 49 54 45  46414 The SQLITE
39b0: 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f  _CONFIG_GETMALLO
39c0: 43 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20 61  C option takes a
39d0: 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65  .      ** single
39e0: 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20   argument which 
39f0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
3a00: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
3a10: 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  he.      ** sqli
3a20: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
3a30: 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 20 73  structure. The s
3a40: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
3a50: 64 73 20 73 74 72 75 63 74 75 72 65 20 69 73 0a  ds structure is.
3a60: 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20        ** filled 
3a70: 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74  with the current
3a80: 6c 79 20 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72  ly defined memor
3a90: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75  y allocation rou
3aa0: 74 69 6e 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tines. */.      
3ab0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
3ac0: 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f  lConfig.m.xMallo
3ad0: 63 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d 65  c==0 ) sqlite3Me
3ae0: 6d 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20  mSetDefault();. 
3af0: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
3b00: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
3b10: 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33  hods*) = sqlite3
3b20: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a  GlobalConfig.m;.
3b30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3b40: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3b50: 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41  TE_CONFIG_MEMSTA
3b60: 54 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  TUS: {.      /* 
3b70: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
3b80: 31 32 37 35 2d 33 35 31 35 37 20 54 68 65 20 53  1275-35157 The S
3b90: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d  QLITE_CONFIG_MEM
3ba0: 53 54 41 54 55 53 20 6f 70 74 69 6f 6e 20 74 61  STATUS option ta
3bb0: 6b 65 73 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e  kes.      ** sin
3bc0: 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 6f 66 20  gle argument of 
3bd0: 74 79 70 65 20 69 6e 74 2c 20 69 6e 74 65 72 70  type int, interp
3be0: 72 65 74 65 64 20 61 73 20 61 20 62 6f 6f 6c 65  reted as a boole
3bf0: 61 6e 2c 20 77 68 69 63 68 20 65 6e 61 62 6c 65  an, which enable
3c00: 73 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 64 69  s.      ** or di
3c10: 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 6c 65  sables the colle
3c20: 63 74 69 6f 6e 20 6f 66 20 6d 65 6d 6f 72 79 20  ction of memory 
3c30: 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 74 61 74 69  allocation stati
3c40: 73 74 69 63 73 2e 20 2a 2f 0a 20 20 20 20 20 20  stics. */.      
3c50: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3c60: 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 3d 20 76  fig.bMemstat = v
3c70: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
3c80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3c90: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3ca0: 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54 43  TE_CONFIG_SCRATC
3cb0: 48 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  H: {.      /* EV
3cc0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38 34  IDENCE-OF: R-084
3cd0: 30 34 2d 36 30 38 38 37 20 54 68 65 72 65 20 61  04-60887 There a
3ce0: 72 65 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e  re three argumen
3cf0: 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 53  ts to.      ** S
3d00: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52  QLITE_CONFIG_SCR
3d10: 41 54 43 48 3a 20 41 20 70 6f 69 6e 74 65 72 20  ATCH: A pointer 
3d20: 61 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  an 8-byte aligne
3d30: 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 20  d memory buffer 
3d40: 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 77 68  from.      ** wh
3d50: 69 63 68 20 74 68 65 20 73 63 72 61 74 63 68 20  ich the scratch 
3d60: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 77 69 6c 6c  allocations will
3d70: 20 62 65 20 64 72 61 77 6e 2c 20 74 68 65 20 73   be drawn, the s
3d80: 69 7a 65 20 6f 66 20 65 61 63 68 20 73 63 72 61  ize of each scra
3d90: 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  tch.      ** all
3da0: 6f 63 61 74 69 6f 6e 20 28 73 7a 29 2c 20 61 6e  ocation (sz), an
3db0: 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  d the maximum nu
3dc0: 6d 62 65 72 20 6f 66 20 73 63 72 61 74 63 68 20  mber of scratch 
3dd0: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 28 4e 29 2e  allocations (N).
3de0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3df0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
3e00: 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28  cratch = va_arg(
3e10: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
3e20: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3e30: 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68 20  onfig.szScratch 
3e40: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
3e50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3e60: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63  GlobalConfig.nSc
3e70: 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61  ratch = va_arg(a
3e80: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3e90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3ea0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3eb0: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a  IG_PAGECACHE: {.
3ec0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
3ed0: 45 2d 4f 46 3a 20 52 2d 33 31 34 30 38 2d 34 30  E-OF: R-31408-40
3ee0: 35 31 30 20 54 68 65 72 65 20 61 72 65 20 74 68  510 There are th
3ef0: 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ree arguments to
3f00: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
3f10: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
3f20: 45 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  E: A pointer to 
3f30: 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 6d  8-byte aligned m
3f40: 65 6d 6f 72 79 2c 20 74 68 65 20 73 69 7a 65 0a  emory, the size.
3f50: 20 20 20 20 20 20 2a 2a 20 6f 66 20 65 61 63 68        ** of each
3f60: 20 70 61 67 65 20 62 75 66 66 65 72 20 28 73 7a   page buffer (sz
3f70: 29 2c 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ), and the numbe
3f80: 72 20 6f 66 20 70 61 67 65 73 20 28 4e 29 2e 20  r of pages (N). 
3f90: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3fa0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61  GlobalConfig.pPa
3fb0: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
3fc0: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71  void*);.      sq
3fd0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3fe0: 67 2e 73 7a 50 61 67 65 20 3d 20 76 61 5f 61 72  g.szPage = va_ar
3ff0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
4000: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4010: 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20 76 61  onfig.nPage = va
4020: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
4030: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4040: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
4050: 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 5f  E_CONFIG_PCACHE_
4060: 48 44 52 53 5a 3a 20 7b 0a 20 20 20 20 20 20 2f  HDRSZ: {.      /
4070: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
4080: 2d 33 39 31 30 30 2d 32 37 33 31 37 20 54 68 65  -39100-27317 The
4090: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
40a0: 43 41 43 48 45 5f 48 44 52 53 5a 20 6f 70 74 69  CACHE_HDRSZ opti
40b0: 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20 2a  on takes.      *
40c0: 2a 20 61 20 73 69 6e 67 6c 65 20 70 61 72 61 6d  * a single param
40d0: 65 74 65 72 20 77 68 69 63 68 20 69 73 20 61 20  eter which is a 
40e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
40f0: 74 65 67 65 72 20 61 6e 64 20 77 72 69 74 65 73  teger and writes
4100: 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74   into.      ** t
4110: 68 61 74 20 69 6e 74 65 67 65 72 20 74 68 65 20  hat integer the 
4120: 6e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  number of extra 
4130: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 72  bytes per page r
4140: 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68  equired for each
4150: 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
4160: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  n SQLITE_CONFIG_
4170: 50 41 47 45 43 41 43 48 45 2e 20 2a 2f 0a 20 20  PAGECACHE. */.  
4180: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
4190: 69 6e 74 2a 29 20 3d 20 0a 20 20 20 20 20 20 20  int*) = .       
41a0: 20 20 20 73 71 6c 69 74 65 33 48 65 61 64 65 72     sqlite3Header
41b0: 53 69 7a 65 42 74 72 65 65 28 29 20 2b 0a 20 20  SizeBtree() +.  
41c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 48          sqlite3H
41d0: 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65 28  eaderSizePcache(
41e0: 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ) +.          sq
41f0: 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a 65 50  lite3HeaderSizeP
4200: 63 61 63 68 65 31 28 29 3b 0a 20 20 20 20 20 20  cache1();.      
4210: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
4220: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
4230: 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20  NFIG_PCACHE: {. 
4240: 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f       /* no-op */
4250: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4260: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
4270: 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43  ITE_CONFIG_GETPC
4280: 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ACHE: {.      /*
4290: 20 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a 2f   now an error */
42a0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
42b0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
42c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
42d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
42e0: 4e 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b 0a  NFIG_PCACHE2: {.
42f0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
4300: 45 2d 4f 46 3a 20 52 2d 36 33 33 32 35 2d 34 38  E-OF: R-63325-48
4310: 33 37 38 20 54 68 65 20 53 51 4c 49 54 45 5f 43  378 The SQLITE_C
4320: 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 20 6f 70  ONFIG_PCACHE2 op
4330: 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20  tion takes a.   
4340: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67     ** single arg
4350: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61  ument which is a
4360: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73   pointer to an s
4370: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
4380: 74 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a 20  thods2.      ** 
4390: 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 6f 62 6a  object. This obj
43a0: 65 63 74 20 73 70 65 63 69 66 69 65 73 20 74 68  ect specifies th
43b0: 65 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 61  e interface to a
43c0: 20 63 75 73 74 6f 6d 20 70 61 67 65 20 63 61 63   custom page cac
43d0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  he.      ** impl
43e0: 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20  ementation. */. 
43f0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4400: 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32  alConfig.pcache2
4410: 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73   = *va_arg(ap, s
4420: 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65  qlite3_pcache_me
4430: 74 68 6f 64 73 32 2a 29 3b 0a 20 20 20 20 20 20  thods2*);.      
4440: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
4450: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4460: 46 49 47 5f 47 45 54 50 43 41 43 48 45 32 3a 20  FIG_GETPCACHE2: 
4470: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
4480: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 30 33 35 2d  NCE-OF: R-22035-
4490: 34 36 31 38 32 20 54 68 65 20 53 51 4c 49 54 45  46182 The SQLITE
44a0: 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48  _CONFIG_GETPCACH
44b0: 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  E2 option takes 
44c0: 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c  a.      ** singl
44d0: 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68  e argument which
44e0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
44f0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 70 63 61 63   an sqlite3_pcac
4500: 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20 20  he_methods2.    
4510: 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 53 51 4c    ** object. SQL
4520: 69 74 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ite copies of th
4530: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
4540: 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ache implementat
4550: 69 6f 6e 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a  ion into.      *
4560: 2a 20 74 68 61 74 20 6f 62 6a 65 63 74 2e 20 2a  * that object. *
4570: 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
4580: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4590: 70 63 61 63 68 65 32 2e 78 49 6e 69 74 3d 3d 30  pcache2.xInit==0
45a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
45b0: 74 65 33 50 43 61 63 68 65 53 65 74 44 65 66 61  te3PCacheSetDefa
45c0: 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ult();.      }. 
45d0: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
45e0: 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f   sqlite3_pcache_
45f0: 6d 65 74 68 6f 64 73 32 2a 29 20 3d 20 73 71 6c  methods2*) = sql
4600: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4610: 2e 70 63 61 63 68 65 32 3b 0a 20 20 20 20 20 20  .pcache2;.      
4620: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 2f 2a  break;.    }../*
4630: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
4640: 30 36 36 32 36 2d 31 32 39 31 31 20 54 68 65 20  06626-12911 The 
4650: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48 45  SQLITE_CONFIG_HE
4660: 41 50 20 6f 70 74 69 6f 6e 20 69 73 20 6f 6e 6c  AP option is onl
4670: 79 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 69  y.** available i
4680: 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  f SQLite is comp
4690: 69 6c 65 64 20 77 69 74 68 20 65 69 74 68 65 72  iled with either
46a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
46b0: 45 4d 53 59 53 33 20 6f 72 0a 2a 2a 20 53 51 4c  EMSYS3 or.** SQL
46c0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
46d0: 53 35 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53  S5 and returns S
46e0: 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 69  QLITE_ERROR if i
46f0: 6e 76 6f 6b 65 64 20 6f 74 68 65 72 77 69 73 65  nvoked otherwise
4700: 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  . */.#if defined
4710: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d  (SQLITE_ENABLE_M
4720: 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69 6e  EMSYS3) || defin
4730: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
4740: 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63 61  _MEMSYS5).    ca
4750: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
4760: 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20 2f  _HEAP: {.      /
4770: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
4780: 2d 31 39 38 35 34 2d 34 32 31 32 36 20 54 68 65  -19854-42126 The
4790: 72 65 20 61 72 65 20 74 68 72 65 65 20 61 72 67  re are three arg
47a0: 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20 20  uments to.      
47b0: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ** SQLITE_CONFIG
47c0: 5f 48 45 41 50 3a 20 41 6e 20 38 2d 62 79 74 65  _HEAP: An 8-byte
47d0: 20 61 6c 69 67 6e 65 64 20 70 6f 69 6e 74 65 72   aligned pointer
47e0: 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20   to the memory, 
47f0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d  the.      ** num
4800: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
4810: 74 68 65 20 6d 65 6d 6f 72 79 20 62 75 66 66 65  the memory buffe
4820: 72 2c 20 61 6e 64 20 74 68 65 20 6d 69 6e 69 6d  r, and the minim
4830: 75 6d 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69  um allocation si
4840: 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
4850: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4860: 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 76  Config.pHeap = v
4870: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
4880: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4890: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61  lobalConfig.nHea
48a0: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  p = va_arg(ap, i
48b0: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
48c0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
48d0: 6e 52 65 71 20 3d 20 76 61 5f 61 72 67 28 61 70  nReq = va_arg(ap
48e0: 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20 20 20 69  , int);..      i
48f0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
4900: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c 31 20 29  Config.mnReq<1 )
4910: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4920: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
4930: 52 65 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Req = 1;.      }
4940: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
4950: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52  GlobalConfig.mnR
4960: 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b 0a 20 20  eq>(1<<12) ){.  
4970: 20 20 20 20 20 20 2f 2a 20 63 61 70 20 6d 69 6e        /* cap min
4980: 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 61 74   request size at
4990: 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20 20 20 20   2^12 */.       
49a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
49b0: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 28 31 3c  nfig.mnReq = (1<
49c0: 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  <12);.      }.. 
49d0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
49e0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
49f0: 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ap==0 ){.       
4a00: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
4a10: 20 52 2d 34 39 39 32 30 2d 36 30 31 38 39 20 49   R-49920-60189 I
4a20: 66 20 74 68 65 20 66 69 72 73 74 20 70 6f 69 6e  f the first poin
4a30: 74 65 72 20 28 74 68 65 20 6d 65 6d 6f 72 79 20  ter (the memory 
4a40: 70 6f 69 6e 74 65 72 29 0a 20 20 20 20 20 20 20  pointer).       
4a50: 20 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65   ** is NULL, the
4a60: 6e 20 53 51 4c 69 74 65 20 72 65 76 65 72 74 73  n SQLite reverts
4a70: 20 74 6f 20 75 73 69 6e 67 20 69 74 73 20 64 65   to using its de
4a80: 66 61 75 6c 74 20 6d 65 6d 6f 72 79 20 61 6c 6c  fault memory all
4a90: 6f 63 61 74 6f 72 0a 20 20 20 20 20 20 20 20 2a  ocator.        *
4aa0: 2a 20 28 74 68 65 20 73 79 73 74 65 6d 20 6d 61  * (the system ma
4ab0: 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e 74  lloc() implement
4ac0: 61 74 69 6f 6e 29 2c 20 75 6e 64 6f 69 6e 67 20  ation), undoing 
4ad0: 61 6e 79 20 70 72 69 6f 72 20 69 6e 76 6f 63 61  any prior invoca
4ae0: 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 20 20  tion of.        
4af0: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ** SQLITE_CONFIG
4b00: 5f 4d 41 4c 4c 4f 43 2e 0a 20 20 20 20 20 20 20  _MALLOC..       
4b10: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 53   **.        ** S
4b20: 65 74 74 69 6e 67 20 73 71 6c 69 74 65 33 47 6c  etting sqlite3Gl
4b30: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 74 6f 20  obalConfig.m to 
4b40: 61 6c 6c 20 7a 65 72 6f 73 20 77 69 6c 6c 20 63  all zeros will c
4b50: 61 75 73 65 20 6d 61 6c 6c 6f 63 20 74 6f 0a 20  ause malloc to. 
4b60: 20 20 20 20 20 20 20 2a 2a 20 72 65 76 65 72 74         ** revert
4b70: 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c 74 20   to its default 
4b80: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77  implementation w
4b90: 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  hen sqlite3_init
4ba0: 69 61 6c 69 7a 65 28 29 20 69 73 20 72 75 6e 0a  ialize() is run.
4bb0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
4bc0: 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74     memset(&sqlit
4bd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4be0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
4bf0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4c00: 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  m));.      }else
4c10: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49  {.        /* EVI
4c20: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 30 30  DENCE-OF: R-6100
4c30: 36 2d 30 38 39 31 38 20 49 66 20 74 68 65 20 6d  6-08918 If the m
4c40: 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 20 69 73  emory pointer is
4c50: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 74   not NULL then t
4c60: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  he.        ** al
4c70: 74 65 72 6e 61 74 69 76 65 20 6d 65 6d 6f 72 79  ternative memory
4c80: 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6e   allocator is en
4c90: 67 61 67 65 64 20 74 6f 20 68 61 6e 64 6c 65 20  gaged to handle 
4ca0: 61 6c 6c 20 6f 66 20 53 51 4c 69 74 65 73 0a 20  all of SQLites. 
4cb0: 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79         ** memory
4cc0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6e 65 65 64   allocation need
4cd0: 73 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s. */.#ifdef SQL
4ce0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
4cf0: 53 33 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  S3.        sqlit
4d00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
4d10: 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65   = *sqlite3MemGe
4d20: 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23 65 6e 64  tMemsys3();.#end
4d30: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
4d40: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 0a  _ENABLE_MEMSYS5.
4d50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
4d60: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20  lobalConfig.m = 
4d70: 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65  *sqlite3MemGetMe
4d80: 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64 69 66 0a  msys5();.#endif.
4d90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4da0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
4db0: 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  f..    case SQLI
4dc0: 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53  TE_CONFIG_LOOKAS
4dd0: 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  IDE: {.      sql
4de0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4df0: 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76  .szLookaside = v
4e00: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
4e10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4e20: 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61  balConfig.nLooka
4e30: 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70  side = va_arg(ap
4e40: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
4e50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a  eak;.    }.    .
4e60: 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 61 20      /* Record a 
4e70: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c  pointer to the l
4e80: 6f 67 67 65 72 20 66 75 6e 63 74 69 6f 6e 20 61  ogger function a
4e90: 6e 64 20 69 74 73 20 66 69 72 73 74 20 61 72 67  nd its first arg
4ea0: 75 6d 65 6e 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ument..    ** Th
4eb0: 65 20 64 65 66 61 75 6c 74 20 69 73 20 4e 55 4c  e default is NUL
4ec0: 4c 2e 20 20 4c 6f 67 67 69 6e 67 20 69 73 20 64  L.  Logging is d
4ed0: 69 73 61 62 6c 65 64 20 69 66 20 74 68 65 20 66  isabled if the f
4ee0: 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20  unction pointer 
4ef0: 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e 0a  is.    ** NULL..
4f00: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
4f10: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f  SQLITE_CONFIG_LO
4f20: 47 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53  G: {.      /* MS
4f30: 56 43 20 69 73 20 70 69 63 6b 79 20 61 62 6f 75  VC is picky abou
4f40: 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70  t pulling func p
4f50: 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69 73 74  trs from va list
4f60: 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74 74 70  s..      ** http
4f70: 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f  ://support.micro
4f80: 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36  soft.com/kb/4796
4f90: 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  1.      ** sqlit
4fa0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
4fb0: 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Log = va_arg(ap,
4fc0: 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 2a 2c 69   void(*)(void*,i
4fd0: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  nt,const char*))
4fe0: 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ;.      */.     
4ff0: 20 74 79 70 65 64 65 66 20 76 6f 69 64 28 2a 4c   typedef void(*L
5000: 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c  OGFUNC_t)(void*,
5010: 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  int,const char*)
5020: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
5030: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
5040: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 4c 4f   = va_arg(ap, LO
5050: 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  GFUNC_t);.      
5060: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
5070: 66 69 67 2e 70 4c 6f 67 41 72 67 20 3d 20 76 61  fig.pLogArg = va
5080: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
5090: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
50a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44    }..    /* EVID
50b0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 34 38  ENCE-OF: R-55548
50c0: 2d 33 33 38 31 37 20 54 68 65 20 63 6f 6d 70 69  -33817 The compi
50d0: 6c 65 2d 74 69 6d 65 20 73 65 74 74 69 6e 67 20  le-time setting 
50e0: 66 6f 72 20 55 52 49 20 66 69 6c 65 6e 61 6d 65  for URI filename
50f0: 73 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20  s.    ** can be 
5100: 63 68 61 6e 67 65 64 20 61 74 20 73 74 61 72 74  changed at start
5110: 2d 74 69 6d 65 20 75 73 69 6e 67 20 74 68 65 0a  -time using the.
5120: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
5130: 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
5140: 46 49 47 5f 55 52 49 2c 31 29 20 6f 72 0a 20 20  FIG_URI,1) or.  
5150: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e    ** sqlite3_con
5160: 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
5170: 47 5f 55 52 49 2c 30 29 20 63 6f 6e 66 69 67 75  G_URI,0) configu
5180: 72 61 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 20 20  ration calls..  
5190: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
51a0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 3a  LITE_CONFIG_URI:
51b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
51c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 34 35 31  ENCE-OF: R-25451
51d0: 2d 36 31 31 32 35 20 54 68 65 20 53 51 4c 49 54  -61125 The SQLIT
51e0: 45 5f 43 4f 4e 46 49 47 5f 55 52 49 20 6f 70 74  E_CONFIG_URI opt
51f0: 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e 67  ion takes a sing
5200: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 75  le.      ** argu
5210: 6d 65 6e 74 20 6f 66 20 74 79 70 65 20 69 6e 74  ment of type int
5220: 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  . If non-zero, t
5230: 68 65 6e 20 55 52 49 20 68 61 6e 64 6c 69 6e 67  hen URI handling
5240: 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a 20 20 20   is globally.   
5250: 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49     ** enabled. I
5260: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
5270: 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 55 52  is zero, then UR
5280: 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67 6c  I handling is gl
5290: 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a 20  obally.      ** 
52a0: 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20 20 20  disabled. */.   
52b0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
52c0: 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 20  Config.bOpenUri 
52d0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
52e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
52f0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
5300: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f  SQLITE_CONFIG_CO
5310: 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41  VERING_INDEX_SCA
5320: 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  N: {.      /* EV
5330: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 36 35  IDENCE-OF: R-365
5340: 39 32 2d 30 32 37 37 32 20 54 68 65 20 53 51 4c  92-02772 The SQL
5350: 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52  ITE_CONFIG_COVER
5360: 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41 4e 0a 20  ING_INDEX_SCAN. 
5370: 20 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 74       ** option t
5380: 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  akes a single in
5390: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 20 77  teger argument w
53a0: 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
53b0: 74 65 64 20 61 73 20 61 0a 20 20 20 20 20 20 2a  ted as a.      *
53c0: 2a 20 62 6f 6f 6c 65 61 6e 20 69 6e 20 6f 72 64  * boolean in ord
53d0: 65 72 20 74 6f 20 65 6e 61 62 6c 65 20 6f 72 20  er to enable or 
53e0: 64 69 73 61 62 6c 65 20 74 68 65 20 75 73 65 20  disable the use 
53f0: 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 69  of covering indi
5400: 63 65 73 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  ces for.      **
5410: 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
5420: 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 6f  s in the query o
5430: 70 74 69 6d 69 7a 65 72 2e 20 2a 2f 0a 20 20 20  ptimizer. */.   
5440: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
5450: 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 20 3d  Config.bUseCis =
5460: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
5470: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5480: 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
5490: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
54a0: 47 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  G.    case SQLIT
54b0: 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 3a  E_CONFIG_SQLLOG:
54c0: 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65 66   {.      typedef
54d0: 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47 46 55 4e   void(*SQLLOGFUN
54e0: 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73 71 6c 69  C_t)(void*, sqli
54f0: 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  te3*, const char
5500: 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  *, int);.      s
5510: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
5520: 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20 76 61 5f  ig.xSqllog = va_
5530: 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f 47 46 55  arg(ap, SQLLOGFU
5540: 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  NC_t);.      sql
5550: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5560: 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d 20 76 61  .pSqllogArg = va
5570: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 20 2a 29  _arg(ap, void *)
5580: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5590: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
55a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
55b0: 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b  FIG_MMAP_SIZE: {
55c0: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
55d0: 43 45 2d 4f 46 3a 20 52 2d 35 38 30 36 33 2d 33  CE-OF: R-58063-3
55e0: 38 32 35 38 20 53 51 4c 49 54 45 5f 43 4f 4e 46  8258 SQLITE_CONF
55f0: 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 20 74 61 6b  IG_MMAP_SIZE tak
5600: 65 73 20 74 77 6f 20 36 34 2d 62 69 74 0a 20 20  es two 64-bit.  
5610: 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 28      ** integer (
5620: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20 76  sqlite3_int64) v
5630: 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20 74  alues that are t
5640: 68 65 20 64 65 66 61 75 6c 74 20 6d 6d 61 70 20  he default mmap 
5650: 73 69 7a 65 20 6c 69 6d 69 74 0a 20 20 20 20 20  size limit.     
5660: 20 2a 2a 20 28 74 68 65 20 64 65 66 61 75 6c 74   ** (the default
5670: 20 73 65 74 74 69 6e 67 20 66 6f 72 20 50 52 41   setting for PRA
5680: 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65 29 20 61  GMA mmap_size) a
5690: 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  nd the maximum a
56a0: 6c 6c 6f 77 65 64 0a 20 20 20 20 20 20 2a 2a 20  llowed.      ** 
56b0: 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d 69 74 2e  mmap size limit.
56c0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
56d0: 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 20 3d  3_int64 szMmap =
56e0: 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
56f0: 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20  te3_int64);.    
5700: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
5710: 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28  mxMmap = va_arg(
5720: 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ap, sqlite3_int6
5730: 34 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  4);.      /* EVI
5740: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 33 33 36  DENCE-OF: R-5336
5750: 37 2d 34 33 31 39 30 20 49 66 20 65 69 74 68 65  7-43190 If eithe
5760: 72 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  r argument to th
5770: 69 73 20 6f 70 74 69 6f 6e 20 69 73 0a 20 20 20  is option is.   
5780: 20 20 20 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20     ** negative, 
5790: 74 68 65 6e 20 74 68 61 74 20 61 72 67 75 6d 65  then that argume
57a0: 6e 74 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  nt is changed to
57b0: 20 69 74 73 20 63 6f 6d 70 69 6c 65 2d 74 69 6d   its compile-tim
57c0: 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 20 20 20  e default..     
57d0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49   **.      ** EVI
57e0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 39  DENCE-OF: R-3499
57f0: 33 2d 34 35 30 33 31 20 54 68 65 20 6d 61 78 69  3-45031 The maxi
5800: 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 6d 6d 61 70  mum allowed mmap
5810: 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 0a 20 20   size will be.  
5820: 20 20 20 20 2a 2a 20 73 69 6c 65 6e 74 6c 79 20      ** silently 
5830: 74 72 75 6e 63 61 74 65 64 20 69 66 20 6e 65 63  truncated if nec
5840: 65 73 73 61 72 79 20 73 6f 20 74 68 61 74 20 69  essary so that i
5850: 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 63 65 65  t does not excee
5860: 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  d the.      ** c
5870: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6d 61 78 69  ompile-time maxi
5880: 6d 75 6d 20 6d 6d 61 70 20 73 69 7a 65 20 73 65  mum mmap size se
5890: 74 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  t by the SQLITE_
58a0: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 0a 20 20  MAX_MMAP_SIZE.  
58b0: 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74      ** compile-t
58c0: 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20 20 20 20  ime option..    
58d0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6d    */.      if( m
58e0: 78 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d 61  xMmap<0 || mxMma
58f0: 70 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  p>SQLITE_MAX_MMA
5900: 50 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  P_SIZE ){.      
5910: 20 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49 54    mxMmap = SQLIT
5920: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b  E_MAX_MMAP_SIZE;
5930: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5940: 66 28 20 73 7a 4d 6d 61 70 3c 30 20 29 20 73 7a  f( szMmap<0 ) sz
5950: 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44 45  Mmap = SQLITE_DE
5960: 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45 3b  FAULT_MMAP_SIZE;
5970: 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 6d 61  .      if( szMma
5980: 70 3e 6d 78 4d 6d 61 70 29 20 73 7a 4d 6d 61 70  p>mxMmap) szMmap
5990: 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20   = mxMmap;.     
59a0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
59b0: 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78  nfig.mxMmap = mx
59c0: 4d 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69  Mmap;.      sqli
59d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
59e0: 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b  szMmap = szMmap;
59f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5a00: 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
5a10: 4f 53 5f 57 49 4e 20 26 26 20 64 65 66 69 6e 65  OS_WIN && define
5a20: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
5a30: 41 4c 4c 4f 43 29 20 2f 2a 20 49 4d 50 3a 20 52  ALLOC) /* IMP: R
5a40: 2d 30 34 37 38 30 2d 35 35 38 31 35 20 2a 2f 0a  -04780-55815 */.
5a50: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
5a60: 43 4f 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41  CONFIG_WIN32_HEA
5a70: 50 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 2f  PSIZE: {.      /
5a80: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5a90: 2d 33 34 39 32 36 2d 30 33 33 36 30 20 53 51 4c  -34926-03360 SQL
5aa0: 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e 33 32  ITE_CONFIG_WIN32
5ab0: 5f 48 45 41 50 53 49 5a 45 20 74 61 6b 65 73 20  _HEAPSIZE takes 
5ac0: 61 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20 2a  a 32-bit.      *
5ad0: 2a 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  * unsigned integ
5ae0: 65 72 20 76 61 6c 75 65 20 74 68 61 74 20 73 70  er value that sp
5af0: 65 63 69 66 69 65 73 20 74 68 65 20 6d 61 78 69  ecifies the maxi
5b00: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20  mum size of the 
5b10: 63 72 65 61 74 65 64 0a 20 20 20 20 20 20 2a 2a  created.      **
5b20: 20 68 65 61 70 2e 20 2a 2f 0a 20 20 20 20 20 20   heap. */.      
5b30: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
5b40: 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61  fig.nHeap = va_a
5b50: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
5b60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5b70: 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65  #endif..    case
5b80: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
5b90: 4d 41 53 5a 3a 20 7b 0a 20 20 20 20 20 20 73 71  MASZ: {.      sq
5ba0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
5bb0: 67 2e 73 7a 50 6d 61 20 3d 20 76 61 5f 61 72 67  g.szPma = va_arg
5bc0: 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  (ap, unsigned in
5bd0: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
5be0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61  .    }..    defa
5bf0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  ult: {.      rc 
5c00: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
5c10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5c20: 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28   }.  }.  va_end(
5c30: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ap);.  return rc
5c40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75  ;.}../*.** Set u
5c50: 70 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  p the lookaside 
5c60: 62 75 66 66 65 72 73 20 66 6f 72 20 61 20 64 61  buffers for a da
5c70: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
5c80: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  n..** Return SQL
5c90: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
5ca0: 73 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61  s.  .** If looka
5cb0: 73 69 64 65 20 69 73 20 61 6c 72 65 61 64 79 20  side is already 
5cc0: 61 63 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53  active, return S
5cd0: 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a  QLITE_BUSY..**.*
5ce0: 2a 20 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74  * The sz paramet
5cf0: 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  er is the number
5d00: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 65 61 63   of bytes in eac
5d10: 68 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74  h lookaside slot
5d20: 2e 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72  ..** The cnt par
5d30: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75  ameter is the nu
5d40: 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20  mber of slots.  
5d50: 49 66 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c  If pStart is NUL
5d60: 4c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66  L the.** space f
5d70: 6f 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  or the lookaside
5d80: 20 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69   memory is obtai
5d90: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
5da0: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66  _malloc()..** If
5db0: 20 70 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e   pStart is not N
5dc0: 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73  ULL then it is s
5dd0: 7a 2a 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d  z*cnt bytes of m
5de0: 65 6d 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72  emory to use for
5df0: 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64  .** the lookasid
5e00: 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  e memory..*/.sta
5e10: 74 69 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f  tic int setupLoo
5e20: 6b 61 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a  kaside(sqlite3 *
5e30: 64 62 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  db, void *pBuf, 
5e40: 69 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29  int sz, int cnt)
5e50: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
5e60: 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 0a  _OMIT_LOOKASIDE.
5e70: 20 20 76 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a    void *pStart;.
5e80: 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73    if( db->lookas
5e90: 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20 20 20 20  ide.nOut ){.    
5ea0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
5eb0: 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 72 65  SY;.  }.  /* Fre
5ec0: 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6c  e any existing l
5ed0: 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72 20  ookaside buffer 
5ee0: 66 6f 72 20 74 68 69 73 20 68 61 6e 64 6c 65 20  for this handle 
5ef0: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f  before.  ** allo
5f00: 63 61 74 69 6e 67 20 61 20 6e 65 77 20 6f 6e 65  cating a new one
5f10: 20 73 6f 20 77 65 20 64 6f 6e 27 74 20 68 61 76   so we don't hav
5f20: 65 20 74 6f 20 68 61 76 65 20 73 70 61 63 65 20  e to have space 
5f30: 66 6f 72 20 0a 20 20 2a 2a 20 62 6f 74 68 20 61  for .  ** both a
5f40: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
5f50: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
5f60: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
5f70: 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ced ){.    sqlit
5f80: 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b  e3_free(db->look
5f90: 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20  aside.pStart);. 
5fa0: 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 69 7a 65   }.  /* The size
5fb0: 20 6f 66 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20   of a lookaside 
5fc0: 73 6c 6f 74 20 61 66 74 65 72 20 52 4f 55 4e 44  slot after ROUND
5fd0: 44 4f 57 4e 38 20 6e 65 65 64 73 20 74 6f 20 62  DOWN8 needs to b
5fe0: 65 20 6c 61 72 67 65 72 0a 20 20 2a 2a 20 74 68  e larger.  ** th
5ff0: 61 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  an a pointer to 
6000: 62 65 20 75 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a  be useful..  */.
6010: 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e    sz = ROUNDDOWN
6020: 38 28 73 7a 29 3b 20 20 2f 2a 20 49 4d 50 3a 20  8(sz);  /* IMP: 
6030: 52 2d 33 33 30 33 38 2d 30 39 33 38 32 20 2a 2f  R-33038-09382 */
6040: 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69 6e 74 29  .  if( sz<=(int)
6050: 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65  sizeof(Lookaside
6060: 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d 20 30 3b  Slot*) ) sz = 0;
6070: 0a 20 20 69 66 28 20 63 6e 74 3c 30 20 29 20 63  .  if( cnt<0 ) c
6080: 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 7a  nt = 0;.  if( sz
6090: 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b  ==0 || cnt==0 ){
60a0: 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20  .    sz = 0;.   
60b0: 20 70 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 7d   pStart = 0;.  }
60c0: 65 6c 73 65 20 69 66 28 20 70 42 75 66 3d 3d 30  else if( pBuf==0
60d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
60e0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
60f0: 28 29 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d  ();.    pStart =
6100: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
6110: 73 7a 2a 63 6e 74 20 29 3b 20 20 2f 2a 20 49 4d  sz*cnt );  /* IM
6120: 50 3a 20 52 2d 36 31 39 34 39 2d 33 35 37 32 37  P: R-61949-35727
6130: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
6140: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
6150: 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  ;.    if( pStart
6160: 20 29 20 63 6e 74 20 3d 20 73 71 6c 69 74 65 33   ) cnt = sqlite3
6170: 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 53 74 61 72  MallocSize(pStar
6180: 74 29 2f 73 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t)/sz;.  }else{.
6190: 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 42 75      pStart = pBu
61a0: 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f  f;.  }.  db->loo
61b0: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20 3d 20  kaside.pStart = 
61c0: 70 53 74 61 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f  pStart;.  db->lo
61d0: 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20  okaside.pFree = 
61e0: 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  0;.  db->lookasi
61f0: 64 65 2e 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b  de.sz = (u16)sz;
6200: 0a 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b  .  if( pStart ){
6210: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
6220: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70  LookasideSlot *p
6230: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
6240: 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c   > (int)sizeof(L
6250: 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29  ookasideSlot*) )
6260: 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61  ;.    p = (Looka
6270: 73 69 64 65 53 6c 6f 74 2a 29 70 53 74 61 72 74  sideSlot*)pStart
6280: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d  ;.    for(i=cnt-
6290: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
62a0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
62b0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46  db->lookaside.pF
62c0: 72 65 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c  ree;.      db->l
62d0: 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d  ookaside.pFree =
62e0: 20 70 3b 0a 20 20 20 20 20 20 70 20 3d 20 28 4c   p;.      p = (L
62f0: 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 26 28  ookasideSlot*)&(
6300: 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20  (u8*)p)[sz];.   
6310: 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61   }.    db->looka
6320: 73 69 64 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20  side.pEnd = p;. 
6330: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
6340: 2e 62 45 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 20  .bEnabled = 1;. 
6350: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
6360: 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 70 42 75  .bMalloced = pBu
6370: 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c  f==0 ?1:0;.  }el
6380: 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  se{.    db->look
6390: 61 73 69 64 65 2e 70 53 74 61 72 74 20 3d 20 64  aside.pStart = d
63a0: 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  b;.    db->looka
63b0: 73 69 64 65 2e 70 45 6e 64 20 3d 20 64 62 3b 0a  side.pEnd = db;.
63c0: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
63d0: 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a  e.bEnabled = 0;.
63e0: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
63f0: 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 30 3b  e.bMalloced = 0;
6400: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
6410: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41  QLITE_OMIT_LOOKA
6420: 53 49 44 45 20 2a 2f 0a 20 20 72 65 74 75 72 6e  SIDE */.  return
6430: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
6440: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6450: 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64  mutex associated
6460: 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
6470: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
6480: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 73  sqlite3_mutex *s
6490: 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28  qlite3_db_mutex(
64a0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
64b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
64c0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
64d0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
64e0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
64f0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
6500: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
6510: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6520: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
6530: 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a  db->mutex;.}../*
6540: 0a 2a 2a 20 46 72 65 65 20 75 70 20 61 73 20 6d  .** Free up as m
6550: 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 77 65  uch memory as we
6560: 20 63 61 6e 20 66 72 6f 6d 20 74 68 65 20 67 69   can from the gi
6570: 76 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ven database.** 
6580: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  connection..*/.i
6590: 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  nt sqlite3_db_re
65a0: 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c  lease_memory(sql
65b0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
65c0: 20 69 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   i;..#ifdef SQLI
65d0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
65e0: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
65f0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
6600: 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
6610: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
6620: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
6630: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
6640: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69  ->mutex);.  sqli
6650: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
6660: 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  (db);.  for(i=0;
6670: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
6680: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
6690: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
66a0: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 29  t;.    if( pBt )
66b0: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70  {.      Pager *p
66c0: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
66d0: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
66e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
66f0: 65 72 53 68 72 69 6e 6b 28 70 50 61 67 65 72 29  erShrink(pPager)
6700: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
6710: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
6720: 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  ll(db);.  sqlite
6730: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
6740: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
6750: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6760: 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79  ./*.** Flush any
6770: 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
6780: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
6790: 66 6f 72 20 61 6e 79 20 61 74 74 61 63 68 65 64  for any attached
67a0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 6f 20   database.** to 
67b0: 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  disk..*/.int sql
67c0: 69 74 65 33 5f 64 62 5f 63 61 63 68 65 66 6c 75  ite3_db_cacheflu
67d0: 73 68 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  sh(sqlite3 *db){
67e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
67f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6800: 20 20 69 6e 74 20 62 53 65 65 6e 42 75 73 79 20    int bSeenBusy 
6810: 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  = 0;..#ifdef SQL
6820: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
6830: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
6840: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
6850: 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
6860: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
6870: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
6880: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
6890: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c  b->mutex);.  sql
68a0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
68b0: 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30  l(db);.  for(i=0
68c0: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
68d0: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
68e0: 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  +){.    Btree *p
68f0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
6900: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
6910: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
6920: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
6930: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70  {.      Pager *p
6940: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
6950: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
6960: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6970: 65 33 50 61 67 65 72 46 6c 75 73 68 28 70 50 61  e3PagerFlush(pPa
6980: 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
6990: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
69a0: 29 7b 0a 20 20 20 20 20 20 20 20 62 53 65 65 6e  ){.        bSeen
69b0: 42 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  Busy = 1;.      
69c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
69d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
69e0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
69f0: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
6a00: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6a10: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
6a20: 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d  ;.  return ((rc=
6a30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 53  =SQLITE_OK && bS
6a40: 65 65 6e 42 75 73 79 29 20 3f 20 53 51 4c 49 54  eenBusy) ? SQLIT
6a50: 45 5f 42 55 53 59 20 3a 20 72 63 29 3b 0a 7d 0a  E_BUSY : rc);.}.
6a60: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61  ./*.** Configura
6a70: 74 69 6f 6e 20 73 65 74 74 69 6e 67 73 20 66 6f  tion settings fo
6a80: 72 20 61 6e 20 69 6e 64 69 76 69 64 75 61 6c 20  r an individual 
6a90: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
6aa0: 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ion.*/.int sqlit
6ab0: 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 73 71 6c  e3_db_config(sql
6ac0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 70  ite3 *db, int op
6ad0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
6ae0: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  t ap;.  int rc;.
6af0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f    va_start(ap, o
6b00: 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p);.  switch( op
6b10: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
6b20: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f  ITE_DBCONFIG_LOO
6b30: 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20  KASIDE: {.      
6b40: 76 6f 69 64 20 2a 70 42 75 66 20 3d 20 76 61 5f  void *pBuf = va_
6b50: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20  arg(ap, void*); 
6b60: 2f 2a 20 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d  /* IMP: R-26835-
6b70: 31 30 39 36 34 20 2a 2f 0a 20 20 20 20 20 20 69  10964 */.      i
6b80: 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
6b90: 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 20 2f  p, int);       /
6ba0: 2a 20 49 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32  * IMP: R-47871-2
6bb0: 35 39 39 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e  5994 */.      in
6bc0: 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61  t cnt = va_arg(a
6bd0: 70 2c 20 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a  p, int);      /*
6be0: 20 49 4d 50 3a 20 52 2d 30 34 34 36 30 2d 35 33   IMP: R-04460-53
6bf0: 33 38 36 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  386 */.      rc 
6c00: 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65  = setupLookaside
6c10: 28 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63  (db, pBuf, sz, c
6c20: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
6c30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
6c40: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 74 61  ult: {.      sta
6c50: 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
6c60: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6f   {.        int o
6c70: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  p;      /* The o
6c80: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20  pcode */.       
6c90: 20 75 33 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a   u32 mask;    /*
6ca0: 20 4d 61 73 6b 20 6f 66 20 74 68 65 20 62 69 74   Mask of the bit
6cb0: 20 69 6e 20 73 71 6c 69 74 65 33 2e 66 6c 61 67   in sqlite3.flag
6cc0: 73 20 74 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a  s to set/clear *
6cd0: 2f 0a 20 20 20 20 20 20 7d 20 61 46 6c 61 67 4f  /.      } aFlagO
6ce0: 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  p[] = {.        
6cf0: 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  { SQLITE_DBCONFI
6d00: 47 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20  G_ENABLE_FKEY,  
6d10: 20 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e    SQLITE_Foreign
6d20: 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20 20 20 20  Keys    },.     
6d30: 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f     { SQLITE_DBCO
6d40: 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47  NFIG_ENABLE_TRIG
6d50: 47 45 52 2c 20 53 51 4c 49 54 45 5f 45 6e 61 62  GER, SQLITE_Enab
6d60: 6c 65 54 72 69 67 67 65 72 20 20 7d 2c 0a 20 20  leTrigger  },.  
6d70: 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 75 6e 73      };.      uns
6d80: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20  igned int i;.   
6d90: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
6da0: 52 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d  RROR; /* IMP: R-
6db0: 34 32 37 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20  42790-23372 */. 
6dc0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
6dd0: 41 72 72 61 79 53 69 7a 65 28 61 46 6c 61 67 4f  ArraySize(aFlagO
6de0: 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  p); i++){.      
6df0: 20 20 69 66 28 20 61 46 6c 61 67 4f 70 5b 69 5d    if( aFlagOp[i]
6e00: 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 20  .op==op ){.     
6e10: 20 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 20 3d       int onoff =
6e20: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
6e30: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
6e40: 2a 70 52 65 73 20 3d 20 76 61 5f 61 72 67 28 61  *pRes = va_arg(a
6e50: 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20  p, int*);.      
6e60: 20 20 20 20 69 6e 74 20 6f 6c 64 46 6c 61 67 73      int oldFlags
6e70: 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20   = db->flags;.  
6e80: 20 20 20 20 20 20 20 20 69 66 28 20 6f 6e 6f 66          if( onof
6e90: 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  f>0 ){.         
6ea0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
6eb0: 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b  aFlagOp[i].mask;
6ec0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
6ed0: 20 69 66 28 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b   if( onoff==0 ){
6ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d  .            db-
6ef0: 3e 66 6c 61 67 73 20 26 3d 20 7e 61 46 6c 61 67  >flags &= ~aFlag
6f00: 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20  Op[i].mask;.    
6f10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6f20: 20 20 69 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d    if( oldFlags!=
6f30: 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20  db->flags ){.   
6f40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6f50: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
6f60: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
6f70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6f80: 20 20 20 20 69 66 28 20 70 52 65 73 20 29 7b 0a      if( pRes ){.
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65              *pRe
6fa0: 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  s = (db->flags &
6fb0: 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b   aFlagOp[i].mask
6fc0: 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20  )!=0;.          
6fd0: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
6fe0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
6ff0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7000: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7010: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7020: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
7030: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
7040: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
7050: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 62 75  n true if the bu
7060: 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63  ffer z[0..n-1] c
7070: 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70 61 63  ontains all spac
7080: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
7090: 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73  t allSpaces(cons
70a0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
70b0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  ){.  while( n>0 
70c0: 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29  && z[n-1]==' ' )
70d0: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72  { n--; }.  retur
70e0: 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n n==0;.}../*.**
70f0: 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
7100: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66  ault collating f
7110: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42  unction named "B
7120: 49 4e 41 52 59 22 20 77 68 69 63 68 20 69 73 20  INARY" which is 
7130: 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61  always.** availa
7140: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
7150: 65 20 70 61 64 46 6c 61 67 20 61 72 67 75 6d 65  e padFlag argume
7160: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  nt is not NULL t
7170: 68 65 6e 20 73 70 61 63 65 20 70 61 64 64 69 6e  hen space paddin
7180: 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20  g at the end.** 
7190: 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20 69 67  of strings is ig
71a0: 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 6d 70  nored.  This imp
71b0: 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54 52 49  lements the RTRI
71c0: 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  M collation..*/.
71d0: 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e 43 6f  static int binCo
71e0: 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  llFunc(.  void *
71f0: 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e  padFlag,.  int n
7200: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
7210: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
7220: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
7230: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
7240: 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b   rc, n;.  n = nK
7250: 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79  ey1<nKey2 ? nKey
7260: 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 2f 2a 20  1 : nKey2;.  /* 
7270: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
7280: 35 30 33 33 2d 32 38 34 34 39 20 54 68 65 20 62  5033-28449 The b
7290: 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52 59 20 63  uilt-in BINARY c
72a0: 6f 6c 6c 61 74 69 6f 6e 20 63 6f 6d 70 61 72 65  ollation compare
72b0: 73 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 62  s.  ** strings b
72c0: 79 74 65 20 62 79 20 62 79 74 65 20 75 73 69 6e  yte by byte usin
72d0: 67 20 74 68 65 20 6d 65 6d 63 6d 70 28 29 20 66  g the memcmp() f
72e0: 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  unction from the
72f0: 20 73 74 61 6e 64 61 72 64 20 43 0a 20 20 2a 2a   standard C.  **
7300: 20 6c 69 62 72 61 72 79 2e 20 2a 2f 0a 20 20 72   library. */.  r
7310: 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31  c = memcmp(pKey1
7320: 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69  , pKey2, n);.  i
7330: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
7340: 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20 20 20  if( padFlag.    
7350: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
7360: 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20  char*)pKey1)+n, 
7370: 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20 26 26  nKey1-n).     &&
7380: 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61   allSpaces(((cha
7390: 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65  r*)pKey2)+n, nKe
73a0: 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20  y2-n).    ){.   
73b0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
73c0: 46 3a 20 52 2d 33 31 36 32 34 2d 32 34 37 33 37  F: R-31624-24737
73d0: 20 52 54 52 49 4d 20 69 73 20 6c 69 6b 65 20 42   RTRIM is like B
73e0: 49 4e 41 52 59 20 65 78 63 65 70 74 20 74 68 61  INARY except tha
73f0: 74 20 65 78 74 72 61 0a 20 20 20 20 20 20 2a 2a  t extra.      **
7400: 20 73 70 61 63 65 73 20 61 74 20 74 68 65 20 65   spaces at the e
7410: 6e 64 20 6f 66 20 65 69 74 68 65 72 20 73 74 72  nd of either str
7420: 69 6e 67 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67  ing do not chang
7430: 65 20 74 68 65 20 72 65 73 75 6c 74 2e 20 49 6e  e the result. In
7440: 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20   other.      ** 
7450: 77 6f 72 64 73 2c 20 73 74 72 69 6e 67 73 20 77  words, strings w
7460: 69 6c 6c 20 63 6f 6d 70 61 72 65 20 65 71 75 61  ill compare equa
7470: 6c 20 74 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72  l to one another
7480: 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 79   as long as they
7490: 0a 20 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72  .      ** differ
74a0: 20 6f 6e 6c 79 20 69 6e 20 74 68 65 20 6e 75 6d   only in the num
74b0: 62 65 72 20 6f 66 20 73 70 61 63 65 73 20 61 74  ber of spaces at
74c0: 20 74 68 65 20 65 6e 64 2e 0a 20 20 20 20 20 20   the end..      
74d0: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
74e0: 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d      rc = nKey1 -
74f0: 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20   nKey2;.    }.  
7500: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
7510: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20  ../*.** Another 
7520: 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69  built-in collati
7530: 6e 67 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43  ng sequence: NOC
7540: 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ASE. .**.** This
7550: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
7560: 6e 63 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20  nce is intended 
7570: 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 22  to be used for "
7580: 63 61 73 65 20 69 6e 64 65 70 65 6e 64 65 6e 74  case independent
7590: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e  .** comparison".
75a0: 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65   SQLite's knowle
75b0: 64 67 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64  dge of upper and
75c0: 20 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75 69   lower case equi
75d0: 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e  valents.** exten
75e0: 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32  ds only to the 2
75f0: 36 20 63 68 61 72 61 63 74 65 72 73 20 75 73 65  6 characters use
7600: 64 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68  d in the English
7610: 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a   language..**.**
7620: 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74   At the moment t
7630: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55  here is only a U
7640: 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74  TF-8 implementat
7650: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
7660: 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69  nt nocaseCollati
7670: 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  ngFunc(.  void *
7680: 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e  NotUsed,.  int n
7690: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
76a0: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
76b0: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
76c0: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
76d0: 20 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e   r = sqlite3StrN
76e0: 49 43 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e  ICmp(.      (con
76f0: 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c  st char *)pKey1,
7700: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
7710: 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65  Key2, (nKey1<nKe
7720: 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29  y2)?nKey1:nKey2)
7730: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
7740: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
7750: 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20   if( 0==r ){.   
7760: 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32   r = nKey1-nKey2
7770: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
7780: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7790: 6e 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74  n the ROWID of t
77a0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69  he most recent i
77b0: 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f  nsert.*/.sqlite_
77c0: 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c 61  int64 sqlite3_la
77d0: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
77e0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
77f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7800: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
7810: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
7820: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
7830: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
7840: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
7850: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
7860: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
7870: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d  db->lastRowid;.}
7880: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7890: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
78a0: 6e 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74  nges in the most
78b0: 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20   recent call to 
78c0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a  sqlite3_exec()..
78d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
78e0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
78f0: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
7900: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
7910: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
7920: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
7930: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
7940: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
7950: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
7960: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
7970: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e  return db->nChan
7980: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ge;.}../*.** Ret
7990: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
79a0: 66 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65 20  f changes since 
79b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
79c0: 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  dle was opened..
79d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  */.int sqlite3_t
79e0: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c  otal_changes(sql
79f0: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65  ite3 *db){.#ifde
7a00: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7a10: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
7a20: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
7a30: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
7a40: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
7a50: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
7a60: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
7a70: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  dif.  return db-
7a80: 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d  >nTotalChange;.}
7a90: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
7aa0: 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
7ab0: 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
7ac0: 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65   only manipulate
7ad0: 73 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a  s fields of the.
7ae0: 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
7af0: 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f  le object, it do
7b00: 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79  es not close any
7b10: 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74   savepoints that
7b20: 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20   may be open.** 
7b30: 61 74 20 74 68 65 20 62 2d 74 72 65 65 2f 70 61  at the b-tree/pa
7b40: 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f  ger level..*/.vo
7b50: 69 64 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53  id sqlite3CloseS
7b60: 61 76 65 70 6f 69 6e 74 73 28 73 71 6c 69 74 65  avepoints(sqlite
7b70: 33 20 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65 28  3 *db){.  while(
7b80: 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
7b90: 29 7b 0a 20 20 20 20 53 61 76 65 70 6f 69 6e 74  ){.    Savepoint
7ba0: 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61   *pTmp = db->pSa
7bb0: 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d  vepoint;.    db-
7bc0: 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54  >pSavepoint = pT
7bd0: 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  mp->pNext;.    s
7be0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7bf0: 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62   pTmp);.  }.  db
7c00: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->nSavepoint = 0
7c10: 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  ;.  db->nStateme
7c20: 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73  nt = 0;.  db->is
7c30: 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70  TransactionSavep
7c40: 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  oint = 0;.}../*.
7c50: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 64 65  ** Invoke the de
7c60: 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f  structor functio
7c70: 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  n associated wit
7c80: 68 20 46 75 6e 63 44 65 66 20 70 2c 20 69 66 20  h FuncDef p, if 
7c90: 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20  any. Except,.** 
7ca0: 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  if this is not t
7cb0: 68 65 20 6c 61 73 74 20 63 6f 70 79 20 6f 66 20  he last copy of 
7cc0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f  the function, do
7cd0: 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20   not invoke it. 
7ce0: 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69  Multiple.** copi
7cf0: 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 66  es of a single f
7d00: 75 6e 63 74 69 6f 6e 20 61 72 65 20 63 72 65 61  unction are crea
7d10: 74 65 64 20 77 68 65 6e 20 63 72 65 61 74 65 5f  ted when create_
7d20: 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 63 61  function() is ca
7d30: 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c  lled.** with SQL
7d40: 49 54 45 5f 41 4e 59 20 61 73 20 74 68 65 20 65  ITE_ANY as the e
7d50: 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ncoding..*/.stat
7d60: 69 63 20 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e  ic void function
7d70: 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33 20  Destroy(sqlite3 
7d80: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 29  *db, FuncDef *p)
7d90: 7b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74  {.  FuncDestruct
7da0: 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 20  or *pDestructor 
7db0: 3d 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72  = p->pDestructor
7dc0: 3b 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63  ;.  if( pDestruc
7dd0: 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74  tor ){.    pDest
7de0: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a  ructor->nRef--;.
7df0: 20 20 20 20 69 66 28 20 70 44 65 73 74 72 75 63      if( pDestruc
7e00: 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  tor->nRef==0 ){.
7e10: 20 20 20 20 20 20 70 44 65 73 74 72 75 63 74 6f        pDestructo
7e20: 72 2d 3e 78 44 65 73 74 72 6f 79 28 70 44 65 73  r->xDestroy(pDes
7e30: 74 72 75 63 74 6f 72 2d 3e 70 55 73 65 72 44 61  tructor->pUserDa
7e40: 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ta);.      sqlit
7e50: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65  e3DbFree(db, pDe
7e60: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d  structor);.    }
7e70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  .  }.}../*.** Di
7e80: 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71 6c  sconnect all sql
7e90: 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74  ite3_vtab object
7ea0: 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  s that belong to
7eb0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
7ec0: 74 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69 73  tion.** db. This
7ed0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
7ee0: 64 62 20 69 73 20 62 65 69 6e 67 20 63 6c 6f 73  db is being clos
7ef0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
7f00: 69 64 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c  id disconnectAll
7f10: 56 74 61 62 28 73 71 6c 69 74 65 33 20 2a 64 62  Vtab(sqlite3 *db
7f20: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
7f30: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
7f40: 42 4c 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20 48  BLE.  int i;.  H
7f50: 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 73 71  ashElem *p;.  sq
7f60: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
7f70: 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d  ll(db);.  for(i=
7f80: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
7f90: 2b 29 7b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a  +){.    Schema *
7fa0: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
7fb0: 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  b[i].pSchema;.  
7fc0: 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d    if( db->aDb[i]
7fd0: 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
7fe0: 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61    for(p=sqliteHa
7ff0: 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d 61  shFirst(&pSchema
8000: 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 3b 20 70  ->tblHash); p; p
8010: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
8020: 70 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62  p)){.        Tab
8030: 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c  le *pTab = (Tabl
8040: 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  e *)sqliteHashDa
8050: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  ta(p);.        i
8060: 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
8070: 62 29 20 29 20 73 71 6c 69 74 65 33 56 74 61 62  b) ) sqlite3Vtab
8080: 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70  Disconnect(db, p
8090: 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
80a0: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 3d    }.  }.  for(p=
80b0: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
80c0: 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 70  &db->aModule); p
80d0: 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; p=sqliteHashNe
80e0: 78 74 28 70 29 29 7b 0a 20 20 20 20 4d 6f 64 75  xt(p)){.    Modu
80f0: 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75  le *pMod = (Modu
8100: 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  le *)sqliteHashD
8110: 61 74 61 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ata(p);.    if( 
8120: 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 20 29 7b  pMod->pEpoTab ){
8130: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
8140: 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c  abDisconnect(db,
8150: 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 29 3b   pMod->pEpoTab);
8160: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
8170: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
8180: 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  st(db);.  sqlite
8190: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
81a0: 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  b);.#else.  UNUS
81b0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29  ED_PARAMETER(db)
81c0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
81d0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
81e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
81f0: 74 69 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69  tion db has unfi
8200: 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64  nalized prepared
8210: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  .** statements o
8220: 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c  r unfinished sql
8230: 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65  ite3_backup obje
8240: 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  cts.  .*/.static
8250: 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49   int connectionI
8260: 73 42 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64  sBusy(sqlite3 *d
8270: 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61  b){.  int j;.  a
8280: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8290: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
82a0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62  tex) );.  if( db
82b0: 2d 3e 70 56 64 62 65 20 29 20 72 65 74 75 72 6e  ->pVdbe ) return
82c0: 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   1;.  for(j=0; j
82d0: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
82e0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
82f0: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b   db->aDb[j].pBt;
8300: 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
8310: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
8320: 42 61 63 6b 75 70 28 70 42 74 29 20 29 20 72 65  Backup(pBt) ) re
8330: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
8340: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
8350: 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69   Close an existi
8360: 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ng SQLite databa
8370: 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  se.*/.static int
8380: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71   sqlite3Close(sq
8390: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66  lite3 *db, int f
83a0: 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69  orceZombie){.  i
83b0: 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 2f 2a  f( !db ){.    /*
83c0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
83d0: 36 33 32 35 37 2d 31 31 37 34 30 20 43 61 6c 6c  63257-11740 Call
83e0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  ing sqlite3_clos
83f0: 65 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  e() or.    ** sq
8400: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29  lite3_close_v2()
8410: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f 69   with a NULL poi
8420: 6e 74 65 72 20 61 72 67 75 6d 65 6e 74 20 69 73  nter argument is
8430: 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f   a harmless no-o
8440: 70 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  p. */.    return
8450: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
8460: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
8470: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
8480: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
8490: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
84a0: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71  E_BKPT;.  }.  sq
84b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
84c0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20  r(db->mutex);.. 
84d0: 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73 63 6f   /* Force xDisco
84e0: 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e 20 61  nnect calls on a
84f0: 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ll virtual table
8500: 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e 65 63  s */.  disconnec
8510: 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a 0a 20  tAllVtab(db);.. 
8520: 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63   /* If a transac
8530: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68  tion is open, th
8540: 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56  e disconnectAllV
8550: 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f 76 65  tab() call above
8560: 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68  .  ** will not h
8570: 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20 78  ave called the x
8580: 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74  Disconnect() met
8590: 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74 75  hod on any virtu
85a0: 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 69  al.  ** tables i
85b0: 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e  n the db->aVTran
85c0: 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20 66  s[] array. The f
85d0: 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33  ollowing sqlite3
85e0: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20  VtabRollback(). 
85f0: 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f   ** call will do
8600: 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f 20   so. We need to 
8610: 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 74  do this before t
8620: 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63 74  he check for act
8630: 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  ive.  ** SQL sta
8640: 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61  tements below, a
8650: 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69 6d  s the v-table im
8660: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79  plementation may
8670: 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a   be storing.  **
8680: 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20 73   some prepared s
8690: 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e  tatements intern
86a0: 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ally..  */.  sql
86b0: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
86c0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65 67 61  (db);..  /* Lega
86d0: 63 79 20 62 65 68 61 76 69 6f 72 20 28 73 71 6c  cy behavior (sql
86e0: 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62 65 68  ite3_close() beh
86f0: 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72 65 74  avior) is to ret
8700: 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  urn.  ** SQLITE_
8710: 42 55 53 59 20 69 66 20 74 68 65 20 63 6f 6e 6e  BUSY if the conn
8720: 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74 20 62  ection can not b
8730: 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61  e closed immedia
8740: 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tely..  */.  if(
8750: 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20 26 26   !forceZombie &&
8760: 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73   connectionIsBus
8770: 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  y(db) ){.    sql
8780: 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
8790: 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  (db, SQLITE_BUSY
87a0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f  , "unable to clo
87b0: 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 61  se due to unfina
87c0: 6c 69 7a 65 64 20 22 0a 20 20 20 20 20 20 20 22  lized ".       "
87d0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e  statements or un
87e0: 66 69 6e 69 73 68 65 64 20 62 61 63 6b 75 70 73  finished backups
87f0: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ");.    sqlite3_
8800: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
8810: 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75  mutex);.    retu
8820: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
8830: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
8840: 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47  TE_ENABLE_SQLLOG
8850: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
8860: 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c  obalConfig.xSqll
8870: 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6c 6f  og ){.    /* Clo
8880: 73 69 6e 67 20 74 68 65 20 68 61 6e 64 6c 65 2e  sing the handle.
8890: 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65   Fourth paramete
88a0: 72 20 69 73 20 70 61 73 73 65 64 20 74 68 65 20  r is passed the 
88b0: 76 61 6c 75 65 20 32 2e 20 2a 2f 0a 20 20 20 20  value 2. */.    
88c0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
88d0: 66 69 67 2e 78 53 71 6c 6c 6f 67 28 73 71 6c 69  fig.xSqllog(sqli
88e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
88f0: 70 53 71 6c 6c 6f 67 41 72 67 2c 20 64 62 2c 20  pSqllogArg, db, 
8900: 30 2c 20 32 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 2);.  }.#endi
8910: 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  f..  /* Convert 
8920: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
8930: 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20 61 6e 64  nto a zombie and
8940: 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 2e 0a   then close it..
8950: 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61 67 69 63    */.  db->magic
8960: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
8970: 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c 69 74 65  ZOMBIE;.  sqlite
8980: 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c  3LeaveMutexAndCl
8990: 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29 3b 0a 20  oseZombie(db);. 
89a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
89b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20  K;.}../*.** Two 
89c0: 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20 74 68  variations on th
89d0: 65 20 70 75 62 6c 69 63 20 69 6e 74 65 72 66 61  e public interfa
89e0: 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 61  ce for closing a
89f0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
8a00: 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 73 71 6c  nection. The sql
8a10: 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 76 65 72  ite3_close() ver
8a20: 73 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  sion returns SQL
8a30: 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20  ITE_BUSY and.** 
8a40: 6c 65 61 76 65 73 20 74 68 65 20 63 6f 6e 6e 65  leaves the conne
8a50: 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20 69 66 20  ction option if 
8a60: 74 68 65 72 65 20 61 72 65 20 75 6e 66 69 6e 61  there are unfina
8a70: 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a  lized prepared.*
8a80: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20  * statements or 
8a90: 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74  unfinished sqlit
8aa0: 65 33 5f 62 61 63 6b 75 70 73 2e 20 20 54 68 65  e3_backups.  The
8ab0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
8ac0: 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 66  2().** version f
8ad0: 6f 72 63 65 73 20 74 68 65 20 63 6f 6e 6e 65 63  orces the connec
8ae0: 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d 65 20 61  tion to become a
8af0: 20 7a 6f 6d 62 69 65 20 69 66 20 74 68 65 72 65   zombie if there
8b00: 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65 64   are.** unclosed
8b10: 20 72 65 73 6f 75 72 63 65 73 2c 20 61 6e 64 20   resources, and 
8b20: 61 72 72 61 6e 67 65 73 20 66 6f 72 20 64 65 61  arranges for dea
8b30: 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65 6e 20 74  llocation when t
8b40: 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72 65 70 61  he last.** prepa
8b50: 72 65 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20  re statement or 
8b60: 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 63  sqlite3_backup c
8b70: 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  loses..*/.int sq
8b80: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69  lite3_close(sqli
8b90: 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e  te3 *db){ return
8ba0: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62   sqlite3Close(db
8bb0: 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74  ,0); }.int sqlit
8bc0: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73 71 6c 69  e3_close_v2(sqli
8bd0: 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e  te3 *db){ return
8be0: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62   sqlite3Close(db
8bf0: 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ,1); }.../*.** C
8c00: 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 6f  lose the mutex o
8c10: 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  n database conne
8c20: 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a 20  ction db..**.** 
8c30: 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 66 20  Furthermore, if 
8c40: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
8c50: 69 6f 6e 20 64 62 20 69 73 20 61 20 7a 6f 6d 62  ion db is a zomb
8c60: 69 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74  ie (meaning that
8c70: 20 74 68 65 72 65 0a 2a 2a 20 68 61 73 20 62 65   there.** has be
8c80: 65 6e 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  en a prior call 
8c90: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  to sqlite3_close
8ca0: 28 64 62 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  (db) or sqlite3_
8cb0: 63 6c 6f 73 65 5f 76 32 28 64 62 29 29 20 61 6e  close_v2(db)) an
8cc0: 64 0a 2a 2a 20 65 76 65 72 79 20 73 71 6c 69 74  d.** every sqlit
8cd0: 65 33 5f 73 74 6d 74 20 68 61 73 20 6e 6f 77 20  e3_stmt has now 
8ce0: 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61  been finalized a
8cf0: 6e 64 20 65 76 65 72 79 20 73 71 6c 69 74 65 33  nd every sqlite3
8d00: 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a 2a 20 66  _backup has.** f
8d10: 69 6e 69 73 68 65 64 2c 20 74 68 65 6e 20 66 72  inished, then fr
8d20: 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73  ee all resources
8d30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8d40: 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c  3LeaveMutexAndCl
8d50: 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c 69 74 65  oseZombie(sqlite
8d60: 33 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c  3 *db){.  HashEl
8d70: 65 6d 20 2a 69 3b 20 20 20 20 20 20 20 20 20 20  em *i;          
8d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
8d90: 68 20 74 61 62 6c 65 20 69 74 65 72 61 74 6f 72  h table iterator
8da0: 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20   */.  int j;..  
8db0: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
8dc0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 73 71 6c 69  outstanding sqli
8dd0: 74 65 33 5f 73 74 6d 74 20 6f 72 20 73 71 6c 69  te3_stmt or sqli
8de0: 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63  te3_backup objec
8df0: 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  ts.  ** or if th
8e00: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  e connection has
8e10: 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6c   not yet been cl
8e20: 6f 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  osed by sqlite3_
8e30: 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20 20 2a 2a  close_v2(),.  **
8e40: 20 74 68 65 6e 20 6a 75 73 74 20 6c 65 61 76 65   then just leave
8e50: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 72   the mutex and r
8e60: 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  eturn..  */.  if
8e70: 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c  ( db->magic!=SQL
8e80: 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45  ITE_MAGIC_ZOMBIE
8e90: 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73   || connectionIs
8ea0: 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20  Busy(db) ){.    
8eb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
8ec0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
8ed0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8ee0: 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
8ef0: 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
8f00: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
8f10: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
8f20: 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20 63 6c 6f  ion has.  ** clo
8f30: 73 65 64 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f  sed all sqlite3_
8f40: 73 74 6d 74 20 61 6e 64 20 73 71 6c 69 74 65 33  stmt and sqlite3
8f50: 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20  _backup objects 
8f60: 61 6e 64 20 68 61 73 20 62 65 65 6e 0a 20 20 2a  and has been.  *
8f70: 2a 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  * passed to sqli
8f80: 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65 61 6e 69  te3_close (meani
8f90: 6e 67 20 74 68 61 74 20 69 74 20 69 73 20 61 20  ng that it is a 
8fa0: 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65 72 65 66  zombie).  Theref
8fb0: 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20 61 68 65  ore,.  ** go ahe
8fc0: 61 64 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20  ad and free all 
8fd0: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 2a 2f 0a  resources..  */.
8fe0: 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73  .  /* If a trans
8ff0: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20  action is open, 
9000: 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 54 68  roll it back. Th
9010: 69 73 20 61 6c 73 6f 20 65 6e 73 75 72 65 73 20  is also ensures 
9020: 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 61 6e 79  that if.  ** any
9030: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
9040: 73 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  s have been modi
9050: 66 69 65 64 20 62 79 20 61 6e 20 75 6e 63 6f 6d  fied by an uncom
9060: 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69  mitted transacti
9070: 6f 6e 0a 20 20 2a 2a 20 74 68 65 79 20 61 72 65  on.  ** they are
9080: 20 72 65 73 65 74 2e 20 41 6e 64 20 74 68 61 74   reset. And that
9090: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 62 2d   the required b-
90a0: 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65  tree mutex is he
90b0: 6c 64 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20  ld to make.  ** 
90c0: 74 68 65 20 70 61 67 65 72 20 72 6f 6c 6c 62 61  the pager rollba
90d0: 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65  ck and schema re
90e0: 73 65 74 20 61 6e 20 61 74 6f 6d 69 63 20 6f 70  set an atomic op
90f0: 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71  eration. */.  sq
9100: 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
9110: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
9120: 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  ..  /* Free any 
9130: 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61 76 65  outstanding Save
9140: 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 73  point structures
9150: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c  . */.  sqlite3Cl
9160: 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
9170: 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  );..  /* Close a
9180: 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ll database conn
9190: 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72  ections */.  for
91a0: 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b  (j=0; j<db->nDb;
91b0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   j++){.    struc
91c0: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
91d0: 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  >aDb[j];.    if(
91e0: 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20   pDb->pBt ){.   
91f0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
9200: 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a  lose(pDb->pBt);.
9210: 20 20 20 20 20 20 70 44 62 2d 3e 70 42 74 20 3d        pDb->pBt =
9220: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 21   0;.      if( j!
9230: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  =1 ){.        pD
9240: 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a  b->pSchema = 0;.
9250: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9260: 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65  }.  /* Clear the
9270: 20 54 45 4d 50 20 73 63 68 65 6d 61 20 73 65 70   TEMP schema sep
9280: 61 72 61 74 65 6c 79 20 61 6e 64 20 6c 61 73 74  arately and last
9290: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 44   */.  if( db->aD
92a0: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a  b[1].pSchema ){.
92b0: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
92c0: 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b 31  aClear(db->aDb[1
92d0: 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ].pSchema);.  }.
92e0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c    sqlite3VtabUnl
92f0: 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20 20  ockList(db);..  
9300: 2f 2a 20 46 72 65 65 20 75 70 20 74 68 65 20 61  /* Free up the a
9310: 72 72 61 79 20 6f 66 20 61 75 78 69 6c 69 61 72  rray of auxiliar
9320: 79 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  y databases */. 
9330: 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65   sqlite3Collapse
9340: 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62  DatabaseArray(db
9350: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
9360: 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73  >nDb<=2 );.  ass
9370: 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62  ert( db->aDb==db
9380: 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a 0a  ->aDbStatic );..
9390: 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f    /* Tell the co
93a0: 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74  de in notify.c t
93b0: 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  hat the connecti
93c0: 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c  on no longer hol
93d0: 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b  ds any.  ** lock
93e0: 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72  s and does not r
93f0: 65 71 75 69 72 65 20 61 6e 79 20 66 75 72 74 68  equire any furth
9400: 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79  er unlock-notify
9410: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f   callbacks..  */
9420: 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  .  sqlite3Connec
9430: 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a  tionClosed(db);.
9440: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72  .  for(j=0; j<Ar
9450: 72 61 79 53 69 7a 65 28 64 62 2d 3e 61 46 75 6e  raySize(db->aFun
9460: 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  c.a); j++){.    
9470: 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c 20  FuncDef *pNext, 
9480: 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20 20 20  *pHash, *p;.    
9490: 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e 63 2e  for(p=db->aFunc.
94a0: 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61 73 68  a[j]; p; p=pHash
94b0: 29 7b 0a 20 20 20 20 20 20 70 48 61 73 68 20 3d  ){.      pHash =
94c0: 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20 20   p->pHash;.     
94d0: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
94e0: 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73       functionDes
94f0: 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20  troy(db, p);.   
9500: 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e       pNext = p->
9510: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73  pNext;.        s
9520: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9530: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d   p);.        p =
9540: 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a   pNext;.      }.
9550: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
9560: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
9570: 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  t(&db->aCollSeq)
9580: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
9590: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43  hNext(i)){.    C
95a0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
95b0: 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74  (CollSeq *)sqlit
95c0: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
95d0: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20    /* Invoke any 
95e0: 64 65 73 74 72 75 63 74 6f 72 73 20 72 65 67 69  destructors regi
95f0: 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61  stered for colla
9600: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73  tion sequence us
9610: 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  er data. */.    
9620: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b  for(j=0; j<3; j+
9630: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  +){.      if( pC
9640: 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20  oll[j].xDel ){. 
9650: 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e         pColl[j].
9660: 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55  xDel(pColl[j].pU
9670: 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ser);.      }.  
9680: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
9690: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29  bFree(db, pColl)
96a0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
96b0: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43  ashClear(&db->aC
96c0: 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66  ollSeq);.#ifndef
96d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
96e0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28  TUALTABLE.  for(
96f0: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
9700: 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
9710: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
9720: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f  Next(i)){.    Mo
9730: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
9740: 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73  dule *)sqliteHas
9750: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
9760: 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79  ( pMod->xDestroy
9770: 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e   ){.      pMod->
9780: 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70  xDestroy(pMod->p
9790: 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Aux);.    }.    
97a0: 73 71 6c 69 74 65 33 56 74 61 62 45 70 6f 6e 79  sqlite3VtabEpony
97b0: 6d 6f 75 73 54 61 62 6c 65 43 6c 65 61 72 28 64  mousTableClear(d
97c0: 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 20 20 73 71  b, pMod);.    sq
97d0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
97e0: 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pMod);.  }.  sql
97f0: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
9800: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
9810: 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72  dif..  sqlite3Er
9820: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
9830: 4b 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  K); /* Deallocat
9840: 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72  es any cached er
9850: 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a  ror strings. */.
9860: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
9870: 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  ee(db->pErr);.  
9880: 73 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65  sqlite3CloseExte
9890: 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 23 69 66 20  nsions(db);.#if 
98a0: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
98b0: 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 73 71 6c  ENTICATION.  sql
98c0: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75  ite3_free(db->au
98d0: 74 68 2e 7a 41 75 74 68 55 73 65 72 29 3b 0a 20  th.zAuthUser);. 
98e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
98f0: 2d 3e 61 75 74 68 2e 7a 41 75 74 68 50 57 29 3b  ->auth.zAuthPW);
9900: 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d  .#endif..  db->m
9910: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
9920: 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a  GIC_ERROR;..  /*
9930: 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61   The temp-databa
9940: 73 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c  se schema is all
9950: 6f 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74  ocated different
9960: 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  ly from the othe
9970: 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62  r schema.  ** ob
9980: 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c  jects (using sql
9990: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65  iteMalloc() dire
99a0: 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66  ctly, instead of
99b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
99c0: 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20  ema())..  ** So 
99d0: 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  it needs to be f
99e0: 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a  reed here. Todo:
99f0: 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68   Why not roll th
9a00: 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e  e temp schema in
9a10: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  to.  ** the same
9a20: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
9a30: 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20  as the one that 
9a40: 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61  allocates the da
9a50: 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72  tabase .  ** str
9a60: 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73  ucture?.  */.  s
9a70: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
9a80: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
9a90: 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ema);.  sqlite3_
9aa0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
9ab0: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61  mutex);.  db->ma
9ac0: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
9ad0: 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c  IC_CLOSED;.  sql
9ae0: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
9af0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
9b00: 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73  sert( db->lookas
9b10: 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20  ide.nOut==0 );  
9b20: 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f  /* Fails on a lo
9b30: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c  okaside memory l
9b40: 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  eak */.  if( db-
9b50: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
9b60: 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  oced ){.    sqli
9b70: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f  te3_free(db->loo
9b80: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a  kaside.pStart);.
9b90: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
9ba0: 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee(db);.}../*.**
9bb0: 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61   Rollback all da
9bc0: 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 20 49  tabase files.  I
9bd0: 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f  f tripCode is no
9be0: 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65  t SQLITE_OK, the
9bf0: 6e 0a 2a 2a 20 61 6e 79 20 77 72 69 74 65 20 63  n.** any write c
9c00: 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c  ursors are inval
9c10: 69 64 61 74 65 64 20 28 22 74 72 69 70 70 65 64  idated ("tripped
9c20: 22 20 2d 20 61 73 20 69 6e 20 22 74 72 69 70 70  " - as in "tripp
9c30: 69 6e 67 20 61 20 63 69 72 63 75 69 74 0a 2a 2a  ing a circuit.**
9c40: 20 62 72 65 61 6b 65 72 22 29 20 61 6e 64 20 6d   breaker") and m
9c50: 61 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74 72  ade to return tr
9c60: 69 70 43 6f 64 65 20 69 66 20 74 68 65 72 65 20  ipCode if there 
9c70: 61 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 0a  are any further.
9c80: 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75  ** attempts to u
9c90: 73 65 20 74 68 61 74 20 63 75 72 73 6f 72 2e 20  se that cursor. 
9ca0: 20 52 65 61 64 20 63 75 72 73 6f 72 73 20 72 65   Read cursors re
9cb0: 6d 61 69 6e 20 6f 70 65 6e 20 61 6e 64 20 76 61  main open and va
9cc0: 6c 69 64 0a 2a 2a 20 62 75 74 20 61 72 65 20 22  lid.** but are "
9cd0: 73 61 76 65 64 22 20 69 6e 20 63 61 73 65 20 74  saved" in case t
9ce0: 68 65 20 74 61 62 6c 65 20 70 61 67 65 73 20 61  he table pages a
9cf0: 72 65 20 6d 6f 76 65 64 20 61 72 6f 75 6e 64 2e  re moved around.
9d00: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9d10: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69  RollbackAll(sqli
9d20: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 74 72 69  te3 *db, int tri
9d30: 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pCode){.  int i;
9d40: 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d  .  int inTrans =
9d50: 20 30 3b 0a 20 20 69 6e 74 20 73 63 68 65 6d 61   0;.  int schema
9d60: 43 68 61 6e 67 65 3b 0a 20 20 61 73 73 65 72 74  Change;.  assert
9d70: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9d80: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
9d90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
9da0: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
9db0: 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 6c  ..  /* Obtain al
9dc0: 6c 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73  l b-tree mutexes
9dd0: 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 20 61   before making a
9de0: 6e 79 20 63 61 6c 6c 73 20 74 6f 20 42 74 72 65  ny calls to Btre
9df0: 65 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 0a 20 20  eRollback(). .  
9e00: 2a 2a 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  ** This is impor
9e10: 74 61 6e 74 20 69 6e 20 63 61 73 65 20 74 68 65  tant in case the
9e20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69   transaction bei
9e30: 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 68  ng rolled back h
9e40: 61 73 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64  as.  ** modified
9e50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
9e60: 68 65 6d 61 2e 20 49 66 20 74 68 65 20 62 2d 74  hema. If the b-t
9e70: 72 65 65 20 6d 75 74 65 78 65 73 20 61 72 65 20  ree mutexes are 
9e80: 6e 6f 74 20 74 61 6b 65 6e 0a 20 20 2a 2a 20 68  not taken.  ** h
9e90: 65 72 65 2c 20 74 68 65 6e 20 61 6e 6f 74 68 65  ere, then anothe
9ea0: 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63  r shared-cache c
9eb0: 6f 6e 6e 65 63 74 69 6f 6e 20 6d 69 67 68 74 20  onnection might 
9ec0: 73 6e 65 61 6b 20 69 6e 20 62 65 74 77 65 65 6e  sneak in between
9ed0: 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61  .  ** the databa
9ee0: 73 65 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  se rollback and 
9ef0: 73 63 68 65 6d 61 20 72 65 73 65 74 2c 20 77 68  schema reset, wh
9f00: 69 63 68 20 63 61 6e 20 63 61 75 73 65 20 66 61  ich can cause fa
9f10: 6c 73 65 0a 20 20 2a 2a 20 63 6f 72 72 75 70 74  lse.  ** corrupt
9f20: 69 6f 6e 20 72 65 70 6f 72 74 73 20 69 6e 20 73  ion reports in s
9f30: 6f 6d 65 20 63 61 73 65 73 2e 20 20 2a 2f 0a 20  ome cases.  */. 
9f40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
9f50: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 73 63 68  erAll(db);.  sch
9f60: 65 6d 61 43 68 61 6e 67 65 20 3d 20 28 64 62 2d  emaChange = (db-
9f70: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
9f80: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21 3d  InternChanges)!=
9f90: 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75  0 && db->init.bu
9fa0: 73 79 3d 3d 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  sy==0;..  for(i=
9fb0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
9fc0: 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  +){.    Btree *p
9fd0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
9fe0: 74 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  t;.    if( p ){.
9ff0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
a000: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
a010: 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  p) ){.        in
a020: 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20  Trans = 1;.     
a030: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a040: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c  BtreeRollback(p,
a050: 20 74 72 69 70 43 6f 64 65 2c 20 21 73 63 68 65   tripCode, !sche
a060: 6d 61 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 7d  maChange);.    }
a070: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74  .  }.  sqlite3Vt
a080: 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a  abRollback(db);.
a090: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
a0a0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69  gnMalloc();..  i
a0b0: 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51  f( (db->flags&SQ
a0c0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
a0d0: 65 73 29 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e  es)!=0 && db->in
a0e0: 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20  it.busy==0 ){.  
a0f0: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
a100: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
a110: 73 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  s(db);.    sqlit
a120: 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61  e3ResetAllSchema
a130: 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62  sOfConnection(db
a140: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
a150: 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62  BtreeLeaveAll(db
a160: 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66  );..  /* Any def
a170: 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74  erred constraint
a180: 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65   violations have
a190: 20 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c 76   now been resolv
a1a0: 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65  ed. */.  db->nDe
a1b0: 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a  ferredCons = 0;.
a1c0: 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49    db->nDeferredI
a1d0: 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62  mmCons = 0;.  db
a1e0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
a1f0: 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 0a 20 20  TE_DeferFKs;..  
a200: 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62 65  /* If one has be
a210: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69  en configured, i
a220: 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61  nvoke the rollba
a230: 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b  ck-hook callback
a240: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 52   */.  if( db->xR
a250: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20  ollbackCallback 
a260: 26 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21  && (inTrans || !
a270: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20  db->autoCommit) 
a280: 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c  ){.    db->xRoll
a290: 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d  backCallback(db-
a2a0: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a  >pRollbackArg);.
a2b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
a2c0: 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72  urn a static str
a2d0: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
a2e0: 68 65 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f  he name correspo
a2f0: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 65 72 72  nding to the err
a300: 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70 65 63 69  or code.** speci
a310: 66 69 65 64 20 69 6e 20 74 68 65 20 61 72 67 75  fied in the argu
a320: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  ment..*/.#if def
a330: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 45 45 44  ined(SQLITE_NEED
a340: 5f 45 52 52 5f 4e 41 4d 45 29 0a 63 6f 6e 73 74  _ERR_NAME).const
a350: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72   char *sqlite3Er
a360: 72 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a 20  rName(int rc){. 
a370: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
a380: 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c  me = 0;.  int i,
a390: 20 6f 72 69 67 52 63 20 3d 20 72 63 3b 0a 20 20   origRc = rc;.  
a3a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 20 26 26 20  for(i=0; i<2 && 
a3b0: 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20 72  zName==0; i++, r
a3c0: 63 20 26 3d 20 30 78 66 66 29 7b 0a 20 20 20 20  c &= 0xff){.    
a3d0: 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20  switch( rc ){.  
a3e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a3f0: 4f 4b 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  OK:             
a400: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a410: 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20  ITE_OK";        
a420: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a430: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a440: 5f 45 52 52 4f 52 3a 20 20 20 20 20 20 20 20 20  _ERROR:         
a450: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a460: 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20  LITE_ERROR";    
a470: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a480: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a490: 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20 20 20 20  E_INTERNAL:     
a4a0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a4b0: 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b  QLITE_INTERNAL";
a4c0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a4d0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a4e0: 54 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20 20  TE_PERM:        
a4f0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a500: 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20 20  SQLITE_PERM";   
a510: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
a520: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a530: 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20  ITE_ABORT:      
a540: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a550: 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20  "SQLITE_ABORT"; 
a560: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a570: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a580: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
a590: 41 43 4b 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ACK:     zName =
a5a0: 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52   "SQLITE_ABORT_R
a5b0: 4f 4c 4c 42 41 43 4b 22 3b 20 20 20 20 62 72 65  OLLBACK";    bre
a5c0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a5d0: 51 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20  QLITE_BUSY:     
a5e0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a5f0: 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 22 3b  = "SQLITE_BUSY";
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
a610: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a620: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f  SQLITE_BUSY_RECO
a630: 56 45 52 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65  VERY:      zName
a640: 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f   = "SQLITE_BUSY_
a650: 52 45 43 4f 56 45 52 59 22 3b 20 20 20 20 20 62  RECOVERY";     b
a660: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a670: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41   SQLITE_BUSY_SNA
a680: 50 53 48 4f 54 3a 20 20 20 20 20 20 7a 4e 61 6d  PSHOT:      zNam
a690: 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59  e = "SQLITE_BUSY
a6a0: 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20 20 20 20  _SNAPSHOT";     
a6b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a6c0: 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a  e SQLITE_LOCKED:
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
a6e0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43  me = "SQLITE_LOC
a6f0: 4b 45 44 22 3b 20 20 20 20 20 20 20 20 20 20 20  KED";           
a700: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a710: 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  se SQLITE_LOCKED
a720: 5f 53 48 41 52 45 44 43 41 43 48 45 3a 20 7a 4e  _SHAREDCACHE: zN
a730: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f  ame = "SQLITE_LO
a740: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
a750: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
a760: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ase SQLITE_NOMEM
a770: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
a780: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
a790: 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 20 20 20  OMEM";          
a7a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a7b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
a7c0: 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20 20 20 20  ONLY:           
a7d0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a7e0: 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20  READONLY";      
a7f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a800: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
a810: 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 3a 20  DONLY_RECOVERY: 
a820: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a830: 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45  _READONLY_RECOVE
a840: 52 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  RY"; break;.    
a850: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
a860: 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 3a  ADONLY_CANTLOCK:
a870: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a880: 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c  E_READONLY_CANTL
a890: 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  OCK"; break;.   
a8a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
a8b0: 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b  EADONLY_ROLLBACK
a8c0: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
a8d0: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c  TE_READONLY_ROLL
a8e0: 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20  BACK"; break;.  
a8f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a900: 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44  READONLY_DBMOVED
a910: 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  :   zName = "SQL
a920: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d  ITE_READONLY_DBM
a930: 4f 56 45 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20  OVED";  break;. 
a940: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a950: 5f 49 4e 54 45 52 52 55 50 54 3a 20 20 20 20 20  _INTERRUPT:     
a960: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a970: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 22 3b  LITE_INTERRUPT";
a980: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a990: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a9a0: 45 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 20 20  E_IOERR:        
a9b0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a9c0: 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20 20 20  QLITE_IOERR";   
a9d0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a9e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a9f0: 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3a 20 20  TE_IOERR_READ:  
aa00: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
aa10: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
aa20: 44 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  D";        break
aa30: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
aa40: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
aa50: 52 45 41 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20  READ:   zName = 
aa60: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
aa70: 4f 52 54 5f 52 45 41 44 22 3b 20 20 62 72 65 61  ORT_READ";  brea
aa80: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
aa90: 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
aaa0: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
aab0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57   "SQLITE_IOERR_W
aac0: 52 49 54 45 22 3b 20 20 20 20 20 20 20 62 72 65  RITE";       bre
aad0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
aae0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
aaf0: 43 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  C:        zName 
ab00: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
ab10: 46 53 59 4e 43 22 3b 20 20 20 20 20 20 20 62 72  FSYNC";       br
ab20: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ab30: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
ab40: 5f 46 53 59 4e 43 3a 20 20 20 20 7a 4e 61 6d 65  _FSYNC:    zName
ab50: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
ab60: 5f 44 49 52 5f 46 53 59 4e 43 22 3b 20 20 20 62  _DIR_FSYNC";   b
ab70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ab80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
ab90: 55 4e 43 41 54 45 3a 20 20 20 20 20 7a 4e 61 6d  UNCATE:     zNam
aba0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
abb0: 52 5f 54 52 55 4e 43 41 54 45 22 3b 20 20 20 20  R_TRUNCATE";    
abc0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
abd0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  e SQLITE_IOERR_F
abe0: 53 54 41 54 3a 20 20 20 20 20 20 20 20 7a 4e 61  STAT:        zNa
abf0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
ac00: 52 52 5f 46 53 54 41 54 22 3b 20 20 20 20 20 20  RR_FSTAT";      
ac10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ac20: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
ac30: 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e  UNLOCK:       zN
ac40: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
ac50: 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20 20  ERR_UNLOCK";    
ac60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ac70: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
ac80: 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a  _RDLOCK:       z
ac90: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
aca0: 4f 45 52 52 5f 52 44 4c 4f 43 4b 22 3b 20 20 20  OERR_RDLOCK";   
acb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
acc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
acd0: 52 5f 44 45 4c 45 54 45 3a 20 20 20 20 20 20 20  R_DELETE:       
ace0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
acf0: 49 4f 45 52 52 5f 44 45 4c 45 54 45 22 3b 20 20  IOERR_DELETE";  
ad00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ad10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
ad20: 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20  RR_NOMEM:       
ad30: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ad40: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20  _IOERR_NOMEM";  
ad50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ad60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
ad70: 45 52 52 5f 41 43 43 45 53 53 3a 20 20 20 20 20  ERR_ACCESS:     
ad80: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ad90: 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 22 3b  E_IOERR_ACCESS";
ada0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
adb0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
adc0: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
add0: 45 44 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20  EDLOCK:.        
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adf0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
ae00: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48  "SQLITE_IOERR_CH
ae10: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 22  ECKRESERVEDLOCK"
ae20: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
ae30: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
ae40: 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 20 7a  _LOCK:         z
ae50: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
ae60: 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20 20 20 20 20  OERR_LOCK";     
ae70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ae80: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
ae90: 52 5f 43 4c 4f 53 45 3a 20 20 20 20 20 20 20 20  R_CLOSE:        
aea0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
aeb0: 49 4f 45 52 52 5f 43 4c 4f 53 45 22 3b 20 20 20  IOERR_CLOSE";   
aec0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
aed0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
aee0: 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3a 20 20 20  RR_DIR_CLOSE:   
aef0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
af00: 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45  _IOERR_DIR_CLOSE
af10: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
af20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
af30: 45 52 52 5f 53 48 4d 4f 50 45 4e 3a 20 20 20 20  ERR_SHMOPEN:    
af40: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
af50: 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 22  E_IOERR_SHMOPEN"
af60: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
af70: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
af80: 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3a 20 20 20  OERR_SHMSIZE:   
af90: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
afa0: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
afb0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
afc0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
afd0: 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20 20  IOERR_SHMLOCK:  
afe0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
aff0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43  ITE_IOERR_SHMLOC
b000: 4b 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  K";     break;. 
b010: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b020: 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 3a 20 20  _IOERR_SHMMAP:  
b030: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b040: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
b050: 50 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  P";      break;.
b060: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b070: 45 5f 49 4f 45 52 52 5f 53 45 45 4b 3a 20 20 20  E_IOERR_SEEK:   
b080: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b090: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
b0a0: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
b0b0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b0c0: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
b0d0: 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20 22  NOENT: zName = "
b0e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
b0f0: 45 54 45 5f 4e 4f 45 4e 54 22 3b 62 72 65 61 6b  ETE_NOENT";break
b100: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b110: 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a 20  ITE_IOERR_MMAP: 
b120: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b130: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  "SQLITE_IOERR_MM
b140: 41 50 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  AP";        brea
b150: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b160: 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
b170: 4d 50 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d  MPPATH:  zName =
b180: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47   "SQLITE_IOERR_G
b190: 45 54 54 45 4d 50 50 41 54 48 22 3b 20 62 72 65  ETTEMPPATH"; bre
b1a0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b1b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56  QLITE_IOERR_CONV
b1c0: 50 41 54 48 3a 20 20 20 20 20 7a 4e 61 6d 65 20  PATH:     zName 
b1d0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b1e0: 43 4f 4e 56 50 41 54 48 22 3b 20 20 20 20 62 72  CONVPATH";    br
b1f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b200: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a 20  SQLITE_CORRUPT: 
b210: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b220: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55   = "SQLITE_CORRU
b230: 50 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 62  PT";           b
b240: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b250: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
b260: 56 54 41 42 3a 20 20 20 20 20 20 20 7a 4e 61 6d  VTAB:       zNam
b270: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52  e = "SQLITE_CORR
b280: 55 50 54 5f 56 54 41 42 22 3b 20 20 20 20 20 20  UPT_VTAB";      
b290: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b2a0: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  e SQLITE_NOTFOUN
b2b0: 44 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  D:           zNa
b2c0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54  me = "SQLITE_NOT
b2d0: 46 4f 55 4e 44 22 3b 20 20 20 20 20 20 20 20 20  FOUND";         
b2e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b2f0: 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20  se SQLITE_FULL: 
b300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
b310: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 55  ame = "SQLITE_FU
b320: 4c 4c 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  LL";            
b330: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b340: 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ase SQLITE_CANTO
b350: 50 45 4e 3a 20 20 20 20 20 20 20 20 20 20 20 7a  PEN:           z
b360: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b370: 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20 20 20 20  ANTOPEN";       
b380: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b390: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
b3a0: 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a 20  OPEN_NOTEMPDIR: 
b3b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b3c0: 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44  CANTOPEN_NOTEMPD
b3d0: 49 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  IR";break;.     
b3e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
b3f0: 54 4f 50 45 4e 5f 49 53 44 49 52 3a 20 20 20 20  TOPEN_ISDIR:    
b400: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b410: 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22  _CANTOPEN_ISDIR"
b420: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
b430: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
b440: 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3a  NTOPEN_FULLPATH:
b450: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b460: 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
b470: 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ATH"; break;.   
b480: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b490: 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48  ANTOPEN_CONVPATH
b4a0: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
b4b0: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56  TE_CANTOPEN_CONV
b4c0: 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  PATH"; break;.  
b4d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b4e0: 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 20 20 20 20  PROTOCOL:       
b4f0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b500: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20  ITE_PROTOCOL";  
b510: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b520: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b530: 5f 45 4d 50 54 59 3a 20 20 20 20 20 20 20 20 20  _EMPTY:         
b540: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b550: 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20 20 20 20  LITE_EMPTY";    
b560: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b570: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b580: 45 5f 53 43 48 45 4d 41 3a 20 20 20 20 20 20 20  E_SCHEMA:       
b590: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b5a0: 51 4c 49 54 45 5f 53 43 48 45 4d 41 22 3b 20 20  QLITE_SCHEMA";  
b5b0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b5c0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b5d0: 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20 20  TE_TOOBIG:      
b5e0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b5f0: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22 3b 20  SQLITE_TOOBIG"; 
b600: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b610: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b620: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20  ITE_CONSTRAINT: 
b630: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b640: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
b650: 4e 54 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  NT";        brea
b660: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b670: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b680: 55 4e 49 51 55 45 3a 20 20 7a 4e 61 6d 65 20 3d  UNIQUE:  zName =
b690: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
b6a0: 49 4e 54 5f 55 4e 49 51 55 45 22 3b 20 62 72 65  INT_UNIQUE"; bre
b6b0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b6c0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b6d0: 5f 54 52 49 47 47 45 52 3a 20 7a 4e 61 6d 65 20  _TRIGGER: zName 
b6e0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
b6f0: 41 49 4e 54 5f 54 52 49 47 47 45 52 22 3b 62 72  AINT_TRIGGER";br
b700: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b710: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b720: 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3a 0a 20 20  T_FOREIGNKEY:.  
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
b750: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
b760: 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
b770: 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  KEY";   break;. 
b780: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b790: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43  _CONSTRAINT_CHEC
b7a0: 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  K:   zName = "SQ
b7b0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
b7c0: 43 48 45 43 4b 22 3b 20 20 62 72 65 61 6b 3b 0a  CHECK";  break;.
b7d0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b7e0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49  E_CONSTRAINT_PRI
b7f0: 4d 41 52 59 4b 45 59 3a 0a 20 20 20 20 20 20 20  MARYKEY:.       
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b820: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
b830: 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 22 3b  INT_PRIMARYKEY";
b840: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b850: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
b860: 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a 20  TRAINT_NOTNULL: 
b870: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b880: 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55  CONSTRAINT_NOTNU
b890: 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20  LL";break;.     
b8a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
b8b0: 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f  STRAINT_COMMITHO
b8c0: 4f 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  OK:.            
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8e0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b8f0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
b900: 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20 20 62 72  OMMITHOOK";   br
b910: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b920: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b930: 54 5f 56 54 41 42 3a 20 20 20 20 7a 4e 61 6d 65  T_VTAB:    zName
b940: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
b950: 52 41 49 4e 54 5f 56 54 41 42 22 3b 20 20 20 62  RAINT_VTAB";   b
b960: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b970: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
b980: 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  NT_FUNCTION:.   
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
b9b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
b9c0: 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e  STRAINT_FUNCTION
b9d0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
b9e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b9f0: 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44  CONSTRAINT_ROWID
ba00: 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  :   zName = "SQL
ba10: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52  ITE_CONSTRAINT_R
ba20: 4f 57 49 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20  OWID";  break;. 
ba30: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ba40: 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20 20 20 20  _MISMATCH:      
ba50: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ba60: 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b 20  LITE_MISMATCH"; 
ba70: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
ba80: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ba90: 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20 20 20  E_MISUSE:       
baa0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bab0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b 20 20  QLITE_MISUSE";  
bac0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bad0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bae0: 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20 20  TE_NOLFS:       
baf0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bb00: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b 20 20  SQLITE_NOLFS";  
bb10: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
bb20: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bb30: 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20 20  ITE_AUTH:       
bb40: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bb50: 22 53 51 4c 49 54 45 5f 41 55 54 48 22 3b 20 20  "SQLITE_AUTH";  
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
bb70: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bb80: 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20  LITE_FORMAT:    
bb90: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
bba0: 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 22   "SQLITE_FORMAT"
bbb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
bbc0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
bbd0: 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20 20 20  QLITE_RANGE:    
bbe0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
bbf0: 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e 47 45 22  = "SQLITE_RANGE"
bc00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
bc10: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bc20: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20  SQLITE_NOTADB:  
bc30: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
bc40: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 41 44   = "SQLITE_NOTAD
bc50: 42 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  B";            b
bc60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bc70: 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20 20 20   SQLITE_ROW:    
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
bc90: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f 57 22  e = "SQLITE_ROW"
bca0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bcb0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bcc0: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 3a  e SQLITE_NOTICE:
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
bce0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54  me = "SQLITE_NOT
bcf0: 49 43 45 22 3b 20 20 20 20 20 20 20 20 20 20 20  ICE";           
bd00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bd10: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  se SQLITE_NOTICE
bd20: 5f 52 45 43 4f 56 45 52 5f 57 41 4c 3a 20 7a 4e  _RECOVER_WAL: zN
bd30: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
bd40: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c  TICE_RECOVER_WAL
bd50: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
bd60: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43  ase SQLITE_NOTIC
bd70: 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41  E_RECOVER_ROLLBA
bd80: 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  CK:.            
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bda0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bdb0: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
bdc0: 45 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72  ER_ROLLBACK"; br
bdd0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bde0: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 3a 20  SQLITE_WARNING: 
bdf0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
be00: 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49   = "SQLITE_WARNI
be10: 4e 47 22 3b 20 20 20 20 20 20 20 20 20 20 20 62  NG";           b
be20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
be30: 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f   SQLITE_WARNING_
be40: 41 55 54 4f 49 4e 44 45 58 3a 20 20 7a 4e 61 6d  AUTOINDEX:  zNam
be50: 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e  e = "SQLITE_WARN
be60: 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 22 3b 20  ING_AUTOINDEX"; 
be70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
be80: 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20  e SQLITE_DONE:  
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
bea0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e  me = "SQLITE_DON
beb0: 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  E";             
bec0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
bed0: 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  }.  if( zName==0
bee0: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
bef0: 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
bf00: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
bf10: 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
bf20: 20 7a 42 75 66 2c 20 22 53 51 4c 49 54 45 5f 55   zBuf, "SQLITE_U
bf30: 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c 20 6f 72 69  NKNOWN(%d)", ori
bf40: 67 52 63 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20  gRc);.    zName 
bf50: 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20 20 72 65  = zBuf;.  }.  re
bf60: 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65  turn zName;.}.#e
bf70: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
bf80: 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69  rn a static stri
bf90: 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
bfa0: 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72  s the kind of er
bfb0: 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e  ror specified in
bfc0: 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   the.** argument
bfd0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
bfe0: 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 69  *sqlite3ErrStr(i
bff0: 6e 74 20 72 63 29 7b 0a 20 20 73 74 61 74 69 63  nt rc){.  static
c000: 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e   const char* con
c010: 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20  st aMsg[] = {.  
c020: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20    /* SQLITE_OK  
c030: 20 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20          */ "not 
c040: 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f  an error",.    /
c050: 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 20  * SQLITE_ERROR  
c060: 20 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67       */ "SQL log
c070: 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69 73 73  ic error or miss
c080: 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c 0a 20  ing database",. 
c090: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54     /* SQLITE_INT
c0a0: 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20  ERNAL    */ 0,. 
c0b0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52     /* SQLITE_PER
c0c0: 4d 20 20 20 20 20 20 20 20 2a 2f 20 22 61 63 63  M        */ "acc
c0d0: 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 64  ess permission d
c0e0: 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  enied",.    /* S
c0f0: 51 4c 49 54 45 5f 41 42 4f 52 54 20 20 20 20 20  QLITE_ABORT     
c100: 20 20 2a 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72    */ "callback r
c110: 65 71 75 65 73 74 65 64 20 71 75 65 72 79 20 61  equested query a
c120: 62 6f 72 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51  bort",.    /* SQ
c130: 4c 49 54 45 5f 42 55 53 59 20 20 20 20 20 20 20  LITE_BUSY       
c140: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 69 73   */ "database is
c150: 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a   locked",.    /*
c160: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20   SQLITE_LOCKED  
c170: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
c180: 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64   table is locked
c190: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
c1a0: 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20  _NOMEM       */ 
c1b0: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c  "out of memory",
c1c0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52  .    /* SQLITE_R
c1d0: 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61  EADONLY    */ "a
c1e0: 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
c1f0: 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62  a readonly datab
c200: 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ase",.    /* SQL
c210: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 20 20  ITE_INTERRUPT   
c220: 2a 2f 20 22 69 6e 74 65 72 72 75 70 74 65 64 22  */ "interrupted"
c230: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c240: 49 4f 45 52 52 20 20 20 20 20 20 20 2a 2f 20 22  IOERR       */ "
c250: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c  disk I/O error",
c260: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
c270: 4f 52 52 55 50 54 20 20 20 20 20 2a 2f 20 22 64  ORRUPT     */ "d
c280: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
c290: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22  ge is malformed"
c2a0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c2b0: 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22  NOTFOUND    */ "
c2c0: 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f  unknown operatio
c2d0: 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  n",.    /* SQLIT
c2e0: 45 5f 46 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f  E_FULL        */
c2f0: 20 22 64 61 74 61 62 61 73 65 20 6f 72 20 64 69   "database or di
c300: 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20  sk is full",.   
c310: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f   /* SQLITE_CANTO
c320: 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c  PEN    */ "unabl
c330: 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  e to open databa
c340: 73 65 20 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a  se file",.    /*
c350: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
c360: 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20      */ "locking 
c370: 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f  protocol",.    /
c380: 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 20  * SQLITE_EMPTY  
c390: 20 20 20 20 20 2a 2f 20 22 74 61 62 6c 65 20 63       */ "table c
c3a0: 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 22  ontains no data"
c3b0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
c3c0: 53 43 48 45 4d 41 20 20 20 20 20 20 2a 2f 20 22  SCHEMA      */ "
c3d0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
c3e0: 68 61 73 20 63 68 61 6e 67 65 64 22 2c 0a 20 20  has changed",.  
c3f0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42    /* SQLITE_TOOB
c400: 49 47 20 20 20 20 20 20 2a 2f 20 22 73 74 72 69  IG      */ "stri
c410: 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62  ng or blob too b
c420: 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ig",.    /* SQLI
c430: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a  TE_CONSTRAINT  *
c440: 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  / "constraint fa
c450: 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  iled",.    /* SQ
c460: 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 20 20  LITE_MISMATCH   
c470: 20 2a 2f 20 22 64 61 74 61 74 79 70 65 20 6d 69   */ "datatype mi
c480: 73 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20  smatch",.    /* 
c490: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 20 20  SQLITE_MISUSE   
c4a0: 20 20 20 2a 2f 20 22 6c 69 62 72 61 72 79 20 72     */ "library r
c4b0: 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75  outine called ou
c4c0: 74 20 6f 66 20 73 65 71 75 65 6e 63 65 22 2c 0a  t of sequence",.
c4d0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
c4e0: 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 22 6c 61  LFS       */ "la
c4f0: 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74  rge file support
c500: 20 69 73 20 64 69 73 61 62 6c 65 64 22 2c 0a 20   is disabled",. 
c510: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54     /* SQLITE_AUT
c520: 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61 75 74  H        */ "aut
c530: 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65  horization denie
c540: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
c550: 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f  E_FORMAT      */
c560: 20 22 61 75 78 69 6c 69 61 72 79 20 64 61 74 61   "auxiliary data
c570: 62 61 73 65 20 66 6f 72 6d 61 74 20 65 72 72 6f  base format erro
c580: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
c590: 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20 2a 2f  E_RANGE       */
c5a0: 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e   "bind or column
c5b0: 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61   index out of ra
c5c0: 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  nge",.    /* SQL
c5d0: 49 54 45 5f 4e 4f 54 41 44 42 20 20 20 20 20 20  ITE_NOTADB      
c5e0: 2a 2f 20 22 66 69 6c 65 20 69 73 20 65 6e 63 72  */ "file is encr
c5f0: 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f 74 20  ypted or is not 
c600: 61 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 7d  a database",.  }
c610: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
c620: 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20  zErr = "unknown 
c630: 65 72 72 6f 72 22 3b 0a 20 20 73 77 69 74 63 68  error";.  switch
c640: 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65  ( rc ){.    case
c650: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
c660: 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20  LLBACK: {.      
c670: 7a 45 72 72 20 3d 20 22 61 62 6f 72 74 20 64 75  zErr = "abort du
c680: 65 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a  e to ROLLBACK";.
c690: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c6a0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
c6b0: 7b 0a 20 20 20 20 20 20 72 63 20 26 3d 20 30 78  {.      rc &= 0x
c6c0: 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c  ff;.      if( AL
c6d0: 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72  WAYS(rc>=0) && r
c6e0: 63 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 73 67  c<ArraySize(aMsg
c6f0: 29 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30  ) && aMsg[rc]!=0
c700: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72   ){.        zErr
c710: 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20   = aMsg[rc];.   
c720: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
c730: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
c740: 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a  turn zErr;.}../*
c750: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
c760: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75   implements a bu
c770: 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74  sy callback that
c780: 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65   sleeps and trie
c790: 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c  s.** again until
c7a0: 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65   a timeout value
c7b0: 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 54 68   is reached.  Th
c7c0: 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  e timeout value 
c7d0: 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72  is.** an integer
c7e0: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
c7f0: 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69  seconds passed i
c800: 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a  n as the first.*
c810: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  * argument..*/.s
c820: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
c830: 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62  DefaultBusyCallb
c840: 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c  ack(. void *ptr,
c850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c860: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
c870: 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f  ction */. int co
c880: 75 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  unt             
c890: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c8a0: 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20  times table has 
c8b0: 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a  been busy */.){.
c8c0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
c8d0: 4e 20 7c 7c 20 48 41 56 45 5f 55 53 4c 45 45 50  N || HAVE_USLEEP
c8e0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
c8f0: 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20  u8 delays[] =.  
c900: 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30     { 1, 2, 5, 10
c910: 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35  , 15, 20, 25, 25
c920: 2c 20 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c  ,  25,  50,  50,
c930: 20 31 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63   100 };.  static
c940: 20 63 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73   const u8 totals
c950: 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31  [] =.     { 0, 1
c960: 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c  , 3,  8, 18, 33,
c970: 20 35 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32   53, 78, 103, 12
c980: 38 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23  8, 178, 228 };.#
c990: 20 64 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 41   define NDELAY A
c9a0: 72 72 61 79 53 69 7a 65 28 64 65 6c 61 79 73 29  rraySize(delays)
c9b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c9c0: 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b   (sqlite3 *)ptr;
c9d0: 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d  .  int timeout =
c9e0: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
c9f0: 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70  ;.  int delay, p
ca00: 72 69 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  rior;..  assert(
ca10: 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69   count>=0 );.  i
ca20: 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41  f( count < NDELA
ca30: 59 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  Y ){.    delay =
ca40: 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a   delays[count];.
ca50: 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61      prior = tota
ca60: 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c  ls[count];.  }el
ca70: 73 65 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20  se{.    delay = 
ca80: 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d  delays[NDELAY-1]
ca90: 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f  ;.    prior = to
caa0: 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b  tals[NDELAY-1] +
cab0: 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e   delay*(count-(N
cac0: 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20  DELAY-1));.  }. 
cad0: 20 69 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c   if( prior + del
cae0: 61 79 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a  ay > timeout ){.
caf0: 20 20 20 20 64 65 6c 61 79 20 3d 20 74 69 6d 65      delay = time
cb00: 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20  out - prior;.   
cb10: 20 69 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20   if( delay<=0 ) 
cb20: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
cb30: 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64  sqlite3OsSleep(d
cb40: 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31  b->pVfs, delay*1
cb50: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
cb60: 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  ;.#else.  sqlite
cb70: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
cb80: 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69   *)ptr;.  int ti
cb90: 6d 65 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65  meout = ((sqlite
cba0: 33 20 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69  3 *)ptr)->busyTi
cbb0: 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20 28 63 6f  meout;.  if( (co
cbc0: 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 69  unt+1)*1000 > ti
cbd0: 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74  meout ){.    ret
cbe0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
cbf0: 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e  ite3OsSleep(db->
cc00: 70 56 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a  pVfs, 1000000);.
cc10: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
cc20: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  if.}../*.** Invo
cc30: 6b 65 20 74 68 65 20 67 69 76 65 6e 20 62 75 73  ke the given bus
cc40: 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a  y handler..**.**
cc50: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
cc60: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
cc70: 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64  operation failed
cc80: 20 77 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a   with a lock..**
cc90: 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
cca0: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
ccb0: 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72  o, the lock is r
ccc0: 65 74 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a  etried.  If it.*
ccd0: 2a 20 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65  * returns 0, the
cce0: 20 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74   operation abort
ccf0: 73 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45  s with an SQLITE
cd00: 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a  _BUSY error..*/.
cd10: 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b  int sqlite3Invok
cd20: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73  eBusyHandler(Bus
cd30: 79 48 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20  yHandler *p){.  
cd40: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 4e 45  int rc;.  if( NE
cd50: 56 45 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e  VER(p==0) || p->
cd60: 78 46 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e  xFunc==0 || p->n
cd70: 42 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20  Busy<0 ) return 
cd80: 30 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46 75  0;.  rc = p->xFu
cd90: 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e  nc(p->pArg, p->n
cda0: 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63 3d  Busy);.  if( rc=
cdb0: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75  =0 ){.    p->nBu
cdc0: 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65  sy = -1;.  }else
cdd0: 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b  {.    p->nBusy++
cde0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
cdf0: 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c; .}../*.** Thi
ce00: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
ce10: 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
ce20: 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64   for an Sqlite d
ce30: 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a  atabase to the.*
ce40: 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b  * given callback
ce50: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
ce60: 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e  he given argumen
ce70: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
ce80: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a  3_busy_handler(.
ce90: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
cea0: 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f   int (*xBusy)(vo
ceb0: 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  id*,int),.  void
cec0: 20 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66   *pArg.){.#ifdef
ced0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
cee0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
cef0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
cf00: 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
cf10: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
cf20: 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
cf30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
cf40: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
cf50: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
cf60: 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79 3b 0a  .xFunc = xBusy;.
cf70: 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65    db->busyHandle
cf80: 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  r.pArg = pArg;. 
cf90: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
cfa0: 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 64 62  .nBusy = 0;.  db
cfb0: 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20  ->busyTimeout = 
cfc0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
cfd0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
cfe0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
cff0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
d000: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d010: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
d020: 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  K./*.** This rou
d030: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 70 72  tine sets the pr
d040: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
d050: 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61  for an Sqlite da
d060: 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a  tabase to the.**
d070: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
d080: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
d090: 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74  e given argument
d0a0: 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63  . The progress c
d0b0: 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20  allback will.** 
d0c0: 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65 72 79  be invoked every
d0d0: 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a   nOps opcodes..*
d0e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 70  /.void sqlite3_p
d0f0: 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65 72 28  rogress_handler(
d100: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
d110: 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69  .  int nOps,.  i
d120: 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73 29 28  nt (*xProgress)(
d130: 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20  void*), .  void 
d140: 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20  *pArg.){.#ifdef 
d150: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
d160: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
d170: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
d180: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
d190: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
d1a0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
d1b0: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
d1c0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d1d0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
d1e0: 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30 20 29  ;.  if( nOps>0 )
d1f0: 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72  {.    db->xProgr
d200: 65 73 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b  ess = xProgress;
d210: 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65  .    db->nProgre
d220: 73 73 4f 70 73 20 3d 20 28 75 6e 73 69 67 6e 65  ssOps = (unsigne
d230: 64 29 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e  d)nOps;.    db->
d240: 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70  pProgressArg = p
d250: 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Arg;.  }else{.  
d260: 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20    db->xProgress 
d270: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72  = 0;.    db->nPr
d280: 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20  ogressOps = 0;. 
d290: 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73     db->pProgress
d2a0: 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  Arg = 0;.  }.  s
d2b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
d2c0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ve(db->mutex);.}
d2d0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
d2e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73  This routine ins
d2f0: 74 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20  talls a default 
d300: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61  busy handler tha
d310: 74 20 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a  t waits for the.
d320: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d  ** specified num
d330: 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
d340: 6e 64 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nds before retur
d350: 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  ning 0..*/.int s
d360: 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
d370: 6f 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  out(sqlite3 *db,
d380: 20 69 6e 74 20 6d 73 29 7b 0a 23 69 66 64 65 66   int ms){.#ifdef
d390: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
d3a0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
d3b0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
d3c0: 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
d3d0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
d3e0: 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69  BKPT;.#endif.  i
d3f0: 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73  f( ms>0 ){.    s
d400: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
d410: 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44 65  ler(db, sqliteDe
d420: 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63  faultBusyCallbac
d430: 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20  k, (void*)db);. 
d440: 20 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f     db->busyTimeo
d450: 75 74 20 3d 20 6d 73 3b 0a 20 20 7d 65 6c 73 65  ut = ms;.  }else
d460: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75  {.    sqlite3_bu
d470: 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30  sy_handler(db, 0
d480: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
d490: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d4a0: 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79  ./*.** Cause any
d4b0: 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69   pending operati
d4c0: 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74  on to stop at it
d4d0: 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72  s earliest oppor
d4e0: 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20  tunity..*/.void 
d4f0: 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
d500: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
d510: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
d520: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
d530: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
d540: 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
d550: 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
d560: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
d570: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d580: 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e 75 31 2e  #endif.  db->u1.
d590: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d 20  isInterrupted = 
d5a0: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  1;.}.../*.** Thi
d5b0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 78  s function is ex
d5c0: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 61  actly the same a
d5d0: 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  s sqlite3_create
d5e0: 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63  _function(), exc
d5f0: 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ept.** that it i
d600: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62 65  s designed to be
d610: 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65 72   called by inter
d620: 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64 69  nal code. The di
d630: 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74  fference is.** t
d640: 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  hat if a malloc(
d650: 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69 74  ) fails in sqlit
d660: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
d670: 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20 63  on(), an error c
d680: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  ode.** is return
d690: 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f  ed and the mallo
d6a0: 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c 65  cFailed flag cle
d6b0: 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  ared. .*/.int sq
d6c0: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
d6d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
d6e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
d6f0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69  unctionName,.  i
d700: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
d710: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73 65  nc,.  void *pUse
d720: 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a  rData,.  void (*
d730: 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63  xFunc)(sqlite3_c
d740: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
d750: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
d760: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
d770: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
d780: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
d790: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
d7a0: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
d7b0: 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75 6e  context*),.  Fun
d7c0: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65  cDestructor *pDe
d7d0: 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46 75  structor.){.  Fu
d7e0: 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20  ncDef *p;.  int 
d7f0: 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65 78 74  nName;.  int ext
d800: 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73 73 65  raFlags;..  asse
d810: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d820: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
d830: 29 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63  ) );.  if( zFunc
d840: 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20  tionName==0 ||. 
d850: 20 20 20 20 20 28 78 46 75 6e 63 20 26 26 20 28       (xFunc && (
d860: 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29  xFinal || xStep)
d870: 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 46  ) || .      (!xF
d880: 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26  unc && (xFinal &
d890: 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20  & !xStep)) ||.  
d8a0: 20 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28      (!xFunc && (
d8b0: 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70  !xFinal && xStep
d8c0: 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72  )) ||.      (nAr
d8d0: 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c  g<-1 || nArg>SQL
d8e0: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
d8f0: 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28  _ARG) ||.      (
d900: 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c  255<(nName = sql
d910: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 20 7a 46  ite3Strlen30( zF
d920: 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29  unctionName))) )
d930: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
d940: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
d950: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
d960: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53  SQLITE_FUNC_CONS
d970: 54 41 4e 54 3d 3d 53 51 4c 49 54 45 5f 44 45 54  TANT==SQLITE_DET
d980: 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20 20  ERMINISTIC );.  
d990: 65 78 74 72 61 46 6c 61 67 73 20 3d 20 65 6e 63  extraFlags = enc
d9a0: 20 26 20 20 53 51 4c 49 54 45 5f 44 45 54 45 52   &  SQLITE_DETER
d9b0: 4d 49 4e 49 53 54 49 43 3b 0a 20 20 65 6e 63 20  MINISTIC;.  enc 
d9c0: 26 3d 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f  &= (SQLITE_FUNC_
d9d0: 45 4e 43 4d 41 53 4b 7c 53 51 4c 49 54 45 5f 41  ENCMASK|SQLITE_A
d9e0: 4e 59 29 3b 0a 20 20 0a 23 69 66 6e 64 65 66 20  NY);.  .#ifndef 
d9f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
da00: 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45  6.  /* If SQLITE
da10: 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66  _UTF16 is specif
da20: 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ied as the encod
da30: 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66  ing type, transf
da40: 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f  orm this.  ** to
da50: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55   one of SQLITE_U
da60: 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45  TF16LE or SQLITE
da70: 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74  _UTF16BE using t
da80: 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55  he.  ** SQLITE_U
da90: 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f  TF16NATIVE macro
daa0: 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  . SQLITE_UTF16 i
dab0: 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
dac0: 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nally..  **.  **
dad0: 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69   If SQLITE_ANY i
dae0: 73 20 73 70 65 63 69 66 69 65 64 2c 20 61 64 64  s specified, add
daf0: 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20   three versions 
db00: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  of the function.
db10: 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68    ** to the hash
db20: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
db30: 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  f( enc==SQLITE_U
db40: 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20  TF16 ){.    enc 
db50: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
db60: 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TIVE;.  }else if
db70: 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e  ( enc==SQLITE_AN
db80: 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  Y ){.    int rc;
db90: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
dba0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
dbb0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
dbc0: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
dbd0: 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20 20  |extraFlags,.   
dbe0: 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61 2c        pUserData,
dbf0: 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78   xFunc, xStep, x
dc00: 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63 74  Final, pDestruct
dc10: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  or);.    if( rc=
dc20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
dc30: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
dc40: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
dc50: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41  FunctionName, nA
dc60: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  rg, SQLITE_UTF16
dc70: 4c 45 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20  LE|extraFlags,. 
dc80: 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61           pUserDa
dc90: 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70  ta, xFunc, xStep
dca0: 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72  , xFinal, pDestr
dcb0: 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  uctor);.    }.  
dcc0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
dcd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
dce0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
dcf0: 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55    enc = SQLITE_U
dd00: 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73  TF16BE;.  }.#els
dd10: 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45  e.  enc = SQLITE
dd20: 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20  _UTF8;.#endif.  
dd30: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
dd40: 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63 74  n existing funct
dd50: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76 65  ion is being ove
dd60: 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65 74  rridden or delet
dd70: 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20  ed. If so,.  ** 
dd80: 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63  and there are ac
dd90: 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20 72  tive VMs, then r
dda0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
ddb0: 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f 6e  Y. If a function
ddc0: 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f  .  ** is being o
ddd0: 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74 65  verridden/delete
dde0: 64 20 62 75 74 20 74 68 65 72 65 20 61 72 65 20  d but there are 
ddf0: 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 61  no active VMs, a
de00: 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70  llow the.  ** op
de10: 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69  eration to conti
de20: 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64 61  nue but invalida
de30: 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c  te all precompil
de40: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
de50: 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   */.  p = sqlite
de60: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
de70: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
de80: 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75   nName, nArg, (u
de90: 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28  8)enc, 0);.  if(
dea0: 20 70 20 26 26 20 28 70 2d 3e 66 75 6e 63 46 6c   p && (p->funcFl
deb0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
dec0: 43 5f 45 4e 43 4d 41 53 4b 29 3d 3d 65 6e 63 20  C_ENCMASK)==enc 
ded0: 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67  && p->nArg==nArg
dee0: 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e   ){.    if( db->
def0: 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20  nVdbeActive ){. 
df00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
df10: 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c  rWithMsg(db, SQL
df20: 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20  ITE_BUSY, .     
df30: 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65     "unable to de
df40: 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72  lete/modify user
df50: 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f  -function due to
df60: 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
df70: 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ts");.      asse
df80: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
df90: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
dfa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
dfb0: 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  Y;.    }else{.  
dfc0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
dfd0: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
dfe0: 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20  nts(db);.    }. 
dff0: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
e000: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62  3FindFunction(db
e010: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
e020: 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75   nName, nArg, (u
e030: 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73  8)enc, 1);.  ass
e040: 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c  ert(p || db->mal
e050: 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66  locFailed);.  if
e060: 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ( !p ){.    retu
e070: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
e080: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  .  }..  /* If an
e090: 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 20 6f   older version o
e0a0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77  f the function w
e0b0: 69 74 68 20 61 20 63 6f 6e 66 69 67 75 72 65 64  ith a configured
e0c0: 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 20   destructor is. 
e0d0: 20 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c 61 63   ** being replac
e0e0: 65 64 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65  ed invoke the de
e0f0: 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f  structor functio
e100: 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75 6e  n here. */.  fun
e110: 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c  ctionDestroy(db,
e120: 20 70 29 3b 0a 0a 20 20 69 66 28 20 70 44 65 73   p);..  if( pDes
e130: 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70  tructor ){.    p
e140: 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66  Destructor->nRef
e150: 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 44 65  ++;.  }.  p->pDe
e160: 73 74 72 75 63 74 6f 72 20 3d 20 70 44 65 73 74  structor = pDest
e170: 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 75 6e  ructor;.  p->fun
e180: 63 46 6c 61 67 73 20 3d 20 28 70 2d 3e 66 75 6e  cFlags = (p->fun
e190: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
e1a0: 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 20 7c 20  FUNC_ENCMASK) | 
e1b0: 65 78 74 72 61 46 6c 61 67 73 3b 0a 20 20 74 65  extraFlags;.  te
e1c0: 73 74 63 61 73 65 28 20 70 2d 3e 66 75 6e 63 46  stcase( p->funcF
e1d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44 45  lags & SQLITE_DE
e1e0: 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20  TERMINISTIC );. 
e1f0: 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78 46 75 6e   p->xFunc = xFun
e200: 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70 20 3d 20  c;.  p->xStep = 
e210: 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e  xStep;.  p->xFin
e220: 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a  alize = xFinal;.
e230: 20 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20 3d    p->pUserData =
e240: 20 70 55 73 65 72 44 61 74 61 3b 0a 20 20 70 2d   pUserData;.  p-
e250: 3e 6e 41 72 67 20 3d 20 28 75 31 36 29 6e 41 72  >nArg = (u16)nAr
e260: 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
e270: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
e280: 43 72 65 61 74 65 20 6e 65 77 20 75 73 65 72 20  Create new user 
e290: 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e  functions..*/.in
e2a0: 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
e2b0: 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  _function(.  sql
e2c0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
e2d0: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20  t char *zFunc,. 
e2e0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
e2f0: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c   enc,.  void *p,
e300: 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29  .  void (*xFunc)
e310: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e320: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
e330: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
e340: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
e350: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
e360: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
e370: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
e380: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e390: 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  t*).){.  return 
e3a0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
e3b0: 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a  unction_v2(db, z
e3c0: 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Func, nArg, enc,
e3d0: 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70   p, xFunc, xStep
e3e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e400: 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 29        xFinal, 0)
e410: 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
e420: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
e430: 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
e440: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
e450: 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   *zFunc,.  int n
e460: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
e470: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
e480: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
e490: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
e4a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
e4b0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
e4c0: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
e4d0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
e4e0: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
e4f0: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
e500: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20  te3_context*),. 
e510: 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 6f 79   void (*xDestroy
e520: 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 69  )(void *).){.  i
e530: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
e540: 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44 65 73 74  RROR;.  FuncDest
e550: 72 75 63 74 6f 72 20 2a 70 41 72 67 20 3d 20 30  ructor *pArg = 0
e560: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
e570: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
e580: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
e590: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
e5a0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
e5b0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
e5c0: 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  PT;.  }.#endif. 
e5d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
e5e0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
e5f0: 0a 20 20 69 66 28 20 78 44 65 73 74 72 6f 79 20  .  if( xDestroy 
e600: 29 7b 0a 20 20 20 20 70 41 72 67 20 3d 20 28 46  ){.    pArg = (F
e610: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 29  uncDestructor *)
e620: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
e630: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 46  ero(db, sizeof(F
e640: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 29 29 3b  uncDestructor));
e650: 0a 20 20 20 20 69 66 28 20 21 70 41 72 67 20 29  .    if( !pArg )
e660: 7b 0a 20 20 20 20 20 20 78 44 65 73 74 72 6f 79  {.      xDestroy
e670: 28 70 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  (p);.      goto 
e680: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
e690: 41 72 67 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20  Arg->xDestroy = 
e6a0: 78 44 65 73 74 72 6f 79 3b 0a 20 20 20 20 70 41  xDestroy;.    pA
e6b0: 72 67 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20  rg->pUserData = 
e6c0: 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  p;.  }.  rc = sq
e6d0: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
e6e0: 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c  db, zFunc, nArg,
e6f0: 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20   enc, p, xFunc, 
e700: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70  xStep, xFinal, p
e710: 41 72 67 29 3b 0a 20 20 69 66 28 20 70 41 72 67  Arg);.  if( pArg
e720: 20 26 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d   && pArg->nRef==
e730: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
e740: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e750: 3b 0a 20 20 20 20 78 44 65 73 74 72 6f 79 28 70  ;.    xDestroy(p
e760: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
e770: 46 72 65 65 28 64 62 2c 20 70 41 72 67 29 3b 0a  Free(db, pArg);.
e780: 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20    }.. out:.  rc 
e790: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
e7a0: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
e7b0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
e7c0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
e7d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
e7e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e7f0: 55 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65  UTF16.int sqlite
e800: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
e810: 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  n16(.  sqlite3 *
e820: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  db,.  const void
e830: 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c   *zFunctionName,
e840: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
e850: 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76  nt eTextRep,.  v
e860: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
e870: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
e880: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
e890: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20  ite3_value**),. 
e8a0: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
e8b0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
e8c0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
e8d0: 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  e**),.  void (*x
e8e0: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
e8f0: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e  ontext*).){.  in
e900: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46  t rc;.  char *zF
e910: 75 6e 63 38 3b 0a 0a 23 69 66 64 65 66 20 53 51  unc8;..#ifdef SQ
e920: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
e930: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
e940: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
e950: 6b 28 64 62 29 20 7c 7c 20 7a 46 75 6e 63 74 69  k(db) || zFuncti
e960: 6f 6e 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  onName==0 ) retu
e970: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
e980: 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
e990: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
e9a0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
e9b0: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
e9c0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
e9d0: 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65   zFunc8 = sqlite
e9e0: 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46  3Utf16to8(db, zF
e9f0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c  unctionName, -1,
ea00: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
ea10: 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  IVE);.  rc = sql
ea20: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
ea30: 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c  b, zFunc8, nArg,
ea40: 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46   eTextRep, p, xF
ea50: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
ea60: 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  al,0);.  sqlite3
ea70: 44 62 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63  DbFree(db, zFunc
ea80: 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  8);.  rc = sqlit
ea90: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
eaa0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
eab0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
eac0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
ead0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
eae0: 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61 74 20  ** Declare that 
eaf0: 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62  a function has b
eb00: 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62  een overloaded b
eb10: 79 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  y a virtual tabl
eb20: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
eb30: 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79  function already
eb40: 20 65 78 69 73 74 73 20 61 73 20 61 20 72 65 67   exists as a reg
eb50: 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ular global func
eb60: 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tion, then.** th
eb70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
eb80: 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66  no-op.  If the f
eb90: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
eba0: 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65   exist, then cre
ebb0: 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65  ate.** a new one
ebc0: 20 74 68 61 74 20 61 6c 77 61 79 73 20 74 68 72   that always thr
ebd0: 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65  ows a run-time e
ebe0: 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  rror.  .**.** Wh
ebf0: 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  en virtual table
ec00: 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76  s intend to prov
ec10: 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65  ide an overloade
ec20: 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79  d function, they
ec30: 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20  .** should call 
ec40: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
ec50: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c  make sure the gl
ec60: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78  obal function ex
ec70: 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61  ists..** A globa
ec80: 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  l function must 
ec90: 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66  exist in order f
eca0: 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  or name resoluti
ecb0: 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72  on to work.** pr
ecc0: 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  operly..*/.int s
ecd0: 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f  qlite3_overload_
ece0: 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  function(.  sqli
ecf0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
ed00: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20   char *zName,.  
ed10: 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e  int nArg.){.  in
ed20: 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  t nName = sqlite
ed30: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
ed40: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
ed50: 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20  ITE_OK;..#ifdef 
ed60: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
ed70: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
ed80: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
ed90: 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65  kOk(db) || zName
eda0: 3d 3d 30 20 7c 7c 20 6e 41 72 67 3c 2d 32 20 29  ==0 || nArg<-2 )
edb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
edc0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
edd0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
ede0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
edf0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
ee00: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 46  if( sqlite3FindF
ee10: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  unction(db, zNam
ee20: 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  e, nName, nArg, 
ee30: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3d  SQLITE_UTF8, 0)=
ee40: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
ee50: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
ee60: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67  (db, zName, nArg
ee70: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20  , SQLITE_UTF8,. 
ee80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee90: 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c            0, sql
eea0: 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e 63 74  ite3InvalidFunct
eeb0: 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ion, 0, 0, 0);. 
eec0: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
eed0: 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
eee0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
eef0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
ef00: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
ef10: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
ef20: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a  TE_OMIT_TRACE./*
ef30: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 74  .** Register a t
ef40: 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20  race function.  
ef50: 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68  The pArg from th
ef60: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  e previously reg
ef70: 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a  istered trace.**
ef80: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a   is returned.  .
ef90: 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61  **.** A NULL tra
efa0: 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  ce function mean
efb0: 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e  s that no tracin
efc0: 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20  g is executes.  
efd0: 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72  A non-NULL.** tr
efe0: 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ace is a pointer
eff0: 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74   to a function t
f000: 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  hat is invoked a
f010: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
f020: 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65  ach.** SQL state
f030: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ment..*/.void *s
f040: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c  qlite3_trace(sql
f050: 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 28  ite3 *db, void (
f060: 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63  *xTrace)(void*,c
f070: 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69  onst char*), voi
f080: 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64  d *pArg){.  void
f090: 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20   *pOld;..#ifdef 
f0a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
f0b0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
f0c0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
f0d0: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
f0e0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
f0f0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
f100: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
f110: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
f120: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
f130: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
f140: 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62  >pTraceArg;.  db
f150: 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63  ->xTrace = xTrac
f160: 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41  e;.  db->pTraceA
f170: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
f180: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
f190: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
f1a0: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a  eturn pOld;.}./*
f1b0: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 70  .** Register a p
f1c0: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e  rofile function.
f1d0: 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
f1e0: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
f1f0: 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72  egistered .** pr
f200: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69  ofile function i
f210: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
f220: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69  .** A NULL profi
f230: 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  le function mean
f240: 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c  s that no profil
f250: 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
f260: 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
f270: 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69  profile is a poi
f280: 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
f290: 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b  on that is invok
f2a0: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
f2b0: 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20  sion of.** each 
f2c0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68  SQL statement th
f2d0: 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f  at is run..*/.vo
f2e0: 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66  id *sqlite3_prof
f2f0: 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ile(.  sqlite3 *
f300: 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72  db,.  void (*xPr
f310: 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  ofile)(void*,con
f320: 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f  st char*,sqlite_
f330: 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  uint64),.  void 
f340: 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20  *pArg.){.  void 
f350: 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53  *pOld;..#ifdef S
f360: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
f370: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
f380: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
f390: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
f3a0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
f3b0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
f3c0: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
f3d0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
f3e0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
f3f0: 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e  );.  pOld = db->
f400: 70 50 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64  pProfileArg;.  d
f410: 62 2d 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78 50  b->xProfile = xP
f420: 72 6f 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50  rofile;.  db->pP
f430: 72 6f 66 69 6c 65 41 72 67 20 3d 20 70 41 72 67  rofileArg = pArg
f440: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
f450: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
f460: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
f470: 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  d;.}.#endif /* S
f480: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
f490: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73   */../*.** Regis
f4a0: 74 65 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 74  ter a function t
f4b0: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 77 68 65  o be invoked whe
f4c0: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
f4d0: 63 6f 6d 6d 69 74 73 2e 0a 2a 2a 20 49 66 20 74  commits..** If t
f4e0: 68 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74  he invoked funct
f4f0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ion returns non-
f500: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63  zero, then the c
f510: 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20 61 0a  ommit becomes a.
f520: 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  ** rollback..*/.
f530: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f  void *sqlite3_co
f540: 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c  mmit_hook(.  sql
f550: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
f560: 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68         /* Attach
f570: 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69   the hook to thi
f580: 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
f590: 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29  int (*xCallback)
f5a0: 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e  (void*),  /* Fun
f5b0: 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20  ction to invoke 
f5c0: 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a  on each commit *
f5d0: 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  /.  void *pArg  
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f5f0: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
f600: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
f610: 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 0a 23    void *pOld;..#
f620: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f630: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
f640: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
f650: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
f660: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
f670: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
f680: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f690: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
f6a0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
f6b0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64  ->mutex);.  pOld
f6c0: 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72   = db->pCommitAr
f6d0: 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  g;.  db->xCommit
f6e0: 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
f6f0: 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d  back;.  db->pCom
f700: 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  mitArg = pArg;. 
f710: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
f720: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
f730: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
f740: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
f750: 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
f760: 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
f770: 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70  time a row is up
f780: 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74  dated,.** insert
f790: 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73  ed or deleted us
f7a0: 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61 73  ing this databas
f7b0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
f7c0: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 75  .void *sqlite3_u
f7d0: 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71  pdate_hook(.  sq
f7e0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
f7f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
f800: 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
f810: 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
f820: 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63   void (*xCallbac
f830: 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61  k)(void*,int,cha
f840: 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20 63  r const *,char c
f850: 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69 6e  onst *,sqlite_in
f860: 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  t64),.  void *pA
f870: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
f880: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
f890: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
f8a0: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  .){.  void *pRet
f8b0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
f8c0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
f8d0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
f8e0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
f8f0: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
f900: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
f910: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
f920: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
f930: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
f940: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
f950: 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70 64 61  pRet = db->pUpda
f960: 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55 70  teArg;.  db->xUp
f970: 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78  dateCallback = x
f980: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
f990: 70 55 70 64 61 74 65 41 72 67 20 3d 20 70 41 72  pUpdateArg = pAr
f9a0: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
f9b0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
f9c0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ex);.  return pR
f9d0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  et;.}../*.** Reg
f9e0: 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
f9f0: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
fa00: 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73  ach time a trans
fa10: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
fa20: 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68 69 73  .** back by this
fa30: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
fa40: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
fa50: 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f  qlite3_rollback_
fa60: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
fa70: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
fa80: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
fa90: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
faa0: 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20  abase */.  void 
fab0: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
fac0: 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b  d*), /* Callback
fad0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
fae0: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
faf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
fb00: 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
fb10: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
fb20: 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66  d *pRet;..#ifdef
fb30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
fb40: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
fb50: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
fb60: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
fb70: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
fb80: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
fb90: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
fba0: 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
fbb0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
fbc0: 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
fbd0: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a  ->pRollbackArg;.
fbe0: 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43    db->xRollbackC
fbf0: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
fc00: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c  ack;.  db->pRoll
fc10: 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a  backArg = pArg;.
fc20: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
fc30: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
fc40: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
fc50: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
fc60: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
fc70: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61  * The sqlite3_wa
fc80: 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63  l_hook() callbac
fc90: 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20  k registered by 
fca0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
fcb0: 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a  checkpoint()..**
fcc0: 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f   Invoke sqlite3_
fcd0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69  wal_checkpoint i
fce0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
fcf0: 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f  frames in the lo
fd00: 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65  g file.** is gre
fd10: 61 74 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65  ater than sqlite
fd20: 33 2e 70 57 61 6c 41 72 67 20 63 61 73 74 20 74  3.pWalArg cast t
fd30: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 28 74 68  o an integer (th
fd40: 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72  e value configur
fd50: 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74  ed by.** wal_aut
fd60: 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a  ocheckpoint())..
fd70: 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  */ .int sqlite3W
fd80: 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20  alDefaultHook(. 
fd90: 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61   void *pClientDa
fda0: 74 61 2c 20 20 20 20 20 2f 2a 20 41 72 67 75 6d  ta,     /* Argum
fdb0: 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ent */.  sqlite3
fdc0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
fdd0: 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  /* Connection */
fde0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
fdf0: 44 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74  Db,       /* Dat
fe00: 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
fe10: 46 72 61 6d 65 20 20 20 20 20 20 20 20 20 20 20  Frame           
fe20: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c    /* Size of WAL
fe30: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72   */.){.  if( nFr
fe40: 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f  ame>=SQLITE_PTR_
fe50: 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44 61  TO_INT(pClientDa
fe60: 74 61 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ta) ){.    sqlit
fe70: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
fe80: 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  loc();.    sqlit
fe90: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
fea0: 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20  t(db, zDb);.    
feb0: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
fec0: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20  Malloc();.  }.  
fed0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
fee0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
fef0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
ff00: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ../*.** Configur
ff10: 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c  e an sqlite3_wal
ff20: 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b  _hook() callback
ff30: 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   to automaticall
ff40: 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  y checkpoint.** 
ff50: 61 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  a database after
ff60: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
ff70: 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
ff80: 72 65 20 61 72 65 20 6e 46 72 61 6d 65 20 6f 72  re are nFrame or
ff90: 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73 20  .** more frames 
ffa0: 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e  in the log file.
ffb0: 20 50 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72   Passing zero or
ffc0: 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75   a negative valu
ffd0: 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61  e as the.** nFra
ffe0: 6d 65 20 70 61 72 61 6d 65 74 65 72 20 64 69 73  me parameter dis
fff0: 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20  ables automatic 
10000 63 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69  checkpoints enti
10010 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rely..**.** The 
10020 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65  callback registe
10030 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
10040 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e  tion replaces an
10050 79 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62  y existing callb
10060 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72 65  ack.** registere
10070 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  d using sqlite3_
10080 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65  wal_hook(). Like
10090 77 69 73 65 2c 20 72 65 67 69 73 74 65 72 69 6e  wise, registerin
100a0 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  g a callback.** 
100b0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61  using sqlite3_wa
100c0 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65  l_hook() disable
100d0 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  s the automatic 
100e0 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61  checkpoint mecha
100f0 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72  nism.** configur
10100 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
10110 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
10120 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63  te3_wal_autochec
10130 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a  kpoint(sqlite3 *
10140 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b  db, int nFrame){
10150 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
10160 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44  MIT_WAL.  UNUSED
10170 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
10180 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10190 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73  ER(nFrame);.#els
101a0 65 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  e.#ifdef SQLITE_
101b0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
101c0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
101d0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
101e0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
101f0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
10200 6e 64 69 66 0a 20 20 69 66 28 20 6e 46 72 61 6d  ndif.  if( nFram
10210 65 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  e>0 ){.    sqlit
10220 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20  e3_wal_hook(db, 
10230 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c  sqlite3WalDefaul
10240 74 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e  tHook, SQLITE_IN
10250 54 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29  T_TO_PTR(nFrame)
10260 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10270 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
10280 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  (db, 0, 0);.  }.
10290 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
102a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
102b0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
102c0 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
102d0 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
102e0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
102f0 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
10300 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64   the write-ahead
10310 2d 6c 6f 67 20 62 79 20 74 68 69 73 20 64 61 74  -log by this dat
10320 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10330 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
10340 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73  e3_wal_hook(.  s
10350 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10370 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
10380 6b 20 74 6f 20 74 68 69 73 20 64 62 20 68 61 6e  k to this db han
10390 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43  dle */.  int(*xC
103a0 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c  allback)(void *,
103b0 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74   sqlite3*, const
103c0 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20   char*, int),.  
103d0 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
103e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103f0 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
10400 74 20 70 61 73 73 65 64 20 74 6f 20 78 43 61 6c  t passed to xCal
10410 6c 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69  lback() */.){.#i
10420 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10430 54 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52  T_WAL.  void *pR
10440 65 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  et;.#ifdef SQLIT
10450 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
10460 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
10470 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
10480 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
10490 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
104a0 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
104b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
104c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
104d0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
104e0 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c   pRet = db->pWal
104f0 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43  Arg;.  db->xWalC
10500 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
10510 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41  ack;.  db->pWalA
10520 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
10530 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10540 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
10550 65 74 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73  eturn pRet;.#els
10560 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  e.  return 0;.#e
10570 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ndif.}../*.** Ch
10580 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73  eckpoint databas
10590 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e zDb..*/.int sq
105a0 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
105b0 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69 74  oint_v2(.  sqlit
105c0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
105d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
105e0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
105f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10600 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
10610 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74     /* Name of at
10620 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20  tached database 
10630 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69  (or NULL) */.  i
10640 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20 20 20 20  nt eMode,       
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10660 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  * SQLITE_CHECKPO
10670 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20  INT_* value */. 
10680 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20   int *pnLog,    
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106a0 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66   /* OUT: Size of
106b0 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d   WAL log in fram
106c0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43  es */.  int *pnC
106d0 6b 70 74 20 20 20 20 20 20 20 20 20 20 20 20 20  kpt             
106e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
106f0 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
10700 66 72 61 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e  frames checkpoin
10710 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66  ted */.){.#ifdef
10720 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
10730 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10740 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  _OK;.#else.  int
10750 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
10760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10770 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
10780 20 69 6e 74 20 69 44 62 20 3d 20 53 51 4c 49 54   int iDb = SQLIT
10790 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3b 20  E_MAX_ATTACHED; 
107a0 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44 62 5b   /* sqlite3.aDb[
107b0 5d 20 69 6e 64 65 78 20 6f 66 20 64 62 20 74 6f  ] index of db to
107c0 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a   checkpoint */..
107d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
107e0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
107f0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
10800 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
10810 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
10820 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
10830 69 66 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  if..  /* Initial
10840 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20 76  ize the output v
10850 61 72 69 61 62 6c 65 73 20 74 6f 20 2d 31 20 69  ariables to -1 i
10860 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20  n case an error 
10870 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28  occurs. */.  if(
10880 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20   pnLog ) *pnLog 
10890 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b  = -1;.  if( pnCk
108a0 70 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d  pt ) *pnCkpt = -
108b0 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51  1;..  assert( SQ
108c0 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
108d0 50 41 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20  PASSIVE==0 );.  
108e0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
108f0 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d  HECKPOINT_FULL==
10900 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  1 );.  assert( S
10910 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
10920 5f 52 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a 20  _RESTART==2 );. 
10930 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
10940 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43  CHECKPOINT_TRUNC
10950 41 54 45 3d 3d 33 20 29 3b 0a 20 20 69 66 28 20  ATE==3 );.  if( 
10960 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43 48 45  eMode<SQLITE_CHE
10970 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20  CKPOINT_PASSIVE 
10980 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54 45 5f  || eMode>SQLITE_
10990 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43  CHECKPOINT_TRUNC
109a0 41 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  ATE ){.    /* EV
109b0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 39  IDENCE-OF: R-039
109c0 39 36 2d 31 32 30 38 38 20 54 68 65 20 4d 20 70  96-12088 The M p
109d0 61 72 61 6d 65 74 65 72 20 6d 75 73 74 20 62 65  arameter must be
109e0 20 61 20 76 61 6c 69 64 20 63 68 65 63 6b 70 6f   a valid checkpo
109f0 69 6e 74 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 3a  int.    ** mode:
10a00 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
10a10 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20  QLITE_MISUSE;.  
10a20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  }..  sqlite3_mut
10a30 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
10a40 65 78 29 3b 0a 20 20 69 66 28 20 7a 44 62 20 26  ex);.  if( zDb &
10a50 26 20 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20  & zDb[0] ){.    
10a60 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  iDb = sqlite3Fin
10a70 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29  dDbName(db, zDb)
10a80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c  ;.  }.  if( iDb<
10a90 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
10aa0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
10ab0 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
10ac0 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 45  Msg(db, SQLITE_E
10ad0 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  RROR, "unknown d
10ae0 61 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a 44  atabase: %s", zD
10af0 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
10b00 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
10b10 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20  .nBusy = 0;.    
10b20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63  rc = sqlite3Chec
10b30 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20  kpoint(db, iDb, 
10b40 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e  eMode, pnLog, pn
10b50 43 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Ckpt);.    sqlit
10b60 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b  e3Error(db, rc);
10b70 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
10b80 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
10b90 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
10ba0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
10bb0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
10bc0 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  c;.#endif.}.../*
10bd0 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64  .** Checkpoint d
10be0 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49 66 20  atabase zDb. If 
10bf0 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20  zDb is NULL, or 
10c00 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 44  if the buffer zD
10c10 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 63  b points.** to c
10c20 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d 6c  ontains a zero-l
10c30 65 6e 67 74 68 20 73 74 72 69 6e 67 2c 20 61 6c  ength string, al
10c40 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
10c50 61 73 65 73 20 61 72 65 20 0a 2a 2a 20 63 68 65  ases are .** che
10c60 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e  ckpointed..*/.in
10c70 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  t sqlite3_wal_ch
10c80 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33  eckpoint(sqlite3
10c90 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
10ca0 20 2a 7a 44 62 29 7b 0a 20 20 2f 2a 20 45 56 49   *zDb){.  /* EVI
10cb0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 36 31  DENCE-OF: R-4161
10cc0 33 2d 32 30 35 35 33 20 54 68 65 20 73 71 6c 69  3-20553 The sqli
10cd0 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
10ce0 6e 74 28 44 2c 58 29 20 69 73 20 65 71 75 69 76  nt(D,X) is equiv
10cf0 61 6c 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 73 71  alent to.  ** sq
10d00 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
10d10 6f 69 6e 74 5f 76 32 28 44 2c 58 2c 53 51 4c 49  oint_v2(D,X,SQLI
10d20 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
10d30 53 53 49 56 45 2c 30 2c 30 29 2e 20 2a 2f 0a 20  SSIVE,0,0). */. 
10d40 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
10d50 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
10d60 32 28 64 62 2c 7a 44 62 2c 53 51 4c 49 54 45 5f  2(db,zDb,SQLITE_
10d70 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
10d80 56 45 2c 30 2c 30 29 3b 0a 7d 0a 0a 23 69 66 6e  VE,0,0);.}..#ifn
10d90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10da0 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20  WAL./*.** Run a 
10db0 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61  checkpoint on da
10dc0 74 61 62 61 73 65 20 69 44 62 2e 20 54 68 69 73  tabase iDb. This
10dd0 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64   is a no-op if d
10de0 61 74 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a  atabase iDb is.*
10df0 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  * not currently 
10e00 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65  open in WAL mode
10e10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61  ..**.** If a tra
10e20 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
10e30 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
10e40 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e   being checkpoin
10e50 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75  ted, this .** fu
10e60 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
10e70 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64  QLITE_LOCKED and
10e80 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73   a checkpoint is
10e90 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20   not attempted. 
10ea0 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  If .** an error 
10eb0 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e  occurs while run
10ec0 6e 69 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f  ning the checkpo
10ed0 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  int, an SQLite e
10ee0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a  rror code is .**
10ef0 20 72 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20   returned (i.e. 
10f00 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f  SQLITE_IOERR). O
10f10 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
10f20 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  _OK..**.** The m
10f30 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65  utex on database
10f40 20 68 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c   handle db shoul
10f50 64 20 62 65 20 68 65 6c 64 20 62 79 20 74 68 65  d be held by the
10f60 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74   caller. The mut
10f70 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  ex.** associated
10f80 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
10f90 69 63 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20  ic b-tree being 
10fa0 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20  checkpointed is 
10fb0 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73  taken by.** this
10fc0 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20   function while 
10fd0 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69  the checkpoint i
10fe0 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  s running..**.**
10ff0 20 49 66 20 69 44 62 20 69 73 20 70 61 73 73 65   If iDb is passe
11000 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  d SQLITE_MAX_ATT
11010 41 43 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20  ACHED, then all 
11020 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
11030 65 73 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70  es are.** checkp
11040 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72  ointed. If an er
11050 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
11060 65 64 20 69 74 20 69 73 20 72 65 74 75 72 6e 65  ed it is returne
11070 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a  d immediately -.
11080 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73  ** no attempt is
11090 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f   made to checkpo
110a0 69 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e  int any remainin
110b0 67 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a  g databases..**.
110c0 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  ** Parameter eMo
110d0 64 65 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c  de is one of SQL
110e0 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
110f0 41 53 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20  ASSIVE, FULL or 
11100 52 45 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20  RESTART..*/.int 
11110 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e  sqlite3Checkpoin
11120 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  t(sqlite3 *db, i
11130 6e 74 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64  nt iDb, int eMod
11140 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69  e, int *pnLog, i
11150 6e 74 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69  nt *pnCkpt){.  i
11160 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
11170 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
11180 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
11190 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111b0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
111c0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 74  erate through at
111d0 74 61 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20  tached dbs */.  
111e0 69 6e 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20  int bBusy = 0;  
111f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11200 2f 2a 20 54 72 75 65 20 69 66 20 53 51 4c 49 54  /* True if SQLIT
11210 45 5f 42 55 53 59 20 68 61 73 20 62 65 65 6e 20  E_BUSY has been 
11220 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a  encountered */..
11230 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11240 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
11250 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
11260 65 72 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a  ert( !pnLog || *
11270 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61  pnLog==-1 );.  a
11280 73 73 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c  ssert( !pnCkpt |
11290 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b  | *pnCkpt==-1 );
112a0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ..  for(i=0; i<d
112b0 62 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51  b->nDb && rc==SQ
112c0 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
112d0 20 20 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c     if( i==iDb ||
112e0 20 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58   iDb==SQLITE_MAX
112f0 5f 41 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20  _ATTACHED ){.   
11300 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
11310 74 72 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64  treeCheckpoint(d
11320 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65  b->aDb[i].pBt, e
11330 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43  Mode, pnLog, pnC
11340 6b 70 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f  kpt);.      pnLo
11350 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43  g = 0;.      pnC
11360 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  kpt = 0;.      i
11370 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
11380 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42  SY ){.        bB
11390 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  usy = 1;.       
113a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
113b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
113c0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63   }..  return (rc
113d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
113e0 42 75 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42  Busy) ? SQLITE_B
113f0 55 53 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64  USY : rc;.}.#end
11400 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
11410 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
11420 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
11430 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61  turns true if ma
11440 69 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64  in-memory should
11450 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
11460 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61   of.** a tempora
11470 72 79 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e  ry file for tran
11480 73 69 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65  sient pager file
11490 73 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20  s and statement 
114a0 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65  journals..** The
114b0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
114c0 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76  depends on the v
114d0 61 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70  alue of db->temp
114e0 5f 73 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a  _store (runtime.
114f0 2a 2a 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e  ** parameter) an
11500 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69  d the compile ti
11510 6d 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49  me value of SQLI
11520 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54  TE_TEMP_STORE. T
11530 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
11540 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
11550 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70  the relationship
11560 20 62 65 74 77 65 65 6e 20 74 68 65 73 65 20 74   between these t
11570 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64  wo values.** and
11580 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20   this functions 
11590 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a  return value..**
115a0 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d  .**   SQLITE_TEM
115b0 50 5f 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e  P_STORE     db->
115c0 74 65 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c  temp_store     L
115d0 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f  ocation of tempo
115e0 72 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  rary database.**
115f0 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
11600 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
11610 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
11620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
11640 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
11650 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20        any       
11660 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
11670 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
11680 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
11690 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
116a0 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
116b0 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
116c0 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20  .**   1         
116d0 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
116e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
116f0 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
11700 20 31 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20   1).**   1      
11710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
11720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11730 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
11740 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20  urn 0).**   2   
11750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11760 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
11770 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
11780 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32  return 0).**   2
11790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117a0 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
117b0 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
117c0 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
117d0 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
117e0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
117f0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
11800 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a  y    (return 1).
11810 2a 2a 20 20 20 33 20 20 20 20 20 20 20 20 20 20  **   3          
11820 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20             any  
11830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
11840 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
11850 31 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1).*/.int sqlite
11860 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f  3TempInMemory(co
11870 6e 73 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29  nst sqlite3 *db)
11880 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  {.#if SQLITE_TEM
11890 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74  P_STORE==1.  ret
118a0 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73  urn ( db->temp_s
118b0 74 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69  tore==2 );.#endi
118c0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  f.#if SQLITE_TEM
118d0 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74  P_STORE==2.  ret
118e0 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73  urn ( db->temp_s
118f0 74 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69  tore!=1 );.#endi
11900 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  f.#if SQLITE_TEM
11910 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 55 4e 55  P_STORE==3.  UNU
11920 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
11930 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  );.  return 1;.#
11940 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
11950 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c  _TEMP_STORE<1 ||
11960 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
11970 52 45 3e 33 0a 20 20 55 4e 55 53 45 44 5f 50 41  RE>3.  UNUSED_PA
11980 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72  RAMETER(db);.  r
11990 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
119a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
119b0 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e  UTF-8 encoded En
119c0 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
119d0 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
119e0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
119f0 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   error..*/.const
11a00 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65   char *sqlite3_e
11a10 72 72 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64  rrmsg(sqlite3 *d
11a20 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b){.  const char
11a30 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29   *z;.  if( !db )
11a40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
11a50 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
11a60 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20  E_NOMEM);.  }.  
11a70 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
11a80 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
11a90 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
11aa0 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
11ab0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
11ac0 50 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  PT);.  }.  sqlit
11ad0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
11ae0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
11af0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11b00 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  d ){.    z = sql
11b10 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49 54  ite3ErrStr(SQLIT
11b20 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73  E_NOMEM);.  }els
11b30 65 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  e{.    testcase(
11b40 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 3b 0a   db->pErr==0 );.
11b50 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 73      z = (char*)s
11b60 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
11b70 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  t(db->pErr);.   
11b80 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
11b90 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
11ba0 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
11bb0 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45      z = sqlite3E
11bc0 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64  rrStr(db->errCod
11bd0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
11be0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
11bf0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
11c00 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23    return z;.}..#
11c10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11c20 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
11c30 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e 63  eturn UTF-16 enc
11c40 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e  oded English lan
11c50 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f  guage explanatio
11c60 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
11c70 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  cent.** error..*
11c80 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
11c90 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28 73  lite3_errmsg16(s
11ca0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73  qlite3 *db){.  s
11cb0 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20  tatic const u16 
11cc0 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20  outOfMem[] = {. 
11cd0 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27     'o', 'u', 't'
11ce0 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c  , ' ', 'o', 'f',
11cf0 20 27 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20   ' ', 'm', 'e', 
11d00 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27  'm', 'o', 'r', '
11d10 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61  y', 0.  };.  sta
11d20 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6d 69  tic const u16 mi
11d30 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27  suse[] = {.    '
11d40 6c 27 2c 20 27 69 27 2c 20 27 62 27 2c 20 27 72  l', 'i', 'b', 'r
11d50 27 2c 20 27 61 27 2c 20 27 72 27 2c 20 27 79 27  ', 'a', 'r', 'y'
11d60 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 72 27 2c  , ' ', .    'r',
11d70 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20   'o', 'u', 't', 
11d80 27 69 27 2c 20 27 6e 27 2c 20 27 65 27 2c 20 27  'i', 'n', 'e', '
11d90 20 27 2c 20 0a 20 20 20 20 27 63 27 2c 20 27 61   ', .    'c', 'a
11da0 27 2c 20 27 6c 27 2c 20 27 6c 27 2c 20 27 65 27  ', 'l', 'l', 'e'
11db0 2c 20 27 64 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'd', ' ', .   
11dc0 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20   'o', 'u', 't', 
11dd0 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27  ' ', .    'o', '
11de0 66 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 73  f', ' ', .    's
11df0 27 2c 20 27 65 27 2c 20 27 71 27 2c 20 27 75 27  ', 'e', 'q', 'u'
11e00 2c 20 27 65 27 2c 20 27 6e 27 2c 20 27 63 27 2c  , 'e', 'n', 'c',
11e10 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20   'e', 0.  };..  
11e20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20  const void *z;. 
11e30 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
11e40 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f  return (void *)o
11e50 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69  utOfMem;.  }.  i
11e60 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
11e70 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
11e80 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
11e90 20 28 76 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b   (void *)misuse;
11ea0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
11eb0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
11ec0 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d  utex);.  if( db-
11ed0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
11ee0 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a  .    z = (void *
11ef0 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c  )outOfMem;.  }el
11f00 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69  se{.    z = sqli
11f10 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
11f20 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20  (db->pErr);.    
11f30 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
11f40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
11f50 74 68 4d 73 67 28 64 62 2c 20 64 62 2d 3e 65 72  thMsg(db, db->er
11f60 72 43 6f 64 65 2c 20 73 71 6c 69 74 65 33 45 72  rCode, sqlite3Er
11f70 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65  rStr(db->errCode
11f80 29 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71  ));.      z = sq
11f90 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
11fa0 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  16(db->pErr);.  
11fb0 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c    }.    /* A mal
11fc0 6c 6f 63 28 29 20 6d 61 79 20 68 61 76 65 20 66  loc() may have f
11fd0 61 69 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65  ailed within the
11fe0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
11ff0 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a  _value_text16().
12000 20 20 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66      ** above. If
12010 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
12020 65 2c 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e  e, then the db->
12030 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
12040 67 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a  g needs to.    *
12050 2a 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66  * be cleared bef
12060 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44  ore returning. D
12070 6f 20 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c  o this directly,
12080 20 69 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a   instead of via.
12090 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70      ** sqlite3Ap
120a0 69 45 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69  iExit(), to avoi
120b0 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 64 61  d setting the da
120c0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72  tabase handle er
120d0 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20  ror message..   
120e0 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   */.    db->mall
120f0 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  ocFailed = 0;.  
12100 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
12110 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
12120 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  x);.  return z;.
12130 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12140 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
12150 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
12160 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65  he most recent e
12170 72 72 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61  rror code genera
12180 74 65 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65  ted by an SQLite
12190 20 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c   routine. If NUL
121a0 4c 20 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74  L is.** passed t
121b0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
121c0 20 77 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c   we assume a mal
121d0 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 64 75 72  loc() failed dur
121e0 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ing sqlite3_open
121f0 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
12200 65 33 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74  e3_errcode(sqlit
12210 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  e3 *db){.  if( d
12220 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66  b && !sqlite3Saf
12230 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
12240 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
12250 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
12260 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
12270 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c   !db || db->mall
12280 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
12290 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
122a0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
122b0 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20  n db->errCode & 
122c0 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69  db->errMask;.}.i
122d0 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  nt sqlite3_exten
122e0 64 65 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69  ded_errcode(sqli
122f0 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20  te3 *db){.  if( 
12300 64 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61  db && !sqlite3Sa
12310 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
12320 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
12330 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
12340 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  E_BKPT;.  }.  if
12350 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c  ( !db || db->mal
12360 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
12370 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
12380 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OMEM;.  }.  retu
12390 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a  rn db->errCode;.
123a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
123b0 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
123c0 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64  scribes the kind
123d0 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66   of error specif
123e0 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ied in the.** ar
123f0 67 75 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77  gument.  For now
12400 2c 20 74 68 69 73 20 73 69 6d 70 6c 79 20 63 61  , this simply ca
12410 6c 6c 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  lls the internal
12420 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 29   sqlite3ErrStr()
12430 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  .** function..*/
12440 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
12450 69 74 65 33 5f 65 72 72 73 74 72 28 69 6e 74 20  ite3_errstr(int 
12460 72 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  rc){.  return sq
12470 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 3b  lite3ErrStr(rc);
12480 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
12490 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67   a new collating
124a0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61   function for da
124b0 74 61 62 61 73 65 20 22 64 62 22 2e 20 20 54 68  tabase "db".  Th
124c0 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a  e name is zName.
124d0 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64  ** and the encod
124e0 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73  ing is enc..*/.s
124f0 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65  tatic int create
12500 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c  Collation(.  sql
12510 69 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73  ite3* db,.  cons
12520 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
12530 20 20 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64    u8 enc,.  void
12540 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
12550 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
12560 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
12570 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c  nt,const void*),
12580 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76  .  void(*xDel)(v
12590 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53  oid*).){.  CollS
125a0 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74  eq *pColl;.  int
125b0 20 65 6e 63 32 3b 0a 20 20 0a 20 20 61 73 73 65   enc2;.  .  asse
125c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
125d0 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
125e0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51  ) );..  /* If SQ
125f0 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70  LITE_UTF16 is sp
12600 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65  ecified as the e
12610 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72  ncoding type, tr
12620 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a  ansform this.  *
12630 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49  * to one of SQLI
12640 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51  TE_UTF16LE or SQ
12650 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69  LITE_UTF16BE usi
12660 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ng the.  ** SQLI
12670 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d  TE_UTF16NATIVE m
12680 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46  acro. SQLITE_UTF
12690 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  16 is not used i
126a0 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  nternally..  */.
126b0 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20    enc2 = enc;.  
126c0 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d  testcase( enc2==
126d0 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a  SQLITE_UTF16 );.
126e0 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32    testcase( enc2
126f0 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  ==SQLITE_UTF16_A
12700 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20  LIGNED );.  if( 
12710 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
12720 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49  16 || enc2==SQLI
12730 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
12740 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53   ){.    enc2 = S
12750 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
12760 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63  E;.  }.  if( enc
12770 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  2<SQLITE_UTF8 ||
12780 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46   enc2>SQLITE_UTF
12790 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75  16BE ){.    retu
127a0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
127b0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
127c0 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 63   Check if this c
127d0 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20  all is removing 
127e0 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20  or replacing an 
127f0 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69  existing collati
12800 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  on .  ** sequenc
12810 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68  e. If so, and th
12820 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
12830 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e  Ms, return busy.
12840 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61   If there.  ** a
12850 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
12860 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  , invalidate any
12870 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74   pre-compiled st
12880 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
12890 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
128a0 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
128b0 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c  (u8)enc2, zName,
128c0 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   0);.  if( pColl
128d0 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   && pColl->xCmp 
128e0 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e  ){.    if( db->n
128f0 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20  VdbeActive ){.  
12900 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
12910 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49  WithMsg(db, SQLI
12920 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
12930 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c    "unable to del
12940 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61  ete/modify colla
12950 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75  tion sequence du
12960 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74  e to active stat
12970 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  ements");.      
12980 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
12990 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  SY;.    }.    sq
129a0 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
129b0 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
129c0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f  );..    /* If co
129d0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
129e0 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65 61 74   pColl was creat
129f0 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 61  ed directly by a
12a00 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
12a10 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
12a20 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f  ollation, and no
12a30 74 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 73  t generated by s
12a40 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20  ynthCollSeq(),. 
12a50 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63     ** then any c
12a60 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20 73 79  opies made by sy
12a70 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65  nthCollSeq() nee
12a80 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61  d to be invalida
12a90 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f  ted..    ** Also
12aa0 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74  , collation dest
12ab0 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71  ructor - CollSeq
12ac0 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63 74 69  .xDel() - functi
12ad0 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20  on may need.    
12ae0 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e  ** to be called.
12af0 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69 66 28  .    */ .    if(
12b00 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e   (pColl->enc & ~
12b10 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
12b20 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20  GNED)==enc2 ){. 
12b30 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43       CollSeq *aC
12b40 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73  oll = sqlite3Has
12b50 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c  hFind(&db->aColl
12b60 53 65 71 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  Seq, zName);.   
12b70 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
12b80 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b  for(j=0; j<3; j+
12b90 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  +){.        Coll
12ba0 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b  Seq *p = &aColl[
12bb0 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  j];.        if( 
12bc0 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65  p->enc==pColl->e
12bd0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
12be0 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20  if( p->xDel ){. 
12bf0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 44             p->xD
12c00 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20  el(p->pUser);.  
12c10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12c20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b      p->xCmp = 0;
12c30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12c40 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
12c50 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
12c60 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28  indCollSeq(db, (
12c70 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20  u8)enc2, zName, 
12c80 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d  1);.  if( pColl=
12c90 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
12ca0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 43 6f 6c  TE_NOMEM;.  pCol
12cb0 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61  l->xCmp = xCompa
12cc0 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73  re;.  pColl->pUs
12cd0 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f  er = pCtx;.  pCo
12ce0 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b  ll->xDel = xDel;
12cf0 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20  .  pColl->enc = 
12d00 28 75 38 29 28 65 6e 63 32 20 7c 20 28 65 6e 63  (u8)(enc2 | (enc
12d10 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f   & SQLITE_UTF16_
12d20 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c  ALIGNED));.  sql
12d30 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
12d40 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 72 65 74 75  LITE_OK);.  retu
12d50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12d60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72  ../*.** This arr
12d70 61 79 20 64 65 66 69 6e 65 73 20 68 61 72 64 20  ay defines hard 
12d80 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20  upper bounds on 
12d90 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54  limit values.  T
12da0 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  he.** initialize
12db0 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69  r must be kept i
12dc0 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20  n sync with the 
12dd0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a  SQLITE_LIMIT_*.*
12de0 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71  * #defines in sq
12df0 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74  lite3.h..*/.stat
12e00 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61  ic const int aHa
12e10 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20  rdLimit[] = {.  
12e20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
12e30 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
12e40 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  SQL_LENGTH,.  SQ
12e50 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c  LITE_MAX_COLUMN,
12e60 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  .  SQLITE_MAX_EX
12e70 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49  PR_DEPTH,.  SQLI
12e80 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
12e90 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45  SELECT,.  SQLITE
12ea0 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20  _MAX_VDBE_OP,.  
12eb0 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
12ec0 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54  ION_ARG,.  SQLIT
12ed0 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a  E_MAX_ATTACHED,.
12ee0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b    SQLITE_MAX_LIK
12ef0 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
12f00 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ,.  SQLITE_MAX_V
12f10 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 20  ARIABLE_NUMBER, 
12f20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33       /* IMP: R-3
12f30 38 30 39 31 2d 33 32 33 35 32 20 2a 2f 0a 20 20  8091-32352 */.  
12f40 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
12f50 45 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49  ER_DEPTH,.  SQLI
12f60 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
12f70 52 45 41 44 53 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  READS,.};../*.**
12f80 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 68   Make sure the h
12f90 61 72 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73  ard limits are s
12fa0 65 74 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65  et to reasonable
12fb0 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53   values.*/.#if S
12fc0 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
12fd0 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  <100.# error SQL
12fe0 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d  ITE_MAX_LENGTH m
12ff0 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
13000 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  100.#endif.#if S
13010 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
13020 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72  NGTH<100.# error
13030 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
13040 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
13050 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64  t least 100.#end
13060 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
13070 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c  X_SQL_LENGTH>SQL
13080 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23  ITE_MAX_LENGTH.#
13090 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
130a0 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73  X_SQL_LENGTH mus
130b0 74 20 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72  t not be greater
130c0 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58   than SQLITE_MAX
130d0 5f 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23  _LENGTH.#endif.#
130e0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
130f0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a  MPOUND_SELECT<2.
13100 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
13110 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
13120 43 54 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  CT must be at le
13130 61 73 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66  ast 2.#endif.#if
13140 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45   SQLITE_MAX_VDBE
13150 5f 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53  _OP<40.# error S
13160 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
13170 50 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  P must be at lea
13180 73 74 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66  st 40.#endif.#if
13190 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
131a0 54 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51  TION_ARG<0 || SQ
131b0 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
131c0 4e 5f 41 52 47 3e 31 30 30 30 0a 23 20 65 72 72  N_ARG>1000.# err
131d0 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  or SQLITE_MAX_FU
131e0 4e 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20  NCTION_ARG must 
131f0 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
13200 20 31 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66   1000.#endif.#if
13210 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41   SQLITE_MAX_ATTA
13220 43 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45  CHED<0 || SQLITE
13230 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3e 31 32  _MAX_ATTACHED>12
13240 35 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  5.# error SQLITE
13250 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75  _MAX_ATTACHED mu
13260 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  st be between 0 
13270 61 6e 64 20 31 32 35 0a 23 65 6e 64 69 66 0a 23  and 125.#endif.#
13280 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  if SQLITE_MAX_LI
13290 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
132a0 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  H<1.# error SQLI
132b0 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54  TE_MAX_LIKE_PATT
132c0 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  ERN_LENGTH must 
132d0 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65  be at least 1.#e
132e0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
132f0 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37  MAX_COLUMN>32767
13300 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
13310 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20  MAX_COLUMN must 
13320 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37 36 37  not exceed 32767
13330 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
13340 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
13350 45 50 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53  EPTH<1.# error S
13360 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
13370 52 5f 44 45 50 54 48 20 6d 75 73 74 20 62 65 20  R_DEPTH must be 
13380 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69  at least 1.#endi
13390 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
133a0 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3c  _WORKER_THREADS<
133b0 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  0 || SQLITE_MAX_
133c0 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 35  WORKER_THREADS>5
133d0 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
133e0 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
133f0 41 44 53 20 6d 75 73 74 20 62 65 20 62 65 74 77  ADS must be betw
13400 65 65 6e 20 30 20 61 6e 64 20 35 30 0a 23 65 6e  een 0 and 50.#en
13410 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
13420 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
13430 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74  a limit.  Report
13440 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a   the old value..
13450 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64  ** If an invalid
13460 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20   limit index is 
13470 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74  supplied, report
13480 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20   -1..** Make no 
13490 63 68 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c  changes but stil
134a0 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64  l report the old
134b0 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a   value if the.**
134c0 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65   new limit is ne
134d0 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  gative..**.** A 
134e0 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20  new lower limit 
134f0 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20  does not shrink 
13500 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75  existing constru
13510 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c  cts..** It merel
13520 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63  y prevents new c
13530 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74 20 65  onstructs that e
13540 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a  xceed the limit.
13550 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e  ** from forming.
13560 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
13570 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  limit(sqlite3 *d
13580 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20  b, int limitId, 
13590 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20  int newLimit){. 
135a0 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a   int oldLimit;..
135b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
135c0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
135d0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
135e0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
135f0 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
13600 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
13610 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
13620 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
13630 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
13640 30 31 38 39 2d 35 34 30 39 37 20 46 6f 72 20 65  0189-54097 For e
13650 61 63 68 20 6c 69 6d 69 74 20 63 61 74 65 67 6f  ach limit catego
13660 72 79 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  ry SQLITE_LIMIT_
13670 4e 41 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65 20  NAME.  ** there 
13680 69 73 20 61 20 68 61 72 64 20 75 70 70 65 72 20  is a hard upper 
13690 62 6f 75 6e 64 20 73 65 74 20 61 74 20 63 6f 6d  bound set at com
136a0 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43  pile-time by a C
136b0 20 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 20 20   preprocessor.  
136c0 2a 2a 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20  ** macro called 
136d0 53 51 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e  SQLITE_MAX_NAME.
136e0 20 28 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20   (The "_LIMIT_" 
136f0 69 6e 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63  in the name is c
13700 68 61 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22  hanged to.  ** "
13710 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20  _MAX_".).  */.  
13720 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
13730 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
13740 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  LENGTH]==SQLITE_
13750 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  MAX_LENGTH );.  
13760 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
13770 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
13780 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c  SQL_LENGTH]==SQL
13790 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
137a0 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
137b0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
137c0 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d  E_LIMIT_COLUMN]=
137d0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55  =SQLITE_MAX_COLU
137e0 4d 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  MN );.  assert( 
137f0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
13800 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
13810 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
13820 45 58 50 52 5f 44 45 50 54 48 20 29 3b 0a 20 20  EXPR_DEPTH );.  
13830 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
13840 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
13850 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d  COMPOUND_SELECT]
13860 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  ==SQLITE_MAX_COM
13870 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20  POUND_SELECT);. 
13880 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
13890 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
138a0 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54  _VDBE_OP]==SQLIT
138b0 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b  E_MAX_VDBE_OP );
138c0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
138d0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
138e0 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d  IT_FUNCTION_ARG]
138f0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  ==SQLITE_MAX_FUN
13900 43 54 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61  CTION_ARG );.  a
13910 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
13920 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41  t[SQLITE_LIMIT_A
13930 54 54 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45  TTACHED]==SQLITE
13940 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 3b  _MAX_ATTACHED );
13950 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
13960 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
13970 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
13980 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20  LENGTH]==.      
13990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139b0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
139c0 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
139d0 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
139e0 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
139f0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
13a00 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53  IABLE_NUMBER]==S
13a10 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
13a20 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73  LE_NUMBER);.  as
13a30 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
13a40 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52  [SQLITE_LIMIT_TR
13a50 49 47 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51  IGGER_DEPTH]==SQ
13a60 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
13a70 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
13a80 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
13a90 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
13aa0 45 52 5f 54 48 52 45 41 44 53 5d 3d 3d 53 51 4c  ER_THREADS]==SQL
13ab0 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
13ac0 48 52 45 41 44 53 20 29 3b 0a 20 20 61 73 73 65  HREADS );.  asse
13ad0 72 74 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  rt( SQLITE_LIMIT
13ae0 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3d  _WORKER_THREADS=
13af0 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54  =(SQLITE_N_LIMIT
13b00 2d 31 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c  -1) );...  if( l
13b10 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69  imitId<0 || limi
13b20 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49  tId>=SQLITE_N_LI
13b30 4d 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  MIT ){.    retur
13b40 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c  n -1;.  }.  oldL
13b50 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69  imit = db->aLimi
13b60 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66  t[limitId];.  if
13b70 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b  ( newLimit>=0 ){
13b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b90 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34     /* IMP: R-524
13ba0 37 36 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20 20  76-28732 */.    
13bb0 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61  if( newLimit>aHa
13bc0 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  rdLimit[limitId]
13bd0 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d   ){.      newLim
13be0 69 74 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b  it = aHardLimit[
13bf0 6c 69 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d  limitId];  /* IM
13c00 50 3a 20 52 2d 35 31 34 36 33 2d 32 35 36 33 34  P: R-51463-25634
13c10 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 62   */.    }.    db
13c20 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ->aLimit[limitId
13c30 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20  ] = newLimit;.  
13c40 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69  }.  return oldLi
13c50 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
13c60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
13c70 20 52 2d 35 33 33 34 31 2d 33 35 34 31 39 20 2a   R-53341-35419 *
13c80 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  /.}../*.** This 
13c90 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
13ca0 20 74 6f 20 70 61 72 73 65 20 62 6f 74 68 20 55   to parse both U
13cb0 52 49 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20  RIs and non-URI 
13cc0 66 69 6c 65 6e 61 6d 65 73 20 70 61 73 73 65 64  filenames passed
13cd0 20 62 79 20 74 68 65 0a 2a 2a 20 75 73 65 72 20   by the.** user 
13ce0 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73  to API functions
13cf0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20   sqlite3_open() 
13d00 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  or sqlite3_open_
13d10 76 32 28 29 2c 20 61 6e 64 20 66 6f 72 20 64 61  v2(), and for da
13d20 74 61 62 61 73 65 0a 2a 2a 20 55 52 49 73 20 73  tabase.** URIs s
13d30 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74  pecified as part
13d40 20 6f 66 20 41 54 54 41 43 48 20 73 74 61 74 65   of ATTACH state
13d50 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ments..**.** The
13d60 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
13d70 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
13d80 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
13d90 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 28  the VFS to use (
13da0 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20  or.** a NULL to 
13db0 73 69 67 6e 69 66 79 20 74 68 65 20 64 65 66 61  signify the defa
13dc0 75 6c 74 20 56 46 53 29 20 69 66 20 74 68 65 20  ult VFS) if the 
13dd0 55 52 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  URI does not con
13de0 74 61 69 6e 20 61 20 22 76 66 73 3d 78 78 78 22  tain a "vfs=xxx"
13df0 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65  .** query parame
13e00 74 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ter. The second 
13e10 61 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e  argument contain
13e20 73 20 74 68 65 20 55 52 49 20 28 6f 72 20 6e 6f  s the URI (or no
13e30 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a  n-URI filename).
13e40 2a 2a 20 69 74 73 65 6c 66 2e 20 57 68 65 6e 20  ** itself. When 
13e50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
13e60 20 63 61 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c   called the *pFl
13e70 61 67 73 20 76 61 72 69 61 62 6c 65 20 73 68 6f  ags variable sho
13e80 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74  uld contain.** t
13e90 68 65 20 64 65 66 61 75 6c 74 20 66 6c 61 67 73  he default flags
13ea0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74   to open the dat
13eb0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 69 74  abase handle wit
13ec0 68 2e 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f  h. The value sto
13ed0 72 65 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67  red in.** *pFlag
13ee0 73 20 6d 61 79 20 62 65 20 75 70 64 61 74 65 64  s may be updated
13ef0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
13f00 67 20 69 66 20 74 68 65 20 55 52 49 20 66 69 6c  g if the URI fil
13f10 65 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a  ename contains .
13f20 2a 2a 20 22 63 61 63 68 65 3d 78 78 78 22 20 6f  ** "cache=xxx" o
13f30 72 20 22 6d 6f 64 65 3d 78 78 78 22 20 71 75 65  r "mode=xxx" que
13f40 72 79 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a  ry parameters..*
13f50 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
13f60 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
13f70 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68   returned. In th
13f80 69 73 20 63 61 73 65 20 2a 70 70 56 66 73 20 69  is case *ppVfs i
13f90 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
13fa0 6f 0a 2a 2a 20 74 68 65 20 56 46 53 20 74 68 61  o.** the VFS tha
13fb0 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
13fc0 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74   to open the dat
13fd0 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46  abase file. *pzF
13fe0 69 6c 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a  ile is set to.**
13ff0 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
14000 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
14010 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
14020 6c 65 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69  le to open. It i
14030 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e  s the .** respon
14040 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
14050 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
14060 61 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74 65  ally call sqlite
14070 33 5f 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65  3_free() to rele
14080 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66  ase.** this buff
14090 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  er..**.** If an 
140a0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
140b0 65 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  en an SQLite err
140c0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
140d0 6e 65 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73  ned and *pzErrMs
140e0 67 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20  g.** may be set 
140f0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75  to point to a bu
14100 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
14110 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  an English langu
14120 61 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65  age error .** me
14130 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65  ssage. It is the
14140 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
14150 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
14160 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65   eventually rele
14170 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66  ase.** this buff
14180 65 72 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  er by calling sq
14190 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
141a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 72 73  .int sqlite3Pars
141b0 65 55 72 69 28 0a 20 20 63 6f 6e 73 74 20 63 68  eUri(.  const ch
141c0 61 72 20 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c  ar *zDefaultVfs,
141d0 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74          /* VFS t
141e0 6f 20 75 73 65 20 69 66 20 6e 6f 20 22 76 66 73  o use if no "vfs
141f0 3d 78 78 78 22 20 71 75 65 72 79 20 6f 70 74 69  =xxx" query opti
14200 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
14210 61 72 20 2a 7a 55 72 69 2c 20 20 20 20 20 20 20  ar *zUri,       
14220 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74          /* Nul-t
14230 65 72 6d 69 6e 61 74 65 64 20 55 52 49 20 74 6f  erminated URI to
14240 20 70 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69   parse */.  unsi
14250 67 6e 65 64 20 69 6e 74 20 2a 70 46 6c 61 67 73  gned int *pFlags
14260 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
14270 4e 2f 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50  N/OUT: SQLITE_OP
14280 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a  EN_XXX flags */.
14290 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a    sqlite3_vfs **
142a0 70 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  ppVfs,          
142b0 20 20 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f    /* OUT: VFS to
142c0 20 75 73 65 20 2a 2f 20 0a 20 20 63 68 61 72 20   use */ .  char 
142d0 2a 2a 70 7a 46 69 6c 65 2c 20 20 20 20 20 20 20  **pzFile,       
142e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
142f0 54 3a 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70  T: Filename comp
14300 6f 6e 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a  onent of URI */.
14310 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73    char **pzErrMs
14320 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
14330 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20    /* OUT: Error 
14340 6d 65 73 73 61 67 65 20 28 69 66 20 72 63 21 3d  message (if rc!=
14350 53 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b  SQLITE_OK) */.){
14360 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14370 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65  TE_OK;.  unsigne
14380 64 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70  d int flags = *p
14390 46 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63  Flags;.  const c
143a0 68 61 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66  har *zVfs = zDef
143b0 61 75 6c 74 56 66 73 3b 0a 20 20 63 68 61 72 20  aultVfs;.  char 
143c0 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 63  *zFile;.  char c
143d0 3b 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 73  ;.  int nUri = s
143e0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
143f0 55 72 69 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  Uri);..  assert(
14400 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b   *pzErrMsg==0 );
14410 0a 0a 20 20 69 66 28 20 28 28 66 6c 61 67 73 20  ..  if( ((flags 
14420 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
14430 49 29 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  I)             /
14440 2a 20 49 4d 50 3a 20 52 2d 34 38 37 32 35 2d 33  * IMP: R-48725-3
14450 32 32 30 36 20 2a 2f 0a 20 20 20 20 20 20 20 20  2206 */.        
14460 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c      || sqlite3Gl
14470 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e  obalConfig.bOpen
14480 55 72 69 29 20 2f 2a 20 49 4d 50 3a 20 52 2d 35  Uri) /* IMP: R-5
14490 31 36 38 39 2d 34 36 35 34 38 20 2a 2f 0a 20 20  1689-46548 */.  
144a0 20 26 26 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d   && nUri>=5 && m
144b0 65 6d 63 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c  emcmp(zUri, "fil
144c0 65 3a 22 2c 20 35 29 3d 3d 30 20 2f 2a 20 49 4d  e:", 5)==0 /* IM
144d0 50 3a 20 52 2d 35 37 38 38 34 2d 33 37 34 39 36  P: R-57884-37496
144e0 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 63 68 61   */.  ){.    cha
144f0 72 20 2a 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74  r *zOpt;.    int
14500 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
14510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
14520 72 73 65 72 20 73 74 61 74 65 20 77 68 65 6e 20  rser state when 
14530 70 61 72 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20  parsing URI */. 
14540 20 20 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 20     int iIn;     
14550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14560 20 2f 2a 20 49 6e 70 75 74 20 63 68 61 72 61 63   /* Input charac
14570 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ter index */.   
14580 20 69 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20   int iOut = 0;  
14590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
145a0 2a 20 4f 75 74 70 75 74 20 63 68 61 72 61 63 74  * Output charact
145b0 65 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  er index */.    
145c0 75 36 34 20 6e 42 79 74 65 20 3d 20 6e 55 72 69  u64 nByte = nUri
145d0 2b 32 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  +2;           /*
145e0 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
145f0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a  to allocate */..
14600 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
14610 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   the SQLITE_OPEN
14620 5f 55 52 49 20 66 6c 61 67 20 69 73 20 73 65 74  _URI flag is set
14630 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 6f 20   to indicate to 
14640 74 68 65 20 56 46 53 20 78 4f 70 65 6e 20 0a 20  the VFS xOpen . 
14650 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61     ** method tha
14660 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65  t there may be e
14670 78 74 72 61 20 70 61 72 61 6d 65 74 65 72 73 20  xtra parameters 
14680 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69  following the fi
14690 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20  le-name.  */.   
146a0 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
146b0 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20  _OPEN_URI;..    
146c0 66 6f 72 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e  for(iIn=0; iIn<n
146d0 55 72 69 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74  Uri; iIn++) nByt
146e0 65 20 2b 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d  e += (zUri[iIn]=
146f0 3d 27 26 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65  ='&');.    zFile
14700 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
14710 63 36 34 28 6e 42 79 74 65 29 3b 0a 20 20 20 20  c64(nByte);.    
14720 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74  if( !zFile ) ret
14730 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
14740 3b 0a 0a 20 20 20 20 69 49 6e 20 3d 20 35 3b 0a  ;..    iIn = 5;.
14750 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 41 4c  #ifdef SQLITE_AL
14760 4c 4f 57 5f 55 52 49 5f 41 55 54 48 4f 52 49 54  LOW_URI_AUTHORIT
14770 59 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  Y.    if( strncm
14780 70 28 7a 55 72 69 2b 35 2c 20 22 2f 2f 2f 22 2c  p(zUri+5, "///",
14790 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   3)==0 ){.      
147a0 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20 2f  iIn = 7;.      /
147b0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
147c0 63 6f 6e 64 69 74 69 6f 6e 20 63 61 75 73 65 73  condition causes
147d0 20 55 52 49 73 20 77 69 74 68 20 66 69 76 65 20   URIs with five 
147e0 6c 65 61 64 69 6e 67 20 2f 20 63 68 61 72 61 63  leading / charac
147f0 74 65 72 73 0a 20 20 20 20 20 20 2a 2a 20 6c 69  ters.      ** li
14800 6b 65 20 66 69 6c 65 3a 2f 2f 2f 2f 2f 68 6f 73  ke file://///hos
14810 74 2f 70 61 74 68 20 74 6f 20 62 65 20 63 6f 6e  t/path to be con
14820 76 65 72 74 65 64 20 69 6e 74 6f 20 55 4e 43 73  verted into UNCs
14830 20 6c 69 6b 65 20 2f 2f 68 6f 73 74 2f 70 61 74   like //host/pat
14840 68 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20  h..      ** The 
14850 63 6f 72 72 65 63 74 20 55 52 49 20 66 6f 72 20  correct URI for 
14860 74 68 61 74 20 55 4e 43 20 68 61 73 20 6f 6e 6c  that UNC has onl
14870 79 20 74 77 6f 20 6f 72 20 66 6f 75 72 20 6c 65  y two or four le
14880 61 64 69 6e 67 20 2f 20 63 68 61 72 61 63 74 65  ading / characte
14890 72 73 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  rs.      ** file
148a0 3a 2f 2f 68 6f 73 74 2f 70 61 74 68 20 6f 72 20  ://host/path or 
148b0 66 69 6c 65 3a 2f 2f 2f 2f 68 6f 73 74 2f 70 61  file:////host/pa
148c0 74 68 2e 20 20 42 75 74 20 35 20 6c 65 61 64 69  th.  But 5 leadi
148d0 6e 67 20 73 6c 61 73 68 65 73 20 69 73 20 61 20  ng slashes is a 
148e0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 6d 6f 6e  .      ** common
148f0 20 65 72 72 6f 72 2c 20 77 65 20 61 72 65 20 74   error, we are t
14900 6f 6c 64 2c 20 73 6f 20 77 65 20 68 61 6e 64 6c  old, so we handl
14910 65 20 69 74 20 61 73 20 61 20 73 70 65 63 69 61  e it as a specia
14920 6c 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20  l case. */.     
14930 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55 72   if( strncmp(zUr
14940 69 2b 37 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d  i+7, "///", 3)==
14950 30 20 29 7b 20 69 49 6e 2b 2b 3b 20 7d 0a 20 20  0 ){ iIn++; }.  
14960 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
14970 63 6d 70 28 7a 55 72 69 2b 35 2c 20 22 2f 2f 6c  cmp(zUri+5, "//l
14980 6f 63 61 6c 68 6f 73 74 2f 22 2c 20 31 32 29 3d  ocalhost/", 12)=
14990 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20  =0 ){.      iIn 
149a0 3d 20 31 36 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  = 16;.    }.#els
149b0 65 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64  e.    /* Discard
149c0 20 74 68 65 20 73 63 68 65 6d 65 20 61 6e 64 20   the scheme and 
149d0 61 75 74 68 6f 72 69 74 79 20 73 65 67 6d 65 6e  authority segmen
149e0 74 73 20 6f 66 20 74 68 65 20 55 52 49 2e 20 2a  ts of the URI. *
149f0 2f 0a 20 20 20 20 69 66 28 20 7a 55 72 69 5b 35  /.    if( zUri[5
14a00 5d 3d 3d 27 2f 27 20 26 26 20 7a 55 72 69 5b 36  ]=='/' && zUri[6
14a10 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
14a20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20 20 20 77  iIn = 7;.      w
14a30 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20  hile( zUri[iIn] 
14a40 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 2f  && zUri[iIn]!='/
14a50 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20  ' ) iIn++;.     
14a60 20 69 66 28 20 69 49 6e 21 3d 37 20 26 26 20 28   if( iIn!=7 && (
14a70 69 49 6e 21 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d  iIn!=16 || memcm
14a80 70 28 22 6c 6f 63 61 6c 68 6f 73 74 22 2c 20 26  p("localhost", &
14a90 7a 55 72 69 5b 37 5d 2c 20 39 29 29 20 29 7b 0a  zUri[7], 9)) ){.
14aa0 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73          *pzErrMs
14ab0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
14ac0 6e 74 66 28 22 69 6e 76 61 6c 69 64 20 75 72 69  ntf("invalid uri
14ad0 20 61 75 74 68 6f 72 69 74 79 3a 20 25 2e 2a 73   authority: %.*s
14ae0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
14af0 69 49 6e 2d 37 2c 20 26 7a 55 72 69 5b 37 5d 29  iIn-7, &zUri[7])
14b00 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
14b10 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
14b20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f       goto parse_
14b30 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  uri_out;.      }
14b40 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
14b50 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 66     /* Copy the f
14b60 69 6c 65 6e 61 6d 65 20 61 6e 64 20 61 6e 79 20  ilename and any 
14b70 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 73  query parameters
14b80 20 69 6e 74 6f 20 74 68 65 20 7a 46 69 6c 65 20   into the zFile 
14b90 62 75 66 66 65 72 2e 20 0a 20 20 20 20 2a 2a 20  buffer. .    ** 
14ba0 44 65 63 6f 64 65 20 25 48 48 20 65 73 63 61 70  Decode %HH escap
14bb0 65 20 63 6f 64 65 73 20 61 6c 6f 6e 67 20 74 68  e codes along th
14bc0 65 20 77 61 79 2e 20 0a 20 20 20 20 2a 2a 0a 20  e way. .    **. 
14bd0 20 20 20 2a 2a 20 57 69 74 68 69 6e 20 74 68 69     ** Within thi
14be0 73 20 6c 6f 6f 70 2c 20 76 61 72 69 61 62 6c 65  s loop, variable
14bf0 20 65 53 74 61 74 65 20 6d 61 79 20 62 65 20 73   eState may be s
14c00 65 74 20 74 6f 20 30 2c 20 31 20 6f 72 20 32 2c  et to 0, 1 or 2,
14c10 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a   depending.    *
14c20 2a 20 6f 6e 20 74 68 65 20 70 61 72 73 69 6e 67  * on the parsing
14c30 20 63 6f 6e 74 65 78 74 2e 20 41 73 20 66 6f 6c   context. As fol
14c40 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  lows:.    **.   
14c50 20 2a 2a 20 20 20 30 3a 20 50 61 72 73 69 6e 67   **   0: Parsing
14c60 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20 20   file-name..    
14c70 2a 2a 20 20 20 31 3a 20 50 61 72 73 69 6e 67 20  **   1: Parsing 
14c80 6e 61 6d 65 20 73 65 63 74 69 6f 6e 20 6f 66 20  name section of 
14c90 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65  a name=value que
14ca0 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20  ry parameter..  
14cb0 20 20 2a 2a 20 20 20 32 3a 20 50 61 72 73 69 6e    **   2: Parsin
14cc0 67 20 76 61 6c 75 65 20 73 65 63 74 69 6f 6e 20  g value section 
14cd0 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20  of a name=value 
14ce0 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
14cf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65 53 74 61  .    */.    eSta
14d00 74 65 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  te = 0;.    whil
14d10 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e  e( (c = zUri[iIn
14d20 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20  ])!=0 && c!='#' 
14d30 29 7b 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a  ){.      iIn++;.
14d40 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27        if( c=='%'
14d50 20 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69   .       && sqli
14d60 74 65 33 49 73 78 64 69 67 69 74 28 7a 55 72 69  te3Isxdigit(zUri
14d70 5b 69 49 6e 5d 29 20 0a 20 20 20 20 20 20 20 26  [iIn]) .       &
14d80 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69  & sqlite3Isxdigi
14d90 74 28 7a 55 72 69 5b 69 49 6e 2b 31 5d 29 20 0a  t(zUri[iIn+1]) .
14da0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
14db0 20 69 6e 74 20 6f 63 74 65 74 20 3d 20 28 73 71   int octet = (sq
14dc0 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 55  lite3HexToInt(zU
14dd0 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29  ri[iIn++]) << 4)
14de0 3b 0a 20 20 20 20 20 20 20 20 6f 63 74 65 74 20  ;.        octet 
14df0 2b 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f 49  += sqlite3HexToI
14e00 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b  nt(zUri[iIn++]);
14e10 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ..        assert
14e20 28 20 6f 63 74 65 74 3e 3d 30 20 26 26 20 6f 63  ( octet>=0 && oc
14e30 74 65 74 3c 32 35 36 20 29 3b 0a 20 20 20 20 20  tet<256 );.     
14e40 20 20 20 69 66 28 20 6f 63 74 65 74 3d 3d 30 20     if( octet==0 
14e50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
14e60 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74  This branch is t
14e70 61 6b 65 6e 20 77 68 65 6e 20 22 25 30 30 22 20  aken when "%00" 
14e80 61 70 70 65 61 72 73 20 77 69 74 68 69 6e 20 74  appears within t
14e90 68 65 20 55 52 49 2e 20 49 6e 20 74 68 69 73 0a  he URI. In this.
14ea0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73            ** cas
14eb0 65 20 77 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20  e we ignore all 
14ec0 74 65 78 74 20 69 6e 20 74 68 65 20 72 65 6d 61  text in the rema
14ed0 69 6e 64 65 72 20 6f 66 20 74 68 65 20 70 61 74  inder of the pat
14ee0 68 2c 20 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20  h, name or.     
14ef0 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 63 75       ** value cu
14f00 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 61  rrently being pa
14f10 72 73 65 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20  rsed. So ignore 
14f20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 72  the current char
14f30 61 63 74 65 72 0a 20 20 20 20 20 20 20 20 20 20  acter.          
14f40 2a 2a 20 61 6e 64 20 73 6b 69 70 20 74 6f 20 74  ** and skip to t
14f50 68 65 20 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22  he next "?", "="
14f60 20 6f 72 20 22 26 22 2c 20 61 73 20 61 70 70 72   or "&", as appr
14f70 6f 70 72 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20  opriate. */.    
14f80 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 20        while( (c 
14f90 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20  = zUri[iIn])!=0 
14fa0 26 26 20 63 21 3d 27 23 27 20 0a 20 20 20 20 20  && c!='#' .     
14fb0 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74           && (eSt
14fc0 61 74 65 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27  ate!=0 || c!='?'
14fd0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
14fe0 26 26 20 28 65 53 74 61 74 65 21 3d 31 20 7c 7c  && (eState!=1 ||
14ff0 20 28 63 21 3d 27 3d 27 20 26 26 20 63 21 3d 27   (c!='=' && c!='
15000 26 27 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  &')).           
15010 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 32     && (eState!=2
15020 20 7c 7c 20 63 21 3d 27 26 27 29 0a 20 20 20 20   || c!='&').    
15030 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
15040 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20       iIn++;.    
15050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15060 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
15070 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20      }.        c 
15080 3d 20 6f 63 74 65 74 3b 0a 20 20 20 20 20 20 7d  = octet;.      }
15090 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 3d  else if( eState=
150a0 3d 31 20 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c  =1 && (c=='&' ||
150b0 20 63 3d 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20   c=='=') ){.    
150c0 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f      if( zFile[iO
150d0 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ut-1]==0 ){.    
150e0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74        /* An empt
150f0 79 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49  y option name. I
15100 67 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69 6f  gnore this optio
15110 6e 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f  n altogether. */
15120 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
15130 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a  ( zUri[iIn] && z
15140 55 72 69 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26  Uri[iIn]!='#' &&
15150 20 7a 55 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26   zUri[iIn-1]!='&
15160 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20  ' ) iIn++;.     
15170 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
15180 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15190 20 69 66 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20   if( c=='&' ){. 
151a0 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 5b 69           zFile[i
151b0 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20  Out++] = '\0';. 
151c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
151d0 20 20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d          eState =
151e0 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   2;.        }.  
151f0 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20        c = 0;.   
15200 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 65 53     }else if( (eS
15210 74 61 74 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f  tate==0 && c=='?
15220 27 29 20 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32  ') || (eState==2
15230 20 26 26 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20   && c=='&') ){. 
15240 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20         c = 0;.  
15250 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 31        eState = 1
15260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15270 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
15280 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
15290 20 65 53 74 61 74 65 3d 3d 31 20 29 20 7a 46 69   eState==1 ) zFi
152a0 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30  le[iOut++] = '\0
152b0 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75  ';.    zFile[iOu
152c0 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  t++] = '\0';.   
152d0 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
152e0 20 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43   '\0';..    /* C
152f0 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 77 65  heck if there we
15300 72 65 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73  re any options s
15310 70 65 63 69 66 69 65 64 20 74 68 61 74 20 73 68  pecified that sh
15320 6f 75 6c 64 20 62 65 20 69 6e 74 65 72 70 72 65  ould be interpre
15330 74 65 64 20 0a 20 20 20 20 2a 2a 20 68 65 72 65  ted .    ** here
15340 2e 20 4f 70 74 69 6f 6e 73 20 74 68 61 74 20 61  . Options that a
15350 72 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 68  re interpreted h
15360 65 72 65 20 69 6e 63 6c 75 64 65 20 22 76 66 73  ere include "vfs
15370 22 20 61 6e 64 20 74 68 6f 73 65 20 74 68 61 74  " and those that
15380 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f  .    ** correspo
15390 6e 64 20 74 6f 20 66 6c 61 67 73 20 74 68 61 74  nd to flags that
153a0 20 6d 61 79 20 62 65 20 70 61 73 73 65 64 20 74   may be passed t
153b0 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f 70  o the sqlite3_op
153c0 65 6e 5f 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d  en_v2().    ** m
153d0 65 74 68 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f  ethod. */.    zO
153e0 70 74 20 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69  pt = &zFile[sqli
153f0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
15400 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65  e)+1];.    while
15410 28 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20  ( zOpt[0] ){.   
15420 20 20 20 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71     int nOpt = sq
15430 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f  lite3Strlen30(zO
15440 70 74 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  pt);.      char 
15450 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f  *zVal = &zOpt[nO
15460 70 74 2b 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74  pt+1];.      int
15470 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 53   nVal = sqlite3S
15480 74 72 6c 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a  trlen30(zVal);..
15490 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d        if( nOpt==
154a0 33 20 26 26 20 6d 65 6d 63 6d 70 28 22 76 66 73  3 && memcmp("vfs
154b0 22 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29  ", zOpt, 3)==0 )
154c0 7b 0a 20 20 20 20 20 20 20 20 7a 56 66 73 20 3d  {.        zVfs =
154d0 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c   zVal;.      }el
154e0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75  se{.        stru
154f0 63 74 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20  ct OpenMode {.  
15500 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
15510 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20  ar *z;.         
15520 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20   int mode;.     
15530 20 20 20 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b     } *aMode = 0;
15540 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
15550 4d 6f 64 65 54 79 70 65 20 3d 20 30 3b 0a 20 20  ModeType = 0;.  
15560 20 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d        int mask =
15570 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   0;.        int 
15580 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20  limit = 0;..    
15590 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20      if( nOpt==5 
155a0 26 26 20 6d 65 6d 63 6d 70 28 22 63 61 63 68 65  && memcmp("cache
155b0 22 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29  ", zOpt, 5)==0 )
155c0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
155d0 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f  ic struct OpenMo
155e0 64 65 20 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20  de aCacheMode[] 
155f0 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  = {.            
15600 7b 20 22 73 68 61 72 65 64 22 2c 20 20 53 51 4c  { "shared",  SQL
15610 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
15620 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20 20  ACHE },.        
15630 20 20 20 20 7b 20 22 70 72 69 76 61 74 65 22 2c      { "private",
15640 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49   SQLITE_OPEN_PRI
15650 56 41 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20  VATECACHE },.   
15660 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20           { 0, 0 
15670 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a  }.          };..
15680 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d            mask =
15690 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
156a0 52 45 44 43 41 43 48 45 7c 53 51 4c 49 54 45 5f  REDCACHE|SQLITE_
156b0 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
156c0 45 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f  E;.          aMo
156d0 64 65 20 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b  de = aCacheMode;
156e0 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74  .          limit
156f0 20 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20   = mask;.       
15700 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22     zModeType = "
15710 63 61 63 68 65 22 3b 0a 20 20 20 20 20 20 20 20  cache";.        
15720 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f  }.        if( nO
15730 70 74 3d 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28  pt==4 && memcmp(
15740 22 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29  "mode", zOpt, 4)
15750 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
15760 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f   static struct O
15770 70 65 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64  penMode aOpenMod
15780 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
15790 20 20 20 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c      { "ro",  SQL
157a0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
157b0 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Y },.           
157c0 20 7b 20 22 72 77 22 2c 20 20 53 51 4c 49 54 45   { "rw",  SQLITE
157d0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
157e0 7d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  }, .            
157f0 7b 20 22 72 77 63 22 2c 20 53 51 4c 49 54 45 5f  { "rwc", SQLITE_
15800 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
15810 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
15820 41 54 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  ATE },.         
15830 20 20 20 7b 20 22 6d 65 6d 6f 72 79 22 2c 20 53     { "memory", S
15840 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
15850 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Y },.           
15860 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20   { 0, 0 }.      
15870 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20      };..        
15880 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f    mask = SQLITE_
15890 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20  OPEN_READONLY | 
158a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
158b0 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 20 20  WRITE.          
158c0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
158d0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 20  E_OPEN_CREATE | 
158e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
158f0 52 59 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d  RY;.          aM
15900 6f 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b  ode = aOpenMode;
15910 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69 74  .          limit
15920 20 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b   = mask & flags;
15930 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65  .          zMode
15940 54 79 70 65 20 3d 20 22 61 63 63 65 73 73 22 3b  Type = "access";
15950 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
15960 20 20 20 20 69 66 28 20 61 4d 6f 64 65 20 29 7b      if( aMode ){
15970 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
15980 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
15990 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  mode = 0;.      
159a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f      for(i=0; aMo
159b0 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20  de[i].z; i++){. 
159c0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
159d0 20 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65   char *z = aMode
159e0 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20  [i].z;.         
159f0 20 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c     if( nVal==sql
15a00 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20  ite3Strlen30(z) 
15a10 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61  && 0==memcmp(zVa
15a20 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20  l, z, nVal) ){. 
15a30 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 64               mod
15a40 65 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64  e = aMode[i].mod
15a50 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
15a60 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
15a70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15a80 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
15a90 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mode==0 ){.     
15aa0 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67         *pzErrMsg
15ab0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
15ac0 74 66 28 22 6e 6f 20 73 75 63 68 20 25 73 20 6d  tf("no such %s m
15ad0 6f 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54  ode: %s", zModeT
15ae0 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20  ype, zVal);.    
15af0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
15b00 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
15b10 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73         goto pars
15b20 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20  e_uri_out;.     
15b30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15b40 20 69 66 28 20 28 6d 6f 64 65 20 26 20 7e 53 51   if( (mode & ~SQ
15b50 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59  LITE_OPEN_MEMORY
15b60 29 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20  )>limit ){.     
15b70 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67         *pzErrMsg
15b80 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
15b90 74 66 28 22 25 73 20 6d 6f 64 65 20 6e 6f 74 20  tf("%s mode not 
15ba0 61 6c 6c 6f 77 65 64 3a 20 25 73 22 2c 0a 20 20  allowed: %s",.  
15bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bd0 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 2c        zModeType,
15be0 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20   zVal);.        
15bf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15c00 50 45 52 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  PERM;.          
15c10 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69    goto parse_uri
15c20 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20  _out;.          
15c30 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  }.          flag
15c40 73 20 3d 20 28 66 6c 61 67 73 20 26 20 7e 6d 61  s = (flags & ~ma
15c50 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20 20 20 20  sk) | mode;.    
15c60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
15c70 20 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 56 61       zOpt = &zVa
15c80 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d  l[nVal+1];.    }
15c90 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ..  }else{.    z
15ca0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
15cb0 61 6c 6c 6f 63 36 34 28 6e 55 72 69 2b 32 29 3b  alloc64(nUri+2);
15cc0 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20  .    if( !zFile 
15cd0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
15ce0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 63 70  NOMEM;.    memcp
15cf0 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e  y(zFile, zUri, n
15d00 55 72 69 29 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  Uri);.    zFile[
15d10 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  nUri] = '\0';.  
15d20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31 5d 20    zFile[nUri+1] 
15d30 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c 61 67  = '\0';.    flag
15d40 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
15d50 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70  N_URI;.  }..  *p
15d60 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
15d70 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20  fs_find(zVfs);. 
15d80 20 69 66 28 20 2a 70 70 56 66 73 3d 3d 30 20 29   if( *ppVfs==0 )
15d90 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20  {.    *pzErrMsg 
15da0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
15db0 66 28 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20  f("no such vfs: 
15dc0 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20  %s", zVfs);.    
15dd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
15de0 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f 75 72  R;.  }. parse_ur
15df0 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  i_out:.  if( rc!
15e00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15e10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
15e20 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65  File);.    zFile
15e30 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c   = 0;.  }.  *pFl
15e40 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 2a  ags = flags;.  *
15e50 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a  pzFile = zFile;.
15e60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15e70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
15e80 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72  ine does the wor
15e90 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20 64  k of opening a d
15ea0 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68 61 6c  atabase on behal
15eb0 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  f of.** sqlite3_
15ec0 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c 69 74  open() and sqlit
15ed0 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68 65  e3_open16(). The
15ee0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   database filena
15ef0 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20  me "zFilename"  
15f00 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65 6e 63  .** is UTF-8 enc
15f10 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oded..*/.static 
15f20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61 73 65  int openDatabase
15f30 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
15f40 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61  zFilename, /* Da
15f50 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
15f60 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f  UTF-8 encoded */
15f70 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
15f80 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  b,        /* OUT
15f90 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74 61 62  : Returned datab
15fa0 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
15fb0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61  unsigned int fla
15fc0 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72 61 74  gs,    /* Operat
15fd0 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20  ional flags */. 
15fe0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
15ff0 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  s       /* Name 
16000 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75 73  of the VFS to us
16010 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
16020 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
16030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
16040 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e  re allocated han
16050 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  dle here */.  in
16060 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
16070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16080 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
16090 20 20 69 6e 74 20 69 73 54 68 72 65 61 64 73 61    int isThreadsa
160a0 66 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fe;             
160b0 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 68    /* True for th
160c0 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65 63 74  readsafe connect
160d0 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ions */.  char *
160e0 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  zOpen = 0;      
160f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
16100 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 74  ename argument t
16110 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65 65 4f  o pass to BtreeO
16120 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61 72 20  pen() */.  char 
16130 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20 20 20  *zErrMsg = 0;   
16140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
16150 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d  ror message from
16160 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69   sqlite3ParseUri
16170 28 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  () */..#ifdef SQ
16180 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
16190 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70 44 62  ARMOR.  if( ppDb
161a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
161b0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
161c0 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62 20  .#endif.  *ppDb 
161d0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
161e0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
161f0 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  T.  rc = sqlite3
16200 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
16210 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
16220 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f   rc;.#endif..  /
16230 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e  * Only allow sen
16240 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f  sible combinatio
16250 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68  ns of bits in th
16260 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  e flags argument
16270 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61  .  .  ** Throw a
16280 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 6e  n error if any n
16290 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61  on-sense combina
162a0 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 49  tion is used.  I
162b0 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74  f we.  ** do not
162c0 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63   block illegal c
162d0 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65 72 65  ombinations here
162e0 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69 67 67  , it could trigg
162f0 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  er.  ** assert()
16300 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 64   statements in d
16310 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20 20 53  eeper layers.  S
16320 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74  ensible combinat
16330 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20  ions.  ** are:. 
16340 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51   **.  **  1:  SQ
16350 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
16360 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c  LY.  **  2:  SQL
16370 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
16380 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c  TE.  **  6:  SQL
16390 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
163a0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
163b0 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20 61  _CREATE.  */.  a
163c0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50  ssert( SQLITE_OP
163d0 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20  EN_READONLY  == 
163e0 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74  0x01 );.  assert
163f0 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ( SQLITE_OPEN_RE
16400 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20  ADWRITE == 0x02 
16410 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
16420 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
16430 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20     == 0x04 );.  
16440 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
16450 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29  lags&7))==0x02 )
16460 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f  ; /* READONLY */
16470 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c  .  testcase( (1<
16480 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30  <(flags&7))==0x0
16490 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54  4 ); /* READWRIT
164a0 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  E */.  testcase(
164b0 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d   (1<<(flags&7))=
164c0 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44  =0x40 ); /* READ
164d0 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a  WRITE | CREATE *
164e0 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c  /.  if( ((1<<(fl
164f0 61 67 73 26 37 29 29 20 26 20 30 78 34 36 29 3d  ags&7)) & 0x46)=
16500 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
16510 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
16520 4b 50 54 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  KPT;  /* IMP: R-
16530 36 35 34 39 37 2d 34 34 35 39 34 20 2a 2f 0a 20  65497-44594 */. 
16540 20 7d 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65   }..  if( sqlite
16550 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
16560 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  oreMutex==0 ){. 
16570 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
16580 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
16590 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
165a0 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a  OPEN_NOMUTEX ){.
165b0 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
165c0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
165d0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
165e0 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20  _OPEN_FULLMUTEX 
165f0 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  ){.    isThreads
16600 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  afe = 1;.  }else
16610 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
16620 66 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  fe = sqlite3Glob
16630 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
16640 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  tex;.  }.  if( f
16650 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
16660 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20  EN_PRIVATECACHE 
16670 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20  ){.    flags &= 
16680 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41  ~SQLITE_OPEN_SHA
16690 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73  REDCACHE;.  }els
166a0 65 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f  e if( sqlite3Glo
166b0 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64  balConfig.shared
166c0 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a  CacheEnabled ){.
166d0 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
166e0 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
166f0 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ACHE;.  }..  /* 
16700 52 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62  Remove harmful b
16710 69 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61  its from the fla
16720 67 73 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a  gs parameter.  *
16730 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54  *.  ** The SQLIT
16740 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61  E_OPEN_NOMUTEX a
16750 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  nd SQLITE_OPEN_F
16760 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77  ULLMUTEX flags w
16770 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77  ere.  ** dealt w
16780 69 74 68 20 69 6e 20 74 68 65 20 70 72 65 76 69  ith in the previ
16790 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20  ous code block. 
167a0 20 42 65 73 69 64 65 73 20 74 68 65 73 65 2c 20   Besides these, 
167b0 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61  the only.  ** va
167c0 6c 69 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20  lid input flags 
167d0 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  for sqlite3_open
167e0 5f 76 32 28 29 20 61 72 65 20 53 51 4c 49 54 45  _v2() are SQLITE
167f0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a  _OPEN_READONLY,.
16800 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e    ** SQLITE_OPEN
16810 5f 52 45 41 44 57 52 49 54 45 2c 20 53 51 4c 49  _READWRITE, SQLI
16820 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20  TE_OPEN_CREATE, 
16830 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
16840 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51  EDCACHE,.  ** SQ
16850 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
16860 45 43 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65  ECACHE, and some
16870 20 72 65 73 65 72 76 65 64 20 62 69 74 73 2e 20   reserved bits. 
16880 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20   Silently mask. 
16890 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65   ** off all othe
168a0 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20  r flags..  */.  
168b0 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c  flags &=  ~( SQL
168c0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
168d0 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20  NCLOSE |.       
168e0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
168f0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a  PEN_EXCLUSIVE |.
16900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
16910 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
16920 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  DB |.           
16930 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
16940 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20  TEMP_DB | .     
16950 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
16960 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
16970 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  DB | .          
16980 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16990 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20  _MAIN_JOURNAL | 
169a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
169b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
169c0 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  _JOURNAL | .    
169d0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
169e0 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
169f0 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  L | .           
16a00 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
16a10 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c  MASTER_JOURNAL |
16a20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16a30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
16a40 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEX |.          
16a50 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16a60 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20  _FULLMUTEX |.   
16a70 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
16a80 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20  TE_OPEN_WAL.    
16a90 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f           );..  /
16aa0 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  * Allocate the s
16ab0 71 6c 69 74 65 20 64 61 74 61 20 73 74 72 75 63  qlite data struc
16ac0 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73  ture */.  db = s
16ad0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
16ae0 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  ( sizeof(sqlite3
16af0 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30  ) );.  if( db==0
16b00 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f   ) goto opendb_o
16b10 75 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65  ut;.  if( isThre
16b20 61 64 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62  adsafe ){.    db
16b30 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
16b40 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
16b50 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
16b60 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  VE);.    if( db-
16b70 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
16b80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
16b90 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20  db);.      db = 
16ba0 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  0;.      goto op
16bb0 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  endb_out;.    }.
16bc0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
16bd0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
16be0 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d  tex);.  db->errM
16bf0 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62  ask = 0xff;.  db
16c00 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d  ->nDb = 2;.  db-
16c10 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
16c20 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62  MAGIC_BUSY;.  db
16c30 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
16c40 74 61 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74  tatic;..  assert
16c50 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69  ( sizeof(db->aLi
16c60 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61  mit)==sizeof(aHa
16c70 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65  rdLimit) );.  me
16c80 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c  mcpy(db->aLimit,
16c90 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a   aHardLimit, siz
16ca0 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29  eof(db->aLimit))
16cb0 3b 0a 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  ;.  db->aLimit[S
16cc0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
16cd0 45 52 5f 54 48 52 45 41 44 53 5d 20 3d 20 53 51  ER_THREADS] = SQ
16ce0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 4f 52  LITE_DEFAULT_WOR
16cf0 4b 45 52 5f 54 48 52 45 41 44 53 3b 0a 20 20 64  KER_THREADS;.  d
16d00 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
16d10 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75 74  1;.  db->nextAut
16d20 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d  ovac = -1;.  db-
16d30 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c 69 74 65  >szMmap = sqlite
16d40 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
16d50 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e 65 78 74  Mmap;.  db->next
16d60 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20  Pagesize = 0;.  
16d70 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d  db->nMaxSorterMm
16d80 61 70 20 3d 20 30 78 37 46 46 46 46 46 46 46 3b  ap = 0x7FFFFFFF;
16d90 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
16da0 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
16db0 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e  ames | SQLITE_En
16dc0 61 62 6c 65 54 72 69 67 67 65 72 20 7c 20 53 51  ableTrigger | SQ
16dd0 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a  LITE_CacheSpill.
16de0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
16df0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
16e00 4d 41 54 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20  MATIC_INDEX) || 
16e10 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
16e20 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20  UTOMATIC_INDEX. 
16e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e40 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64  | SQLITE_AutoInd
16e50 65 78 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  ex.#endif.#if SQ
16e60 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 4b 50  LITE_DEFAULT_CKP
16e70 54 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20 20  TFULLFSYNC.     
16e80 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
16e90 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79  LITE_CkptFullFSy
16ea0 6e 63 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  nc.#endif.#if SQ
16eb0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
16ec0 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20  E_FORMAT<4.     
16ed0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
16ee0 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
16ef0 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  mt.#endif.#ifdef
16f00 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
16f10 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
16f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16f30 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65   SQLITE_LoadExte
16f40 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66  nsion.#endif.#if
16f50 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
16f60 52 45 43 55 52 53 49 56 45 5f 54 52 49 47 47 45  RECURSIVE_TRIGGE
16f70 52 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RS.             
16f80 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63      | SQLITE_Rec
16f90 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a  Triggers.#endif.
16fa0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
16fb0 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49  TE_DEFAULT_FOREI
16fc0 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49  GN_KEYS) && SQLI
16fd0 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49  TE_DEFAULT_FOREI
16fe0 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20  GN_KEYS.        
16ff0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
17000 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65  E_ForeignKeys.#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 52 45 56 45 52 53 45 5f  (SQLITE_REVERSE_
17030 55 4e 4f 52 44 45 52 45 44 5f 53 45 4c 45 43 54  UNORDERED_SELECT
17040 53 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S).             
17050 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 76      | SQLITE_Rev
17060 65 72 73 65 4f 72 64 65 72 0a 23 65 6e 64 69 66  erseOrder.#endif
17070 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
17080 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
17090 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
170a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170b0 20 7c 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69   | SQLITE_CellSi
170c0 7a 65 43 6b 0a 23 65 6e 64 69 66 0a 20 20 20 20  zeCk.#endif.    
170d0 20 20 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 73    ;.  sqlite3Has
170e0 68 49 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c 6c  hInit(&db->aColl
170f0 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Seq);.#ifndef SQ
17100 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
17110 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33  LTABLE.  sqlite3
17120 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d  HashInit(&db->aM
17130 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
17140 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65 66    /* Add the def
17150 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ault collation s
17160 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e 20  equence BINARY. 
17170 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f 72  BINARY works for
17180 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a 2a   both UTF-8.  **
17190 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f 20   and UTF-16, so 
171a0 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66 6f  add a version fo
171b0 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64 20  r each to avoid 
171c0 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79 0a  any unnecessary.
171d0 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73    ** conversions
171e0 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f 72  . The only error
171f0 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72 20   that can occur 
17200 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f 63  here is a malloc
17210 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a 2a  () failure..  **
17220 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  ** EVIDENCE-O
17230 46 3a 20 52 2d 35 32 37 38 36 2d 34 34 38 37 38  F: R-52786-44878
17240 20 53 51 4c 69 74 65 20 64 65 66 69 6e 65 73 20   SQLite defines 
17250 74 68 72 65 65 20 62 75 69 6c 74 2d 69 6e 20 63  three built-in c
17260 6f 6c 6c 61 74 69 6e 67 0a 20 20 2a 2a 20 66 75  ollating.  ** fu
17270 6e 63 74 69 6f 6e 73 3a 0a 20 20 2a 2f 0a 20 20  nctions:.  */.  
17280 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
17290 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51  db, "BINARY", SQ
172a0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69  LITE_UTF8, 0, bi
172b0 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
172c0 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
172d0 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53  (db, "BINARY", S
172e0 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 30  QLITE_UTF16BE, 0
172f0 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
17300 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
17310 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59  tion(db, "BINARY
17320 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  ", SQLITE_UTF16L
17330 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  E, 0, binCollFun
17340 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
17350 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f  ollation(db, "NO
17360 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54  CASE", SQLITE_UT
17370 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c  F8, 0, nocaseCol
17380 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a  latingFunc, 0);.
17390 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
173a0 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53  n(db, "RTRIM", S
173b0 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69  QLITE_UTF8, (voi
173c0 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  d*)1, binCollFun
173d0 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d  c, 0);.  if( db-
173e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
173f0 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
17400 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 2f 2a 20 45  _out;.  }.  /* E
17410 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38  VIDENCE-OF: R-08
17420 33 30 38 2d 31 37 32 32 34 20 54 68 65 20 64 65  308-17224 The de
17430 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20  fault collating 
17440 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c  function for all
17450 0a 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 69 73  .  ** strings is
17460 20 42 49 4e 41 52 59 2e 20 0a 20 20 2a 2f 0a 20   BINARY. .  */. 
17470 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d   db->pDfltColl =
17480 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
17490 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55  Seq(db, SQLITE_U
174a0 54 46 38 2c 20 22 42 49 4e 41 52 59 22 2c 20 30  TF8, "BINARY", 0
174b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
174c0 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b  >pDfltColl!=0 );
174d0 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65  ..  /* Parse the
174e0 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61 72   filename/URI ar
174f0 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64 62 2d  gument. */.  db-
17500 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61  >openFlags = fla
17510 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  gs;.  rc = sqlit
17520 65 33 50 61 72 73 65 55 72 69 28 7a 56 66 73 2c  e3ParseUri(zVfs,
17530 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c 61   zFilename, &fla
17540 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20 26  gs, &db->pVfs, &
17550 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67 29  zOpen, &zErrMsg)
17560 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17570 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
17580 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
17590 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  M ) db->mallocFa
175a0 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 73 71  iled = 1;.    sq
175b0 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
175c0 67 28 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d 73  g(db, rc, zErrMs
175d0 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a 45  g ? "%s" : 0, zE
175e0 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
175f0 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
17600 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  );.    goto open
17610 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  db_out;.  }..  /
17620 2a 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65  * Open the backe
17630 6e 64 20 64 61 74 61 62 61 73 65 20 64 72 69 76  nd database driv
17640 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  er */.  rc = sql
17650 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62  ite3BtreeOpen(db
17660 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 64  ->pVfs, zOpen, d
17670 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  b, &db->aDb[0].p
17680 42 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  Bt, 0,.         
17690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
176a0 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50  lags | SQLITE_OP
176b0 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 69  EN_MAIN_DB);.  i
176c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
176d0 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
176e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
176f0 45 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  EM ){.      rc =
17700 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
17710 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
17720 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20  Error(db, rc);. 
17730 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
17740 75 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ut;.  }.  sqlite
17750 33 42 74 72 65 65 45 6e 74 65 72 28 64 62 2d 3e  3BtreeEnter(db->
17760 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64  aDb[0].pBt);.  d
17770 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d  b->aDb[0].pSchem
17780 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  a = sqlite3Schem
17790 61 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62  aGet(db, db->aDb
177a0 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28 20  [0].pBt);.  if( 
177b0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
177c0 64 20 29 20 45 4e 43 28 64 62 29 20 3d 20 53 43  d ) ENC(db) = SC
177d0 48 45 4d 41 5f 45 4e 43 28 64 62 29 3b 0a 20 20  HEMA_ENC(db);.  
177e0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
177f0 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
17800 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  );.  db->aDb[1].
17810 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65  pSchema = sqlite
17820 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30  3SchemaGet(db, 0
17830 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66  );..  /* The def
17840 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65  ault safety_leve
17850 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  l for the main d
17860 61 74 61 62 61 73 65 20 69 73 20 27 66 75 6c 6c  atabase is 'full
17870 27 3b 20 66 6f 72 20 74 68 65 20 74 65 6d 70 0a  '; for the temp.
17880 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 74    ** database it
17890 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69 73   is 'NONE'. This
178a0 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 61 67   matches the pag
178b0 65 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c 74  er layer default
178c0 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e  s.  .  */.  db->
178d0 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22  aDb[0].zName = "
178e0 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62  main";.  db->aDb
178f0 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c  [0].safety_level
17900 20 3d 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62 5b   = 3;.  db->aDb[
17910 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70  1].zName = "temp
17920 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  ";.  db->aDb[1].
17930 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31  safety_level = 1
17940 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  ;..  db->magic =
17950 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50   SQLITE_MAGIC_OP
17960 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  EN;.  if( db->ma
17970 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
17980 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
17990 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67  t;.  }..  /* Reg
179a0 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d  ister all built-
179b0 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75  in functions, bu
179c0 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  t do not attempt
179d0 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a   to read the.  *
179e0 2a 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  * database schem
179f0 61 20 79 65 74 2e 20 54 68 69 73 20 69 73 20 64  a yet. This is d
17a00 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65  elayed until the
17a10 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 20   first time the 
17a20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73  database.  ** is
17a30 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a   accessed..  */.
17a40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
17a50 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
17a60 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
17a70 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73  BuiltinFunctions
17a80 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64  (db);..  /* Load
17a90 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e   automatic exten
17aa0 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f  sions - extensio
17ab0 6e 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65  ns that have bee
17ac0 6e 20 72 65 67 69 73 74 65 72 65 64 0a 20 20 2a  n registered.  *
17ad0 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
17ae0 74 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78  te3_automatic_ex
17af0 74 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20  tension() API.. 
17b00 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
17b10 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
17b20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17b30 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
17b40 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73  e3AutoLoadExtens
17b50 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20 72 63  ions(db);.    rc
17b60 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
17b70 64 65 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20  de(db);.    if( 
17b80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17b90 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
17ba0 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  db_out;.    }.  
17bb0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
17bc0 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20 69  _ENABLE_FTS1.  i
17bd0 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
17be0 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78 74 65  iled ){.    exte
17bf0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  rn int sqlite3Ft
17c00 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29  s1Init(sqlite3*)
17c10 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
17c20 65 33 46 74 73 31 49 6e 69 74 28 64 62 29 3b 0a  e3Fts1Init(db);.
17c30 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
17c40 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
17c50 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64 62 2d  _FTS2.  if( !db-
17c60 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
17c70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17c80 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
17c90 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74   sqlite3Fts2Init
17ca0 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20  (sqlite3*);.    
17cb0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 32  rc = sqlite3Fts2
17cc0 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
17cd0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
17ce0 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 20  ITE_ENABLE_FTS3 
17cf0 2f 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  /* automatically
17d00 20 64 65 66 69 6e 65 64 20 62 79 20 53 51 4c 49   defined by SQLI
17d10 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 20 2a  TE_ENABLE_FTS4 *
17d20 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  /.  if( !db->mal
17d30 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
17d40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17d50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
17d60 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s3Init(db);.  }.
17d70 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
17d80 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
17d90 35 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  5.  if( !db->mal
17da0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
17db0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17dc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
17dd0 73 35 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s5Init(db);.  }.
17de0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
17df0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55  QLITE_ENABLE_ICU
17e00 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
17e10 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
17e20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17e30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63 75   rc = sqlite3Icu
17e40 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
17e50 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
17e60 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45  ITE_ENABLE_RTREE
17e70 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
17e80 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
17e90 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20  SQLITE_OK){.    
17ea0 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72 65  rc = sqlite3Rtre
17eb0 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  eInit(db);.  }.#
17ec0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
17ed0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 53 54  LITE_ENABLE_DBST
17ee0 41 54 5f 56 54 41 42 0a 20 20 69 66 28 20 21 64  AT_VTAB.  if( !d
17ef0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
17f00 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
17f10 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
17f20 74 65 33 44 62 73 74 61 74 52 65 67 69 73 74 65  te3DbstatRegiste
17f30 72 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  r(db);.  }.#endi
17f40 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
17f50 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 31 0a 20 20  _ENABLE_JSON1.  
17f60 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
17f70 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
17f80 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20  ITE_OK){.    rc 
17f90 3d 20 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e  = sqlite3Json1In
17fa0 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
17fb0 69 66 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54  if..  /* -DSQLIT
17fc0 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
17fd0 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45  G_MODE=1 makes E
17fe0 58 43 4c 55 53 49 56 45 20 74 68 65 20 64 65 66  XCLUSIVE the def
17ff0 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
18000 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54  * mode.  -DSQLIT
18010 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
18020 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f  G_MODE=0 make NO
18030 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74  RMAL the default
18040 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f   locking.  ** mo
18050 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69  de.  Doing nothi
18060 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d  ng at all also m
18070 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20  akes NORMAL the 
18080 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69  default..  */.#i
18090 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41  fdef SQLITE_DEFA
180a0 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
180b0 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d  .  db->dfltLockM
180c0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ode = SQLITE_DEF
180d0 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
180e0 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  E;.  sqlite3Page
180f0 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c  rLockingMode(sql
18100 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64  ite3BtreePager(d
18110 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a  b->aDb[0].pBt),.
18120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18130 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
18140 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
18150 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a  _MODE);.#endif..
18160 20 20 69 66 28 20 72 63 20 29 20 73 71 6c 69 74    if( rc ) sqlit
18170 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b  e3Error(db, rc);
18180 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68  ..  /* Enable th
18190 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c  e lookaside-mall
181a0 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a  oc subsystem */.
181b0 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65    setupLookaside
181c0 28 64 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47  (db, 0, sqlite3G
181d0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f  lobalConfig.szLo
181e0 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20  okaside,.       
181f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18200 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
18210 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29  nfig.nLookaside)
18220 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  ;..  sqlite3_wal
18230 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
18240 64 62 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  db, SQLITE_DEFAU
18250 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b  LT_WAL_AUTOCHECK
18260 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f  POINT);..opendb_
18270 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
18280 72 65 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 69 66  ree(zOpen);.  if
18290 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65  ( db ){.    asse
182a0 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30  rt( db->mutex!=0
182b0 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66 65   || isThreadsafe
182c0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
182d0 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  | sqlite3GlobalC
182e0 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
182f0 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
18300 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
18310 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20  b->mutex);.  }. 
18320 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
18330 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 61 73 73  rcode(db);.  ass
18340 65 72 74 28 20 64 62 21 3d 30 20 7c 7c 20 72 63  ert( db!=0 || rc
18350 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
18360 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
18370 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
18380 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
18390 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a 20  );.    db = 0;. 
183a0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
183b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
183c0 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
183d0 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20  TE_MAGIC_SICK;. 
183e0 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64 62 3b   }.  *ppDb = db;
183f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18400 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69  NABLE_SQLLOG.  i
18410 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
18420 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29  Config.xSqllog )
18430 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69 6e 67  {.    /* Opening
18440 20 61 20 64 62 20 68 61 6e 64 6c 65 2e 20 46 6f   a db handle. Fo
18450 75 72 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  urth parameter i
18460 73 20 70 61 73 73 65 64 20 30 2e 20 2a 2f 0a 20  s passed 0. */. 
18470 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20 3d 20     void *pArg = 
18480 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
18490 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 3b 0a  fig.pSqllogArg;.
184a0 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
184b0 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28  lConfig.xSqllog(
184c0 70 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c 65 6e  pArg, db, zFilen
184d0 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  ame, 0);.  }.#en
184e0 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
184f0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
18500 29 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ).  if( rc==SQLI
18510 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e  TE_OK ){.    con
18520 73 74 20 63 68 61 72 20 2a 7a 48 65 78 4b 65 79  st char *zHexKey
18530 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
18540 61 72 61 6d 65 74 65 72 28 7a 4f 70 65 6e 2c 20  arameter(zOpen, 
18550 22 68 65 78 6b 65 79 22 29 3b 0a 20 20 20 20 69  "hexkey");.    i
18560 66 28 20 7a 48 65 78 4b 65 79 20 26 26 20 7a 48  f( zHexKey && zH
18570 65 78 4b 65 79 5b 30 5d 20 29 7b 0a 20 20 20 20  exKey[0] ){.    
18580 20 20 75 38 20 69 42 79 74 65 3b 0a 20 20 20 20    u8 iByte;.    
18590 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 63    int i;.      c
185a0 68 61 72 20 7a 4b 65 79 5b 34 30 5d 3b 0a 20 20  har zKey[40];.  
185b0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 69 42 79      for(i=0, iBy
185c0 74 65 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a  te=0; i<sizeof(z
185d0 4b 65 79 29 2a 32 20 26 26 20 73 71 6c 69 74 65  Key)*2 && sqlite
185e0 33 49 73 78 64 69 67 69 74 28 7a 48 65 78 4b 65  3Isxdigit(zHexKe
185f0 79 5b 69 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  y[i]); i++){.   
18600 20 20 20 20 20 69 42 79 74 65 20 3d 20 28 69 42       iByte = (iB
18610 79 74 65 3c 3c 34 29 20 2b 20 73 71 6c 69 74 65  yte<<4) + sqlite
18620 33 48 65 78 54 6f 49 6e 74 28 7a 48 65 78 4b 65  3HexToInt(zHexKe
18630 79 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  y[i]);.        i
18640 66 28 20 28 69 26 31 29 21 3d 30 20 29 20 7a 4b  f( (i&1)!=0 ) zK
18650 65 79 5b 69 2f 32 5d 20 3d 20 69 42 79 74 65 3b  ey[i/2] = iByte;
18660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
18670 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62  qlite3_key_v2(db
18680 2c 20 30 2c 20 7a 4b 65 79 2c 20 69 2f 32 29 3b  , 0, zKey, i/2);
18690 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
186a0 66 0a 20 20 72 65 74 75 72 6e 20 72 63 20 26 20  f.  return rc & 
186b0 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  0xff;.}../*.** O
186c0 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61  pen a new databa
186d0 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
186e0 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a  t sqlite3_open(.
186f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
18700 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69  ilename, .  sqli
18710 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20  te3 **ppDb .){. 
18720 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61   return openData
18730 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  base(zFilename, 
18740 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ppDb,.          
18750 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
18760 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
18770 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
18780 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e  CREATE, 0);.}.in
18790 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  t sqlite3_open_v
187a0 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2(.  const char 
187b0 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  *filename,   /* 
187c0 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
187d0 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73  e (UTF-8) */.  s
187e0 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20  qlite3 **ppDb,  
187f0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
18800 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20  QLite db handle 
18810 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
18820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18830 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  Flags */.  const
18840 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20   char *zVfs     
18850 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46     /* Name of VF
18860 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20  S module to use 
18870 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f  */.){.  return o
18880 70 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65  penDatabase(file
18890 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e 73  name, ppDb, (uns
188a0 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67 73 2c  igned int)flags,
188b0 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64   zVfs);.}..#ifnd
188c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
188d0 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  TF16./*.** Open 
188e0 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68  a new database h
188f0 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  andle..*/.int sq
18900 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20  lite3_open16(.  
18910 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c  const void *zFil
18920 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65  ename, .  sqlite
18930 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68  3 **ppDb.){.  ch
18940 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e  ar const *zFilen
18950 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65  ame8;   /* zFile
18960 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20  name encoded in 
18970 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66  UTF-8 instead of
18980 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c   UTF-16 */.  sql
18990 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
189a0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  ;.  int rc;..#if
189b0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
189c0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
189d0 28 20 70 70 44 62 3d 3d 30 20 29 20 72 65 74 75  ( ppDb==0 ) retu
189e0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
189f0 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
18a00 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64  *ppDb = 0;.#ifnd
18a10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
18a20 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73  UTOINIT.  rc = s
18a30 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
18a40 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  e();.  if( rc ) 
18a50 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
18a60 66 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  f.  if( zFilenam
18a70 65 3d 3d 30 20 29 20 7a 46 69 6c 65 6e 61 6d 65  e==0 ) zFilename
18a80 20 3d 20 22 5c 30 30 30 5c 30 30 30 22 3b 0a 20   = "\000\000";. 
18a90 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
18aa0 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71  alueNew(0);.  sq
18ab0 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
18ac0 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65  (pVal, -1, zFile
18ad0 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46  name, SQLITE_UTF
18ae0 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45  16NATIVE, SQLITE
18af0 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c  _STATIC);.  zFil
18b00 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33  ename8 = sqlite3
18b10 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20  ValueText(pVal, 
18b20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
18b30 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29  if( zFilename8 )
18b40 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44  {.    rc = openD
18b50 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d  atabase(zFilenam
18b60 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20  e8, ppDb,.      
18b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
18b90 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
18ba0 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a  PEN_CREATE, 0);.
18bb0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 44      assert( *ppD
18bc0 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  b || rc==SQLITE_
18bd0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28  NOMEM );.    if(
18be0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
18bf0 26 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  & !DbHasProperty
18c00 28 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f 53 63  (*ppDb, 0, DB_Sc
18c10 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20  hemaLoaded) ){. 
18c20 20 20 20 20 20 53 43 48 45 4d 41 5f 45 4e 43 28       SCHEMA_ENC(
18c30 2a 70 70 44 62 29 20 3d 20 45 4e 43 28 2a 70 70  *ppDb) = ENC(*pp
18c40 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  Db) = SQLITE_UTF
18c50 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d 0a  16NATIVE;.    }.
18c60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
18c70 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
18c80 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61 6c    }.  sqlite3Val
18c90 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20  ueFree(pVal);.. 
18ca0 20 72 65 74 75 72 6e 20 72 63 20 26 20 30 78 66   return rc & 0xf
18cb0 66 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  f;.}.#endif /* S
18cc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
18cd0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73   */../*.** Regis
18ce0 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
18cf0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
18d00 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
18d10 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
18d20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
18d30 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c  collation(.  sql
18d40 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e  ite3* db, .  con
18d50 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
18d60 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76  .  int enc, .  v
18d70 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
18d80 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
18d90 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
18da0 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
18db0 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  *).){.  return s
18dc0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
18dd0 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a  llation_v2(db, z
18de0 4e 61 6d 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c  Name, enc, pCtx,
18df0 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 7d   xCompare, 0);.}
18e00 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
18e10 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e   a new collation
18e20 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74   sequence with t
18e30 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
18e40 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
18e50 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
18e60 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c  lation_v2(.  sql
18e70 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e  ite3* db, .  con
18e80 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
18e90 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76  .  int enc, .  v
18ea0 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
18eb0 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
18ec0 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
18ed0 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
18ee0 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c  *),.  void(*xDel
18ef0 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e  )(void*).){.  in
18f00 74 20 72 63 3b 0a 0a 23 69 66 64 65 66 20 53 51  t rc;..#ifdef SQ
18f10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
18f20 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
18f30 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
18f40 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d  k(db) || zName==
18f50 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
18f60 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
18f70 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
18f80 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
18f90 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
18fa0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
18fb0 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72  led );.  rc = cr
18fc0 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
18fd0 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63  , zName, (u8)enc
18fe0 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
18ff0 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63 20 3d 20  , xDel);.  rc = 
19000 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
19010 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
19020 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
19030 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
19040 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
19050 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
19060 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  F16./*.** Regist
19070 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  er a new collati
19080 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68  on sequence with
19090 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
190a0 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  ndle db..*/.int 
190b0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
190c0 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73 71  ollation16(.  sq
190d0 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f  lite3* db, .  co
190e0 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c  nst void *zName,
190f0 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76  .  int enc, .  v
19100 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
19110 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
19120 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
19130 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
19140 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *).){.  int rc =
19150 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68   SQLITE_OK;.  ch
19160 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 0a 23 69 66  ar *zName8;..#if
19170 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
19180 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
19190 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
191a0 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a  CheckOk(db) || z
191b0 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
191c0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
191d0 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
191e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
191f0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
19200 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
19210 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a  locFailed );.  z
19220 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 55  Name8 = sqlite3U
19230 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e 61 6d  tf16to8(db, zNam
19240 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
19250 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 69 66  F16NATIVE);.  if
19260 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20 20  ( zName8 ){.    
19270 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
19280 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38 2c  tion(db, zName8,
19290 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20   (u8)enc, pCtx, 
192a0 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20  xCompare, 0);.  
192b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
192c0 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d  db, zName8);.  }
192d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
192e0 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
192f0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
19300 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
19310 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19320 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
19330 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
19340 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
19350 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
19360 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c  ence factory cal
19370 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64  lback with the d
19380 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
19390 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e  * db. Replace an
193a0 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73  y previously ins
193b0 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  talled collation
193c0 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
193d0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
193e0 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
193f0 65 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ed(.  sqlite3 *d
19400 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c  b, .  void *pCol
19410 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76  lNeededArg, .  v
19420 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64  oid(*xCollNeeded
19430 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a  )(void*,sqlite3*
19440 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f  ,int eTextRep,co
19450 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 23 69  nst char*).){.#i
19460 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
19470 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
19480 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
19490 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
194a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
194b0 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
194c0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
194d0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
194e0 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  );.  db->xCollNe
194f0 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64  eded = xCollNeed
19500 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  ed;.  db->xCollN
19510 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64  eeded16 = 0;.  d
19520 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
19530 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41  g = pCollNeededA
19540 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
19550 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
19560 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
19570 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
19580 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19590 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67  _UTF16./*.** Reg
195a0 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f  ister a collatio
195b0 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
195c0 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ry callback with
195d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
195e0 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c  ndle.** db. Repl
195f0 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73  ace any previous
19600 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c  ly installed col
19610 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
19620 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20  factory..*/.int 
19630 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
19640 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71  n_needed16(.  sq
19650 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f  lite3 *db, .  vo
19660 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41  id *pCollNeededA
19670 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f  rg, .  void(*xCo
19680 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64  llNeeded16)(void
19690 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
196a0 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f  TextRep,const vo
196b0 69 64 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20 53  id*).){.#ifdef S
196c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
196d0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
196e0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
196f0 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
19700 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
19710 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
19720 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
19730 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
19740 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d  b->xCollNeeded =
19750 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e   0;.  db->xCollN
19760 65 65 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e  eeded16 = xCollN
19770 65 65 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70  eeded16;.  db->p
19780 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20  CollNeededArg = 
19790 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a  pCollNeededArg;.
197a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
197b0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
197c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
197d0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
197e0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
197f0 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  F16 */..#ifndef 
19800 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
19810 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69  ECATED./*.** Thi
19820 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
19830 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d  w an anachronism
19840 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 20  . It used to be 
19850 75 73 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20  used to recover 
19860 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63  from a.** malloc
19870 28 29 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20  () failure, but 
19880 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20  SQLite now does 
19890 74 68 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  this automatical
198a0 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
198b0 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65  e3_global_recove
198c0 72 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  r(void){.  retur
198d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
198e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  endif../*.** Tes
198f0 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72  t to see whether
19900 20 6f 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61   or not the data
19910 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
19920 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74  is in autocommit
19930 0a 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75 72  .** mode.  Retur
19940 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
19950 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74  and FALSE if not
19960 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  .  Autocommit mo
19970 64 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64  de is on.** by d
19980 65 66 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d  efault.  Autocom
19990 6d 69 74 20 69 73 20 64 69 73 61 62 6c 65 64 20  mit is disabled 
199a0 62 79 20 61 20 42 45 47 49 4e 20 73 74 61 74 65  by a BEGIN state
199b0 6d 65 6e 74 20 61 6e 64 20 72 65 65 6e 61 62 6c  ment and reenabl
199c0 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65 78  ed.** by the nex
199d0 74 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c  t COMMIT or ROLL
199e0 42 41 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  BACK..*/.int sql
199f0 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d  ite3_get_autocom
19a00 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  mit(sqlite3 *db)
19a10 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
19a20 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
19a30 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
19a40 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
19a50 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
19a60 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
19a70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
19a80 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
19a90 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  urn db->autoComm
19aa0 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  it;.}../*.** The
19ab0 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
19ac0 6e 65 73 20 61 72 65 20 73 75 62 73 74 69 74 75  nes are substitu
19ad0 74 65 73 20 66 6f 72 20 63 6f 6e 73 74 61 6e 74  tes for constant
19ae0 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
19af0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55  ,.** SQLITE_MISU
19b00 53 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  SE, SQLITE_CANTO
19b10 50 45 4e 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  PEN, SQLITE_IOER
19b20 52 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f  R and possibly o
19b30 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  ther error.** co
19b40 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 79 20 73  nstants.  They s
19b50 65 72 76 65 20 74 77 6f 20 70 75 72 70 6f 73 65  erve two purpose
19b60 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 53  s:.**.**   1.  S
19b70 65 72 76 65 20 61 73 20 61 20 63 6f 6e 76 65 6e  erve as a conven
19b80 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65  ient place to se
19b90 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 69  t a breakpoint i
19ba0 6e 20 61 20 64 65 62 75 67 67 65 72 0a 2a 2a 20  n a debugger.** 
19bb0 20 20 20 20 20 20 74 6f 20 64 65 74 65 63 74 20        to detect 
19bc0 77 68 65 6e 20 76 65 72 73 69 6f 6e 20 65 72 72  when version err
19bd0 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 63  or conditions oc
19be0 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e  curs..**.**   2.
19bf0 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33    Invoke sqlite3
19c00 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f 76 69 64  _log() to provid
19c10 65 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64  e the source cod
19c20 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68 65 72 65  e location where
19c30 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c 6f 77 2d  .**       a low-
19c40 6c 65 76 65 6c 20 65 72 72 6f 72 20 69 73 20 66  level error is f
19c50 69 72 73 74 20 64 65 74 65 63 74 65 64 2e 0a 2a  irst detected..*
19c60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72  /.int sqlite3Cor
19c70 72 75 70 74 45 72 72 6f 72 28 69 6e 74 20 6c 69  ruptError(int li
19c80 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
19c90 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
19ca0 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
19cb0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
19cc0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a  SQLITE_CORRUPT,.
19cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 64                "d
19ce0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
19cf0 6f 6e 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66  on at line %d of
19d00 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20   [%.10s]",.     
19d10 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c           lineno,
19d20 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72   20+sqlite3_sour
19d30 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72  ceid());.  retur
19d40 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
19d50 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d  ;.}.int sqlite3M
19d60 69 73 75 73 65 45 72 72 6f 72 28 69 6e 74 20 6c  isuseError(int l
19d70 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61  ineno){.  testca
19d80 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  se( sqlite3Globa
19d90 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20  lConfig.xLog!=0 
19da0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  );.  sqlite3_log
19db0 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20  (SQLITE_MISUSE, 
19dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
19dd0 6d 69 73 75 73 65 20 61 74 20 6c 69 6e 65 20 25  misuse at line %
19de0 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20  d of [%.10s]",. 
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e               lin
19e00 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f  eno, 20+sqlite3_
19e10 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72  sourceid());.  r
19e20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
19e30 55 53 45 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  USE;.}.int sqlit
19e40 65 33 43 61 6e 74 6f 70 65 6e 45 72 72 6f 72 28  e3CantopenError(
19e50 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
19e60 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
19e70 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
19e80 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  g!=0 );.  sqlite
19e90 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 41 4e  3_log(SQLITE_CAN
19ea0 54 4f 50 45 4e 2c 20 0a 20 20 20 20 20 20 20 20  TOPEN, .        
19eb0 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 6f 70        "cannot op
19ec0 65 6e 20 66 69 6c 65 20 61 74 20 6c 69 6e 65 20  en file at line 
19ed0 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a  %d of [%.10s]",.
19ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69                li
19ef0 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33  neno, 20+sqlite3
19f00 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20  _sourceid());.  
19f10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
19f20 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23 69 66 6e  NTOPEN;.}...#ifn
19f30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19f40 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a  DEPRECATED./*.**
19f50 20 54 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65   This is a conve
19f60 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74  nience routine t
19f70 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74  hat makes sure t
19f80 68 61 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73  hat all thread-s
19f90 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20  pecific.** data 
19fa0 66 6f 72 20 74 68 69 73 20 74 68 72 65 61 64 20  for this thread 
19fb0 68 61 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63  has been dealloc
19fc0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ated..**.** SQLi
19fd0 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65  te no longer use
19fe0 73 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  s thread-specifi
19ff0 63 20 64 61 74 61 20 73 6f 20 74 68 69 73 20 72  c data so this r
1a000 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a  outine is now a.
1a010 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73  ** no-op.  It is
1a020 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69   retained for hi
1a030 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69  storical compati
1a040 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20  bility..*/.void 
1a050 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63  sqlite3_thread_c
1a060 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a  leanup(void){.}.
1a070 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1a080 74 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d  turn meta inform
1a090 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70  ation about a sp
1a0a0 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66  ecific column of
1a0b0 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
1a0c0 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e  e..** See commen
1a0d0 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28  t in sqlite3.h (
1a0e0 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72  sqlite.h.in) for
1a0f0 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74   details..*/.int
1a100 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
1a110 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
1a120 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a140 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64   Connection hand
1a150 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
1a160 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20  ar *zDbName,    
1a170 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1a180 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  name or NULL */.
1a190 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1a1a0 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  ableName,     /*
1a1b0 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   Table name */. 
1a1c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
1a1d0 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20  lumnName,    /* 
1a1e0 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  Column name */. 
1a1f0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a   char const **pz
1a200 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20  DataType,    /* 
1a210 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64  OUTPUT: Declared
1a220 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20   data type */.  
1a230 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43  char const **pzC
1a240 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f  ollSeq,     /* O
1a250 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e  UTPUT: Collation
1a260 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a   sequence name *
1a270 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c  /.  int *pNotNul
1a280 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1a290 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
1a2a0 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73  if NOT NULL cons
1a2b0 74 72 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f  traint exists */
1a2c0 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79  .  int *pPrimary
1a2d0 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Key,           /
1a2e0 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
1a2f0 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66  f column part of
1a300 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41   PK */.  int *pA
1a310 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20  utoinc          
1a320 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
1a330 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69  True if column i
1a340 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74  s auto-increment
1a350 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1a360 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
1a370 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70   = 0;.  Table *p
1a380 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d  Tab = 0;.  Colum
1a390 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69  n *pCol = 0;.  i
1a3a0 6e 74 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 63  nt iCol = 0;.  c
1a3b0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61  har const *zData
1a3c0 54 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72  Type = 0;.  char
1a3d0 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71   const *zCollSeq
1a3e0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e   = 0;.  int notn
1a3f0 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70  ull = 0;.  int p
1a400 72 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20  rimarykey = 0;. 
1a410 20 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30   int autoinc = 0
1a420 3b 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ;...#ifdef SQLIT
1a430 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1a440 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1a450 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1a460 62 29 20 7c 7c 20 7a 54 61 62 6c 65 4e 61 6d 65  b) || zTableName
1a470 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1a480 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1a490 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
1a4a0 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68  ..  /* Ensure th
1a4b0 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
1a4c0 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65  a has been loade
1a4d0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  d */.  sqlite3_m
1a4e0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1a4f0 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  utex);.  sqlite3
1a500 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
1a510 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1a520 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d  3Init(db, &zErrM
1a530 73 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  sg);.  if( SQLIT
1a540 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
1a550 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
1a560 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
1a570 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75   the table in qu
1a580 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62  estion */.  pTab
1a590 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
1a5a0 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61  ble(db, zTableNa
1a5b0 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  me, zDbName);.  
1a5c0 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61  if( !pTab || pTa
1a5d0 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
1a5e0 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
1a5f0 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
1a600 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74    }..  /* Find t
1a610 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68  he column for wh
1a620 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75  ich info is requ
1a630 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a  ested */.  if( z
1a640 43 6f 6c 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29 7b  ColumnName==0 ){
1a650 0a 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6f  .    /* Query fo
1a660 72 20 65 78 69 73 74 61 6e 63 65 20 6f 66 20 74  r existance of t
1a670 61 62 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d  able only */.  }
1a680 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43  else{.    for(iC
1a690 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
1a6a0 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
1a6b0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54        pCol = &pT
1a6c0 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a  ab->aCol[iCol];.
1a6d0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
1a6e0 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
1a6f0 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e  ->zName, zColumn
1a700 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
1a710 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1a720 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
1a730 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  ol==pTab->nCol )
1a740 7b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73 52  {.      if( HasR
1a750 6f 77 69 64 28 70 54 61 62 29 20 26 26 20 73 71  owid(pTab) && sq
1a760 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f  lite3IsRowid(zCo
1a770 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20  lumnName) ){.   
1a780 20 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62       iCol = pTab
1a790 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20  ->iPKey;.       
1a7a0 20 70 43 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30 20   pCol = iCol>=0 
1a7b0 3f 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  ? &pTab->aCol[iC
1a7c0 6f 6c 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d  ol] : 0;.      }
1a7d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
1a7e0 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ab = 0;.        
1a7f0 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
1a800 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a810 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  }..  /* The foll
1a820 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72  owing block stor
1a830 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f  es the meta info
1a840 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  rmation that wil
1a850 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20  l be returned.  
1a860 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
1a870 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62   in local variab
1a880 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a  les zDataType, z
1a890 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c  CollSeq, notnull
1a8a0 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a  , primarykey.  *
1a8b0 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41  * and autoinc. A
1a8c0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
1a8d0 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69  re are two possi
1a8e0 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a  bilities:.  ** .
1a8f0 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20    **     1. The 
1a900 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e  specified column
1a910 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22   name was rowid"
1a920 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77  , "oid" or "_row
1a930 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20  id_" .  **      
1a940 20 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e    and there is n
1a950 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63  o explicitly dec
1a960 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e  lared IPK column
1a970 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  . .  **.  **    
1a980 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73   2. The table is
1a990 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20   not a view and 
1a9a0 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
1a9b0 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20  identified an . 
1a9c0 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69   **        expli
1a9d0 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63  citly declared c
1a9e0 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61  olumn. Copy meta
1a9f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
1aa00 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20  m *pCol..  */ . 
1aa10 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20   if( pCol ){.   
1aa20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 70 43 6f   zDataType = pCo
1aa30 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 7a 43  l->zType;.    zC
1aa40 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a  ollSeq = pCol->z
1aa50 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c  Coll;.    notnul
1aa60 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c  l = pCol->notNul
1aa70 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d 61 72  l!=0;.    primar
1aa80 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d 3e 63  ykey  = (pCol->c
1aa90 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46 4c 41  olFlags & COLFLA
1aaa0 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b 0a 20  G_PRIMKEY)!=0;. 
1aab0 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61     autoinc = pTa
1aac0 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26  b->iPKey==iCol &
1aad0 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  & (pTab->tabFlag
1aae0 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
1aaf0 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  ment)!=0;.  }els
1ab00 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65  e{.    zDataType
1ab10 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
1ab20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31    primarykey = 1
1ab30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f  ;.  }.  if( !zCo
1ab40 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f  llSeq ){.    zCo
1ab50 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59 22  llSeq = "BINARY"
1ab60 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74  ;.  }..error_out
1ab70 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  :.  sqlite3Btree
1ab80 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20  LeaveAll(db);.. 
1ab90 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65 20   /* Whether the 
1aba0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73 75  function call su
1abb0 63 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c 65  cceeded or faile
1abc0 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70 75  d, set the outpu
1abd0 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20 2a  t parameters.  *
1abe0 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20 74 68  * to whatever th
1abf0 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74 65  eir local counte
1ac00 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e 20  rparts contain. 
1ac10 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20  If an error did 
1ac20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69 73  occur,.  ** this
1ac30 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
1ac40 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20 6f  of zeroing all o
1ac50 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
1ac60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a 44  ..  */.  if( pzD
1ac70 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61 74  ataType ) *pzDat
1ac80 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79 70  aType = zDataTyp
1ac90 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c 53  e;.  if( pzCollS
1aca0 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71 20  eq ) *pzCollSeq 
1acb0 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69 66  = zCollSeq;.  if
1acc0 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e  ( pNotNull ) *pN
1acd0 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c  otNull = notnull
1ace0 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72 79  ;.  if( pPrimary
1acf0 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79 4b  Key ) *pPrimaryK
1ad00 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79 3b  ey = primarykey;
1ad10 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63 20  .  if( pAutoinc 
1ad20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61 75  ) *pAutoinc = au
1ad30 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53 51  toinc;..  if( SQ
1ad40 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20 21  LITE_OK==rc && !
1ad50 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  pTab ){.    sqli
1ad60 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
1ad70 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72 72  rrMsg);.    zErr
1ad80 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
1ad90 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75 63  intf(db, "no suc
1ada0 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20  h table column: 
1adb0 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e 61  %s.%s", zTableNa
1adc0 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  me,.        zCol
1add0 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  umnName);.    rc
1ade0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1adf0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
1ae00 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72  rorWithMsg(db, r
1ae10 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22  c, (zErrMsg?"%s"
1ae20 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  :0), zErrMsg);. 
1ae30 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1ae40 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72  b, zErrMsg);.  r
1ae50 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
1ae60 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
1ae70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1ae80 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
1ae90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1aea0 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
1aeb0 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
1aec0 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
1aed0 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
1aee0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
1aef0 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20  leep(int ms){.  
1af00 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1af10 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  s;.  int rc;.  p
1af20 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
1af30 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28  s_find(0);.  if(
1af40 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72   pVfs==0 ) retur
1af50 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  n 0;..  /* This 
1af60 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69  function works i
1af70 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20  n milliseconds, 
1af80 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79 69  but the underlyi
1af90 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20 20  ng OsSleep() .  
1afa0 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63 72  ** API uses micr
1afb0 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20  oseconds. Hence 
1afc0 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f  the 1000's..  */
1afd0 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33  .  rc = (sqlite3
1afe0 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31 30  OsSleep(pVfs, 10
1aff0 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20  00*ms)/1000);.  
1b000 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b010 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
1b020 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64  sable the extend
1b030 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e  ed result codes.
1b040 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1b050 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
1b060 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64  codes(sqlite3 *d
1b070 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 23  b, int onoff){.#
1b080 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1b090 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1b0a0 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1b0b0 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
1b0c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1b0d0 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
1b0e0 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1b0f0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1b100 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73  x);.  db->errMas
1b110 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66  k = onoff ? 0xff
1b120 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20  ffffff : 0xff;. 
1b130 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1b140 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1b150 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b160 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
1b170 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f  voke the xFileCo
1b180 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20  ntrol method on 
1b190 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
1b1a0 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
1b1b0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
1b1c0 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ol(sqlite3 *db, 
1b1d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
1b1e0 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  ame, int op, voi
1b1f0 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20  d *pArg){.  int 
1b200 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1b210 52 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  R;.  Btree *pBtr
1b220 65 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ee;..#ifdef SQLI
1b230 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1b240 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1b250 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1b260 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
1b270 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1b280 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1b290 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1b2a0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74 72  ->mutex);.  pBtr
1b2b0 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61  ee = sqlite3DbNa
1b2c0 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44  meToBtree(db, zD
1b2d0 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 42  bName);.  if( pB
1b2e0 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67 65  tree ){.    Page
1b2f0 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 73  r *pPager;.    s
1b300 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
1b310 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1b320 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
1b330 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
1b340 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
1b350 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65  Btree);.    asse
1b360 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
1b370 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74 65  .    fd = sqlite
1b380 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65  3PagerFile(pPage
1b390 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
1b3a0 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  fd!=0 );.    if(
1b3b0 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54   op==SQLITE_FCNT
1b3c0 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29  L_FILE_POINTER )
1b3d0 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65  {.      *(sqlite
1b3e0 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20  3_file**)pArg = 
1b3f0 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  fd;.      rc = S
1b400 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1b410 6c 73 65 20 69 66 28 20 66 64 2d 3e 70 4d 65 74  lse if( fd->pMet
1b420 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 72 63  hods ){.      rc
1b430 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1b440 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20  Control(fd, op, 
1b450 70 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pArg);.    }else
1b460 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1b470 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
1b480 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
1b490 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
1b4a0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1b4b0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1b4c0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1b4d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
1b4e0 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20  nterface to the 
1b4f0 74 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a  testing logic..*
1b500 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65  /.int sqlite3_te
1b510 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f  st_control(int o
1b520 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72  p, ...){.  int r
1b530 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  c = 0;.#ifdef SQ
1b540 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49  LITE_OMIT_BUILTI
1b550 4e 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f  N_TEST.  UNUSED_
1b560 50 41 52 41 4d 45 54 45 52 28 6f 70 29 3b 0a 23  PARAMETER(op);.#
1b570 65 6c 73 65 0a 20 20 76 61 5f 6c 69 73 74 20 61  else.  va_list a
1b580 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  p;.  va_start(ap
1b590 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
1b5a0 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20   op ){..    /*. 
1b5b0 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20 63     ** Save the c
1b5c0 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
1b5d0 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f  the PRNG..    */
1b5e0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1b5f0 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53  _TESTCTRL_PRNG_S
1b600 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  AVE: {.      sql
1b610 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61 74  ite3PrngSaveStat
1b620 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
1b630 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1b640 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20 74      ** Restore t
1b650 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
1b660 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73 74  PRNG to the last
1b670 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73 69   state saved usi
1b680 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53  ng.    ** PRNG_S
1b690 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53 41  AVE.  If PRNG_SA
1b6a0 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65 66  VE has never bef
1b6b0 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ore been called,
1b6c0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69   then.    ** thi
1b6d0 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b 65  s verb acts like
1b6e0 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20   PRNG_RESET..   
1b6f0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1b700 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
1b710 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20  G_RESTORE: {.   
1b720 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65     sqlite3PrngRe
1b730 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20 20  storeState();.  
1b740 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b750 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1b760 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20 62  Reset the PRNG b
1b770 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e 69  ack to its unini
1b780 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e 20  tialized state. 
1b790 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20   The next call. 
1b7a0 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
1b7b0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69  _randomness() wi
1b7c0 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50 52  ll reseed the PR
1b7d0 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  NG using a singl
1b7e0 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  e call.    ** to
1b7f0 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73   the xRandomness
1b800 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 64   method of the d
1b810 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20 20  efault VFS..    
1b820 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1b830 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
1b840 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20  _RESET: {.      
1b850 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
1b860 73 73 28 30 2c 30 29 3b 0a 20 20 20 20 20 20 62  ss(0,0);.      b
1b870 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1b880 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
1b890 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1b8a0 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73 69  (BITVEC_TEST, si
1b8b0 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20 20  ze, program).   
1b8c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61   **.    ** Run a
1b8d0 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61 20   test against a 
1b8e0 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f 66  Bitvec object of
1b8f0 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f 67   size.  The prog
1b900 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20 20  ram argument.   
1b910 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20   ** is an array 
1b920 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61 74  of integers that
1b930 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65 73   defines the tes
1b940 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e  t.  Return -1 on
1b950 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79   a.    ** memory
1b960 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
1b970 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c  r, 0 on success,
1b980 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72   or non-zero for
1b990 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a   an error..    *
1b9a0 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74 65  * See the sqlite
1b9b0 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65  3BitvecBuiltinTe
1b9c0 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  st() for additio
1b9d0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
1b9e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1b9f0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1ba00 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a  _BITVEC_TEST: {.
1ba10 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76        int sz = v
1ba20 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
1ba30 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f 67        int *aProg
1ba40 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1ba50 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t*);.      rc = 
1ba60 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69  sqlite3BitvecBui
1ba70 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50 72  ltinTest(sz, aPr
1ba80 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  og);.      break
1ba90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
1baa0 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
1bab0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 46 41 55  test_control(FAU
1bac0 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20 78 43 61 6c  LT_INSTALL, xCal
1bad0 6c 62 61 63 6b 29 0a 20 20 20 20 2a 2a 0a 20 20  lback).    **.  
1bae0 20 20 2a 2a 20 41 72 72 61 6e 67 65 20 74 6f 20    ** Arrange to 
1baf0 69 6e 76 6f 6b 65 20 78 43 61 6c 6c 62 61 63 6b  invoke xCallback
1bb00 28 29 20 77 68 65 6e 65 76 65 72 20 73 71 6c 69  () whenever sqli
1bb10 74 65 33 46 61 75 6c 74 53 69 6d 28 29 20 69 73  te3FaultSim() is
1bb20 20 63 61 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a 20   called,.    ** 
1bb30 69 66 20 78 43 61 6c 6c 62 61 63 6b 20 69 73 20  if xCallback is 
1bb40 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a  not NULL..    **
1bb50 0a 20 20 20 20 2a 2a 20 41 73 20 61 20 74 65 73  .    ** As a tes
1bb60 74 20 6f 66 20 74 68 65 20 66 61 75 6c 74 20 73  t of the fault s
1bb70 69 6d 75 6c 61 74 6f 72 20 6d 65 63 68 61 6e 69  imulator mechani
1bb80 73 6d 20 69 74 73 65 6c 66 2c 20 73 71 6c 69 74  sm itself, sqlit
1bb90 65 33 46 61 75 6c 74 53 69 6d 28 30 29 0a 20 20  e3FaultSim(0).  
1bba0 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 69    ** is called i
1bbb0 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
1bbc0 20 69 6e 73 74 61 6c 6c 69 6e 67 20 74 68 65 20   installing the 
1bbd0 6e 65 77 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64  new callback and
1bbe0 20 74 68 65 20 72 65 74 75 72 6e 0a 20 20 20 20   the return.    
1bbf0 2a 2a 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 71  ** value from sq
1bc00 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29  lite3FaultSim(0)
1bc10 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65 74   becomes the ret
1bc20 75 72 6e 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  urn from.    ** 
1bc30 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1bc40 74 72 6f 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  trol()..    */. 
1bc50 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1bc60 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e  ESTCTRL_FAULT_IN
1bc70 53 54 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 2f  STALL: {.      /
1bc80 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20  * MSVC is picky 
1bc90 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75  about pulling fu
1bca0 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20  nc ptrs from va 
1bcb0 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  lists..      ** 
1bcc0 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d  http://support.m
1bcd0 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f  icrosoft.com/kb/
1bce0 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73  47961.      ** s
1bcf0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1bd00 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b  ig.xTestCallback
1bd10 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1bd20 74 28 2a 29 28 69 6e 74 29 29 3b 0a 20 20 20 20  t(*)(int));.    
1bd30 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64    */.      typed
1bd40 65 66 20 69 6e 74 28 2a 54 45 53 54 43 41 4c 4c  ef int(*TESTCALL
1bd50 42 41 43 4b 46 55 4e 43 5f 74 29 28 69 6e 74 29  BACKFUNC_t)(int)
1bd60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
1bd70 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73  lobalConfig.xTes
1bd80 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61  tCallback = va_a
1bd90 72 67 28 61 70 2c 20 54 45 53 54 43 41 4c 4c 42  rg(ap, TESTCALLB
1bda0 41 43 4b 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20  ACKFUNC_t);.    
1bdb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 61    rc = sqlite3Fa
1bdc0 75 6c 74 53 69 6d 28 30 29 3b 0a 20 20 20 20 20  ultSim(0);.     
1bdd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1bde0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
1bdf0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1be00 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43  ol(BENIGN_MALLOC
1be10 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20  _HOOKS, xBegin, 
1be20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20  xEnd).    **.   
1be30 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f   ** Register hoo
1be40 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e  ks to call to in
1be50 64 69 63 61 74 65 20 77 68 69 63 68 20 6d 61 6c  dicate which mal
1be60 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20 0a  loc() failures .
1be70 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69 67      ** are benig
1be80 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
1be90 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1bea0 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43  RL_BENIGN_MALLOC
1beb0 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20  _HOOKS: {.      
1bec0 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 76  typedef void (*v
1bed0 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f  oid_function)(vo
1bee0 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f  id);.      void_
1bef0 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e  function xBenign
1bf00 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69  Begin;.      voi
1bf10 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69  d_function xBeni
1bf20 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42 65  gnEnd;.      xBe
1bf30 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61  nignBegin = va_a
1bf40 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63  rg(ap, void_func
1bf50 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42 65  tion);.      xBe
1bf60 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67  nignEnd = va_arg
1bf70 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69  (ap, void_functi
1bf80 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  on);.      sqlit
1bf90 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f  e3BenignMallocHo
1bfa0 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69 6e  oks(xBenignBegin
1bfb0 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20  , xBenignEnd);. 
1bfc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bfd0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1bfe0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1bff0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1c000 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42  STCTRL_PENDING_B
1c010 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  YTE, unsigned in
1c020 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t X).    **.    
1c030 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44 49  ** Set the PENDI
1c040 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65 20 76  NG byte to the v
1c050 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67 75  alue in the argu
1c060 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20  ment, if X>0..  
1c070 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61    ** Make no cha
1c080 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20 52  nges if X==0.  R
1c090 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
1c0a0 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20 62  of the pending b
1c0b0 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69 74  yte.    ** as it
1c0c0 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72 65   existing before
1c0d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
1c0e0 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a  s called..    **
1c0f0 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e  .    ** IMPORTAN
1c100 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65  T:  Changing the
1c110 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66 72   PENDING byte fr
1c120 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20 72 65  om 0x40000000 re
1c130 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20  sults in.    ** 
1c140 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
1c150 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
1c160 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67 20  rmat.  Changing 
1c170 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
1c180 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e  .    ** while an
1c190 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  y database conne
1c1a0 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65  ction is open re
1c1b0 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69 6e  sults in undefin
1c1c0 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65  ed and.    ** de
1c1d0 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61 76 69  leterious behavi
1c1e0 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  or..    */.    c
1c1f0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1c200 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45  TRL_PENDING_BYTE
1c210 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 50  : {.      rc = P
1c220 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66  ENDING_BYTE;.#if
1c230 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c240 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20 20  _WSD.      {.   
1c250 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e       unsigned in
1c260 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61 72  t newVal = va_ar
1c270 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69  g(ap, unsigned i
1c280 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nt);.        if(
1c290 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74 65   newVal ) sqlite
1c2a0 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e  3PendingByte = n
1c2b0 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23  ewVal;.      }.#
1c2c0 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
1c2d0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1c2e0 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
1c2f0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1c300 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
1c310 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20 20  SERT, int X).   
1c320 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
1c330 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20  action provides 
1c340 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  a run-time test 
1c350 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f  to see whether o
1c360 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73  r not.    ** ass
1c370 65 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c 65  ert() was enable
1c380 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1c390 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65  e.  If X is true
1c3a0 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20 20   and assert().  
1c3b0 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c    ** is enabled,
1c3c0 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
1c3d0 20 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e 20   value is true. 
1c3e0 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e   If X is true an
1c3f0 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28  d.    ** assert(
1c400 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  ) is disabled, t
1c410 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
1c420 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20 49  alue is zero.  I
1c430 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66 61  f X is.    ** fa
1c440 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29  lse and assert()
1c450 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
1c460 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e 20  n the assertion 
1c470 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20 20  fires and the.  
1c480 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62 6f    ** process abo
1c490 72 74 73 2e 20 20 49 66 20 58 20 69 73 20 66 61  rts.  If X is fa
1c4a0 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29  lse and assert()
1c4b0 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68   is disabled, th
1c4c0 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  en the.    ** re
1c4d0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65  turn value is ze
1c4e0 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ro..    */.    c
1c4f0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1c500 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20  TRL_ASSERT: {.  
1c510 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74      volatile int
1c520 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73   x = 0;.      as
1c530 73 65 72 74 28 20 28 78 20 3d 20 76 61 5f 61 72  sert( (x = va_ar
1c540 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b  g(ap,int))!=0 );
1c550 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a 20  .      rc = x;. 
1c560 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c570 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  }...    /*.    *
1c580 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
1c590 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1c5a0 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20  ESTCTRL_ALWAYS, 
1c5b0 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
1c5c0 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e    ** This action
1c5d0 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d   provides a run-
1c5e0 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65  time test to see
1c5f0 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53 20   how the ALWAYS 
1c600 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52  and.    ** NEVER
1c610 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65 66   macros were def
1c620 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  ined at compile-
1c630 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  time..    **.   
1c640 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76   ** The return v
1c650 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28 58  alue is ALWAYS(X
1c660 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ).  .    **.    
1c670 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64  ** The recommend
1c680 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32 2e  ed test is X==2.
1c690 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20    If the return 
1c6a0 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61 74  value is 2, that
1c6b0 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c   means.    ** AL
1c6c0 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52  WAYS() and NEVER
1c6d0 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f  () are both no-o
1c6e0 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d  p pass-through m
1c6f0 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20  acros, which is 
1c700 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  the.    ** defau
1c710 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66 20  lt setting.  If 
1c720 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1c730 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57 41   is 1, then ALWA
1c740 59 53 28 29 20 69 73 20 65 69 74 68 65 72 0a 20  YS() is either. 
1c750 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64     ** hard-coded
1c760 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73 65   to true or else
1c770 20 69 74 20 61 73 73 65 72 74 73 20 69 66 20 69   it asserts if i
1c780 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ts argument is f
1c790 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  alse..    ** The
1c7a0 20 66 69 72 73 74 20 62 65 68 61 76 69 6f 72 20   first behavior 
1c7b0 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74  (hard-coded to t
1c7c0 72 75 65 29 20 69 73 20 74 68 65 20 63 61 73 65  rue) is the case
1c7d0 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
1c7e0 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
1c7f0 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
1c800 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
1c810 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  d and the second
1c820 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f 72  .    ** behavior
1c830 20 28 61 73 73 65 72 74 20 69 66 20 74 68 65 20   (assert if the 
1c840 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41  argument to ALWA
1c850 59 53 28 29 20 69 73 20 66 61 6c 73 65 29 20 69  YS() is false) i
1c860 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20  s the case if.  
1c870 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54    ** SQLITE_TEST
1c880 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77  CTRL_ASSERT show
1c890 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20  s that assert() 
1c8a0 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20  is enabled..    
1c8b0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75  **.    ** The ru
1c8c0 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f 63  n-time test proc
1c8d0 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b  edure might look
1c8e0 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20   something like 
1c8f0 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
1c900 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69 74   **    if( sqlit
1c910 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1c920 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1c930 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b  ALWAYS, 2)==2 ){
1c940 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20  .    **      // 
1c950 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56  ALWAYS() and NEV
1c960 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70  ER() are no-op p
1c970 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72  ass-through macr
1c980 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c  os.    **    }el
1c990 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74  se if( sqlite3_t
1c9a0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1c9b0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
1c9c0 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a  RT, 1) ){.    **
1c9d0 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
1c9e0 78 29 20 61 73 73 65 72 74 73 20 74 68 61 74 20  x) asserts that 
1c9f0 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45 52  x is true. NEVER
1ca00 28 78 29 20 61 73 73 65 72 74 73 20 78 20 69 73  (x) asserts x is
1ca10 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20   false..    **  
1ca20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20    }else{.    ** 
1ca30 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78       // ALWAYS(x
1ca40 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  ) is a constant 
1ca50 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73 20  1.  NEVER(x) is 
1ca60 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20  a constant 0..  
1ca70 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f    **    }.    */
1ca80 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ca90 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
1caa0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20  : {.      int x 
1cab0 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
1cac0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c 57  ;.      rc = ALW
1cad0 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62 72  AYS(x);.      br
1cae0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1caf0 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c 69  /*.    **   sqli
1cb00 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1cb10 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1cb20 5f 42 59 54 45 4f 52 44 45 52 29 3b 0a 20 20 20  _BYTEORDER);.   
1cb30 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 69   **.    ** The i
1cb40 6e 74 65 67 65 72 20 72 65 74 75 72 6e 65 64 20  nteger returned 
1cb50 72 65 76 65 61 6c 73 20 74 68 65 20 62 79 74 65  reveals the byte
1cb60 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 20 63 6f  -order of the co
1cb70 6d 70 75 74 65 72 20 6f 6e 20 77 68 69 63 68 0a  mputer on which.
1cb80 20 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 69 73      ** SQLite is
1cb90 20 72 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a   running:.    **
1cba0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 31 20  .    **       1 
1cbb0 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20      big-endian, 
1cbc0 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74     determined at
1cbd0 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a   run-time.    **
1cbe0 20 20 20 20 20 20 31 30 20 20 20 20 20 6c 69 74        10     lit
1cbf0 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65  tle-endian, dete
1cc00 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69  rmined at run-ti
1cc10 6d 65 0a 20 20 20 20 2a 2a 20 20 34 33 32 31 30  me.    **  43210
1cc20 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e  1     big-endian
1cc30 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20  ,    determined 
1cc40 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a  at compile-time.
1cc50 20 20 20 20 2a 2a 20 20 31 32 33 34 31 30 20 20      **  123410  
1cc60 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e     little-endian
1cc70 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20  , determined at 
1cc80 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20  compile-time.   
1cc90 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 53 51   */ .    case SQ
1cca0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59  LITE_TESTCTRL_BY
1ccb0 54 45 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20 20  TEORDER: {.     
1ccc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 59 54   rc = SQLITE_BYT
1ccd0 45 4f 52 44 45 52 2a 31 30 30 20 2b 20 53 51 4c  EORDER*100 + SQL
1cce0 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e  ITE_LITTLEENDIAN
1ccf0 2a 31 30 20 2b 20 53 51 4c 49 54 45 5f 42 49 47  *10 + SQLITE_BIG
1cd00 45 4e 44 49 41 4e 3b 0a 20 20 20 20 20 20 62 72  ENDIAN;.      br
1cd10 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1cd20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1cd30 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1cd40 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
1cd50 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  E, sqlite3 *db, 
1cd60 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20  int N).    **.  
1cd70 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65    ** Set the nRe
1cd80 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20  serve size to N 
1cd90 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
1cda0 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74  abase on the dat
1cdb0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e  abase.    ** con
1cdc0 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20  nection db..    
1cdd0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1cde0 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45  TE_TESTCTRL_RESE
1cdf0 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RVE: {.      sql
1ce00 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
1ce10 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
1ce20 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76  .      int x = v
1ce30 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
1ce40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
1ce50 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1ce60 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ex);.      sqlit
1ce70 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
1ce80 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  ze(db->aDb[0].pB
1ce90 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20  t, 0, x, 0);.   
1cea0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1ceb0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
1cec0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ced0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73      }..    /*  s
1cee0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1cef0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1cf00 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
1cf10 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  S, sqlite3 *db, 
1cf20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20  int N).    **.  
1cf30 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64    ** Enable or d
1cf40 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f  isable various o
1cf50 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72  ptimizations for
1cf60 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
1cf70 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20  s.  The .    ** 
1cf80 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20  argument N is a 
1cf90 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d  bitmask of optim
1cfa0 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64  izations to be d
1cfb0 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f  isabled.  For no
1cfc0 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72  rmal.    ** oper
1cfd0 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62  ation N should b
1cfe0 65 20 30 2e 20 20 54 68 65 20 69 64 65 61 20 69  e 0.  The idea i
1cff0 73 20 74 68 61 74 20 61 20 74 65 73 74 20 70 72  s that a test pr
1d000 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a  ogram (like the.
1d010 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63      ** SQL Logic
1d020 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73   Test or SLT tes
1d030 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75  t module) can ru
1d040 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d  n the same SQL m
1d050 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20  ultiple times.  
1d060 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75    ** with variou
1d070 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  s optimizations 
1d080 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69  disabled to veri
1d090 66 79 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  fy that the same
1d0a0 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69   answer.    ** i
1d0b0 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76  s obtained in ev
1d0c0 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  ery case..    */
1d0d0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1d0e0 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
1d0f0 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20  ZATIONS: {.     
1d100 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
1d110 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
1d120 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 64  3*);.      db->d
1d130 62 4f 70 74 46 6c 61 67 73 20 3d 20 28 75 31 36  bOptFlags = (u16
1d140 29 28 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  )(va_arg(ap, int
1d150 29 20 26 20 30 78 66 66 66 66 29 3b 0a 20 20 20  ) & 0xffff);.   
1d160 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1d170 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
1d180 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a 20  _KEYWORD.    /* 
1d190 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1d1a0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1d1b0 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20  CTRL_ISKEYWORD, 
1d1c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72  const char *zWor
1d1d0 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d).    **.    **
1d1e0 20 49 66 20 7a 57 6f 72 64 20 69 73 20 61 20 6b   If zWord is a k
1d1f0 65 79 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a 65  eyword recognize
1d200 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2c  d by the parser,
1d210 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
1d220 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  .    ** number o
1d230 66 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  f keywords.  Or 
1d240 69 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74 20  if zWord is not 
1d250 61 20 6b 65 79 77 6f 72 64 2c 20 72 65 74 75 72  a keyword, retur
1d260 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20  n 0..    ** .   
1d270 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 66 65   ** This test fe
1d280 61 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 61 76  ature is only av
1d290 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 61  ailable in the a
1d2a0 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e 63  malgamation sinc
1d2b0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c  e.    ** the SQL
1d2c0 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d 61  ITE_N_KEYWORD ma
1d2d0 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  cro is not defin
1d2e0 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  ed in this file 
1d2f0 69 66 20 53 51 4c 69 74 65 0a 20 20 20 20 2a 2a  if SQLite.    **
1d300 20 69 73 20 62 75 69 6c 74 20 75 73 69 6e 67 20   is built using 
1d310 73 65 70 61 72 61 74 65 20 73 6f 75 72 63 65 20  separate source 
1d320 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  files..    */.  
1d330 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1d340 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44  STCTRL_ISKEYWORD
1d350 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  : {.      const 
1d360 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76 61  char *zWord = va
1d370 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63  _arg(ap, const c
1d380 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  har*);.      int
1d390 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
1d3a0 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20 20  en30(zWord);.   
1d3b0 20 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33     rc = (sqlite3
1d3c0 4b 65 79 77 6f 72 64 43 6f 64 65 28 28 75 38 2a  KeywordCode((u8*
1d3d0 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f 49  )zWord, n)!=TK_I
1d3e0 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b 45  D) ? SQLITE_N_KE
1d3f0 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20 20  YWORD : 0;.     
1d400 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1d410 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20 73 71  ndif ..    /* sq
1d420 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1d430 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1d440 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43  RL_SCRATCHMALLOC
1d450 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70 46 72  , sz, &pNew, pFr
1d460 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ee);.    **.    
1d470 2a 2a 20 50 61 73 73 20 70 46 72 65 65 20 69 6e  ** Pass pFree in
1d480 74 6f 20 73 71 6c 69 74 65 33 53 63 72 61 74 63  to sqlite3Scratc
1d490 68 46 72 65 65 28 29 2e 20 0a 20 20 20 20 2a 2a  hFree(). .    **
1d4a0 20 49 66 20 73 7a 3e 30 20 74 68 65 6e 20 61 6c   If sz>0 then al
1d4b0 6c 6f 63 61 74 65 20 61 20 73 63 72 61 74 63 68  locate a scratch
1d4c0 20 62 75 66 66 65 72 20 69 6e 74 6f 20 70 4e 65   buffer into pNe
1d4d0 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  w.  .    */.    
1d4e0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1d4f0 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c  CTRL_SCRATCHMALL
1d500 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64  OC: {.      void
1d510 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e 65 77   *pFree, **ppNew
1d520 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ;.      int sz;.
1d530 20 20 20 20 20 20 73 7a 20 3d 20 76 61 5f 61 72        sz = va_ar
1d540 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
1d550 20 20 70 70 4e 65 77 20 3d 20 76 61 5f 61 72 67    ppNew = va_arg
1d560 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20 20  (ap, void**);.  
1d570 20 20 20 20 70 46 72 65 65 20 3d 20 76 61 5f 61      pFree = va_a
1d580 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20  rg(ap, void*);. 
1d590 20 20 20 20 20 69 66 28 20 73 7a 20 29 20 2a 70       if( sz ) *p
1d5a0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 63  pNew = sqlite3Sc
1d5b0 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a 29 3b  ratchMalloc(sz);
1d5c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63  .      sqlite3Sc
1d5d0 72 61 74 63 68 46 72 65 65 28 70 46 72 65 65 29  ratchFree(pFree)
1d5e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d5f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
1d600 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1d610 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1d620 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
1d630 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b  ULT, int onoff);
1d640 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1d650 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66  f parameter onof
1d660 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63  f is non-zero, c
1d670 6f 6e 66 69 67 75 72 65 20 74 68 65 20 77 72 61  onfigure the wra
1d680 70 70 65 72 73 20 73 6f 20 74 68 61 74 20 61 6c  ppers so that al
1d690 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75  l.    ** subsequ
1d6a0 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63  ent calls to loc
1d6b0 61 6c 74 69 6d 65 28 29 20 61 6e 64 20 76 61 72  altime() and var
1d6c0 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66 20 6f  iants fail. If o
1d6d0 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a 20 20  noff is zero,.  
1d6e0 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73 20 73    ** undo this s
1d6f0 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  etting..    */. 
1d700 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1d710 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d  ESTCTRL_LOCALTIM
1d720 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20  E_FAULT: {.     
1d730 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1d740 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46  nfig.bLocaltimeF
1d750 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28 61 70  ault = va_arg(ap
1d760 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
1d770 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1d780 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1d790 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1d7a0 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f  _TESTCTRL_NEVER_
1d7b0 43 4f 52 52 55 50 54 2c 20 69 6e 74 29 3b 0a 20  CORRUPT, int);. 
1d7c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
1d7d0 20 6f 72 20 63 6c 65 61 72 20 61 20 66 6c 61 67   or clear a flag
1d7e0 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20   that indicates 
1d7f0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
1d800 65 20 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73  e file is always
1d810 20 77 65 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f   well-.    ** fo
1d820 72 6d 65 64 20 61 6e 64 20 6e 65 76 65 72 20 63  rmed and never c
1d830 6f 72 72 75 70 74 2e 20 20 54 68 69 73 20 66 6c  orrupt.  This fl
1d840 61 67 20 69 73 20 63 6c 65 61 72 20 62 79 20 64  ag is clear by d
1d850 65 66 61 75 6c 74 2c 20 69 6e 64 69 63 61 74 69  efault, indicati
1d860 6e 67 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 64  ng that.    ** d
1d870 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 6d 69  atabase files mi
1d880 67 68 74 20 68 61 76 65 20 61 72 62 69 74 72 61  ght have arbitra
1d890 72 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  ry corruption.  
1d8a0 53 65 74 74 69 6e 67 20 74 68 65 20 66 6c 61 67  Setting the flag
1d8b0 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74   during.    ** t
1d8c0 65 73 74 69 6e 67 20 63 61 75 73 65 73 20 63 65  esting causes ce
1d8d0 72 74 61 69 6e 20 61 73 73 65 72 74 28 29 20 73  rtain assert() s
1d8e0 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65  tatements in the
1d8f0 20 63 6f 64 65 20 74 6f 20 62 65 20 61 63 74 69   code to be acti
1d900 76 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 68 61  vated.    ** tha
1d910 74 20 64 65 6d 6f 6e 73 74 72 61 74 20 69 6e 76  t demonstrat inv
1d920 61 72 69 61 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d  ariants on well-
1d930 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
1d940 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  files..    */.  
1d950 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1d960 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52  STCTRL_NEVER_COR
1d970 52 55 50 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  RUPT: {.      sq
1d980 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1d990 67 2e 6e 65 76 65 72 43 6f 72 72 75 70 74 20 3d  g.neverCorrupt =
1d9a0 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1d9b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1d9c0 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 20 20     }...    /*   
1d9d0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1d9e0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1d9f0 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41  CTRL_VDBE_COVERA
1da00 47 45 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70  GE, xCallback, p
1da10 74 72 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tr);.    **.    
1da20 2a 2a 20 53 65 74 20 74 68 65 20 56 44 42 45 20  ** Set the VDBE 
1da30 63 6f 76 65 72 61 67 65 20 63 61 6c 6c 62 61 63  coverage callbac
1da40 6b 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 78 43  k function to xC
1da50 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 63 6f 6e  allback with con
1da60 74 65 78 74 20 0a 20 20 20 20 2a 2a 20 70 6f 69  text .    ** poi
1da70 6e 74 65 72 20 70 74 72 2e 0a 20 20 20 20 2a 2f  nter ptr..    */
1da80 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1da90 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43  _TESTCTRL_VDBE_C
1daa0 4f 56 45 52 41 47 45 3a 20 7b 0a 23 69 66 64 65  OVERAGE: {.#ifde
1dab0 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f  f SQLITE_VDBE_CO
1dac0 56 45 52 41 47 45 0a 20 20 20 20 20 20 74 79 70  VERAGE.      typ
1dad0 65 64 65 66 20 76 6f 69 64 20 28 2a 62 72 61 6e  edef void (*bran
1dae0 63 68 5f 63 61 6c 6c 62 61 63 6b 29 28 76 6f 69  ch_callback)(voi
1daf0 64 2a 2c 69 6e 74 2c 75 38 2c 75 38 29 3b 0a 20  d*,int,u8,u8);. 
1db00 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1db10 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62 65 42 72  alConfig.xVdbeBr
1db20 61 6e 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70  anch = va_arg(ap
1db30 2c 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b  ,branch_callback
1db40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1db50 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64  GlobalConfig.pVd
1db60 62 65 42 72 61 6e 63 68 41 72 67 20 3d 20 76 61  beBranchArg = va
1db70 5f 61 72 67 28 61 70 2c 76 6f 69 64 2a 29 3b 0a  _arg(ap,void*);.
1db80 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
1db90 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1dba0 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1dbb0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1dbc0 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f  TESTCTRL_SORTER_
1dbd0 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d 61 78 29 3b  MMAP, db, nMax);
1dbe0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1dbf0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52  ITE_TESTCTRL_SOR
1dc00 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20  TER_MMAP: {.    
1dc10 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1dc20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1dc30 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  e3*);.      db->
1dc40 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d  nMaxSorterMmap =
1dc50 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1dc60 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1dc70 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
1dc80 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1dc90 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1dca0 54 52 4c 5f 49 53 49 4e 49 54 29 3b 0a 20 20 20  TRL_ISINIT);.   
1dcb0 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74 75 72   **.    ** Retur
1dcc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 53  n SQLITE_OK if S
1dcd0 51 4c 69 74 65 20 68 61 73 20 62 65 65 6e 20 69  QLite has been i
1dce0 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 53  nitialized and S
1dcf0 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 0a 20  QLITE_ERROR if. 
1dd00 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20 20 2a     ** not..    *
1dd10 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1dd20 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49  E_TESTCTRL_ISINI
1dd30 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  T: {.      if( s
1dd40 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1dd50 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 29 20 72  ig.isInit==0 ) r
1dd60 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1dd70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1dd80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73 71     }..    /*  sq
1dd90 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1dda0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1ddb0 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64 62 2c  RL_IMPOSTER, db,
1ddc0 20 64 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c 20   dbName, onOff, 
1ddd0 74 6e 75 6d 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  tnum);.    **.  
1dde0 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 63    ** This test c
1ddf0 6f 6e 74 72 6f 6c 20 69 73 20 75 73 65 64 20 74  ontrol is used t
1de00 6f 20 63 72 65 61 74 65 20 69 6d 70 6f 73 74 65  o create imposte
1de10 72 20 74 61 62 6c 65 73 2e 20 20 22 64 62 22 20  r tables.  "db" 
1de20 69 73 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 20  is a pointer.   
1de30 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62   ** to the datab
1de40 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ase connection. 
1de50 20 64 62 4e 61 6d 65 20 69 73 20 74 68 65 20 64   dbName is the d
1de60 61 74 61 62 61 73 65 20 6e 61 6d 65 20 28 65 78  atabase name (ex
1de70 3a 20 22 6d 61 69 6e 22 20 6f 72 0a 20 20 20 20  : "main" or.    
1de80 2a 2a 20 22 74 65 6d 70 22 29 20 77 68 69 63 68  ** "temp") which
1de90 20 77 69 6c 6c 20 72 65 63 65 69 76 65 20 74 68   will receive th
1dea0 65 20 69 6d 70 6f 73 74 65 72 2e 20 20 22 6f 6e  e imposter.  "on
1deb0 4f 66 66 22 20 74 75 72 6e 73 20 69 6d 70 6f 73  Off" turns impos
1dec0 74 65 72 20 6d 6f 64 65 20 6f 6e 0a 20 20 20 20  ter mode on.    
1ded0 2a 2a 20 6f 72 20 6f 66 66 2e 20 20 22 74 6e 75  ** or off.  "tnu
1dee0 6d 22 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  m" is the root p
1def0 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1df00 65 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 69  e to which the i
1df10 6d 70 6f 73 74 65 72 0a 20 20 20 20 2a 2a 20 74  mposter.    ** t
1df20 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 6e  able should conn
1df30 65 63 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ect..    **.    
1df40 2a 2a 20 45 6e 61 62 6c 65 20 69 6d 70 6f 73 74  ** Enable impost
1df50 65 72 20 6d 6f 64 65 20 6f 6e 6c 79 20 77 68 65  er mode only whe
1df60 6e 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73  n the schema has
1df70 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 61   already been pa
1df80 72 73 65 64 2e 20 20 54 68 65 6e 0a 20 20 20 20  rsed.  Then.    
1df90 2a 2a 20 72 75 6e 20 61 20 73 69 6e 67 6c 65 20  ** run a single 
1dfa0 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
1dfb0 74 65 6d 65 6e 74 20 74 6f 20 63 6f 6e 73 74 72  tement to constr
1dfc0 75 63 74 20 74 68 65 20 69 6d 70 6f 73 74 65 72  uct the imposter
1dfd0 20 74 61 62 6c 65 20 69 6e 0a 20 20 20 20 2a 2a   table in.    **
1dfe0 20 74 68 65 20 70 61 72 73 65 64 20 73 63 68 65   the parsed sche
1dff0 6d 61 2e 20 20 54 68 65 6e 20 74 75 72 6e 20 69  ma.  Then turn i
1e000 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20 62 61 63  mposter mode bac
1e010 6b 20 6f 66 66 20 61 67 61 69 6e 2e 0a 20 20 20  k off again..   
1e020 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e   **.    ** If on
1e030 4f 66 66 3d 3d 30 20 61 6e 64 20 74 6e 75 6d 3e  Off==0 and tnum>
1e040 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  0 then reset the
1e050 20 73 63 68 65 6d 61 20 66 6f 72 20 61 6c 6c 20   schema for all 
1e060 64 61 74 61 62 61 73 65 73 2c 20 63 61 75 73 69  databases, causi
1e070 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 63  ng.    ** the sc
1e080 68 65 6d 61 20 74 6f 20 62 65 20 72 65 70 61 72  hema to be repar
1e090 73 65 64 20 74 68 65 20 6e 65 78 74 20 74 69 6d  sed the next tim
1e0a0 65 20 69 74 20 69 73 20 6e 65 65 64 65 64 2e 20  e it is needed. 
1e0b0 20 54 68 69 73 20 68 61 73 20 74 68 65 0a 20 20   This has the.  
1e0c0 20 20 2a 2a 20 65 66 66 65 63 74 20 6f 66 20 65    ** effect of e
1e0d0 72 61 73 69 6e 67 20 61 6c 6c 20 69 6d 70 6f 73  rasing all impos
1e0e0 74 65 72 20 74 61 62 6c 65 73 2e 0a 20 20 20 20  ter tables..    
1e0f0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1e100 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
1e110 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  STER: {.      sq
1e120 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
1e130 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
1e140 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1e150 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
1e160 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 64 62  mutex);.      db
1e170 2d 3e 69 6e 69 74 2e 69 44 62 20 3d 20 73 71 6c  ->init.iDb = sql
1e180 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
1e190 62 2c 20 76 61 5f 61 72 67 28 61 70 2c 63 6f 6e  b, va_arg(ap,con
1e1a0 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20 20  st char*));.    
1e1b0 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20    db->init.busy 
1e1c0 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73  = db->init.impos
1e1d0 74 65 72 54 61 62 6c 65 20 3d 20 76 61 5f 61 72  terTable = va_ar
1e1e0 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20  g(ap,int);.     
1e1f0 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
1e200 6d 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  m = va_arg(ap,in
1e210 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  t);.      if( db
1e220 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 26  ->init.busy==0 &
1e230 26 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  & db->init.newTn
1e240 75 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  um>0 ){.        
1e250 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53  sqlite3ResetAllS
1e260 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69  chemasOfConnecti
1e270 6f 6e 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  on(db);.      }.
1e280 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
1e290 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
1e2a0 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tex);.      brea
1e2b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
1e2c0 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69  a_end(ap);.#endi
1e2d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1e2e0 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f  _BUILTIN_TEST */
1e2f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e300 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
1e310 20 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65   utility routine
1e320 2c 20 75 73 65 66 75 6c 20 74 6f 20 56 46 53 20  , useful to VFS 
1e330 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c  implementations,
1e340 20 74 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20   that checks.** 
1e350 74 6f 20 73 65 65 20 69 66 20 61 20 64 61 74 61  to see if a data
1e360 62 61 73 65 20 66 69 6c 65 20 77 61 73 20 61 20  base file was a 
1e370 55 52 49 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  URI that contain
1e380 65 64 20 61 20 73 70 65 63 69 66 69 63 20 71 75  ed a specific qu
1e390 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65  ery .** paramete
1e3a0 72 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f 62 74  r, and if so obt
1e3b0 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  ains the value o
1e3c0 66 20 74 68 65 20 71 75 65 72 79 20 70 61 72 61  f the query para
1e3d0 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  meter..**.** The
1e3e0 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d   zFilename argum
1e3f0 65 6e 74 20 69 73 20 74 68 65 20 66 69 6c 65 6e  ent is the filen
1e400 61 6d 65 20 70 6f 69 6e 74 65 72 20 70 61 73 73  ame pointer pass
1e410 65 64 20 69 6e 74 6f 20 74 68 65 20 78 4f 70 65  ed into the xOpe
1e420 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66  n().** method of
1e430 20 61 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74   a VFS implement
1e440 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72  ation.  The zPar
1e450 61 6d 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  am argument is t
1e460 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a  he name of the.*
1e470 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  * query paramete
1e480 72 20 77 65 20 73 65 65 6b 2e 20 20 54 68 69 73  r we seek.  This
1e490 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1e4a0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1e4b0 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61  e zParam.** para
1e4c0 6d 65 74 65 72 20 69 66 20 69 74 20 65 78 69 73  meter if it exis
1e4d0 74 73 2e 20 20 49 66 20 74 68 65 20 70 61 72 61  ts.  If the para
1e4e0 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 65  meter does not e
1e4f0 78 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69  xist, this routi
1e500 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  ne.** returns a 
1e510 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  NULL pointer..*/
1e520 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
1e530 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
1e540 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
1e550 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20  Filename, const 
1e560 63 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20  char *zParam){. 
1e570 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d   if( zFilename==
1e580 30 20 7c 7c 20 7a 50 61 72 61 6d 3d 3d 30 20 29  0 || zParam==0 )
1e590 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46 69   return 0;.  zFi
1e5a0 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65  lename += sqlite
1e5b0 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
1e5c0 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c  ame) + 1;.  whil
1e5d0 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  e( zFilename[0] 
1e5e0 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 73  ){.    int x = s
1e5f0 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
1e600 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46   zParam);.    zF
1e610 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74  ilename += sqlit
1e620 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
1e630 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 69  name) + 1;.    i
1e640 66 28 20 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( x==0 ) return
1e650 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20   zFilename;.    
1e660 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c  zFilename += sql
1e670 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
1e680 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d  lename) + 1;.  }
1e690 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1e6a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62  /*.** Return a b
1e6b0 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f 72  oolean value for
1e6c0 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65 74   a query paramet
1e6d0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1e6e0 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 63  e3_uri_boolean(c
1e6f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1e700 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  name, const char
1e710 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62 44   *zParam, int bD
1e720 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  flt){.  const ch
1e730 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ar *z = sqlite3_
1e740 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46  uri_parameter(zF
1e750 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29  ilename, zParam)
1e760 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62 44 66 6c  ;.  bDflt = bDfl
1e770 74 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a  t!=0;.  return z
1e780 20 3f 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f   ? sqlite3GetBoo
1e790 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20 3a  lean(z, bDflt) :
1e7a0 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   bDflt;.}../*.**
1e7b0 20 52 65 74 75 72 6e 20 61 20 36 34 2d 62 69 74   Return a 64-bit
1e7c0 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66   integer value f
1e7d0 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d  or a query param
1e7e0 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  eter..*/.sqlite3
1e7f0 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 75  _int64 sqlite3_u
1e800 72 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e 73  ri_int64(.  cons
1e810 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1e820 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d  e,    /* Filenam
1e830 65 20 61 73 20 70 61 73 73 65 64 20 74 6f 20 78  e as passed to x
1e840 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  Open */.  const 
1e850 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20  char *zParam,   
1e860 20 20 20 20 2f 2a 20 55 52 49 20 70 61 72 61 6d      /* URI param
1e870 65 74 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a 20  eter sought */. 
1e880 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 62   sqlite3_int64 b
1e890 44 66 6c 74 20 20 20 20 20 20 20 2f 2a 20 72 65  Dflt       /* re
1e8a0 74 75 72 6e 20 69 66 20 70 61 72 61 6d 65 74 65  turn if paramete
1e8b0 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f 0a  r is missing */.
1e8c0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1e8d0 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69  *z = sqlite3_uri
1e8e0 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65  _parameter(zFile
1e8f0 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20  name, zParam);. 
1e900 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76   sqlite3_int64 v
1e910 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 73 71 6c  ;.  if( z && sql
1e920 69 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36  ite3DecOrHexToI6
1e930 34 28 7a 2c 20 26 76 29 3d 3d 53 51 4c 49 54 45  4(z, &v)==SQLITE
1e940 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66 6c 74  _OK ){.    bDflt
1e950 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = v;.  }.  retu
1e960 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a  rn bDflt;.}../*.
1e970 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 42 74  ** Return the Bt
1e980 72 65 65 20 70 6f 69 6e 74 65 72 20 69 64 65 6e  ree pointer iden
1e990 74 69 66 69 65 64 20 62 79 20 7a 44 62 4e 61 6d  tified by zDbNam
1e9a0 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
1e9b0 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
1e9c0 0a 42 74 72 65 65 20 2a 73 71 6c 69 74 65 33 44  .Btree *sqlite3D
1e9d0 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 73 71 6c  bNameToBtree(sql
1e9e0 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
1e9f0 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
1ea00 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1ea10 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
1ea20 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  ++){.    if( db-
1ea30 3e 61 44 62 5b 69 5d 2e 70 42 74 0a 20 20 20 20  >aDb[i].pBt.    
1ea40 20 26 26 20 28 7a 44 62 4e 61 6d 65 3d 3d 30 20   && (zDbName==0 
1ea50 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
1ea60 70 28 7a 44 62 4e 61 6d 65 2c 20 64 62 2d 3e 61  p(zDbName, db->a
1ea70 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 29  Db[i].zName)==0)
1ea80 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1ea90 74 75 72 6e 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  turn db->aDb[i].
1eaa0 70 42 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pBt;.    }.  }. 
1eab0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1eac0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
1ead0 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  ilename of the d
1eae0 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
1eaf0 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61  ed with a databa
1eb00 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
1eb10 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
1eb20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65  *sqlite3_db_file
1eb30 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62  name(sqlite3 *db
1eb40 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
1eb50 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20  bName){.  Btree 
1eb60 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53 51 4c  *pBt;.#ifdef SQL
1eb70 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
1eb80 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
1eb90 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
1eba0 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
1ebb0 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
1ebc0 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
1ebd0 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
1ebe0 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62   pBt = sqlite3Db
1ebf0 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20  NameToBtree(db, 
1ec00 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  zDbName);.  retu
1ec10 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33  rn pBt ? sqlite3
1ec20 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
1ec30 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  (pBt) : 0;.}../*
1ec40 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
1ec50 64 61 74 61 62 61 73 65 20 69 73 20 72 65 61 64  database is read
1ec60 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20 72 65  -only or 0 if re
1ec70 61 64 2f 77 72 69 74 65 2e 20 20 52 65 74 75 72  ad/write.  Retur
1ec80 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73 75  n -1 if.** no su
1ec90 63 68 20 64 61 74 61 62 61 73 65 20 65 78 69 73  ch database exis
1eca0 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
1ecb0 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 73  e3_db_readonly(s
1ecc0 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
1ecd0 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29  t char *zDbName)
1ece0 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a  {.  Btree *pBt;.
1ecf0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1ed00 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
1ed10 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
1ed20 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
1ed30 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
1ed40 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
1ed50 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1ed60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 20   }.#endif.  pBt 
1ed70 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54  = sqlite3DbNameT
1ed80 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61  oBtree(db, zDbNa
1ed90 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  me);.  return pB
1eda0 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65  t ? sqlite3Btree
1edb0 49 73 52 65 61 64 6f 6e 6c 79 28 70 42 74 29 20  IsReadonly(pBt) 
1edc0 3a 20 2d 31 3b 0a 7d 0a                          : -1;.}.