/ Hex Artifact Content
Login

Artifact 68d3bc675eda6abcb9b7c21dad2a0a9cfaef3f8e46a6d910f30a36f73ea798d4:


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 53   SQLITE_ENABLE_S
0290: 51 4c 52 52 0a 23 20 69 6e 63 6c 75 64 65 20 22  QLRR.# include "
02a0: 73 71 6c 72 72 2e 68 22 0a 23 65 6e 64 69 66 20  sqlrr.h".#endif 
02b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
02c0: 4e 41 42 4c 45 5f 46 54 53 33 0a 23 20 69 6e 63  NABLE_FTS3.# inc
02d0: 6c 75 64 65 20 22 66 74 73 33 2e 68 22 0a 23 65  lude "fts3.h".#e
02e0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
02f0: 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a  TE_ENABLE_RTREE.
0300: 23 20 69 6e 63 6c 75 64 65 20 22 72 74 72 65 65  # include "rtree
0310: 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  .h".#endif.#if d
0320: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
0330: 41 42 4c 45 5f 49 43 55 29 20 7c 7c 20 64 65 66  ABLE_ICU) || def
0340: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
0350: 4c 45 5f 49 43 55 5f 43 4f 4c 4c 41 54 49 4f 4e  LE_ICU_COLLATION
0360: 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 22 73 71  S).# include "sq
0370: 6c 69 74 65 69 63 75 2e 68 22 0a 23 65 6e 64 69  liteicu.h".#endi
0380: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
0390: 45 4e 41 42 4c 45 5f 4a 53 4f 4e 31 0a 69 6e 74  ENABLE_JSON1.int
03a0: 20 73 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69   sqlite3Json1Ini
03b0: 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 23 65 6e  t(sqlite3*);.#en
03c0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
03d0: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 56 54 41  E_ENABLE_STMTVTA
03e0: 42 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 74 6d  B.int sqlite3Stm
03f0: 74 56 74 61 62 49 6e 69 74 28 73 71 6c 69 74 65  tVtabInit(sqlite
0400: 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  3*);.#endif.#ifd
0410: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0420: 5f 46 54 53 35 0a 69 6e 74 20 73 71 6c 69 74 65  _FTS5.int sqlite
0430: 33 46 74 73 35 49 6e 69 74 28 73 71 6c 69 74 65  3Fts5Init(sqlite
0440: 33 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  3*);.#endif..#if
0450: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0460: 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d 50 4c  GAMATION./* IMPL
0470: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
0480: 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54 68 65  -46656-45156 The
0490: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
04a0: 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61  [] string consta
04b0: 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  nt.** contains t
04c0: 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c 49 54  he text of SQLIT
04d0: 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 2e  E_VERSION macro.
04e0: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
04f0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b  sqlite3_version[
0500: 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ] = SQLITE_VERSI
0510: 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49  ON;.#endif../* I
0520: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
0530: 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37 35 20  : R-53536-42575 
0540: 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  The sqlite3_libv
0550: 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f  ersion() functio
0560: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 20 70  n returns.** a p
0570: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f  ointer to the to
0580: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72   the sqlite3_ver
0590: 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f  sion[] string co
05a0: 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f 6e 73  nstant. .*/.cons
05b0: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
05c0: 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  libversion(void)
05d0: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
05e0: 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f 2a 20  _version; }../* 
05f0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
0600: 46 3a 20 52 2d 32 35 30 36 33 2d 32 33 32 38 36  F: R-25063-23286
0610: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73 6f 75   The sqlite3_sou
0620: 72 63 65 69 64 28 29 20 66 75 6e 63 74 69 6f 6e  rceid() function
0630: 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 70 6f   returns a.** po
0640: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
0650: 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f 73 65  g constant whose
0660: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
0670: 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53 51 4c  me as the.** SQL
0680: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20 43 20  ITE_SOURCE_ID C 
0690: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  preprocessor mac
06a0: 72 6f 2e 20 45 78 63 65 70 74 20 69 66 20 53 51  ro. Except if SQ
06b0: 4c 69 74 65 20 69 73 20 62 75 69 6c 74 20 75 73  Lite is built us
06c0: 69 6e 67 0a 2a 2a 20 61 6e 20 65 64 69 74 65 64  ing.** an edited
06d0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 61 6d 61   copy of the ama
06e0: 6c 67 61 6d 61 74 69 6f 6e 2c 20 74 68 65 6e 20  lgamation, then 
06f0: 74 68 65 20 6c 61 73 74 20 66 6f 75 72 20 63 68  the last four ch
0700: 61 72 61 63 74 65 72 73 20 6f 66 0a 2a 2a 20 74  aracters of.** t
0710: 68 65 20 68 61 73 68 20 6d 69 67 68 74 20 62 65  he hash might be
0720: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
0730: 53 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44  SQLITE_SOURCE_ID
0740: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
0750: 2a 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69  *sqlite3_sourcei
0760: 64 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e 20  d(void){ return 
0770: 53 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 44  SQLITE_SOURCE_ID
0780: 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e  ; }../* IMPLEMEN
0790: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 33 35 32  TATION-OF: R-352
07a0: 31 30 2d 36 33 35 30 38 20 54 68 65 20 73 71 6c  10-63508 The sql
07b0: 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f  ite3_libversion_
07c0: 6e 75 6d 62 65 72 28 29 20 66 75 6e 63 74 69 6f  number() functio
07d0: 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20  n.** returns an 
07e0: 69 6e 74 65 67 65 72 20 65 71 75 61 6c 20 74 6f  integer equal to
07f0: 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 5f   SQLITE_VERSION_
0800: 4e 55 4d 42 45 52 2e 0a 2a 2f 0a 69 6e 74 20 73  NUMBER..*/.int s
0810: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
0820: 6e 5f 6e 75 6d 62 65 72 28 76 6f 69 64 29 7b 20  n_number(void){ 
0830: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 56 45  return SQLITE_VE
0840: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3b 20 7d 0a  RSION_NUMBER; }.
0850: 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49  ./* IMPLEMENTATI
0860: 4f 4e 2d 4f 46 3a 20 52 2d 32 30 37 39 30 2d 31  ON-OF: R-20790-1
0870: 34 30 32 35 20 54 68 65 20 73 71 6c 69 74 65 33  4025 The sqlite3
0880: 5f 74 68 72 65 61 64 73 61 66 65 28 29 20 66 75  _threadsafe() fu
0890: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a  nction returns.*
08a0: 2a 20 7a 65 72 6f 20 69 66 20 61 6e 64 20 6f 6e  * zero if and on
08b0: 6c 79 20 69 66 20 53 51 4c 69 74 65 20 77 61 73  ly if SQLite was
08c0: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 6d   compiled with m
08d0: 75 74 65 78 69 6e 67 20 63 6f 64 65 20 6f 6d 69  utexing code omi
08e0: 74 74 65 64 20 64 75 65 20 74 6f 0a 2a 2a 20 74  tted due to.** t
08f0: 68 65 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  he SQLITE_THREAD
0900: 53 41 46 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  SAFE compile-tim
0910: 65 20 6f 70 74 69 6f 6e 20 62 65 69 6e 67 20 73  e option being s
0920: 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20  et to 0..*/.int 
0930: 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61  sqlite3_threadsa
0940: 66 65 28 76 6f 69 64 29 7b 20 72 65 74 75 72 6e  fe(void){ return
0950: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
0960: 46 45 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  FE; }../*.** Whe
0970: 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20  n compiling the 
0980: 74 65 73 74 20 66 69 78 74 75 72 65 20 6f 72 20  test fixture or 
0990: 77 69 74 68 20 64 65 62 75 67 67 69 6e 67 20 65  with debugging e
09a0: 6e 61 62 6c 65 64 20 28 6f 6e 20 57 69 6e 33 32  nabled (on Win32
09b0: 29 2c 0a 2a 2a 20 74 68 69 73 20 76 61 72 69 61  ),.** this varia
09c0: 62 6c 65 20 62 65 69 6e 67 20 73 65 74 20 74 6f  ble being set to
09d0: 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69 6c 6c 20 63   non-zero will c
09e0: 61 75 73 65 20 4f 53 54 52 41 43 45 20 6d 61 63  ause OSTRACE mac
09f0: 72 6f 73 20 74 6f 20 65 6d 69 74 0a 2a 2a 20 65  ros to emit.** e
0a00: 78 74 72 61 20 64 69 61 67 6e 6f 73 74 69 63 20  xtra diagnostic 
0a10: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
0a20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
0a30: 56 45 5f 4f 53 5f 54 52 41 43 45 0a 23 20 69 66  VE_OS_TRACE.# if
0a40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  ndef SQLITE_DEBU
0a50: 47 5f 4f 53 5f 54 52 41 43 45 0a 23 20 20 20 64  G_OS_TRACE.#   d
0a60: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 42  efine SQLITE_DEB
0a70: 55 47 5f 4f 53 5f 54 52 41 43 45 20 30 0a 23 20  UG_OS_TRACE 0.# 
0a80: 65 6e 64 69 66 0a 20 20 69 6e 74 20 73 71 6c 69  endif.  int sqli
0a90: 74 65 33 4f 53 54 72 61 63 65 20 3d 20 53 51 4c  te3OSTrace = SQL
0aa0: 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41  ITE_DEBUG_OS_TRA
0ab0: 43 45 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  CE;.#endif..#if 
0ac0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
0ad0: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
0ae0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
0af0: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a  ABLE_IOTRACE)./*
0b00: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
0b10: 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f  wing function po
0b20: 69 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c  inter is not NUL
0b30: 4c 20 61 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49  L and if.** SQLI
0b40: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
0b50: 45 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  E is enabled, th
0b60: 65 6e 20 6d 65 73 73 61 67 65 73 20 64 65 73 63  en messages desc
0b70: 72 69 62 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63  ribing.** I/O ac
0b80: 74 69 76 65 20 61 72 65 20 77 72 69 74 74 65 6e  tive are written
0b90: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
0ba0: 74 69 6f 6e 2e 20 20 54 68 65 73 65 20 6d 65 73  tion.  These mes
0bb0: 73 61 67 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74  sages.** are int
0bc0: 65 6e 64 65 64 20 66 6f 72 20 64 65 62 75 67 67  ended for debugg
0bd0: 69 6e 67 20 61 63 74 69 76 69 74 79 20 6f 6e 6c  ing activity onl
0be0: 79 2e 0a 2a 2f 0a 53 51 4c 49 54 45 5f 41 50 49  y..*/.SQLITE_API
0bf0: 20 76 6f 69 64 20 28 53 51 4c 49 54 45 5f 43 44   void (SQLITE_CD
0c00: 45 43 4c 20 2a 73 71 6c 69 74 65 33 49 6f 54 72  ECL *sqlite3IoTr
0c10: 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  ace)(const char*
0c20: 2c 20 2e 2e 2e 29 20 3d 20 30 3b 0a 23 65 6e 64  , ...) = 0;.#end
0c30: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
0c40: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
0c50: 6c 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74  l variable point
0c60: 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 77 68  s to a string wh
0c70: 69 63 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e 61  ich is the.** na
0c80: 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72  me of a director
0c90: 79 2c 20 74 68 65 6e 20 74 68 61 74 20 64 69 72  y, then that dir
0ca0: 65 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20 75  ectory will be u
0cb0: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a 20  sed to store.** 
0cc0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
0cd0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
0ce0: 74 68 65 20 22 50 52 41 47 4d 41 20 74 65 6d 70  the "PRAGMA temp
0cf0: 5f 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79  _store_directory
0d00: 22 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  " SQL command..*
0d10: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
0d20: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d  temp_directory =
0d30: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68   0;../*.** If th
0d40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
0d50: 61 6c 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e  al variable poin
0d60: 74 73 20 74 6f 20 61 20 73 74 72 69 6e 67 20 77  ts to a string w
0d70: 68 69 63 68 20 69 73 20 74 68 65 0a 2a 2a 20 6e  hich is the.** n
0d80: 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f  ame of a directo
0d90: 72 79 2c 20 74 68 65 6e 20 74 68 61 74 20 64 69  ry, then that di
0da0: 72 65 63 74 6f 72 79 20 77 69 6c 6c 20 62 65 20  rectory will be 
0db0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
0dc0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69   all database fi
0dd0: 6c 65 73 20 73 70 65 63 69 66 69 65 64 20 77 69  les specified wi
0de0: 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  th a relative pa
0df0: 74 68 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 53 65  thname..**.** Se
0e00: 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47  e also the "PRAG
0e10: 4d 41 20 64 61 74 61 5f 73 74 6f 72 65 5f 64 69  MA data_store_di
0e20: 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d  rectory" SQL com
0e30: 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  mand..*/.char *s
0e40: 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
0e50: 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  ctory = 0;../*.*
0e60: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 53 51 4c  * Initialize SQL
0e70: 69 74 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  ite.  .**.** Thi
0e80: 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
0e90: 65 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 69 74  e called to init
0ea0: 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
0eb0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 0a 2a 2a  y allocation,.**
0ec0: 20 56 46 53 2c 20 61 6e 64 20 6d 75 74 65 78 20   VFS, and mutex 
0ed0: 73 75 62 73 79 73 74 65 6d 73 20 70 72 69 6f 72  subsystems prior
0ee0: 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 73 65   to doing any se
0ef0: 72 69 6f 75 73 20 77 6f 72 6b 20 77 69 74 68 0a  rious work with.
0f00: 2a 2a 20 53 51 4c 69 74 65 2e 20 20 42 75 74 20  ** SQLite.  But 
0f10: 61 73 20 6c 6f 6e 67 20 61 73 20 79 6f 75 20 64  as long as you d
0f20: 6f 20 6e 6f 74 20 63 6f 6d 70 69 6c 65 20 77 69  o not compile wi
0f30: 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  th SQLITE_OMIT_A
0f40: 55 54 4f 49 4e 49 54 0a 2a 2a 20 74 68 69 73 20  UTOINIT.** this 
0f50: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
0f60: 63 61 6c 6c 65 64 20 61 75 74 6f 6d 61 74 69 63  called automatic
0f70: 61 6c 6c 79 20 62 79 20 6b 65 79 20 72 6f 75 74  ally by key rout
0f80: 69 6e 65 73 20 73 75 63 68 20 61 73 0a 2a 2a 20  ines such as.** 
0f90: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 20  sqlite3_open(). 
0fa0: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75   .**.** This rou
0fb0: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
0fc0: 65 78 63 65 70 74 20 6f 6e 20 69 74 73 20 76 65  except on its ve
0fd0: 72 79 20 66 69 72 73 74 20 63 61 6c 6c 20 66 6f  ry first call fo
0fe0: 72 20 74 68 65 20 70 72 6f 63 65 73 73 2c 0a 2a  r the process,.*
0ff0: 2a 20 6f 72 20 66 6f 72 20 74 68 65 20 66 69 72  * or for the fir
1000: 73 74 20 63 61 6c 6c 20 61 66 74 65 72 20 61 20  st call after a 
1010: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
1020: 73 68 75 74 64 6f 77 6e 2e 0a 2a 2a 0a 2a 2a 20  shutdown..**.** 
1030: 54 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  The first thread
1040: 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 72 6f   to call this ro
1050: 75 74 69 6e 65 20 72 75 6e 73 20 74 68 65 20 69  utine runs the i
1060: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 6f  nitialization to
1070: 0a 2a 2a 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20  .** completion. 
1080: 20 49 66 20 73 75 62 73 65 71 75 65 6e 74 20 74   If subsequent t
1090: 68 72 65 61 64 73 20 63 61 6c 6c 20 74 68 69 73  hreads call this
10a0: 20 72 6f 75 74 69 6e 65 20 62 65 66 6f 72 65 20   routine before 
10b0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 68 72  the first.** thr
10c0: 65 61 64 20 68 61 73 20 66 69 6e 69 73 68 65 64  ead has finished
10d0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
10e0: 69 6f 6e 20 70 72 6f 63 65 73 73 2c 20 74 68 65  ion process, the
10f0: 6e 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74  n the subsequent
1100: 0a 2a 2a 20 74 68 72 65 61 64 73 20 6d 75 73 74  .** threads must
1110: 20 62 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65   block until the
1120: 20 66 69 72 73 74 20 74 68 72 65 61 64 20 66 69   first thread fi
1130: 6e 69 73 68 65 73 20 77 69 74 68 20 74 68 65 20  nishes with the 
1140: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a  initialization..
1150: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
1160: 74 68 72 65 61 64 20 6d 69 67 68 74 20 63 61 6c  thread might cal
1170: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
1180: 65 63 75 72 73 69 76 65 6c 79 2e 20 20 52 65 63  ecursively.  Rec
1190: 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 73 20  ursive.** calls 
11a0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
11b0: 73 68 6f 75 6c 64 20 6e 6f 74 20 62 6c 6f 63 6b  should not block
11c0: 2c 20 6f 66 20 63 6f 75 72 73 65 2e 20 20 4f 74  , of course.  Ot
11d0: 68 65 72 77 69 73 65 20 74 68 65 0a 2a 2a 20 69  herwise the.** i
11e0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72  nitialization pr
11f0: 6f 63 65 73 73 20 77 6f 75 6c 64 20 6e 65 76 65  ocess would neve
1200: 72 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2a 0a 2a  r complete..**.*
1210: 2a 20 4c 65 74 20 58 20 62 65 20 74 68 65 20 66  * Let X be the f
1220: 69 72 73 74 20 74 68 72 65 61 64 20 74 6f 20 65  irst thread to e
1230: 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  nter this routin
1240: 65 2e 20 20 4c 65 74 20 59 20 62 65 20 73 6f 6d  e.  Let Y be som
1250: 65 20 6f 74 68 65 72 0a 2a 2a 20 74 68 72 65 61  e other.** threa
1260: 64 2e 20 20 54 68 65 6e 20 77 68 69 6c 65 20 74  d.  Then while t
1270: 68 65 20 69 6e 69 74 69 61 6c 20 69 6e 76 6f 63  he initial invoc
1280: 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 72 6f  ation of this ro
1290: 75 74 69 6e 65 20 62 79 20 58 20 69 73 0a 2a 2a  utine by X is.**
12a0: 20 69 6e 63 6f 6d 70 6c 65 74 65 2c 20 69 74 20   incomplete, it 
12b0: 69 73 20 72 65 71 75 69 72 65 64 20 74 68 61 74  is required that
12c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 61  :.**.**    *  Ca
12d0: 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74  lls to this rout
12e0: 69 6e 65 20 66 72 6f 6d 20 59 20 6d 75 73 74 20  ine from Y must 
12f0: 62 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20  block until the 
1300: 6f 75 74 65 72 2d 6d 6f 73 74 0a 2a 2a 20 20 20  outer-most.**   
1310: 20 20 20 20 63 61 6c 6c 20 62 79 20 58 20 63 6f      call by X co
1320: 6d 70 6c 65 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  mpletes..**.**  
1330: 20 20 2a 20 20 52 65 63 75 72 73 69 76 65 20 63    *  Recursive c
1340: 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75  alls to this rou
1350: 74 69 6e 65 20 66 72 6f 6d 20 74 68 72 65 61 64  tine from thread
1360: 20 58 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69   X return immedi
1370: 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20 77  ately.**       w
1380: 69 74 68 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e  ithout blocking.
1390: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
13a0: 69 6e 69 74 69 61 6c 69 7a 65 28 76 6f 69 64 29  initialize(void)
13b0: 7b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  {.  MUTEX_LOGIC(
13c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
13d0: 70 4d 61 73 74 65 72 3b 20 29 20 20 20 20 20 20  pMaster; )      
13e0: 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73 74 61   /* The main sta
13f0: 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 69  tic mutex */.  i
1400: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1430: 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 23 69  esult code */.#i
1440: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52  fdef SQLITE_EXTR
1450: 41 5f 49 4e 49 54 0a 20 20 69 6e 74 20 62 52 75  A_INIT.  int bRu
1460: 6e 45 78 74 72 61 49 6e 69 74 20 3d 20 30 3b 20  nExtraInit = 0; 
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 69        /* Extra i
1490: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6e 65  nitialization ne
14a0: 65 64 65 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  eded */.#endif..
14b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
14c0: 49 54 5f 57 53 44 0a 20 20 72 63 20 3d 20 73 71  IT_WSD.  rc = sq
14d0: 6c 69 74 65 33 5f 77 73 64 5f 69 6e 69 74 28 34  lite3_wsd_init(4
14e0: 30 39 36 2c 20 32 34 29 3b 0a 20 20 69 66 28 20  096, 24);.  if( 
14f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1500: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1510: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1520: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
1530: 67 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73  g assert() fails
1540: 20 6f 6e 20 73 6f 6d 65 20 6f 62 73 63 75 72 65   on some obscure
1550: 20 70 72 6f 63 65 73 73 6f 72 2f 63 6f 6d 70 69   processor/compi
1560: 6c 65 72 0a 20 20 2a 2a 20 63 6f 6d 62 69 6e 61  ler.  ** combina
1570: 74 69 6f 6e 2c 20 74 68 65 20 77 6f 72 6b 2d 61  tion, the work-a
1580: 72 6f 75 6e 64 20 69 73 20 74 6f 20 73 65 74 20  round is to set 
1590: 74 68 65 20 63 6f 72 72 65 63 74 20 70 6f 69 6e  the correct poin
15a0: 74 65 72 0a 20 20 2a 2a 20 73 69 7a 65 20 61 74  ter.  ** size at
15b0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73   compile-time us
15c0: 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 50 54 52  ing -DSQLITE_PTR
15d0: 53 49 5a 45 3d 6e 20 63 6f 6d 70 69 6c 65 2d 74  SIZE=n compile-t
15e0: 69 6d 65 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20  ime option */.  
15f0: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 50  assert( SQLITE_P
1600: 54 52 53 49 5a 45 3d 3d 73 69 7a 65 6f 66 28 63  TRSIZE==sizeof(c
1610: 68 61 72 2a 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  har*) );..  /* I
1620: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
1630: 61 64 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 69  ady completely i
1640: 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e  nitialized, then
1650: 20 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a 20   this call.  ** 
1660: 74 6f 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  to sqlite3_initi
1670: 61 6c 69 7a 65 28 29 20 73 68 6f 75 6c 64 20 62  alize() should b
1680: 65 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20  e a no-op.  But 
1690: 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
16a0: 6f 6e 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  on.  ** must be 
16b0: 63 6f 6d 70 6c 65 74 65 2e 20 20 53 6f 20 69 73  complete.  So is
16c0: 49 6e 69 74 20 6d 75 73 74 20 6e 6f 74 20 62 65  Init must not be
16d0: 20 73 65 74 20 75 6e 74 69 6c 20 74 68 65 20 76   set until the v
16e0: 65 72 79 20 65 6e 64 0a 20 20 2a 2a 20 6f 66 20  ery end.  ** of 
16f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20 20  this routine..  
1700: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
1710: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
1720: 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  nit ) return SQL
1730: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d 61  ITE_OK;..  /* Ma
1740: 6b 65 20 73 75 72 65 20 74 68 65 20 6d 75 74 65  ke sure the mute
1750: 78 20 73 75 62 73 79 73 74 65 6d 20 69 73 20 69  x subsystem is i
1760: 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 49 66 20  nitialized.  If 
1770: 75 6e 61 62 6c 65 20 74 6f 20 0a 20 20 2a 2a 20  unable to .  ** 
1780: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d  initialize the m
1790: 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 2c 20  utex subsystem, 
17a0: 72 65 74 75 72 6e 20 65 61 72 6c 79 20 77 69 74  return early wit
17b0: 68 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 2a  h the error..  *
17c0: 2a 20 49 66 20 74 68 65 20 73 79 73 74 65 6d 20  * If the system 
17d0: 69 73 20 73 6f 20 73 69 63 6b 20 74 68 61 74 20  is so sick that 
17e0: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
17f0: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 75 74 65   allocate a mute
1800: 78 2c 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  x,.  ** there is
1810: 20 6e 6f 74 20 6d 75 63 68 20 53 51 4c 69 74 65   not much SQLite
1820: 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 62 65 20   is going to be 
1830: 61 62 6c 65 20 74 6f 20 64 6f 2e 0a 20 20 2a 2a  able to do..  **
1840: 0a 20 20 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  .  ** The mutex 
1850: 73 75 62 73 79 73 74 65 6d 20 6d 75 73 74 20 74  subsystem must t
1860: 61 6b 65 20 63 61 72 65 20 6f 66 20 73 65 72 69  ake care of seri
1870: 61 6c 69 7a 69 6e 67 20 69 74 73 20 6f 77 6e 0a  alizing its own.
1880: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74    ** initializat
1890: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
18a0: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 49 6e 69   sqlite3MutexIni
18b0: 74 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  t();.  if( rc ) 
18c0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
18d0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
18e0: 6d 61 6c 6c 6f 63 28 29 20 73 79 73 74 65 6d 20  malloc() system 
18f0: 61 6e 64 20 74 68 65 20 72 65 63 75 72 73 69 76  and the recursiv
1900: 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74  e pInitMutex mut
1910: 65 78 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 70  ex..  ** This op
1920: 65 72 61 74 69 6f 6e 20 69 73 20 70 72 6f 74 65  eration is prote
1930: 63 74 65 64 20 62 79 20 74 68 65 20 53 54 41 54  cted by the STAT
1940: 49 43 5f 4d 41 53 54 45 52 20 6d 75 74 65 78 2e  IC_MASTER mutex.
1950: 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a    Note that.  **
1960: 20 4d 75 74 65 78 41 6c 6c 6f 63 28 29 20 69 73   MutexAlloc() is
1970: 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 73 74   called for a st
1980: 61 74 69 63 20 6d 75 74 65 78 20 70 72 69 6f 72  atic mutex prior
1990: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   to initializing
19a0: 20 74 68 65 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   the.  ** malloc
19b0: 20 73 75 62 73 79 73 74 65 6d 20 2d 20 74 68 69   subsystem - thi
19c0: 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 74  s implies that t
19d0: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  he allocation of
19e0: 20 61 20 73 74 61 74 69 63 0a 20 20 2a 2a 20 6d   a static.  ** m
19f0: 75 74 65 78 20 6d 75 73 74 20 6e 6f 74 20 72 65  utex must not re
1a00: 71 75 69 72 65 20 73 75 70 70 6f 72 74 20 66 72  quire support fr
1a10: 6f 6d 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 75  om the malloc su
1a20: 62 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20 20  bsystem..  */.  
1a30: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61  MUTEX_LOGIC( pMa
1a40: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75  ster = sqlite3Mu
1a50: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
1a60: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
1a70: 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65  TER); ).  sqlite
1a80: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
1a90: 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  aster);.  sqlite
1aa0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1ab0: 4d 75 74 65 78 49 6e 69 74 20 3d 20 31 3b 0a 20  MutexInit = 1;. 
1ac0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 47 6c 6f   if( !sqlite3Glo
1ad0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c  balConfig.isMall
1ae0: 6f 63 49 6e 69 74 20 29 7b 0a 20 20 20 20 72 63  ocInit ){.    rc
1af0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
1b00: 49 6e 69 74 28 29 3b 0a 20 20 7d 0a 20 20 69 66  Init();.  }.  if
1b10: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  ){.    sqlite3Gl
1b30: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c  obalConfig.isMal
1b40: 6c 6f 63 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20  locInit = 1;.   
1b50: 20 69 66 28 20 21 73 71 6c 69 74 65 33 47 6c 6f   if( !sqlite3Glo
1b60: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
1b70: 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 73 71  utex ){.      sq
1b80: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1b90: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 0a 20  g.pInitMutex =. 
1ba0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1bb0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
1bc0: 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
1bd0: 56 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  VE);.      if( s
1be0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1bf0: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 26 26  ig.bCoreMutex &&
1c00: 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43   !sqlite3GlobalC
1c10: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1c20: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1c30: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
1c40: 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
1c50: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
1c60: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1c80: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
1c90: 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ex++;.  }.  sqli
1ca0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1cb0: 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pMaster);..  /* 
1cc0: 49 66 20 72 63 20 69 73 20 6e 6f 74 20 53 51 4c  If rc is not SQL
1cd0: 49 54 45 5f 4f 4b 20 61 74 20 74 68 69 73 20 70  ITE_OK at this p
1ce0: 6f 69 6e 74 2c 20 74 68 65 6e 20 65 69 74 68 65  oint, then eithe
1cf0: 72 20 74 68 65 20 6d 61 6c 6c 6f 63 0a 20 20 2a  r the malloc.  *
1d00: 2a 20 73 75 62 73 79 73 74 65 6d 20 63 6f 75 6c  * subsystem coul
1d10: 64 20 6e 6f 74 20 62 65 20 69 6e 69 74 69 61 6c  d not be initial
1d20: 69 7a 65 64 20 6f 72 20 74 68 65 20 73 79 73 74  ized or the syst
1d30: 65 6d 20 66 61 69 6c 65 64 20 74 6f 20 61 6c 6c  em failed to all
1d40: 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70  ocate.  ** the p
1d50: 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65 78 2e  InitMutex mutex.
1d60: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
1d70: 20 69 6e 20 65 69 74 68 65 72 20 63 61 73 65 2e   in either case.
1d80: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21 3d 53    */.  if( rc!=S
1d90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1da0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1db0: 20 20 2f 2a 20 44 6f 20 74 68 65 20 72 65 73 74    /* Do the rest
1dc0: 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
1dd0: 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20 74 68 65  zation under the
1de0: 20 72 65 63 75 72 73 69 76 65 20 6d 75 74 65 78   recursive mutex
1df0: 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 77 65   so.  ** that we
1e00: 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20 74 6f   will be able to
1e10: 20 68 61 6e 64 6c 65 20 72 65 63 75 72 73 69 76   handle recursiv
1e20: 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a 20 20 2a  e calls into.  *
1e30: 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  * sqlite3_initia
1e40: 6c 69 7a 65 28 29 2e 20 20 54 68 65 20 72 65 63  lize().  The rec
1e50: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6e 6f 72  ursive calls nor
1e60: 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68 72 6f 75  mally come throu
1e70: 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  gh.  ** sqlite3_
1e80: 6f 73 5f 69 6e 69 74 28 29 20 77 68 65 6e 20 69  os_init() when i
1e90: 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65  t invokes sqlite
1ea0: 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 29  3_vfs_register()
1eb0: 2c 20 62 75 74 20 6f 74 68 65 72 0a 20 20 2a 2a  , but other.  **
1ec0: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1ed0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 70   might also be p
1ee0: 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  ossible..  **.  
1ef0: 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
1f00: 4e 2d 4f 46 3a 20 52 2d 30 30 31 34 30 2d 33 37  N-OF: R-00140-37
1f10: 34 34 35 20 53 51 4c 69 74 65 20 61 75 74 6f 6d  445 SQLite autom
1f20: 61 74 69 63 61 6c 6c 79 20 73 65 72 69 61 6c 69  atically seriali
1f30: 7a 65 73 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 74  zes calls.  ** t
1f40: 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65 74 68  o the xInit meth
1f50: 6f 64 2c 20 73 6f 20 74 68 65 20 78 49 6e 69 74  od, so the xInit
1f60: 20 6d 65 74 68 6f 64 20 6e 65 65 64 20 6e 6f 74   method need not
1f70: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2e 0a   be threadsafe..
1f80: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f    **.  ** The fo
1f90: 6c 6c 6f 77 69 6e 67 20 6d 75 74 65 78 20 69 73  llowing mutex is
1fa0: 20 77 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73   what serializes
1fb0: 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 61   access to the a
1fc0: 70 70 64 65 66 20 70 63 61 63 68 65 20 78 49 6e  ppdef pcache xIn
1fd0: 69 74 0a 20 20 2a 2a 20 6d 65 74 68 6f 64 73 2e  it.  ** methods.
1fe0: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 70 63    The sqlite3_pc
1ff0: 61 63 68 65 5f 6d 65 74 68 6f 64 73 2e 78 49 6e  ache_methods.xIn
2000: 69 74 28 29 20 61 6c 6c 20 69 73 20 65 6d 62 65  it() all is embe
2010: 64 64 65 64 20 69 6e 20 74 68 65 0a 20 20 2a 2a  dded in the.  **
2020: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2030: 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65  PcacheInitialize
2040: 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ()..  */.  sqlit
2050: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
2060: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2070: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a  ig.pInitMutex);.
2080: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2090: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
20a0: 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33 47 6c  ==0 && sqlite3Gl
20b0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
20c0: 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20  gress==0 ){.    
20d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
20e0: 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d  fig.inProgress =
20f0: 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   1;.#ifdef SQLIT
2100: 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a  E_ENABLE_SQLLOG.
2110: 20 20 20 20 7b 0a 20 20 20 20 20 20 65 78 74 65      {.      exte
2120: 72 6e 20 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  rn void sqlite3_
2130: 69 6e 69 74 5f 73 71 6c 6c 6f 67 28 76 6f 69 64  init_sqllog(void
2140: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2150: 5f 69 6e 69 74 5f 73 71 6c 6c 6f 67 28 29 3b 0a  _init_sqllog();.
2160: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2170: 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74 65 33   memset(&sqlite3
2180: 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73  BuiltinFunctions
2190: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
21a0: 74 65 33 42 75 69 6c 74 69 6e 46 75 6e 63 74 69  te3BuiltinFuncti
21b0: 6f 6e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ons));.    sqlit
21c0: 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69  e3RegisterBuilti
21d0: 6e 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20  nFunctions();.  
21e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
21f0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
2200: 68 65 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  heInit==0 ){.   
2210: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2220: 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28  cacheInitialize(
2230: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2240: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2250: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
2260: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
2270: 61 63 68 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20  acheInit = 1;.  
2280: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2290: 4f 73 49 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a  OsInit();.    }.
22a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
22b0: 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45  ABLE_DESERIALIZE
22c0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
22d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 64  rc = sqlite3Memd
22f0: 62 49 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a 23  bInit();.    }.#
2300: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
2310: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2320: 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63       sqlite3PCac
2330: 68 65 42 75 66 66 65 72 53 65 74 75 70 28 20 73  heBufferSetup( s
2340: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2350: 69 67 2e 70 50 61 67 65 2c 20 0a 20 20 20 20 20  ig.pPage, .     
2360: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2370: 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 2c  alConfig.szPage,
2380: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2390: 6e 66 69 67 2e 6e 50 61 67 65 29 3b 0a 20 20 20  nfig.nPage);.   
23a0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
23b0: 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20  Config.isInit = 
23c0: 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  1;.#ifdef SQLITE
23d0: 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 20 20  _EXTRA_INIT.    
23e0: 20 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74 20    bRunExtraInit 
23f0: 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  = 1;.#endif.    
2400: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  }.    sqlite3Glo
2410: 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67  balConfig.inProg
2420: 72 65 73 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ress = 0;.  }.  
2430: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
2440: 61 76 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ave(sqlite3Globa
2450: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
2460: 65 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62 61  ex);..  /* Go ba
2470: 63 6b 20 75 6e 64 65 72 20 74 68 65 20 73 74 61  ck under the sta
2480: 74 69 63 20 6d 75 74 65 78 20 61 6e 64 20 63 6c  tic mutex and cl
2490: 65 61 6e 20 75 70 20 74 68 65 20 72 65 63 75 72  ean up the recur
24a0: 73 69 76 65 0a 20 20 2a 2a 20 6d 75 74 65 78 20  sive.  ** mutex 
24b0: 74 6f 20 70 72 65 76 65 6e 74 20 61 20 72 65 73  to prevent a res
24c0: 6f 75 72 63 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f  ource leak..  */
24d0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
24e0: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
24f0: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
2500: 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d  Config.nRefInitM
2510: 75 74 65 78 2d 2d 3b 0a 20 20 69 66 28 20 73 71  utex--;.  if( sq
2520: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2530: 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3c  g.nRefInitMutex<
2540: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
2550: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
2560: 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75  onfig.nRefInitMu
2570: 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  tex==0 );.    sq
2580: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
2590: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  (sqlite3GlobalCo
25a0: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29  nfig.pInitMutex)
25b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
25c0: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
25d0: 75 74 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  utex = 0;.  }.  
25e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
25f0: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20  ave(pMaster);.. 
2600: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
2610: 67 20 69 73 20 6a 75 73 74 20 61 20 73 61 6e 69  g is just a sani
2620: 74 79 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65  ty check to make
2630: 20 73 75 72 65 20 53 51 4c 69 74 65 20 68 61 73   sure SQLite has
2640: 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70 69  .  ** been compi
2650: 6c 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  led correctly.  
2660: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
2670: 74 6f 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  to run this code
2680: 2c 20 62 75 74 0a 20 20 2a 2a 20 77 65 20 64 6f  , but.  ** we do
2690: 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 75 6e 20  n't want to run 
26a0: 69 74 20 74 6f 6f 20 6f 66 74 65 6e 20 61 6e 64  it too often and
26b0: 20 73 6f 61 6b 20 75 70 20 43 50 55 20 63 79 63   soak up CPU cyc
26c0: 6c 65 73 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20  les for no.  ** 
26d0: 72 65 61 73 6f 6e 2e 20 20 53 6f 20 77 65 20 72  reason.  So we r
26e0: 75 6e 20 69 74 20 6f 6e 63 65 20 64 75 72 69 6e  un it once durin
26f0: 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  g initialization
2700: 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ..  */.#ifndef N
2710: 44 45 42 55 47 0a 23 69 66 6e 64 65 66 20 53 51  DEBUG.#ifndef SQ
2720: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
2730: 4e 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 54 68  NG_POINT.  /* Th
2740: 69 73 20 73 65 63 74 69 6f 6e 20 6f 66 20 63 6f  is section of co
2750: 64 65 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70 75  de's only "outpu
2760: 74 22 20 69 73 20 76 69 61 20 61 73 73 65 72 74  t" is via assert
2770: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a  () statements. *
2780: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2790: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34  TE_OK ){.    u64
27a0: 20 78 20 3d 20 28 28 28 75 36 34 29 31 29 3c 3c   x = (((u64)1)<<
27b0: 36 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c  63)-1;.    doubl
27c0: 65 20 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e y;.    assert(
27d0: 73 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20  sizeof(x)==8);. 
27e0: 20 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66     assert(sizeof
27f0: 28 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b  (x)==sizeof(y));
2800: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 79 2c 20  .    memcpy(&y, 
2810: 26 78 2c 20 38 29 3b 0a 20 20 20 20 61 73 73 65  &x, 8);.    asse
2820: 72 74 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  rt( sqlite3IsNaN
2830: 28 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  (y) );.  }.#endi
2840: 66 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  f.#endif..  /* D
2850: 6f 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69  o extra initiali
2860: 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 72 65 71  zation steps req
2870: 75 65 73 74 65 64 20 62 79 20 74 68 65 20 53 51  uested by the SQ
2880: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a  LITE_EXTRA_INIT.
2890: 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d    ** compile-tim
28a0: 65 20 6f 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  e option..  */.#
28b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54  ifdef SQLITE_EXT
28c0: 52 41 5f 49 4e 49 54 0a 20 20 69 66 28 20 62 52  RA_INIT.  if( bR
28d0: 75 6e 45 78 74 72 61 49 6e 69 74 20 29 7b 0a 20  unExtraInit ){. 
28e0: 20 20 20 69 6e 74 20 53 51 4c 49 54 45 5f 45 58     int SQLITE_EX
28f0: 54 52 41 5f 49 4e 49 54 28 63 6f 6e 73 74 20 63  TRA_INIT(const c
2900: 68 61 72 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  har*);.    rc = 
2910: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2920: 54 28 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  T(0);.  }.#endif
2930: 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2940: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65  ../*.** Undo the
2950: 20 65 66 66 65 63 74 73 20 6f 66 20 73 71 6c 69   effects of sqli
2960: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
2970: 2e 20 20 4d 75 73 74 20 6e 6f 74 20 62 65 20 63  .  Must not be c
2980: 61 6c 6c 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74  alled while.** t
2990: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
29a0: 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f  ding database co
29b0: 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d  nnections or mem
29c0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ory allocations 
29d0: 6f 72 0a 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20  or.** while any 
29e0: 70 61 72 74 20 6f 66 20 53 51 4c 69 74 65 20 69  part of SQLite i
29f0: 73 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75  s otherwise in u
2a00: 73 65 20 69 6e 20 61 6e 79 20 74 68 72 65 61 64  se in any thread
2a10: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
2a20: 6e 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  ne is not thread
2a30: 73 61 66 65 2e 20 20 42 75 74 20 69 74 20 69 73  safe.  But it is
2a40: 20 73 61 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20   safe to invoke 
2a50: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
2a60: 6f 6e 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69  on when SQLite i
2a70: 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20 64  s already shut d
2a80: 6f 77 6e 2e 20 20 49 66 20 53 51 4c 69 74 65 20  own.  If SQLite 
2a90: 69 73 20 61 6c 72 65 61 64 79 20 73 68 75 74 20  is already shut 
2aa0: 64 6f 77 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69  down.** when thi
2ab0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76  s routine is inv
2ac0: 6f 6b 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  oked, then this 
2ad0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72  routine is a har
2ae0: 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  mless no-op..*/.
2af0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 68 75 74  int sqlite3_shut
2b00: 64 6f 77 6e 28 76 6f 69 64 29 7b 0a 23 69 66 64  down(void){.#ifd
2b10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2b20: 53 44 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  SD.  int rc = sq
2b30: 6c 69 74 65 33 5f 77 73 64 5f 69 6e 69 74 28 34  lite3_wsd_init(4
2b40: 30 39 36 2c 20 32 34 29 3b 0a 20 20 69 66 28 20  096, 24);.  if( 
2b50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2b60: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2b70: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
2b80: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
2b90: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a  onfig.isInit ){.
2ba0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58  #ifdef SQLITE_EX
2bb0: 54 52 41 5f 53 48 55 54 44 4f 57 4e 0a 20 20 20  TRA_SHUTDOWN.   
2bc0: 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 45 58 54   void SQLITE_EXT
2bd0: 52 41 5f 53 48 55 54 44 4f 57 4e 28 76 6f 69 64  RA_SHUTDOWN(void
2be0: 29 3b 0a 20 20 20 20 53 51 4c 49 54 45 5f 45 58  );.    SQLITE_EX
2bf0: 54 52 41 5f 53 48 55 54 44 4f 57 4e 28 29 3b 0a  TRA_SHUTDOWN();.
2c00: 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
2c10: 65 33 5f 6f 73 5f 65 6e 64 28 29 3b 0a 20 20 20  e3_os_end();.   
2c20: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 5f 61   sqlite3_reset_a
2c30: 75 74 6f 5f 65 78 74 65 6e 73 69 6f 6e 28 29 3b  uto_extension();
2c40: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
2c50: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
2c60: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
2c70: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2c80: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20  ig.isPCacheInit 
2c90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ){.    sqlite3Pc
2ca0: 61 63 68 65 53 68 75 74 64 6f 77 6e 28 29 3b 0a  acheShutdown();.
2cb0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2cc0: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
2cd0: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
2ce0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2cf0: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
2d00: 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Init ){.    sqli
2d10: 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a  te3MallocEnd();.
2d20: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2d30: 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63  lConfig.isMalloc
2d40: 49 6e 69 74 20 3d 20 30 3b 0a 0a 23 69 66 6e 64  Init = 0;..#ifnd
2d50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2d60: 48 55 54 44 4f 57 4e 5f 44 49 52 45 43 54 4f 52  HUTDOWN_DIRECTOR
2d70: 49 45 53 0a 20 20 20 20 2f 2a 20 54 68 65 20 68  IES.    /* The h
2d80: 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 68 61  eap subsystem ha
2d90: 73 20 6e 6f 77 20 62 65 65 6e 20 73 68 75 74 64  s now been shutd
2da0: 6f 77 6e 20 61 6e 64 20 74 68 65 73 65 20 76 61  own and these va
2db0: 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65  lues are suppose
2dc0: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 4e  d.    ** to be N
2dd0: 55 4c 4c 20 6f 72 20 70 6f 69 6e 74 20 74 6f 20  ULL or point to 
2de0: 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20  memory that was 
2df0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
2e00: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 0a  lite3_malloc(),.
2e10: 20 20 20 20 2a 2a 20 77 68 69 63 68 20 77 6f 75      ** which wou
2e20: 6c 64 20 72 65 6c 79 20 6f 6e 20 74 68 61 74 20  ld rely on that 
2e30: 68 65 61 70 20 73 75 62 73 79 73 74 65 6d 3b 20  heap subsystem; 
2e40: 74 68 65 72 65 66 6f 72 65 2c 20 6d 61 6b 65 20  therefore, make 
2e50: 73 75 72 65 20 74 68 65 73 65 0a 20 20 20 20 2a  sure these.    *
2e60: 2a 20 76 61 6c 75 65 73 20 63 61 6e 6e 6f 74 20  * values cannot 
2e70: 72 65 66 65 72 20 74 6f 20 68 65 61 70 20 6d 65  refer to heap me
2e80: 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20 6a 75  mory that was ju
2e90: 73 74 20 69 6e 76 61 6c 69 64 61 74 65 64 20 77  st invalidated w
2ea0: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 68  hen the.    ** h
2eb0: 65 61 70 20 73 75 62 73 79 73 74 65 6d 20 77 61  eap subsystem wa
2ec0: 73 20 73 68 75 74 64 6f 77 6e 2e 20 20 54 68 69  s shutdown.  Thi
2ed0: 73 20 69 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 69  s is only done i
2ee0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61  f the current ca
2ef0: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 69  ll to.    ** thi
2f00: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 75 6c  s function resul
2f10: 74 65 64 20 69 6e 20 74 68 65 20 68 65 61 70 20  ted in the heap 
2f20: 73 75 62 73 79 73 74 65 6d 20 61 63 74 75 61 6c  subsystem actual
2f30: 6c 79 20 62 65 69 6e 67 20 73 68 75 74 64 6f 77  ly being shutdow
2f40: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  n..    */.    sq
2f50: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
2f60: 74 6f 72 79 20 3d 20 30 3b 0a 20 20 20 20 73 71  tory = 0;.    sq
2f70: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
2f80: 74 6f 72 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66  tory = 0;.#endif
2f90: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2fa0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2fb0: 73 4d 75 74 65 78 49 6e 69 74 20 29 7b 0a 20 20  sMutexInit ){.  
2fc0: 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 45 6e    sqlite3MutexEn
2fd0: 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d();.    sqlite3
2fe0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d  GlobalConfig.isM
2ff0: 75 74 65 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20  utexInit = 0;.  
3000: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
3010: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
3020: 54 68 69 73 20 41 50 49 20 61 6c 6c 6f 77 73 20  This API allows 
3030: 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20  applications to 
3040: 6d 6f 64 69 66 79 20 74 68 65 20 67 6c 6f 62 61  modify the globa
3050: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  l configuration 
3060: 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  of.** the SQLite
3070: 20 6c 69 62 72 61 72 79 20 61 74 20 72 75 6e 2d   library at run-
3080: 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  time..**.** This
3090: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
30a0: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77  only be called w
30b0: 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hen there are no
30c0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20   outstanding.** 
30d0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
30e0: 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61  ions or memory a
30f0: 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 69  llocations.  Thi
3100: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  s routine is not
3110: 0a 2a 2a 20 74 68 72 65 61 64 73 61 66 65 2e 20  .** threadsafe. 
3120: 20 46 61 69 6c 75 72 65 20 74 6f 20 68 65 65 64   Failure to heed
3130: 20 74 68 65 73 65 20 77 61 72 6e 69 6e 67 73 20   these warnings 
3140: 63 61 6e 20 6c 65 61 64 20 74 6f 20 75 6e 70 72  can lead to unpr
3150: 65 64 69 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68  edictable.** beh
3160: 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  avior..*/.int sq
3170: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74  lite3_config(int
3180: 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f   op, ...){.  va_
3190: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72  list ap;.  int r
31a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
31b0: 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e    /* sqlite3_con
31c0: 66 69 67 28 29 20 73 68 61 6c 6c 20 72 65 74 75  fig() shall retu
31d0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
31e0: 20 69 66 20 69 74 20 69 73 20 69 6e 76 6f 6b 65   if it is invoke
31f0: 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65  d while.  ** the
3200: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
3210: 69 73 20 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20  is in use. */.  
3220: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
3230: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29  lConfig.isInit )
3240: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
3250: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76  ISUSE_BKPT;..  v
3260: 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
3270: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
3280: 0a 0a 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 63  ..    /* Mutex c
3290: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74  onfiguration opt
32a0: 69 6f 6e 73 20 61 72 65 20 6f 6e 6c 79 20 61 76  ions are only av
32b0: 61 69 6c 61 62 6c 65 20 69 6e 20 61 20 74 68 72  ailable in a thr
32c0: 65 61 64 73 61 66 65 0a 20 20 20 20 2a 2a 20 63  eadsafe.    ** c
32d0: 6f 6d 70 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 23  ompile..    */.#
32e0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
32f0: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
3300: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
3310: 46 45 3e 30 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  FE>0  /* IMP: R-
3320: 35 34 34 36 36 2d 34 36 37 35 36 20 2a 2f 0a 20  54466-46756 */. 
3330: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3340: 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45  ONFIG_SINGLETHRE
3350: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  AD: {.      /* E
3360: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 32  VIDENCE-OF: R-02
3370: 37 34 38 2d 31 39 30 39 36 20 54 68 69 73 20 6f  748-19096 This o
3380: 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 74  ption sets the t
3390: 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20 74 6f  hreading mode to
33a0: 0a 20 20 20 20 20 20 2a 2a 20 53 69 6e 67 6c 65  .      ** Single
33b0: 2d 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20  -thread. */.    
33c0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
33d0: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
33e0: 20 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c   = 0;  /* Disabl
33f0: 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f 72 65 20  e mutex on core 
3400: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3410: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
3420: 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 20 20 2f 2a  llMutex = 0;  /*
3430: 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 20 6f   Disable mutex o
3440: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  n connections */
3450: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3460: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
3470: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48  efined(SQLITE_TH
3480: 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c  READSAFE) && SQL
3490: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
34a0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 30 35 32 30   /* IMP: R-20520
34b0: 2d 35 34 30 38 36 20 2a 2f 0a 20 20 20 20 63 61  -54086 */.    ca
34c0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
34d0: 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a 20 7b 0a  _MULTITHREAD: {.
34e0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
34f0: 45 2d 4f 46 3a 20 52 2d 31 34 33 37 34 2d 34 32  E-OF: R-14374-42
3500: 34 36 38 20 54 68 69 73 20 6f 70 74 69 6f 6e 20  468 This option 
3510: 73 65 74 73 20 74 68 65 20 74 68 72 65 61 64 69  sets the threadi
3520: 6e 67 20 6d 6f 64 65 20 74 6f 0a 20 20 20 20 20  ng mode to.     
3530: 20 2a 2a 20 4d 75 6c 74 69 2d 74 68 72 65 61 64   ** Multi-thread
3540: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
3550: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
3560: 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b 20 20  CoreMutex = 1;  
3570: 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 20  /* Enable mutex 
3580: 6f 6e 20 63 6f 72 65 20 2a 2f 0a 20 20 20 20 20  on core */.     
3590: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
35a0: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
35b0: 3d 20 30 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65  = 0;  /* Disable
35c0: 20 6d 75 74 65 78 20 6f 6e 20 63 6f 6e 6e 65 63   mutex on connec
35d0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 62  tions */.      b
35e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
35f0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
3600: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
3610: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
3620: 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50 3a  ADSAFE>0 /* IMP:
3630: 20 52 2d 35 39 35 39 33 2d 32 31 38 31 30 20 2a   R-59593-21810 *
3640: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
3650: 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49  E_CONFIG_SERIALI
3660: 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ZED: {.      /* 
3670: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
3680: 31 32 32 30 2d 35 31 38 30 30 20 54 68 69 73 20  1220-51800 This 
3690: 6f 70 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  option sets the 
36a0: 74 68 72 65 61 64 69 6e 67 20 6d 6f 64 65 20 74  threading mode t
36b0: 6f 0a 20 20 20 20 20 20 2a 2a 20 53 65 72 69 61  o.      ** Seria
36c0: 6c 69 7a 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  lized. */.      
36d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
36e0: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d  fig.bCoreMutex =
36f0: 20 31 3b 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d   1;  /* Enable m
3700: 75 74 65 78 20 6f 6e 20 63 6f 72 65 20 2a 2f 0a  utex on core */.
3710: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3720: 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
3730: 75 74 65 78 20 3d 20 31 3b 20 20 2f 2a 20 45 6e  utex = 1;  /* En
3740: 61 62 6c 65 20 6d 75 74 65 78 20 6f 6e 20 63 6f  able mutex on co
3750: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  nnections */.   
3760: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3770: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
3780: 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ed(SQLITE_THREAD
3790: 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f  SAFE) && SQLITE_
37a0: 54 48 52 45 41 44 53 41 46 45 3e 30 20 2f 2a 20  THREADSAFE>0 /* 
37b0: 49 4d 50 3a 20 52 2d 36 33 36 36 36 2d 34 38 37  IMP: R-63666-487
37c0: 35 35 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  55 */.    case S
37d0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54  QLITE_CONFIG_MUT
37e0: 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53  EX: {.      /* S
37f0: 70 65 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e  pecify an altern
3800: 61 74 69 76 65 20 6d 75 74 65 78 20 69 6d 70 6c  ative mutex impl
3810: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
3820: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3830: 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20  lConfig.mutex = 
3840: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
3850: 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64  te3_mutex_method
3860: 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  s*);.      break
3870: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
3880: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3890: 45 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26  E_THREADSAFE) &&
38a0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
38b0: 46 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 31  FE>0 /* IMP: R-1
38c0: 34 34 35 30 2d 33 37 35 39 37 20 2a 2f 0a 20 20  4450-37597 */.  
38d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
38e0: 4e 46 49 47 5f 47 45 54 4d 55 54 45 58 3a 20 7b  NFIG_GETMUTEX: {
38f0: 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65  .      /* Retrie
3900: 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  ve the current m
3910: 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74  utex implementat
3920: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a 76 61  ion */.      *va
3930: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
3940: 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29  _mutex_methods*)
3950: 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
3960: 43 6f 6e 66 69 67 2e 6d 75 74 65 78 3b 0a 20 20  Config.mutex;.  
3970: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3980: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
3990: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
39a0: 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20  MALLOC: {.      
39b0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
39c0: 52 2d 35 35 35 39 34 2d 32 31 30 33 30 20 54 68  R-55594-21030 Th
39d0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
39e0: 4d 41 4c 4c 4f 43 20 6f 70 74 69 6f 6e 20 74 61  MALLOC option ta
39f0: 6b 65 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 73  kes a.      ** s
3a00: 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ingle argument w
3a10: 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65  hich is a pointe
3a20: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
3a30: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
3a40: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
3a50: 68 6f 64 73 20 73 74 72 75 63 74 75 72 65 2e 20  hods structure. 
3a60: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 73 70 65  The argument spe
3a70: 63 69 66 69 65 73 20 61 6c 74 65 72 6e 61 74 69  cifies alternati
3a80: 76 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 77 2d  ve.      ** low-
3a90: 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c  level memory all
3aa0: 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73  ocation routines
3ab0: 20 74 6f 20 62 65 20 75 73 65 64 20 69 6e 20 70   to be used in p
3ac0: 6c 61 63 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f  lace of the memo
3ad0: 72 79 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  ry.      ** allo
3ae0: 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  cation routines 
3af0: 62 75 69 6c 74 20 69 6e 74 6f 20 53 51 4c 69 74  built into SQLit
3b00: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e. */.      sqli
3b10: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3b20: 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  m = *va_arg(ap, 
3b30: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3b40: 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ods*);.      bre
3b50: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3b60: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3b70: 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  _GETMALLOC: {.  
3b80: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
3b90: 4f 46 3a 20 52 2d 35 31 32 31 33 2d 34 36 34 31  OF: R-51213-4641
3ba0: 34 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  4 The SQLITE_CON
3bb0: 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 20 6f 70  FIG_GETMALLOC op
3bc0: 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20  tion takes a.   
3bd0: 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67     ** single arg
3be0: 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 61  ument which is a
3bf0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
3c00: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 0a 20  nstance of the. 
3c10: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
3c20: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75  mem_methods stru
3c30: 63 74 75 72 65 2e 20 54 68 65 20 73 71 6c 69 74  cture. The sqlit
3c40: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 73  e3_mem_methods s
3c50: 74 72 75 63 74 75 72 65 20 69 73 0a 20 20 20 20  tructure is.    
3c60: 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
3c70: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
3c80: 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 61 6c  efined memory al
3c90: 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65  location routine
3ca0: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  s. */.      if( 
3cb0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3cc0: 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d 30  fig.m.xMalloc==0
3cd0: 20 29 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74   ) sqlite3MemSet
3ce0: 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20 20  Default();.     
3cf0: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
3d00: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
3d10: 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  *) = sqlite3Glob
3d20: 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20 20  alConfig.m;.    
3d30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3d40: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3d50: 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53 3a  ONFIG_MEMSTATUS:
3d60: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3d70: 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 32 37 35  ENCE-OF: R-61275
3d80: 2d 33 35 31 35 37 20 54 68 65 20 53 51 4c 49 54  -35157 The SQLIT
3d90: 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54  E_CONFIG_MEMSTAT
3da0: 55 53 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 0a  US option takes.
3db0: 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
3dc0: 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 79 70 65  argument of type
3dd0: 20 69 6e 74 2c 20 69 6e 74 65 72 70 72 65 74 65   int, interprete
3de0: 64 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 2c 20  d as a boolean, 
3df0: 77 68 69 63 68 20 65 6e 61 62 6c 65 73 0a 20 20  which enables.  
3e00: 20 20 20 20 2a 2a 20 6f 72 20 64 69 73 61 62 6c      ** or disabl
3e10: 65 73 20 74 68 65 20 63 6f 6c 6c 65 63 74 69 6f  es the collectio
3e20: 6e 20 6f 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  n of memory allo
3e30: 63 61 74 69 6f 6e 20 73 74 61 74 69 73 74 69 63  cation statistic
3e40: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  s. */.      sqli
3e50: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3e60: 62 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72  bMemstat = va_ar
3e70: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
3e80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3e90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3ea0: 4f 4e 46 49 47 5f 53 4d 41 4c 4c 5f 4d 41 4c 4c  ONFIG_SMALL_MALL
3eb0: 4f 43 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OC: {.      sqli
3ec0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3ed0: 62 53 6d 61 6c 6c 4d 61 6c 6c 6f 63 20 3d 20 76  bSmallMalloc = v
3ee0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
3ef0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3f00: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3f10: 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41  TE_CONFIG_PAGECA
3f20: 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  CHE: {.      /* 
3f30: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
3f40: 38 37 36 31 2d 33 36 36 30 31 20 54 68 65 72 65  8761-36601 There
3f50: 20 61 72 65 20 74 68 72 65 65 20 61 72 67 75 6d   are three argum
3f60: 65 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ents to.      **
3f70: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50   SQLITE_CONFIG_P
3f80: 41 47 45 43 41 43 48 45 3a 20 41 20 70 6f 69 6e  AGECACHE: A poin
3f90: 74 65 72 20 74 6f 20 38 2d 62 79 74 65 20 61 6c  ter to 8-byte al
3fa0: 69 67 6e 65 64 20 6d 65 6d 6f 72 79 20 28 70 4d  igned memory (pM
3fb0: 65 6d 29 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  em),.      ** th
3fc0: 65 20 73 69 7a 65 20 6f 66 20 65 61 63 68 20 70  e size of each p
3fd0: 61 67 65 20 63 61 63 68 65 20 6c 69 6e 65 20 28  age cache line (
3fe0: 73 7a 29 2c 20 61 6e 64 20 74 68 65 20 6e 75 6d  sz), and the num
3ff0: 62 65 72 20 6f 66 20 63 61 63 68 65 20 6c 69 6e  ber of cache lin
4000: 65 73 0a 20 20 20 20 20 20 2a 2a 20 28 4e 29 2e  es.      ** (N).
4010: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
4020: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50  3GlobalConfig.pP
4030: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
4040: 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73   void*);.      s
4050: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4060: 69 67 2e 73 7a 50 61 67 65 20 3d 20 76 61 5f 61  ig.szPage = va_a
4070: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
4080: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4090: 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20 76  Config.nPage = v
40a0: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
40b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
40c0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
40d0: 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45  TE_CONFIG_PCACHE
40e0: 5f 48 44 52 53 5a 3a 20 7b 0a 20 20 20 20 20 20  _HDRSZ: {.      
40f0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4100: 52 2d 33 39 31 30 30 2d 32 37 33 31 37 20 54 68  R-39100-27317 Th
4110: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4120: 50 43 41 43 48 45 5f 48 44 52 53 5a 20 6f 70 74  PCACHE_HDRSZ opt
4130: 69 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20  ion takes.      
4140: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 70 61 72 61  ** a single para
4150: 6d 65 74 65 72 20 77 68 69 63 68 20 69 73 20 61  meter which is a
4160: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
4170: 6e 74 65 67 65 72 20 61 6e 64 20 77 72 69 74 65  nteger and write
4180: 73 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20  s into.      ** 
4190: 74 68 61 74 20 69 6e 74 65 67 65 72 20 74 68 65  that integer the
41a0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   number of extra
41b0: 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
41c0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
41d0: 68 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  h page.      ** 
41e0: 69 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  in SQLITE_CONFIG
41f0: 5f 50 41 47 45 43 41 43 48 45 2e 20 2a 2f 0a 20  _PAGECACHE. */. 
4200: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
4210: 20 69 6e 74 2a 29 20 3d 20 0a 20 20 20 20 20 20   int*) = .      
4220: 20 20 20 20 73 71 6c 69 74 65 33 48 65 61 64 65      sqlite3Heade
4230: 72 53 69 7a 65 42 74 72 65 65 28 29 20 2b 0a 20  rSizeBtree() +. 
4240: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4250: 48 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65  HeaderSizePcache
4260: 28 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73  () +.          s
4270: 71 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a 65  qlite3HeaderSize
4280: 50 63 61 63 68 65 31 28 29 3b 0a 20 20 20 20 20  Pcache1();.     
4290: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
42a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
42b0: 4f 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a  ONFIG_PCACHE: {.
42c0: 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
42d0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
42e0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
42f0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50  LITE_CONFIG_GETP
4300: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
4310: 2a 20 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a  * now an error *
4320: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
4330: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
4340: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
4350: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
4360: 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b  ONFIG_PCACHE2: {
4370: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
4380: 43 45 2d 4f 46 3a 20 52 2d 36 33 33 32 35 2d 34  CE-OF: R-63325-4
4390: 38 33 37 38 20 54 68 65 20 53 51 4c 49 54 45 5f  8378 The SQLITE_
43a0: 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 20 6f  CONFIG_PCACHE2 o
43b0: 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20  ption takes a.  
43c0: 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72      ** single ar
43d0: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
43e0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
43f0: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
4400: 65 74 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a  ethods2.      **
4410: 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 6f 62   object. This ob
4420: 6a 65 63 74 20 73 70 65 63 69 66 69 65 73 20 74  ject specifies t
4430: 68 65 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  he interface to 
4440: 61 20 63 75 73 74 6f 6d 20 70 61 67 65 20 63 61  a custom page ca
4450: 63 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70  che.      ** imp
4460: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a  lementation. */.
4470: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4480: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
4490: 32 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  2 = *va_arg(ap, 
44a0: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
44b0: 65 74 68 6f 64 73 32 2a 29 3b 0a 20 20 20 20 20  ethods2*);.     
44c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
44d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
44e0: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 32 3a  NFIG_GETPCACHE2:
44f0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
4500: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 30 33 35  ENCE-OF: R-22035
4510: 2d 34 36 31 38 32 20 54 68 65 20 53 51 4c 49 54  -46182 The SQLIT
4520: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43  E_CONFIG_GETPCAC
4530: 48 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73  HE2 option takes
4540: 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
4550: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
4560: 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  h is a pointer t
4570: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 70 63 61  o an sqlite3_pca
4580: 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20  che_methods2.   
4590: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 53 51     ** object. SQ
45a0: 4c 69 74 65 20 63 6f 70 69 65 73 20 6f 66 20 74  Lite copies of t
45b0: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
45c0: 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  cache implementa
45d0: 74 69 6f 6e 20 69 6e 74 6f 0a 20 20 20 20 20 20  tion into.      
45e0: 2a 2a 20 74 68 61 74 20 6f 62 6a 65 63 74 2e 20  ** that object. 
45f0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( 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 2e 78 49 6e 69 74 3d 3d  .pcache2.xInit==
4620: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
4630: 69 74 65 33 50 43 61 63 68 65 53 65 74 44 65 66  ite3PCacheSetDef
4640: 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a  ault();.      }.
4650: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
4660: 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  , sqlite3_pcache
4670: 5f 6d 65 74 68 6f 64 73 32 2a 29 20 3d 20 73 71  _methods2*) = sq
4680: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4690: 67 2e 70 63 61 63 68 65 32 3b 0a 20 20 20 20 20  g.pcache2;.     
46a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 2f   break;.    }../
46b0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
46c0: 2d 30 36 36 32 36 2d 31 32 39 31 31 20 54 68 65  -06626-12911 The
46d0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48   SQLITE_CONFIG_H
46e0: 45 41 50 20 6f 70 74 69 6f 6e 20 69 73 20 6f 6e  EAP option is on
46f0: 6c 79 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  ly.** available 
4700: 69 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  if SQLite is com
4710: 70 69 6c 65 64 20 77 69 74 68 20 65 69 74 68 65  piled with eithe
4720: 72 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  r SQLITE_ENABLE_
4730: 4d 45 4d 53 59 53 33 20 6f 72 0a 2a 2a 20 53 51  MEMSYS3 or.** SQ
4740: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
4750: 59 53 35 20 61 6e 64 20 72 65 74 75 72 6e 73 20  YS5 and returns 
4760: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
4770: 69 6e 76 6f 6b 65 64 20 6f 74 68 65 72 77 69 73  invoked otherwis
4780: 65 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e. */.#if define
4790: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
47a0: 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69  MEMSYS3) || defi
47b0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
47c0: 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63  E_MEMSYS5).    c
47d0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
47e0: 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20  G_HEAP: {.      
47f0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4800: 52 2d 31 39 38 35 34 2d 34 32 31 32 36 20 54 68  R-19854-42126 Th
4810: 65 72 65 20 61 72 65 20 74 68 72 65 65 20 61 72  ere are three ar
4820: 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20  guments to.     
4830: 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   ** SQLITE_CONFI
4840: 47 5f 48 45 41 50 3a 20 41 6e 20 38 2d 62 79 74  G_HEAP: An 8-byt
4850: 65 20 61 6c 69 67 6e 65 64 20 70 6f 69 6e 74 65  e aligned pointe
4860: 72 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 2c  r to the memory,
4870: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75   the.      ** nu
4880: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
4890: 20 74 68 65 20 6d 65 6d 6f 72 79 20 62 75 66 66   the memory buff
48a0: 65 72 2c 20 61 6e 64 20 74 68 65 20 6d 69 6e 69  er, and the mini
48b0: 6d 75 6d 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73  mum allocation s
48c0: 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ize..      */.  
48d0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
48e0: 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20  lConfig.pHeap = 
48f0: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
4900: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4910: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65  GlobalConfig.nHe
4920: 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ap = va_arg(ap, 
4930: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
4940: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4950: 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67 28 61  mnReq = va_arg(a
4960: 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20 20 20  p, int);..      
4970: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
4980: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c 31 20  lConfig.mnReq<1 
4990: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
49a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
49b0: 6e 52 65 71 20 3d 20 31 3b 0a 20 20 20 20 20 20  nReq = 1;.      
49c0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
49d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
49e0: 52 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b 0a 20  Req>(1<<12) ){. 
49f0: 20 20 20 20 20 20 20 2f 2a 20 63 61 70 20 6d 69         /* cap mi
4a00: 6e 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 61  n request size a
4a10: 74 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20 20 20  t 2^12 */.      
4a20: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4a30: 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 28 31  onfig.mnReq = (1
4a40: 3c 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  <<12);.      }..
4a50: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
4a60: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48  3GlobalConfig.pH
4a70: 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eap==0 ){.      
4a80: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
4a90: 3a 20 52 2d 34 39 39 32 30 2d 36 30 31 38 39 20  : R-49920-60189 
4aa0: 49 66 20 74 68 65 20 66 69 72 73 74 20 70 6f 69  If the first poi
4ab0: 6e 74 65 72 20 28 74 68 65 20 6d 65 6d 6f 72 79  nter (the memory
4ac0: 20 70 6f 69 6e 74 65 72 29 0a 20 20 20 20 20 20   pointer).      
4ad0: 20 20 2a 2a 20 69 73 20 4e 55 4c 4c 2c 20 74 68    ** is NULL, th
4ae0: 65 6e 20 53 51 4c 69 74 65 20 72 65 76 65 72 74  en SQLite revert
4af0: 73 20 74 6f 20 75 73 69 6e 67 20 69 74 73 20 64  s to using its d
4b00: 65 66 61 75 6c 74 20 6d 65 6d 6f 72 79 20 61 6c  efault memory al
4b10: 6c 6f 63 61 74 6f 72 0a 20 20 20 20 20 20 20 20  locator.        
4b20: 2a 2a 20 28 74 68 65 20 73 79 73 74 65 6d 20 6d  ** (the system m
4b30: 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e  alloc() implemen
4b40: 74 61 74 69 6f 6e 29 2c 20 75 6e 64 6f 69 6e 67  tation), undoing
4b50: 20 61 6e 79 20 70 72 69 6f 72 20 69 6e 76 6f 63   any prior invoc
4b60: 61 74 69 6f 6e 20 6f 66 0a 20 20 20 20 20 20 20  ation of.       
4b70: 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   ** SQLITE_CONFI
4b80: 47 5f 4d 41 4c 4c 4f 43 2e 0a 20 20 20 20 20 20  G_MALLOC..      
4b90: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
4ba0: 53 65 74 74 69 6e 67 20 73 71 6c 69 74 65 33 47  Setting sqlite3G
4bb0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 74 6f  lobalConfig.m to
4bc0: 20 61 6c 6c 20 7a 65 72 6f 73 20 77 69 6c 6c 20   all zeros will 
4bd0: 63 61 75 73 65 20 6d 61 6c 6c 6f 63 20 74 6f 0a  cause malloc to.
4be0: 20 20 20 20 20 20 20 20 2a 2a 20 72 65 76 65 72          ** rever
4bf0: 74 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c 74  t to its default
4c00: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
4c10: 77 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e 69  when sqlite3_ini
4c20: 74 69 61 6c 69 7a 65 28 29 20 69 73 20 72 75 6e  tialize() is run
4c30: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
4c40: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c 69      memset(&sqli
4c50: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4c60: 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c  m, 0, sizeof(sql
4c70: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4c80: 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  .m));.      }els
4c90: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  e{.        /* EV
4ca0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 30  IDENCE-OF: R-610
4cb0: 30 36 2d 30 38 39 31 38 20 49 66 20 74 68 65 20  06-08918 If the 
4cc0: 6d 65 6d 6f 72 79 20 70 6f 69 6e 74 65 72 20 69  memory pointer i
4cd0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
4ce0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  the.        ** a
4cf0: 6c 74 65 72 6e 61 74 69 76 65 20 6d 65 6d 6f 72  lternative memor
4d00: 79 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65  y allocator is e
4d10: 6e 67 61 67 65 64 20 74 6f 20 68 61 6e 64 6c 65  ngaged to handle
4d20: 20 61 6c 6c 20 6f 66 20 53 51 4c 69 74 65 73 0a   all of SQLites.
4d30: 20 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d 6f 72          ** memor
4d40: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6e 65 65  y allocation nee
4d50: 64 73 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ds. */.#ifdef SQ
4d60: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
4d70: 59 53 33 0a 20 20 20 20 20 20 20 20 73 71 6c 69  YS3.        sqli
4d80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4d90: 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47  m = *sqlite3MemG
4da0: 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23 65 6e  etMemsys3();.#en
4db0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
4dc0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
4dd0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4de0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d  GlobalConfig.m =
4df0: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d   *sqlite3MemGetM
4e00: 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64 69 66  emsys5();.#endif
4e10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
4e20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
4e30: 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  if..    case SQL
4e40: 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41  ITE_CONFIG_LOOKA
4e50: 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SIDE: {.      sq
4e60: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4e70: 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  g.szLookaside = 
4e80: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
4e90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4ea0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b  obalConfig.nLook
4eb0: 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61  aside = va_arg(a
4ec0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
4ed0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4ee0: 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 61  .    /* Record a
4ef0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4f00: 6c 6f 67 67 65 72 20 66 75 6e 63 74 69 6f 6e 20  logger function 
4f10: 61 6e 64 20 69 74 73 20 66 69 72 73 74 20 61 72  and its first ar
4f20: 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a 2a 20 54  gument..    ** T
4f30: 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 4e 55  he default is NU
4f40: 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20 69 73 20  LL.  Logging is 
4f50: 64 69 73 61 62 6c 65 64 20 69 66 20 74 68 65 20  disabled if the 
4f60: 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
4f70: 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e   is.    ** NULL.
4f80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
4f90: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c   SQLITE_CONFIG_L
4fa0: 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d  OG: {.      /* M
4fb0: 53 56 43 20 69 73 20 70 69 63 6b 79 20 61 62 6f  SVC is picky abo
4fc0: 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20  ut pulling func 
4fd0: 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69 73  ptrs from va lis
4fe0: 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74 74  ts..      ** htt
4ff0: 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72  p://support.micr
5000: 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39  osoft.com/kb/479
5010: 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  61.      ** sqli
5020: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
5030: 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  xLog = va_arg(ap
5040: 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 2a 2c  , void(*)(void*,
5050: 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  int,const char*)
5060: 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  );.      */.    
5070: 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28 2a    typedef void(*
5080: 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a  LOGFUNC_t)(void*
5090: 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a  ,int,const char*
50a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
50b0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
50c0: 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 4c  g = va_arg(ap, L
50d0: 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20  OGFUNC_t);.     
50e0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
50f0: 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20 3d 20 76  nfig.pLogArg = v
5100: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
5110: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5120: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 56 49     }..    /* EVI
5130: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 34  DENCE-OF: R-5554
5140: 38 2d 33 33 38 31 37 20 54 68 65 20 63 6f 6d 70  8-33817 The comp
5150: 69 6c 65 2d 74 69 6d 65 20 73 65 74 74 69 6e 67  ile-time setting
5160: 20 66 6f 72 20 55 52 49 20 66 69 6c 65 6e 61 6d   for URI filenam
5170: 65 73 0a 20 20 20 20 2a 2a 20 63 61 6e 20 62 65  es.    ** can be
5180: 20 63 68 61 6e 67 65 64 20 61 74 20 73 74 61 72   changed at star
5190: 74 2d 74 69 6d 65 20 75 73 69 6e 67 20 74 68 65  t-time using the
51a0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
51b0: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
51c0: 4e 46 49 47 5f 55 52 49 2c 31 29 20 6f 72 0a 20  NFIG_URI,1) or. 
51d0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f     ** sqlite3_co
51e0: 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
51f0: 49 47 5f 55 52 49 2c 30 29 20 63 6f 6e 66 69 67  IG_URI,0) config
5200: 75 72 61 74 69 6f 6e 20 63 61 6c 6c 73 2e 0a 20  uration calls.. 
5210: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
5220: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49  QLITE_CONFIG_URI
5230: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
5240: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 34 35  DENCE-OF: R-2545
5250: 31 2d 36 31 31 32 35 20 54 68 65 20 53 51 4c 49  1-61125 The SQLI
5260: 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 20 6f 70  TE_CONFIG_URI op
5270: 74 69 6f 6e 20 74 61 6b 65 73 20 61 20 73 69 6e  tion takes a sin
5280: 67 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 72 67  gle.      ** arg
5290: 75 6d 65 6e 74 20 6f 66 20 74 79 70 65 20 69 6e  ument of type in
52a0: 74 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  t. If non-zero, 
52b0: 74 68 65 6e 20 55 52 49 20 68 61 6e 64 6c 69 6e  then URI handlin
52c0: 67 20 69 73 20 67 6c 6f 62 61 6c 6c 79 0a 20 20  g is globally.  
52d0: 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20      ** enabled. 
52e0: 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
52f0: 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 55   is zero, then U
5300: 52 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67  RI handling is g
5310: 6c 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  lobally.      **
5320: 20 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20 20   disabled. */.  
5330: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
5340: 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69  lConfig.bOpenUri
5350: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
5360: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
5370: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
5380: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 43   SQLITE_CONFIG_C
5390: 4f 56 45 52 49 4e 47 5f 49 4e 44 45 58 5f 53 43  OVERING_INDEX_SC
53a0: 41 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  AN: {.      /* E
53b0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 36  VIDENCE-OF: R-36
53c0: 35 39 32 2d 30 32 37 37 32 20 54 68 65 20 53 51  592-02772 The SQ
53d0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45  LITE_CONFIG_COVE
53e0: 52 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41 4e 0a  RING_INDEX_SCAN.
53f0: 20 20 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20        ** option 
5400: 74 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 20 69  takes a single i
5410: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 20  nteger argument 
5420: 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
5430: 65 74 65 64 20 61 73 20 61 0a 20 20 20 20 20 20  eted as a.      
5440: 2a 2a 20 62 6f 6f 6c 65 61 6e 20 69 6e 20 6f 72  ** boolean in or
5450: 64 65 72 20 74 6f 20 65 6e 61 62 6c 65 20 6f 72  der to enable or
5460: 20 64 69 73 61 62 6c 65 20 74 68 65 20 75 73 65   disable the use
5470: 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64   of covering ind
5480: 69 63 65 73 20 66 6f 72 0a 20 20 20 20 20 20 2a  ices for.      *
5490: 2a 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  * full table sca
54a0: 6e 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 20  ns in the query 
54b0: 6f 70 74 69 6d 69 7a 65 72 2e 20 2a 2f 0a 20 20  optimizer. */.  
54c0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
54d0: 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 20  lConfig.bUseCis 
54e0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
54f0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5500: 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
5510: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
5520: 4f 47 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  OG.    case SQLI
5530: 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47  TE_CONFIG_SQLLOG
5540: 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65  : {.      typede
5550: 66 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47 46 55  f void(*SQLLOGFU
5560: 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73 71 6c  NC_t)(void*, sql
5570: 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61  ite3*, const cha
5580: 72 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  r*, int);.      
5590: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
55a0: 66 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20 76 61  fig.xSqllog = va
55b0: 5f 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f 47 46  _arg(ap, SQLLOGF
55c0: 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 73 71  UNC_t);.      sq
55d0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
55e0: 67 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d 20 76  g.pSqllogArg = v
55f0: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 20 2a  a_arg(ap, void *
5600: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5610: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
5620: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
5630: 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20  NFIG_MMAP_SIZE: 
5640: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
5650: 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 36 33 2d  NCE-OF: R-58063-
5660: 33 38 32 35 38 20 53 51 4c 49 54 45 5f 43 4f 4e  38258 SQLITE_CON
5670: 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 20 74 61  FIG_MMAP_SIZE ta
5680: 6b 65 73 20 74 77 6f 20 36 34 2d 62 69 74 0a 20  kes two 64-bit. 
5690: 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20       ** integer 
56a0: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20  (sqlite3_int64) 
56b0: 76 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20  values that are 
56c0: 74 68 65 20 64 65 66 61 75 6c 74 20 6d 6d 61 70  the default mmap
56d0: 20 73 69 7a 65 20 6c 69 6d 69 74 0a 20 20 20 20   size limit.    
56e0: 20 20 2a 2a 20 28 74 68 65 20 64 65 66 61 75 6c    ** (the defaul
56f0: 74 20 73 65 74 74 69 6e 67 20 66 6f 72 20 50 52  t setting for PR
5700: 41 47 4d 41 20 6d 6d 61 70 5f 73 69 7a 65 29 20  AGMA mmap_size) 
5710: 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  and the maximum 
5720: 61 6c 6c 6f 77 65 64 0a 20 20 20 20 20 20 2a 2a  allowed.      **
5730: 20 6d 6d 61 70 20 73 69 7a 65 20 6c 69 6d 69 74   mmap size limit
5740: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
5750: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 20  e3_int64 szMmap 
5760: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
5770: 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20  ite3_int64);.   
5780: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
5790: 20 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67   mxMmap = va_arg
57a0: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  (ap, sqlite3_int
57b0: 36 34 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56  64);.      /* EV
57c0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 33 33  IDENCE-OF: R-533
57d0: 36 37 2d 34 33 31 39 30 20 49 66 20 65 69 74 68  67-43190 If eith
57e0: 65 72 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  er argument to t
57f0: 68 69 73 20 6f 70 74 69 6f 6e 20 69 73 0a 20 20  his option is.  
5800: 20 20 20 20 2a 2a 20 6e 65 67 61 74 69 76 65 2c      ** negative,
5810: 20 74 68 65 6e 20 74 68 61 74 20 61 72 67 75 6d   then that argum
5820: 65 6e 74 20 69 73 20 63 68 61 6e 67 65 64 20 74  ent is changed t
5830: 6f 20 69 74 73 20 63 6f 6d 70 69 6c 65 2d 74 69  o its compile-ti
5840: 6d 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 20 20  me default..    
5850: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56    **.      ** EV
5860: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39  IDENCE-OF: R-349
5870: 39 33 2d 34 35 30 33 31 20 54 68 65 20 6d 61 78  93-45031 The max
5880: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 6d 6d 61  imum allowed mma
5890: 70 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 0a 20  p size will be. 
58a0: 20 20 20 20 20 2a 2a 20 73 69 6c 65 6e 74 6c 79       ** silently
58b0: 20 74 72 75 6e 63 61 74 65 64 20 69 66 20 6e 65   truncated if ne
58c0: 63 65 73 73 61 72 79 20 73 6f 20 74 68 61 74 20  cessary so that 
58d0: 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 63 65  it does not exce
58e0: 65 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ed the.      ** 
58f0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6d 61 78  compile-time max
5900: 69 6d 75 6d 20 6d 6d 61 70 20 73 69 7a 65 20 73  imum mmap size s
5910: 65 74 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  et by the SQLITE
5920: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 0a 20  _MAX_MMAP_SIZE. 
5930: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d       ** compile-
5940: 74 69 6d 65 20 6f 70 74 69 6f 6e 2e 0a 20 20 20  time option..   
5950: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
5960: 6d 78 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d  mxMmap<0 || mxMm
5970: 61 70 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  ap>SQLITE_MAX_MM
5980: 41 50 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  AP_SIZE ){.     
5990: 20 20 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49     mxMmap = SQLI
59a0: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
59b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
59c0: 69 66 28 20 73 7a 4d 6d 61 70 3c 30 20 29 20 73  if( szMmap<0 ) s
59d0: 7a 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f 44  zMmap = SQLITE_D
59e0: 45 46 41 55 4c 54 5f 4d 4d 41 50 5f 53 49 5a 45  EFAULT_MMAP_SIZE
59f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 6d  ;.      if( szMm
5a00: 61 70 3e 6d 78 4d 6d 61 70 29 20 73 7a 4d 6d 61  ap>mxMmap) szMma
5a10: 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  p = mxMmap;.    
5a20: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
5a30: 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d  onfig.mxMmap = m
5a40: 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c  xMmap;.      sql
5a50: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5a60: 2e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70  .szMmap = szMmap
5a70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5a80: 20 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45     }..#if SQLITE
5a90: 5f 4f 53 5f 57 49 4e 20 26 26 20 64 65 66 69 6e  _OS_WIN && defin
5aa0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5ab0: 4d 41 4c 4c 4f 43 29 20 2f 2a 20 49 4d 50 3a 20  MALLOC) /* IMP: 
5ac0: 52 2d 30 34 37 38 30 2d 35 35 38 31 35 20 2a 2f  R-04780-55815 */
5ad0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
5ae0: 5f 43 4f 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45  _CONFIG_WIN32_HE
5af0: 41 50 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  APSIZE: {.      
5b00: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
5b10: 52 2d 33 34 39 32 36 2d 30 33 33 36 30 20 53 51  R-34926-03360 SQ
5b20: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e 33  LITE_CONFIG_WIN3
5b30: 32 5f 48 45 41 50 53 49 5a 45 20 74 61 6b 65 73  2_HEAPSIZE takes
5b40: 20 61 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20   a 32-bit.      
5b50: 2a 2a 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  ** unsigned inte
5b60: 67 65 72 20 76 61 6c 75 65 20 74 68 61 74 20 73  ger value that s
5b70: 70 65 63 69 66 69 65 73 20 74 68 65 20 6d 61 78  pecifies the max
5b80: 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65  imum size of the
5b90: 20 63 72 65 61 74 65 64 0a 20 20 20 20 20 20 2a   created.      *
5ba0: 2a 20 68 65 61 70 2e 20 2a 2f 0a 20 20 20 20 20  * heap. */.     
5bb0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
5bc0: 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f  nfig.nHeap = va_
5bd0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
5be0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5bf0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73  .#endif..    cas
5c00: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
5c10: 50 4d 41 53 5a 3a 20 7b 0a 20 20 20 20 20 20 73  PMASZ: {.      s
5c20: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
5c30: 69 67 2e 73 7a 50 6d 61 20 3d 20 76 61 5f 61 72  ig.szPma = va_ar
5c40: 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69  g(ap, unsigned i
5c50: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
5c60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
5c70: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
5c80: 53 54 4d 54 4a 52 4e 4c 5f 53 50 49 4c 4c 3a 20  STMTJRNL_SPILL: 
5c90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
5ca0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 74 6d  lobalConfig.nStm
5cb0: 74 53 70 69 6c 6c 20 3d 20 76 61 5f 61 72 67 28  tSpill = va_arg(
5cc0: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
5cd0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
5ce0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5cf0: 4c 45 5f 53 4f 52 54 45 52 5f 52 45 46 45 52 45  LE_SORTER_REFERE
5d00: 4e 43 45 53 0a 20 20 20 20 63 61 73 65 20 53 51  NCES.    case SQ
5d10: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 4f 52 54  LITE_CONFIG_SORT
5d20: 45 52 52 45 46 5f 53 49 5a 45 3a 20 7b 0a 20 20  ERREF_SIZE: {.  
5d30: 20 20 20 20 69 6e 74 20 69 56 61 6c 20 3d 20 76      int iVal = v
5d40: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
5d50: 20 20 20 20 20 20 69 66 28 20 69 56 61 6c 3c 30        if( iVal<0
5d60: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 56 61 6c   ){.        iVal
5d70: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
5d80: 54 5f 53 4f 52 54 45 52 52 45 46 5f 53 49 5a 45  T_SORTERREF_SIZE
5d90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5da0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
5db0: 66 69 67 2e 73 7a 53 6f 72 74 65 72 52 65 66 20  fig.szSorterRef 
5dc0: 3d 20 28 75 33 32 29 69 56 61 6c 3b 0a 20 20 20  = (u32)iVal;.   
5dd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5de0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
5df0: 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 52 5f 52  _ENABLE_SORTER_R
5e00: 45 46 45 52 45 4e 43 45 53 20 2a 2f 0a 0a 23 69  EFERENCES */..#i
5e10: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5e20: 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a 20  LE_DESERIALIZE. 
5e30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
5e40: 4f 4e 46 49 47 5f 4d 45 4d 44 42 5f 4d 41 58 53  ONFIG_MEMDB_MAXS
5e50: 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  IZE: {.      sql
5e60: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
5e70: 2e 6d 78 4d 65 6d 64 62 53 69 7a 65 20 3d 20 76  .mxMemdbSize = v
5e80: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
5e90: 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20 20 20  3_int64);.      
5ea0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
5eb0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
5ec0: 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45  ABLE_DESERIALIZE
5ed0: 20 2a 2f 0a 0a 20 20 20 20 64 65 66 61 75 6c 74   */..    default
5ee0: 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  : {.      rc = S
5ef0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
5f00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5f10: 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29    }.  va_end(ap)
5f20: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
5f30: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74  ../*.** Set up t
5f40: 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66  he lookaside buf
5f50: 66 65 72 73 20 66 6f 72 20 61 20 64 61 74 61 62  fers for a datab
5f60: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
5f70: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
5f80: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
5f90: 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64   .** If lookasid
5fa0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  e is already act
5fb0: 69 76 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ive, return SQLI
5fc0: 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54  TE_BUSY..**.** T
5fd0: 68 65 20 73 7a 20 70 61 72 61 6d 65 74 65 72 20  he sz parameter 
5fe0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
5ff0: 20 62 79 74 65 73 20 69 6e 20 65 61 63 68 20 6c   bytes in each l
6000: 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a  ookaside slot..*
6010: 2a 20 54 68 65 20 63 6e 74 20 70 61 72 61 6d 65  * The cnt parame
6020: 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ter is the numbe
6030: 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66 20  r of slots.  If 
6040: 70 53 74 61 72 74 20 69 73 20 4e 55 4c 4c 20 74  pStart is NULL t
6050: 68 65 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72 20  he.** space for 
6060: 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65  the lookaside me
6070: 6d 6f 72 79 20 69 73 20 6f 62 74 61 69 6e 65 64  mory is obtained
6080: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
6090: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53  lloc()..** If pS
60a0: 74 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  tart is not NULL
60b0: 20 74 68 65 6e 20 69 74 20 69 73 20 73 7a 2a 63   then it is sz*c
60c0: 6e 74 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  nt bytes of memo
60d0: 72 79 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a  ry to use for.**
60e0: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d   the lookaside m
60f0: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
6100: 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73   int setupLookas
6110: 69 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ide(sqlite3 *db,
6120: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
6130: 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 23   sz, int cnt){.#
6140: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6150: 49 54 5f 4c 4f 4f 4b 41 53 49 44 45 0a 20 20 76  IT_LOOKASIDE.  v
6160: 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 0a  oid *pStart;.  .
6170: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 6f    if( sqlite3Loo
6180: 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c 30 29  kasideUsed(db,0)
6190: 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
61a0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
61b0: 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  }.  /* Free any 
61c0: 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69  existing lookasi
61d0: 64 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 68  de buffer for th
61e0: 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72 65  is handle before
61f0: 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67  .  ** allocating
6200: 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65   a new one so we
6210: 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 68   don't have to h
6220: 61 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a 20  ave space for . 
6230: 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65 20   ** both at the 
6240: 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a  same time..  */.
6250: 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73    if( db->lookas
6260: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b  ide.bMalloced ){
6270: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
6280: 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  e(db->lookaside.
6290: 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f  pStart);.  }.  /
62a0: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20  * The size of a 
62b0: 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20 61  lookaside slot a
62c0: 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20  fter ROUNDDOWN8 
62d0: 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72 67  needs to be larg
62e0: 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20 70  er.  ** than a p
62f0: 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73 65  ointer to be use
6300: 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d  ful..  */.  sz =
6310: 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b   ROUNDDOWN8(sz);
6320: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33    /* IMP: R-3303
6330: 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66 28  8-09382 */.  if(
6340: 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66   sz<=(int)sizeof
6350: 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29  (LookasideSlot*)
6360: 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28   ) sz = 0;.  if(
6370: 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30   cnt<0 ) cnt = 0
6380: 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c  ;.  if( sz==0 ||
6390: 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73   cnt==0 ){.    s
63a0: 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72  z = 0;.    pStar
63b0: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  t = 0;.  }else i
63c0: 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20  f( pBuf==0 ){.  
63d0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
63e0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
63f0: 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74    pStart = sqlit
6400: 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 28 73 71  e3Malloc( sz*(sq
6410: 6c 69 74 65 33 5f 69 6e 74 36 34 29 63 6e 74 20  lite3_int64)cnt 
6420: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31  );  /* IMP: R-61
6430: 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20  949-35727 */.   
6440: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
6450: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69  nMalloc();.    i
6460: 66 28 20 70 53 74 61 72 74 20 29 20 63 6e 74 20  f( pStart ) cnt 
6470: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  = sqlite3MallocS
6480: 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a 3b 0a  ize(pStart)/sz;.
6490: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74    }else{.    pSt
64a0: 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a  art = pBuf;.  }.
64b0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
64c0: 70 53 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b  pStart = pStart;
64d0: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
64e0: 2e 70 49 6e 69 74 20 3d 20 30 3b 0a 20 20 64 62  .pInit = 0;.  db
64f0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65  ->lookaside.pFre
6500: 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f  e = 0;.  db->loo
6510: 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28 75 31 36  kaside.sz = (u16
6520: 29 73 7a 3b 0a 20 20 69 66 28 20 70 53 74 61 72  )sz;.  if( pStar
6530: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
6540: 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f      LookasideSlo
6550: 74 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72 74  t *p;.    assert
6560: 28 20 73 7a 20 3e 20 28 69 6e 74 29 73 69 7a 65  ( sz > (int)size
6570: 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74  of(LookasideSlot
6580: 2a 29 20 29 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  *) );.    db->lo
6590: 6f 6b 61 73 69 64 65 2e 6e 53 6c 6f 74 20 3d 20  okaside.nSlot = 
65a0: 63 6e 74 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f  cnt;.    p = (Lo
65b0: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 70 53 74  okasideSlot*)pSt
65c0: 61 72 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63  art;.    for(i=c
65d0: 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  nt-1; i>=0; i--)
65e0: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74  {.      p->pNext
65f0: 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65   = db->lookaside
6600: 2e 70 49 6e 69 74 3b 0a 20 20 20 20 20 20 64 62  .pInit;.      db
6610: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 49 6e 69  ->lookaside.pIni
6620: 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 20 3d  t = p;.      p =
6630: 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a   (LookasideSlot*
6640: 29 26 28 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a  )&((u8*)p)[sz];.
6650: 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f      }.    db->lo
6660: 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 70  okaside.pEnd = p
6670: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
6680: 69 64 65 2e 62 44 69 73 61 62 6c 65 20 3d 20 30  ide.bDisable = 0
6690: 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
66a0: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20  ide.bMalloced = 
66b0: 70 42 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20  pBuf==0 ?1:0;.  
66c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c  }else{.    db->l
66d0: 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20  ookaside.pStart 
66e0: 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f  = db;.    db->lo
66f0: 6f 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 64  okaside.pEnd = d
6700: 62 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  b;.    db->looka
6710: 73 69 64 65 2e 62 44 69 73 61 62 6c 65 20 3d 20  side.bDisable = 
6720: 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  1;.    db->looka
6730: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d  side.bMalloced =
6740: 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b   0;.    db->look
6750: 61 73 69 64 65 2e 6e 53 6c 6f 74 20 3d 20 30 3b  aside.nSlot = 0;
6760: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
6770: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 4f 4b 41  QLITE_OMIT_LOOKA
6780: 53 49 44 45 20 2a 2f 0a 20 20 72 65 74 75 72 6e  SIDE */.  return
6790: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
67a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
67b0: 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64  mutex associated
67c0: 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
67d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
67e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 73  sqlite3_mutex *s
67f0: 71 6c 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28  qlite3_db_mutex(
6800: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
6810: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6820: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
6830: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
6840: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
6850: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
6860: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
6870: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6880: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
6890: 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a  db->mutex;.}../*
68a0: 0a 2a 2a 20 46 72 65 65 20 75 70 20 61 73 20 6d  .** Free up as m
68b0: 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 77 65  uch memory as we
68c0: 20 63 61 6e 20 66 72 6f 6d 20 74 68 65 20 67 69   can from the gi
68d0: 76 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ven database.** 
68e0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  connection..*/.i
68f0: 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  nt sqlite3_db_re
6900: 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c  lease_memory(sql
6910: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
6920: 20 69 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   i;..#ifdef SQLI
6930: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
6940: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
6950: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
6960: 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
6970: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
6980: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
6990: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
69a0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c 69  ->mutex);.  sqli
69b0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
69c0: 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  (db);.  for(i=0;
69d0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
69e0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
69f0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
6a00: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 29  t;.    if( pBt )
6a10: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70  {.      Pager *p
6a20: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
6a30: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
6a40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
6a50: 65 72 53 68 72 69 6e 6b 28 70 50 61 67 65 72 29  erShrink(pPager)
6a60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
6a70: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
6a80: 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  ll(db);.  sqlite
6a90: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
6aa0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
6ab0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6ac0: 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79  ./*.** Flush any
6ad0: 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
6ae0: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
6af0: 66 6f 72 20 61 6e 79 20 61 74 74 61 63 68 65 64  for any attached
6b00: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 6f 20   database.** to 
6b10: 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  disk..*/.int sql
6b20: 69 74 65 33 5f 64 62 5f 63 61 63 68 65 66 6c 75  ite3_db_cacheflu
6b30: 73 68 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  sh(sqlite3 *db){
6b40: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
6b50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6b60: 20 20 69 6e 74 20 62 53 65 65 6e 42 75 73 79 20    int bSeenBusy 
6b70: 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  = 0;..#ifdef SQL
6b80: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
6b90: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
6ba0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
6bb0: 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
6bc0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
6bd0: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
6be0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
6bf0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71 6c  b->mutex);.  sql
6c00: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
6c10: 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30  l(db);.  for(i=0
6c20: 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
6c30: 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
6c40: 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  +){.    Btree *p
6c50: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
6c60: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74  pBt;.    if( pBt
6c70: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
6c80: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29  IsInTrans(pBt) )
6c90: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70  {.      Pager *p
6ca0: 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
6cb0: 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
6cc0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6cd0: 65 33 50 61 67 65 72 46 6c 75 73 68 28 70 50 61  e3PagerFlush(pPa
6ce0: 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
6cf0: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
6d00: 29 7b 0a 20 20 20 20 20 20 20 20 62 53 65 65 6e  ){.        bSeen
6d10: 42 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  Busy = 1;.      
6d20: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
6d30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6d40: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
6d50: 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
6d60: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6d70: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
6d80: 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d  ;.  return ((rc=
6d90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 53  =SQLITE_OK && bS
6da0: 65 65 6e 42 75 73 79 29 20 3f 20 53 51 4c 49 54  eenBusy) ? SQLIT
6db0: 45 5f 42 55 53 59 20 3a 20 72 63 29 3b 0a 7d 0a  E_BUSY : rc);.}.
6dc0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61  ./*.** Configura
6dd0: 74 69 6f 6e 20 73 65 74 74 69 6e 67 73 20 66 6f  tion settings fo
6de0: 72 20 61 6e 20 69 6e 64 69 76 69 64 75 61 6c 20  r an individual 
6df0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
6e00: 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ion.*/.int sqlit
6e10: 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 73 71 6c  e3_db_config(sql
6e20: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 70  ite3 *db, int op
6e30: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
6e40: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  t ap;.  int rc;.
6e50: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f    va_start(ap, o
6e60: 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p);.  switch( op
6e70: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
6e80: 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41 49  ITE_DBCONFIG_MAI
6e90: 4e 44 42 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20  NDBNAME: {.     
6ea0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 36 38 32 34   /* IMP: R-06824
6eb0: 2d 32 38 35 33 31 20 2a 2f 0a 20 20 20 20 20 20  -28531 */.      
6ec0: 2f 2a 20 49 4d 50 3a 20 52 2d 33 36 32 35 37 2d  /* IMP: R-36257-
6ed0: 35 32 31 32 35 20 2a 2f 0a 20 20 20 20 20 20 64  52125 */.      d
6ee0: 62 2d 3e 61 44 62 5b 30 5d 2e 7a 44 62 53 4e 61  b->aDb[0].zDbSNa
6ef0: 6d 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 63  me = va_arg(ap,c
6f00: 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 72 63 20  har*);.      rc 
6f10: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
6f20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6f30: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
6f40: 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49  DBCONFIG_LOOKASI
6f50: 44 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64  DE: {.      void
6f60: 20 2a 70 42 75 66 20 3d 20 76 61 5f 61 72 67 28   *pBuf = va_arg(
6f70: 61 70 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49  ap, void*); /* I
6f80: 4d 50 3a 20 52 2d 32 36 38 33 35 2d 31 30 39 36  MP: R-26835-1096
6f90: 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73  4 */.      int s
6fa0: 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  z = va_arg(ap, i
6fb0: 6e 74 29 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d  nt);       /* IM
6fc0: 50 3a 20 52 2d 34 37 38 37 31 2d 32 35 39 39 34  P: R-47871-25994
6fd0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e   */.      int cn
6fe0: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
6ff0: 6e 74 29 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50  nt);      /* IMP
7000: 3a 20 52 2d 30 34 34 36 30 2d 35 33 33 38 36 20  : R-04460-53386 
7010: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  */.      rc = se
7020: 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c  tupLookaside(db,
7030: 20 70 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b   pBuf, sz, cnt);
7040: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7050: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
7060: 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20   {.      static 
7070: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
7080: 20 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20         int op;  
7090: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
70a0: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  e */.        u32
70b0: 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73   mask;    /* Mas
70c0: 6b 20 6f 66 20 74 68 65 20 62 69 74 20 69 6e 20  k of the bit in 
70d0: 73 71 6c 69 74 65 33 2e 66 6c 61 67 73 20 74 6f  sqlite3.flags to
70e0: 20 73 65 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20   set/clear */.  
70f0: 20 20 20 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20      } aFlagOp[] 
7100: 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 53 51  = {.        { SQ
7110: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
7120: 41 42 4c 45 5f 46 4b 45 59 2c 20 20 20 20 20 20  ABLE_FKEY,      
7130: 20 20 20 20 20 53 51 4c 49 54 45 5f 46 6f 72 65       SQLITE_Fore
7140: 69 67 6e 4b 65 79 73 20 20 20 20 7d 2c 0a 20 20  ignKeys    },.  
7150: 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44        { SQLITE_D
7160: 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54  BCONFIG_ENABLE_T
7170: 52 49 47 47 45 52 2c 20 20 20 20 20 20 20 20 53  RIGGER,        S
7180: 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67  QLITE_EnableTrig
7190: 67 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 20 20  ger  },.        
71a0: 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  { SQLITE_DBCONFI
71b0: 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f  G_ENABLE_FTS3_TO
71c0: 4b 45 4e 49 5a 45 52 2c 20 53 51 4c 49 54 45 5f  KENIZER, SQLITE_
71d0: 46 74 73 33 54 6f 6b 65 6e 69 7a 65 72 20 20 7d  Fts3Tokenizer  }
71e0: 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49  ,.        { SQLI
71f0: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
7200: 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  LE_LOAD_EXTENSIO
7210: 4e 2c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78  N, SQLITE_LoadEx
7220: 74 65 6e 73 69 6f 6e 20 20 7d 2c 0a 20 20 20 20  tension  },.    
7230: 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43      { SQLITE_DBC
7240: 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54 5f 4f 4e  ONFIG_NO_CKPT_ON
7250: 5f 43 4c 4f 53 45 2c 20 20 20 20 20 20 53 51 4c  _CLOSE,      SQL
7260: 49 54 45 5f 4e 6f 43 6b 70 74 4f 6e 43 6c 6f 73  ITE_NoCkptOnClos
7270: 65 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20  e  },.        { 
7280: 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
7290: 45 4e 41 42 4c 45 5f 51 50 53 47 2c 20 20 20 20  ENABLE_QPSG,    
72a0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 45 6e         SQLITE_En
72b0: 61 62 6c 65 51 50 53 47 20 20 20 20 20 7d 2c 0a  ableQPSG     },.
72c0: 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45          { SQLITE
72d0: 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45  _DBCONFIG_TRIGGE
72e0: 52 5f 45 51 50 2c 20 20 20 20 20 20 20 20 20 20  R_EQP,          
72f0: 20 53 51 4c 49 54 45 5f 54 72 69 67 67 65 72 45   SQLITE_TriggerE
7300: 51 50 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  QP     },.      
7310: 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e    { SQLITE_DBCON
7320: 46 49 47 5f 52 45 53 45 54 5f 44 41 54 41 42 41  FIG_RESET_DATABA
7330: 53 45 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54  SE,        SQLIT
7340: 45 5f 52 65 73 65 74 44 61 74 61 62 61 73 65 20  E_ResetDatabase 
7350: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
7360: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 44 45  LITE_DBCONFIG_DE
7370: 46 45 4e 53 49 56 45 2c 20 20 20 20 20 20 20 20  FENSIVE,        
7380: 20 20 20 20 20 53 51 4c 49 54 45 5f 44 65 66 65       SQLITE_Defe
7390: 6e 73 69 76 65 20 20 20 20 20 20 7d 2c 0a 20 20  nsive      },.  
73a0: 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44        { SQLITE_D
73b0: 42 43 4f 4e 46 49 47 5f 57 52 49 54 41 42 4c 45  BCONFIG_WRITABLE
73c0: 5f 53 43 48 45 4d 41 2c 20 20 20 20 20 20 20 53  _SCHEMA,       S
73d0: 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d  QLITE_WriteSchem
73e0: 61 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a|.             
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7410: 20 20 20 20 53 51 4c 49 54 45 5f 4e 6f 53 63 68      SQLITE_NoSch
7420: 65 6d 61 45 72 72 6f 72 20 20 7d 2c 0a 20 20 20  emaError  },.   
7430: 20 20 20 7d 3b 0a 20 20 20 20 20 20 75 6e 73 69     };.      unsi
7440: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20  gned int i;.    
7450: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
7460: 52 4f 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 34  ROR; /* IMP: R-4
7470: 32 37 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20 20  2790-23372 */.  
7480: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
7490: 72 72 61 79 53 69 7a 65 28 61 46 6c 61 67 4f 70  rraySize(aFlagOp
74a0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ); i++){.       
74b0: 20 69 66 28 20 61 46 6c 61 67 4f 70 5b 69 5d 2e   if( aFlagOp[i].
74c0: 6f 70 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 20 20  op==op ){.      
74d0: 20 20 20 20 69 6e 74 20 6f 6e 6f 66 66 20 3d 20      int onoff = 
74e0: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
74f0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 2a  .          int *
7500: 70 52 65 73 20 3d 20 76 61 5f 61 72 67 28 61 70  pRes = va_arg(ap
7510: 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 20  , int*);.       
7520: 20 20 20 75 36 34 20 6f 6c 64 46 6c 61 67 73 20     u64 oldFlags 
7530: 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20  = db->flags;.   
7540: 20 20 20 20 20 20 20 69 66 28 20 6f 6e 6f 66 66         if( onoff
7550: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
7560: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 61    db->flags |= a
7570: 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a  FlagOp[i].mask;.
7580: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
7590: 69 66 28 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b 0a  if( onoff==0 ){.
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
75b0: 66 6c 61 67 73 20 26 3d 20 7e 28 75 36 34 29 61  flags &= ~(u64)a
75c0: 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a  FlagOp[i].mask;.
75d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
75e0: 20 20 20 20 20 20 69 66 28 20 6f 6c 64 46 6c 61        if( oldFla
75f0: 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29 7b  gs!=db->flags ){
7600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
7610: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
7620: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 2c  edStatements(db,
7630: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
7640: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
7650: 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Res ){.         
7660: 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e     *pRes = (db->
7670: 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b  flags & aFlagOp[
7680: 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20  i].mask)!=0;.   
7690: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
76a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
76b0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  K;.          bre
76c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
76d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
76e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
76f0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
7700: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
7710: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
7720: 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e   the buffer z[0.
7730: 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61  .n-1] contains a
7740: 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74  ll spaces..*/.st
7750: 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63  atic int allSpac
7760: 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  es(const char *z
7770: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c  , int n){.  whil
7780: 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d  e( n>0 && z[n-1]
7790: 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  ==' ' ){ n--; }.
77a0: 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d    return n==0;.}
77b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
77c0: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
77d0: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  ating function n
77e0: 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77 68  amed "BINARY" wh
77f0: 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  ich is always.**
7800: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
7810: 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c 61 67  * If the padFlag
7820: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
7830: 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65   NULL then space
7840: 20 70 61 64 64 69 6e 67 20 61 74 20 74 68 65 20   padding at the 
7850: 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67  end.** of string
7860: 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54  s is ignored.  T
7870: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  his implements t
7880: 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69  he RTRIM collati
7890: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
78a0: 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20  t binCollFunc(. 
78b0: 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a   void *padFlag,.
78c0: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
78d0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
78e0: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
78f0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
7900: 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20  {.  int rc, n;. 
7910: 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32   n = nKey1<nKey2
7920: 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32   ? nKey1 : nKey2
7930: 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
7940: 4f 46 3a 20 52 2d 36 35 30 33 33 2d 32 38 34 34  OF: R-65033-2844
7950: 39 20 54 68 65 20 62 75 69 6c 74 2d 69 6e 20 42  9 The built-in B
7960: 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f 6e 20  INARY collation 
7970: 63 6f 6d 70 61 72 65 73 0a 20 20 2a 2a 20 73 74  compares.  ** st
7980: 72 69 6e 67 73 20 62 79 74 65 20 62 79 20 62 79  rings byte by by
7990: 74 65 20 75 73 69 6e 67 20 74 68 65 20 6d 65 6d  te using the mem
79a0: 63 6d 70 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  cmp() function f
79b0: 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
79c0: 20 43 0a 20 20 2a 2a 20 6c 69 62 72 61 72 79 2e   C.  ** library.
79d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4b   */.  assert( pK
79e0: 65 79 31 20 26 26 20 70 4b 65 79 32 20 29 3b 0a  ey1 && pKey2 );.
79f0: 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b    rc = memcmp(pK
7a00: 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a  ey1, pKey2, n);.
7a10: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
7a20: 20 20 20 69 66 28 20 70 61 64 46 6c 61 67 0a 20     if( padFlag. 
7a30: 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73      && allSpaces
7a40: 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31 29 2b  (((char*)pKey1)+
7a50: 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20  n, nKey1-n).    
7a60: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
7a70: 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20  char*)pKey2)+n, 
7a80: 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a  nKey2-n).    ){.
7a90: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
7aa0: 45 2d 4f 46 3a 20 52 2d 33 31 36 32 34 2d 32 34  E-OF: R-31624-24
7ab0: 37 33 37 20 52 54 52 49 4d 20 69 73 20 6c 69 6b  737 RTRIM is lik
7ac0: 65 20 42 49 4e 41 52 59 20 65 78 63 65 70 74 20  e BINARY except 
7ad0: 74 68 61 74 20 65 78 74 72 61 0a 20 20 20 20 20  that extra.     
7ae0: 20 2a 2a 20 73 70 61 63 65 73 20 61 74 20 74 68   ** spaces at th
7af0: 65 20 65 6e 64 20 6f 66 20 65 69 74 68 65 72 20  e end of either 
7b00: 73 74 72 69 6e 67 20 64 6f 20 6e 6f 74 20 63 68  string do not ch
7b10: 61 6e 67 65 20 74 68 65 20 72 65 73 75 6c 74 2e  ange the result.
7b20: 20 49 6e 20 6f 74 68 65 72 0a 20 20 20 20 20 20   In other.      
7b30: 2a 2a 20 77 6f 72 64 73 2c 20 73 74 72 69 6e 67  ** words, string
7b40: 73 20 77 69 6c 6c 20 63 6f 6d 70 61 72 65 20 65  s will compare e
7b50: 71 75 61 6c 20 74 6f 20 6f 6e 65 20 61 6e 6f 74  qual to one anot
7b60: 68 65 72 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  her as long as t
7b70: 68 65 79 0a 20 20 20 20 20 20 2a 2a 20 64 69 66  hey.      ** dif
7b80: 66 65 72 20 6f 6e 6c 79 20 69 6e 20 74 68 65 20  fer only in the 
7b90: 6e 75 6d 62 65 72 20 6f 66 20 73 70 61 63 65 73  number of spaces
7ba0: 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 20 20 20   at the end..   
7bb0: 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b     */.    }else{
7bc0: 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79  .      rc = nKey
7bd0: 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d  1 - nKey2;.    }
7be0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
7bf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7c00: 6e 20 74 72 75 65 20 69 66 20 43 6f 6c 6c 53 65  n true if CollSe
7c10: 71 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  q is the default
7c20: 20 62 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52 59   built-in BINARY
7c30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7c40: 49 73 42 69 6e 61 72 79 28 63 6f 6e 73 74 20 43  IsBinary(const C
7c50: 6f 6c 6c 53 65 71 20 2a 70 29 7b 0a 20 20 61 73  ollSeq *p){.  as
7c60: 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 2d  sert( p==0 || p-
7c70: 3e 78 43 6d 70 21 3d 62 69 6e 43 6f 6c 6c 46 75  >xCmp!=binCollFu
7c80: 6e 63 20 7c 7c 20 70 2d 3e 70 55 73 65 72 21 3d  nc || p->pUser!=
7c90: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0.            ||
7ca0: 20 73 74 72 63 6d 70 28 70 2d 3e 7a 4e 61 6d 65   strcmp(p->zName
7cb0: 2c 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 3b  ,"BINARY")==0 );
7cc0: 0a 20 20 72 65 74 75 72 6e 20 70 3d 3d 30 20 7c  .  return p==0 |
7cd0: 7c 20 28 70 2d 3e 78 43 6d 70 3d 3d 62 69 6e 43  | (p->xCmp==binC
7ce0: 6f 6c 6c 46 75 6e 63 20 26 26 20 70 2d 3e 70 55  ollFunc && p->pU
7cf0: 73 65 72 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ser==0);.}../*.*
7d00: 2a 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d  * Another built-
7d10: 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  in collating seq
7d20: 75 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a  uence: NOCASE. .
7d30: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61  **.** This colla
7d40: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  ting sequence is
7d50: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
7d60: 75 73 65 64 20 66 6f 72 20 22 63 61 73 65 20 69  used for "case i
7d70: 6e 64 65 70 65 6e 64 65 6e 74 0a 2a 2a 20 63 6f  ndependent.** co
7d80: 6d 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74  mparison". SQLit
7d90: 65 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66  e's knowledge of
7da0: 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72   upper and lower
7db0: 20 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74   case equivalent
7dc0: 73 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c  s.** extends onl
7dd0: 79 20 74 6f 20 74 68 65 20 32 36 20 63 68 61 72  y to the 26 char
7de0: 61 63 74 65 72 73 20 75 73 65 64 20 69 6e 20 74  acters used in t
7df0: 68 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  he English langu
7e00: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68  age..**.** At th
7e10: 65 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69  e moment there i
7e20: 73 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69  s only a UTF-8 i
7e30: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
7e40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63  /.static int noc
7e50: 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63  aseCollatingFunc
7e60: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
7e70: 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  d,.  int nKey1, 
7e80: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
7e90: 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20  1,.  int nKey2, 
7ea0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
7eb0: 32 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73  2.){.  int r = s
7ec0: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a  qlite3StrNICmp(.
7ed0: 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61        (const cha
7ee0: 72 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73  r *)pKey1, (cons
7ef0: 74 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20  t char *)pKey2, 
7f00: 28 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b  (nKey1<nKey2)?nK
7f10: 65 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e  ey1:nKey2);.  UN
7f20: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
7f30: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30  otUsed);.  if( 0
7f40: 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e  ==r ){.    r = n
7f50: 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a  Key1-nKey2;.  }.
7f60: 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f    return r;.}../
7f70: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
7f80: 52 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73  ROWID of the mos
7f90: 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a  t recent insert.
7fa0: 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  */.sqlite_int64 
7fb0: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
7fc0: 65 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65  ert_rowid(sqlite
7fd0: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
7fe0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
7ff0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
8000: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
8010: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
8020: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
8030: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
8040: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
8050: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61  .  return db->la
8060: 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  stRowid;.}../*.*
8070: 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
8080: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
8090: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
80a0: 65 72 74 5f 72 6f 77 69 64 28 29 20 41 50 49 20  ert_rowid() API 
80b0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
80c0: 64 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 6c 61  d sqlite3_set_la
80d0: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
80e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 73 71 6c  sqlite3 *db, sql
80f0: 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69  ite3_int64 iRowi
8100: 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d){.#ifdef SQLIT
8110: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
8120: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
8130: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
8140: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
8150: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
8160: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
8170: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
8180: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
8190: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
81a0: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 69  b->lastRowid = i
81b0: 52 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33  Rowid;.  sqlite3
81c0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
81d0: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >mutex);.}../*.*
81e0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
81f0: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69  ber of changes i
8200: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
8210: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
8220: 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74  3_exec()..*/.int
8230: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
8240: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23  (sqlite3 *db){.#
8250: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
8260: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
8270: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
8280: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
8290: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
82a0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
82b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
82c0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
82d0: 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a   db->nChange;.}.
82e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
82f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e  e number of chan
8300: 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 64 61  ges since the da
8310: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61  tabase handle wa
8320: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  s opened..*/.int
8330: 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63   sqlite3_total_c
8340: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
8350: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
8360: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
8370: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
8380: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
8390: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
83a0: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
83b0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
83c0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
83d0: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61  return db->nTota
83e0: 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  lChange;.}../*.*
83f0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e  * Close all open
8400: 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69   savepoints. Thi
8410: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20  s function only 
8420: 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c  manipulates fiel
8430: 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ds of the.** dat
8440: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a  abase handle obj
8450: 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  ect, it does not
8460: 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70   close any savep
8470: 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62  oints that may b
8480: 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65  e open.** at the
8490: 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65   b-tree/pager le
84a0: 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  vel..*/.void sql
84b0: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
84c0: 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
84d0: 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70  {.  while( db->p
84e0: 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
84f0: 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70   Savepoint *pTmp
8500: 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
8510: 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65  t;.    db->pSave
8520: 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e  point = pTmp->pN
8530: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
8540: 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29  DbFree(db, pTmp)
8550: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76  ;.  }.  db->nSav
8560: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62  epoint = 0;.  db
8570: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
8580: 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61  ;.  db->isTransa
8590: 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
85a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   0;.}../*.** Inv
85b0: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
85c0: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f  or function asso
85d0: 63 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63  ciated with Func
85e0: 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45  Def p, if any. E
85f0: 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69  xcept,.** if thi
8600: 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  s is not the las
8610: 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75  t copy of the fu
8620: 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69  nction, do not i
8630: 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70  nvoke it. Multip
8640: 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20  le.** copies of 
8650: 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f  a single functio
8660: 6e 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68  n are created wh
8670: 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69  en create_functi
8680: 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a  on() is called.*
8690: 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e  * with SQLITE_AN
86a0: 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  Y as the encodin
86b0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
86c0: 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f  d functionDestro
86d0: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46  y(sqlite3 *db, F
86e0: 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75  uncDef *p){.  Fu
86f0: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44  ncDestructor *pD
8700: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 75  estructor = p->u
8710: 2e 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20  .pDestructor;.  
8720: 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20  if( pDestructor 
8730: 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74  ){.    pDestruct
8740: 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  or->nRef--;.    
8750: 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d  if( pDestructor-
8760: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
8770: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78    pDestructor->x
8780: 44 65 73 74 72 6f 79 28 70 44 65 73 74 72 75 63  Destroy(pDestruc
8790: 74 6f 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b  tor->pUserData);
87a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
87b0: 46 72 65 65 28 64 62 2c 20 70 44 65 73 74 72 75  Free(db, pDestru
87c0: 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ctor);.    }.  }
87d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e  .}../*.** Discon
87e0: 6e 65 63 74 20 61 6c 6c 20 73 71 6c 69 74 65 33  nect all sqlite3
87f0: 5f 76 74 61 62 20 6f 62 6a 65 63 74 73 20 74 68  _vtab objects th
8800: 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 64 61 74  at belong to dat
8810: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
8820: 0a 2a 2a 20 64 62 2e 20 54 68 69 73 20 69 73 20  .** db. This is 
8830: 63 61 6c 6c 65 64 20 77 68 65 6e 20 64 62 20 69  called when db i
8840: 73 20 62 65 69 6e 67 20 63 6c 6f 73 65 64 2e 0a  s being closed..
8850: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
8860: 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62  isconnectAllVtab
8870: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23  (sqlite3 *db){.#
8880: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8890: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
88a0: 20 20 69 6e 74 20 69 3b 0a 20 20 48 61 73 68 45    int i;.  HashE
88b0: 6c 65 6d 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  lem *p;.  sqlite
88c0: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
88d0: 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  b);.  for(i=0; i
88e0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
88f0: 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68      Schema *pSch
8900: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  ema = db->aDb[i]
8910: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66  .pSchema;.    if
8920: 28 20 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ( pSchema ){.   
8930: 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48     for(p=sqliteH
8940: 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d  ashFirst(&pSchem
8950: 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 3b 20  a->tblHash); p; 
8960: 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  p=sqliteHashNext
8970: 28 70 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61  (p)){.        Ta
8980: 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61 62  ble *pTab = (Tab
8990: 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  le *)sqliteHashD
89a0: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ata(p);.        
89b0: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
89c0: 61 62 29 20 29 20 73 71 6c 69 74 65 33 56 74 61  ab) ) sqlite3Vta
89d0: 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20  bDisconnect(db, 
89e0: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pTab);.      }. 
89f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70     }.  }.  for(p
8a00: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
8a10: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20  (&db->aModule); 
8a20: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
8a30: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 4d 6f 64  ext(p)){.    Mod
8a40: 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64  ule *pMod = (Mod
8a50: 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68  ule *)sqliteHash
8a60: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 69 66 28  Data(p);.    if(
8a70: 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 20 29   pMod->pEpoTab )
8a80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8a90: 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62  tabDisconnect(db
8aa0: 2c 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 29  , pMod->pEpoTab)
8ab0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
8ac0: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
8ad0: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
8ae0: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
8af0: 64 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  db);.#else.  UNU
8b00: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
8b10: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
8b20: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
8b30: 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  f database conne
8b40: 63 74 69 6f 6e 20 64 62 20 68 61 73 20 75 6e 66  ction db has unf
8b50: 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65  inalized prepare
8b60: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  d.** statements 
8b70: 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71  or unfinished sq
8b80: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a  lite3_backup obj
8b90: 65 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  ects.  .*/.stati
8ba0: 63 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  c int connection
8bb0: 49 73 42 75 73 79 28 73 71 6c 69 74 65 33 20 2a  IsBusy(sqlite3 *
8bc0: 64 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  db){.  int j;.  
8bd0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
8be0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
8bf0: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 64  utex) );.  if( d
8c00: 62 2d 3e 70 56 64 62 65 20 29 20 72 65 74 75 72  b->pVdbe ) retur
8c10: 6e 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  n 1;.  for(j=0; 
8c20: 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b  j<db->nDb; j++){
8c30: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
8c40: 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74  = db->aDb[j].pBt
8c50: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26  ;.    if( pBt &&
8c60: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
8c70: 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29 20 72  nBackup(pBt) ) r
8c80: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
8c90: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
8ca0: 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74  * Close an exist
8cb0: 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62  ing SQLite datab
8cc0: 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ase.*/.static in
8cd0: 74 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 73  t sqlite3Close(s
8ce0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
8cf0: 66 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20  forceZombie){.  
8d00: 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 2f  if( !db ){.    /
8d10: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
8d20: 2d 36 33 32 35 37 2d 31 31 37 34 30 20 43 61 6c  -63257-11740 Cal
8d30: 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 63 6c 6f  ling sqlite3_clo
8d40: 73 65 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  se() or.    ** s
8d50: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28  qlite3_close_v2(
8d60: 29 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f  ) with a NULL po
8d70: 69 6e 74 65 72 20 61 72 67 75 6d 65 6e 74 20 69  inter argument i
8d80: 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
8d90: 6f 70 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  op. */.    retur
8da0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
8db0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
8dc0: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
8dd0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
8de0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
8df0: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73  SE_BKPT;.  }.  s
8e00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
8e10: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
8e20: 20 69 66 28 20 64 62 2d 3e 6d 54 72 61 63 65 20   if( db->mTrace 
8e30: 26 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43  & SQLITE_TRACE_C
8e40: 4c 4f 53 45 20 29 7b 0a 20 20 20 20 64 62 2d 3e  LOSE ){.    db->
8e50: 78 54 72 61 63 65 28 53 51 4c 49 54 45 5f 54 52  xTrace(SQLITE_TR
8e60: 41 43 45 5f 43 4c 4f 53 45 2c 20 64 62 2d 3e 70  ACE_CLOSE, db->p
8e70: 54 72 61 63 65 41 72 67 2c 20 64 62 2c 20 30 29  TraceArg, db, 0)
8e80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 63  ;.  }..  /* Forc
8e90: 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 63 61  e xDisconnect ca
8ea0: 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75  lls on all virtu
8eb0: 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64  al tables */.  d
8ec0: 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62  isconnectAllVtab
8ed0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  (db);..  /* If a
8ee0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
8ef0: 6f 70 65 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e  open, the discon
8f00: 6e 65 63 74 41 6c 6c 56 74 61 62 28 29 20 63 61  nectAllVtab() ca
8f10: 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69  ll above.  ** wi
8f20: 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c  ll not have call
8f30: 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65  ed the xDisconne
8f40: 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61  ct() method on a
8f50: 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20  ny virtual.  ** 
8f60: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62  tables in the db
8f70: 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61  ->aVTrans[] arra
8f80: 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  y. The following
8f90: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
8fa0: 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c  back().  ** call
8fb0: 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20   will do so. We 
8fc0: 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20  need to do this 
8fd0: 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b  before the check
8fe0: 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a   for active.  **
8ff0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
9000: 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d  below, as the v-
9010: 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61  table implementa
9020: 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72  tion may be stor
9030: 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72  ing.  ** some pr
9040: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
9050: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  s internally..  
9060: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  */.  sqlite3Vtab
9070: 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20  Rollback(db);.. 
9080: 20 2f 2a 20 4c 65 67 61 63 79 20 62 65 68 61 76   /* Legacy behav
9090: 69 6f 72 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f  ior (sqlite3_clo
90a0: 73 65 28 29 20 62 65 68 61 76 69 6f 72 29 20 69  se() behavior) i
90b0: 73 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a  s to return.  **
90c0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20   SQLITE_BUSY if 
90d0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  the connection c
90e0: 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64  an not be closed
90f0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
9100: 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72 63 65 5a  */.  if( !forceZ
9110: 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65 63 74  ombie && connect
9120: 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b  ionIsBusy(db) ){
9130: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
9140: 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c  rWithMsg(db, SQL
9150: 49 54 45 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c  ITE_BUSY, "unabl
9160: 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74  e to close due t
9170: 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a  o unfinalized ".
9180: 20 20 20 20 20 20 20 22 73 74 61 74 65 6d 65 6e         "statemen
9190: 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64  ts or unfinished
91a0: 20 62 61 63 6b 75 70 73 22 29 3b 0a 20 20 20 20   backups");.    
91b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
91c0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
91d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
91e0: 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66  E_BUSY;.  }..#if
91f0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
9200: 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73  E_SQLLOG.  if( s
9210: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
9220: 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20  ig.xSqllog ){.  
9230: 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65    /* Closing the
9240: 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20   handle. Fourth 
9250: 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73  parameter is pas
9260: 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 32 2e  sed the value 2.
9270: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 47   */.    sqlite3G
9280: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
9290: 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  log(sqlite3Globa
92a0: 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41  lConfig.pSqllogA
92b0: 72 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20  rg, db, 0, 2);. 
92c0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
92d0: 43 6f 6e 76 65 72 74 20 74 68 65 20 63 6f 6e 6e  Convert the conn
92e0: 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f  ection into a zo
92f0: 6d 62 69 65 20 61 6e 64 20 74 68 65 6e 20 63 6c  mbie and then cl
9300: 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64  ose it..  */.  d
9310: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
9320: 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a  E_MAGIC_ZOMBIE;.
9330: 20 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75    sqlite3LeaveMu
9340: 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69  texAndCloseZombi
9350: 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(db);.  return 
9360: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
9370: 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61 74 69 6f  .** Two variatio
9380: 6e 73 20 6f 6e 20 74 68 65 20 70 75 62 6c 69 63  ns on the public
9390: 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20 63   interface for c
93a0: 6c 6f 73 69 6e 67 20 61 20 64 61 74 61 62 61 73  losing a databas
93b0: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
93c0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f   The sqlite3_clo
93d0: 73 65 28 29 20 76 65 72 73 69 6f 6e 20 72 65 74  se() version ret
93e0: 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59  urns SQLITE_BUSY
93f0: 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74   and.** leaves t
9400: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  he connection op
9410: 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72  tion if there ar
9420: 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72  e unfinalized pr
9430: 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d  epared.** statem
9440: 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68  ents or unfinish
9450: 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  ed sqlite3_backu
9460: 70 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ps.  The sqlite3
9470: 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76  _close_v2().** v
9480: 65 72 73 69 6f 6e 20 66 6f 72 63 65 73 20 74 68  ersion forces th
9490: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
94a0: 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20  become a zombie 
94b0: 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  if there are.** 
94c0: 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75 72 63  unclosed resourc
94d0: 65 73 2c 20 61 6e 64 20 61 72 72 61 6e 67 65 73  es, and arranges
94e0: 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f   for deallocatio
94f0: 6e 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 0a  n when the last.
9500: 2a 2a 20 70 72 65 70 61 72 65 20 73 74 61 74 65  ** prepare state
9510: 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74 65 33 5f  ment or sqlite3_
9520: 62 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a  backup closes..*
9530: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c  /.int sqlite3_cl
9540: 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ose(sqlite3 *db)
9550: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
9560: 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69  Close(db,0); }.i
9570: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  nt sqlite3_close
9580: 5f 76 32 28 73 71 6c 69 74 65 33 20 2a 64 62 29  _v2(sqlite3 *db)
9590: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
95a0: 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a  Close(db,1); }..
95b0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
95c0: 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61   mutex on databa
95d0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
95e0: 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d  ..**.** Furtherm
95f0: 6f 72 65 2c 20 69 66 20 64 61 74 61 62 61 73 65  ore, if database
9600: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69   connection db i
9610: 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e  s a zombie (mean
9620: 69 6e 67 20 74 68 61 74 20 74 68 65 72 65 0a 2a  ing that there.*
9630: 2a 20 68 61 73 20 62 65 65 6e 20 61 20 70 72 69  * has been a pri
9640: 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  or call to sqlit
9650: 65 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72 20  e3_close(db) or 
9660: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
9670: 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65  (db)) and.** eve
9680: 72 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ry sqlite3_stmt 
9690: 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e  has now been fin
96a0: 61 6c 69 7a 65 64 20 61 6e 64 20 65 76 65 72 79  alized and every
96b0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
96c0: 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c  has.** finished,
96d0: 20 74 68 65 6e 20 66 72 65 65 20 61 6c 6c 20 72   then free all r
96e0: 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69  esources..*/.voi
96f0: 64 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75  d sqlite3LeaveMu
9700: 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69  texAndCloseZombi
9710: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
9720: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20    HashElem *i;  
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9740: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
9750: 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  iterator */.  in
9760: 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t j;..  /* If th
9770: 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
9780: 69 6e 67 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ing sqlite3_stmt
9790: 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b   or sqlite3_back
97a0: 75 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20  up objects.  ** 
97b0: 6f 72 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  or if the connec
97c0: 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74  tion has not yet
97d0: 20 62 65 65 6e 20 63 6c 6f 73 65 64 20 62 79 20   been closed by 
97e0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
97f0: 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75  (),.  ** then ju
9800: 73 74 20 6c 65 61 76 65 20 74 68 65 20 6d 75 74  st leave the mut
9810: 65 78 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ex and return.. 
9820: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
9830: 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49  gic!=SQLITE_MAGI
9840: 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e  C_ZOMBIE || conn
9850: 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29  ectionIsBusy(db)
9860: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
9870: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
9880: 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75  mutex);.    retu
9890: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  rn;.  }..  /* If
98a0: 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
98b0: 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
98c0: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
98d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a   connection has.
98e0: 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20    ** closed all 
98f0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e 64  sqlite3_stmt and
9900: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
9910: 6f 62 6a 65 63 74 73 20 61 6e 64 20 68 61 73 20  objects and has 
9920: 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64  been.  ** passed
9930: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73   to sqlite3_clos
9940: 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  e (meaning that 
9950: 69 74 20 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e  it is a zombie).
9960: 20 20 54 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a    Therefore,.  *
9970: 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 66  * go ahead and f
9980: 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65  ree all resource
9990: 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  s..  */..  /* If
99a0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
99b0: 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20  s open, roll it 
99c0: 62 61 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20  back. This also 
99d0: 65 6e 73 75 72 65 73 20 74 68 61 74 20 69 66 0a  ensures that if.
99e0: 20 20 2a 2a 20 61 6e 79 20 64 61 74 61 62 61 73    ** any databas
99f0: 65 20 73 63 68 65 6d 61 73 20 68 61 76 65 20 62  e schemas have b
9a00: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 62 79 20  een modified by 
9a10: 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74  an uncommitted t
9a20: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
9a30: 74 68 65 79 20 61 72 65 20 72 65 73 65 74 2e 20  they are reset. 
9a40: 41 6e 64 20 74 68 61 74 20 74 68 65 20 72 65 71  And that the req
9a50: 75 69 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74  uired b-tree mut
9a60: 65 78 20 69 73 20 68 65 6c 64 20 74 6f 20 6d 61  ex is held to ma
9a70: 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  ke.  ** the page
9a80: 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73  r rollback and s
9a90: 63 68 65 6d 61 20 72 65 73 65 74 20 61 6e 20 61  chema reset an a
9aa0: 74 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e  tomic operation.
9ab0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c   */.  sqlite3Rol
9ac0: 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
9ad0: 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46  ITE_OK);..  /* F
9ae0: 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64  ree any outstand
9af0: 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20 73 74  ing Savepoint st
9b00: 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73  ructures. */.  s
9b10: 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
9b20: 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a  oints(db);..  /*
9b30: 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61 62   Close all datab
9b40: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
9b50: 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  */.  for(j=0; j<
9b60: 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20  db->nDb; j++){. 
9b70: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
9b80: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b  b = &db->aDb[j];
9b90: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
9ba0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
9bb0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62  e3BtreeClose(pDb
9bc0: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44  ->pBt);.      pD
9bd0: 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20  b->pBt = 0;.    
9be0: 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20    if( j!=1 ){.  
9bf0: 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65        pDb->pSche
9c00: 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ma = 0;.      }.
9c10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43      }.  }.  /* C
9c20: 6c 65 61 72 20 74 68 65 20 54 45 4d 50 20 73 63  lear the TEMP sc
9c30: 68 65 6d 61 20 73 65 70 61 72 61 74 65 6c 79 20  hema separately 
9c40: 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66  and last */.  if
9c50: 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ( db->aDb[1].pSc
9c60: 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c 69  hema ){.    sqli
9c70: 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64  te3SchemaClear(d
9c80: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
9c90: 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  a);.  }.  sqlite
9ca0: 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28  3VtabUnlockList(
9cb0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  db);..  /* Free 
9cc0: 75 70 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  up the array of 
9cd0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
9ce0: 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ses */.  sqlite3
9cf0: 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65  CollapseDatabase
9d00: 41 72 72 61 79 28 64 62 29 3b 0a 20 20 61 73 73  Array(db);.  ass
9d10: 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20  ert( db->nDb<=2 
9d20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
9d30: 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb==db->aDbSta
9d40: 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c  tic );..  /* Tel
9d50: 6c 20 74 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f  l the code in no
9d60: 74 69 66 79 2e 63 20 74 68 61 74 20 74 68 65 20  tify.c that the 
9d70: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f  connection no lo
9d80: 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20  nger holds any. 
9d90: 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f   ** locks and do
9da0: 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
9db0: 6e 79 20 66 75 72 74 68 65 72 20 75 6e 6c 6f 63  ny further unloc
9dc0: 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63  k-notify callbac
9dd0: 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ks..  */.  sqlit
9de0: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73  e3ConnectionClos
9df0: 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69  ed(db);..  for(i
9e00: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
9e10: 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b 20 69 3b  (&db->aFunc); i;
9e20: 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
9e30: 74 28 69 29 29 7b 0a 20 20 20 20 46 75 6e 63 44  t(i)){.    FuncD
9e40: 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 3b 0a 20  ef *pNext, *p;. 
9e50: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61 73     p = sqliteHas
9e60: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 64 6f  hData(i);.    do
9e70: 7b 0a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e  {.      function
9e80: 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a  Destroy(db, p);.
9e90: 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d        pNext = p-
9ea0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
9eb0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9ec0: 70 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 70 4e  p);.      p = pN
9ed0: 65 78 74 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ext;.    }while(
9ee0: 20 70 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   p );.  }.  sqli
9ef0: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62  te3HashClear(&db
9f00: 2d 3e 61 46 75 6e 63 29 3b 0a 20 20 66 6f 72 28  ->aFunc);.  for(
9f10: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
9f20: 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  t(&db->aCollSeq)
9f30: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
9f40: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43  hNext(i)){.    C
9f50: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
9f60: 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74  (CollSeq *)sqlit
9f70: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
9f80: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20    /* Invoke any 
9f90: 64 65 73 74 72 75 63 74 6f 72 73 20 72 65 67 69  destructors regi
9fa0: 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61  stered for colla
9fb0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73  tion sequence us
9fc0: 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  er data. */.    
9fd0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b  for(j=0; j<3; j+
9fe0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  +){.      if( pC
9ff0: 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20  oll[j].xDel ){. 
a000: 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e         pColl[j].
a010: 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55  xDel(pColl[j].pU
a020: 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ser);.      }.  
a030: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
a040: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29  bFree(db, pColl)
a050: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
a060: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43  ashClear(&db->aC
a070: 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66  ollSeq);.#ifndef
a080: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
a090: 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28  TUALTABLE.  for(
a0a0: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
a0b0: 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
a0c0: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
a0d0: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f  Next(i)){.    Mo
a0e0: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
a0f0: 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73  dule *)sqliteHas
a100: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
a110: 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79  ( pMod->xDestroy
a120: 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e   ){.      pMod->
a130: 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70  xDestroy(pMod->p
a140: 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Aux);.    }.    
a150: 73 71 6c 69 74 65 33 56 74 61 62 45 70 6f 6e 79  sqlite3VtabEpony
a160: 6d 6f 75 73 54 61 62 6c 65 43 6c 65 61 72 28 64  mousTableClear(d
a170: 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 20 20 73 71  b, pMod);.    sq
a180: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
a190: 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pMod);.  }.  sql
a1a0: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
a1b0: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
a1c0: 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72  dif..  sqlite3Er
a1d0: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
a1e0: 4b 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  K); /* Deallocat
a1f0: 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72  es any cached er
a200: 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a  ror strings. */.
a210: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
a220: 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  ee(db->pErr);.  
a230: 73 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65  sqlite3CloseExte
a240: 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 23 69 66 20  nsions(db);.#if 
a250: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
a260: 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 73 71 6c  ENTICATION.  sql
a270: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75  ite3_free(db->au
a280: 74 68 2e 7a 41 75 74 68 55 73 65 72 29 3b 0a 20  th.zAuthUser);. 
a290: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
a2a0: 2d 3e 61 75 74 68 2e 7a 41 75 74 68 50 57 29 3b  ->auth.zAuthPW);
a2b0: 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d  .#endif..  db->m
a2c0: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
a2d0: 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a  GIC_ERROR;..  /*
a2e0: 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61   The temp-databa
a2f0: 73 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c  se schema is all
a300: 6f 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74  ocated different
a310: 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  ly from the othe
a320: 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62  r schema.  ** ob
a330: 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c  jects (using sql
a340: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65  iteMalloc() dire
a350: 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66  ctly, instead of
a360: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
a370: 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20  ema())..  ** So 
a380: 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  it needs to be f
a390: 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a  reed here. Todo:
a3a0: 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68   Why not roll th
a3b0: 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e  e temp schema in
a3c0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  to.  ** the same
a3d0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
a3e0: 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20  as the one that 
a3f0: 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61  allocates the da
a400: 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72  tabase .  ** str
a410: 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73  ucture?.  */.  s
a420: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a430: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
a440: 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ema);.  sqlite3_
a450: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
a460: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61  mutex);.  db->ma
a470: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
a480: 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c  IC_CLOSED;.  sql
a490: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
a4a0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
a4b0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4c 6f 6f  sert( sqlite3Loo
a4c0: 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c 30 29  kasideUsed(db,0)
a4d0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  ==0 );.  if( db-
a4e0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
a4f0: 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  oced ){.    sqli
a500: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f  te3_free(db->loo
a510: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a  kaside.pStart);.
a520: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
a530: 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 52 52 0a 20  E_ENABLE_SQLRR. 
a540: 20 53 52 52 65 63 43 6c 6f 73 65 28 64 62 29 3b   SRRecClose(db);
a550: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 71 6c  .#endif.  .  sql
a560: 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d  ite3_free(db);.}
a570: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
a580: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69   all database fi
a590: 6c 65 73 2e 20 20 49 66 20 74 72 69 70 43 6f 64  les.  If tripCod
a5a0: 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  e is not SQLITE_
a5b0: 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20  OK, then.** any 
a5c0: 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
a5d0: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 22  e invalidated ("
a5e0: 74 72 69 70 70 65 64 22 20 2d 20 61 73 20 69 6e  tripped" - as in
a5f0: 20 22 74 72 69 70 70 69 6e 67 20 61 20 63 69 72   "tripping a cir
a600: 63 75 69 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22  cuit.** breaker"
a610: 29 20 61 6e 64 20 6d 61 64 65 20 74 6f 20 72 65  ) and made to re
a620: 74 75 72 6e 20 74 72 69 70 43 6f 64 65 20 69 66  turn tripCode if
a630: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 66   there are any f
a640: 75 72 74 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70  urther.** attemp
a650: 74 73 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ts to use that c
a660: 75 72 73 6f 72 2e 20 20 52 65 61 64 20 63 75 72  ursor.  Read cur
a670: 73 6f 72 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e  sors remain open
a680: 20 61 6e 64 20 76 61 6c 69 64 0a 2a 2a 20 62 75   and valid.** bu
a690: 74 20 61 72 65 20 22 73 61 76 65 64 22 20 69 6e  t are "saved" in
a6a0: 20 63 61 73 65 20 74 68 65 20 74 61 62 6c 65 20   case the table 
a6b0: 70 61 67 65 73 20 61 72 65 20 6d 6f 76 65 64 20  pages are moved 
a6c0: 61 72 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20  around..*/.void 
a6d0: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
a6e0: 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
a6f0: 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20  int tripCode){. 
a700: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e   int i;.  int in
a710: 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 69 6e 74  Trans = 0;.  int
a720: 20 73 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20   schemaChange;. 
a730: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a740: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
a750: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
a760: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
a770: 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62  lloc();..  /* Ob
a780: 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20  tain all b-tree 
a790: 6d 75 74 65 78 65 73 20 62 65 66 6f 72 65 20 6d  mutexes before m
a7a0: 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20  aking any calls 
a7b0: 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  to BtreeRollback
a7c0: 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20 69  (). .  ** This i
a7d0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63  s important in c
a7e0: 61 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ase the transact
a7f0: 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64  ion being rolled
a800: 20 62 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d   back has.  ** m
a810: 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61  odified the data
a820: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
a830: 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78  the b-tree mutex
a840: 65 73 20 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e  es are not taken
a850: 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e  .  ** here, then
a860: 20 61 6e 6f 74 68 65 72 20 73 68 61 72 65 64 2d   another shared-
a870: 63 61 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  cache connection
a880: 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 20   might sneak in 
a890: 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65  between.  ** the
a8a0: 20 64 61 74 61 62 61 73 65 20 72 6f 6c 6c 62 61   database rollba
a8b0: 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65  ck and schema re
a8c0: 73 65 74 2c 20 77 68 69 63 68 20 63 61 6e 20 63  set, which can c
a8d0: 61 75 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20  ause false.  ** 
a8e0: 63 6f 72 72 75 70 74 69 6f 6e 20 72 65 70 6f 72  corruption repor
a8f0: 74 73 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73  ts in some cases
a900: 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
a910: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
a920: 3b 0a 20 20 73 63 68 65 6d 61 43 68 61 6e 67 65  ;.  schemaChange
a930: 20 3d 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73   = (db->mDbFlags
a940: 20 26 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61   & DBFLAG_Schema
a950: 43 68 61 6e 67 65 29 21 3d 30 20 26 26 20 64 62  Change)!=0 && db
a960: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 3b 0a  ->init.busy==0;.
a970: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
a980: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
a990: 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e   Btree *p = db->
a9a0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
a9b0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 69  if( p ){.      i
a9c0: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
a9d0: 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20  sInTrans(p) ){. 
a9e0: 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d         inTrans =
a9f0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
aa00: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
aa10: 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69 70 43 6f  llback(p, tripCo
aa20: 64 65 2c 20 21 73 63 68 65 6d 61 43 68 61 6e 67  de, !schemaChang
aa30: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
aa40: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
aa50: 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ack(db);.  sqlit
aa60: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
aa70: 63 28 29 3b 0a 0a 20 20 69 66 28 20 73 63 68 65  c();..  if( sche
aa80: 6d 61 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20  maChange ){.    
aa90: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
aaa0: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
aab0: 64 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  db, 0);.    sqli
aac0: 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d  te3ResetAllSchem
aad0: 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64  asOfConnection(d
aae0: 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  b);.  }.  sqlite
aaf0: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
ab00: 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65  b);..  /* Any de
ab10: 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
ab20: 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76  t violations hav
ab30: 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c  e now been resol
ab40: 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44  ved. */.  db->nD
ab50: 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b  eferredCons = 0;
ab60: 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  .  db->nDeferred
ab70: 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64  ImmCons = 0;.  d
ab80: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 75 36  b->flags &= ~(u6
ab90: 34 29 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b  4)SQLITE_DeferFK
aba0: 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20  s;..  /* If one 
abb0: 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75  has been configu
abc0: 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  red, invoke the 
abd0: 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61  rollback-hook ca
abe0: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  llback */.  if( 
abf0: 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
ac00: 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72 61 6e  lback && (inTran
ac10: 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f  s || !db->autoCo
ac20: 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64 62 2d  mmit) ){.    db-
ac30: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
ac40: 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  ck(db->pRollback
ac50: 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Arg);.  }.}../*.
ac60: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74  ** Return a stat
ac70: 69 63 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69  ic string contai
ac80: 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 63 6f  ning the name co
ac90: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
aca0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  he error code.**
acb0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
acc0: 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  e argument..*/.#
acd0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
ace0: 45 5f 4e 45 45 44 5f 45 52 52 5f 4e 41 4d 45 29  E_NEED_ERR_NAME)
acf0: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
ad00: 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 20  ite3ErrName(int 
ad10: 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rc){.  const cha
ad20: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
ad30: 69 6e 74 20 69 2c 20 6f 72 69 67 52 63 20 3d 20  int i, origRc = 
ad40: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
ad50: 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20  <2 && zName==0; 
ad60: 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66 66 29  i++, rc &= 0xff)
ad70: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 72 63  {.    switch( rc
ad80: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53   ){.      case S
ad90: 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20  QLITE_OK:       
ada0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
adb0: 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20  = "SQLITE_OK";  
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
add0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ade0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20  SQLITE_ERROR:   
adf0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
ae00: 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52   = "SQLITE_ERROR
ae10: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
ae20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ae30: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 53 4e   SQLITE_ERROR_SN
ae40: 41 50 53 48 4f 54 3a 20 20 20 20 20 7a 4e 61 6d  APSHOT:     zNam
ae50: 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f  e = "SQLITE_ERRO
ae60: 52 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20 20 20  R_SNAPSHOT";    
ae70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ae80: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  e SQLITE_INTERNA
ae90: 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  L:           zNa
aea0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54  me = "SQLITE_INT
aeb0: 45 52 4e 41 4c 22 3b 20 20 20 20 20 20 20 20 20  ERNAL";         
aec0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
aed0: 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20  se SQLITE_PERM: 
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
aef0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45  ame = "SQLITE_PE
af00: 52 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  RM";            
af10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
af20: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
af30: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
af40: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41  Name = "SQLITE_A
af50: 42 4f 52 54 22 3b 20 20 20 20 20 20 20 20 20 20  BORT";          
af60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
af70: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
af80: 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20  T_ROLLBACK:     
af90: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
afa0: 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b  ABORT_ROLLBACK";
afb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
afc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53   case SQLITE_BUS
afd0: 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:              
afe0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
aff0: 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20 20 20  _BUSY";         
b000: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b010: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
b020: 53 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 20 20  SY_RECOVERY:    
b030: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b040: 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 22  E_BUSY_RECOVERY"
b050: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
b060: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
b070: 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20  USY_SNAPSHOT:   
b080: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b090: 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54  TE_BUSY_SNAPSHOT
b0a0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
b0b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b0c0: 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20  LOCKED:         
b0d0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b0e0: 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20  ITE_LOCKED";    
b0f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b100: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b110: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
b120: 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  CHE: zName = "SQ
b130: 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
b140: 45 44 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a  EDCACHE";break;.
b150: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b160: 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20  E_NOMEM:        
b170: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b180: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20  QLITE_NOMEM";   
b190: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b1a0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b1b0: 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20  TE_READONLY:    
b1c0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b1d0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22  SQLITE_READONLY"
b1e0: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
b1f0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b200: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43  ITE_READONLY_REC
b210: 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20  OVERY:  zName = 
b220: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
b230: 5f 52 45 43 4f 56 45 52 59 22 3b 20 62 72 65 61  _RECOVERY"; brea
b240: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b250: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41  LITE_READONLY_CA
b260: 4e 54 49 4e 49 54 3a 20 20 7a 4e 61 6d 65 20 3d  NTINIT:  zName =
b270: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
b280: 59 5f 43 41 4e 54 49 4e 49 54 22 3b 20 62 72 65  Y_CANTINIT"; bre
b290: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b2a0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
b2b0: 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20  OLLBACK:  zName 
b2c0: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
b2d0: 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72  LY_ROLLBACK"; br
b2e0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b2f0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
b300: 44 42 4d 4f 56 45 44 3a 20 20 20 7a 4e 61 6d 65  DBMOVED:   zName
b310: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
b320: 4e 4c 59 5f 44 42 4d 4f 56 45 44 22 3b 20 20 62  NLY_DBMOVED";  b
b330: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b340: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
b350: 5f 44 49 52 45 43 54 4f 52 59 3a 20 7a 4e 61 6d  _DIRECTORY: zNam
b360: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
b370: 4f 4e 4c 59 5f 44 49 52 45 43 54 4f 52 59 22 3b  ONLY_DIRECTORY";
b380: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b390: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  e SQLITE_INTERRU
b3a0: 50 54 3a 20 20 20 20 20 20 20 20 20 20 7a 4e 61  PT:          zNa
b3b0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54  me = "SQLITE_INT
b3c0: 45 52 52 55 50 54 22 3b 20 20 20 20 20 20 20 20  ERRUPT";        
b3d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b3e0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a  se SQLITE_IOERR:
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
b400: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b410: 45 52 52 22 3b 20 20 20 20 20 20 20 20 20 20 20  ERR";           
b420: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b430: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b440: 5f 52 45 41 44 3a 20 20 20 20 20 20 20 20 20 7a  _READ:         z
b450: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b460: 4f 45 52 52 5f 52 45 41 44 22 3b 20 20 20 20 20  OERR_READ";     
b470: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b480: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b490: 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20 20 20  R_SHORT_READ:   
b4a0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b4b0: 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
b4c0: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
b4d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b4e0: 52 52 5f 57 52 49 54 45 3a 20 20 20 20 20 20 20  RR_WRITE:       
b4f0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b500: 5f 49 4f 45 52 52 5f 57 52 49 54 45 22 3b 20 20  _IOERR_WRITE";  
b510: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b520: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b530: 45 52 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 20  ERR_FSYNC:      
b540: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b550: 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20  E_IOERR_FSYNC"; 
b560: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b570: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b580: 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20  OERR_DIR_FSYNC: 
b590: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b5a0: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
b5b0: 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  NC";   break;.  
b5c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b5d0: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3a 20  IOERR_TRUNCATE: 
b5e0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b5f0: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
b600: 54 45 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  TE";    break;. 
b610: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b620: 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a 20 20 20  _IOERR_FSTAT:   
b630: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b640: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
b650: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
b660: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b670: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20  E_IOERR_UNLOCK: 
b680: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b690: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
b6a0: 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  CK";      break;
b6b0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b6c0: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a  TE_IOERR_RDLOCK:
b6d0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b6e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
b6f0: 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b  OCK";      break
b700: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b710: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
b720: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
b730: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  "SQLITE_IOERR_DE
b740: 4c 45 54 45 22 3b 20 20 20 20 20 20 62 72 65 61  LETE";      brea
b750: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b760: 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
b770: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
b780: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e   "SQLITE_IOERR_N
b790: 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65  OMEM";       bre
b7a0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b7b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
b7c0: 53 53 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  SS:       zName 
b7d0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b7e0: 41 43 43 45 53 53 22 3b 20 20 20 20 20 20 62 72  ACCESS";      br
b7f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b800: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
b810: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a  CKRESERVEDLOCK:.
b820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b840: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b850: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
b860: 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b  VEDLOCK"; break;
b870: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b880: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20  TE_IOERR_LOCK:  
b890: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b8a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
b8b0: 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  K";        break
b8c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b8d0: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a  ITE_IOERR_CLOSE:
b8e0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b8f0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  "SQLITE_IOERR_CL
b900: 4f 53 45 22 3b 20 20 20 20 20 20 20 62 72 65 61  OSE";       brea
b910: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b920: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43  LITE_IOERR_DIR_C
b930: 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d  LOSE:    zName =
b940: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44   "SQLITE_IOERR_D
b950: 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20 62 72 65  IR_CLOSE";   bre
b960: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b970: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
b980: 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  PEN:      zName 
b990: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b9a0: 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20 20 62 72  SHMOPEN";     br
b9b0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b9c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b9d0: 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65  SIZE:      zName
b9e0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b9f0: 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20 20 20 62  _SHMSIZE";     b
ba00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ba10: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
ba20: 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d  MLOCK:      zNam
ba30: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
ba40: 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20  R_SHMLOCK";     
ba50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ba60: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
ba70: 48 4d 4d 41 50 3a 20 20 20 20 20 20 20 7a 4e 61  HMMAP:       zNa
ba80: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
ba90: 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20 20 20 20  RR_SHMMAP";     
baa0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bab0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
bac0: 53 45 45 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e  SEEK:         zN
bad0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
bae0: 45 52 52 5f 53 45 45 4b 22 3b 20 20 20 20 20 20  ERR_SEEK";      
baf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bb00: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
bb10: 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a  _DELETE_NOENT: z
bb20: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
bb30: 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
bb40: 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  T";break;.      
bb50: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
bb60: 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20 20 20 20  R_MMAP:         
bb70: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bb80: 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20 20 20 20  IOERR_MMAP";    
bb90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bba0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
bbb0: 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 3a 20  RR_GETTEMPPATH: 
bbc0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bbd0: 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
bbe0: 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  TH"; break;.    
bbf0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
bc00: 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a 20 20 20  ERR_CONVPATH:   
bc10: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bc20: 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48  E_IOERR_CONVPATH
bc30: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
bc40: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
bc50: 4f 45 52 52 5f 56 4e 4f 44 45 3a 20 20 20 20 20  OERR_VNODE:     
bc60: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bc70: 54 45 5f 49 4f 45 52 52 5f 56 4e 4f 44 45 22 3b  TE_IOERR_VNODE";
bc80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bc90: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bca0: 43 4f 52 52 55 50 54 3a 20 20 20 20 20 20 20 20  CORRUPT:        
bcb0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bcc0: 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20 20  ITE_CORRUPT";   
bcd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bce0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bcf0: 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3a 20 20  _CORRUPT_VTAB:  
bd00: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bd10: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
bd20: 42 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  B";      break;.
bd30: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bd40: 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20 20 20  E_NOTFOUND:     
bd50: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bd60: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b  QLITE_NOTFOUND";
bd70: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bd80: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bd90: 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20 20  TE_FULL:        
bda0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bdb0: 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20  SQLITE_FULL";   
bdc0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
bdd0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bde0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20  ITE_CANTOPEN:   
bdf0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
be00: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
be10: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
be20: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
be30: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f  LITE_CANTOPEN_NO
be40: 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65 20 3d  TEMPDIR: zName =
be50: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
be60: 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62 72 65  N_NOTEMPDIR";bre
be70: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
be80: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
be90: 53 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d 65 20  SDIR:     zName 
bea0: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
beb0: 45 4e 5f 49 53 44 49 52 22 3b 20 20 20 20 62 72  EN_ISDIR";    br
bec0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
bed0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
bee0: 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61 6d 65  FULLPATH:  zName
bef0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
bf00: 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b 20 62  PEN_FULLPATH"; b
bf10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bf20: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
bf30: 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e 61 6d  _CONVPATH:  zNam
bf40: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
bf50: 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22 3b 20  OPEN_CONVPATH"; 
bf60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bf70: 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  e SQLITE_PROTOCO
bf80: 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  L:           zNa
bf90: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 52 4f  me = "SQLITE_PRO
bfa0: 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20 20 20  TOCOL";         
bfb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bfc0: 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a  se SQLITE_EMPTY:
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
bfe0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d  ame = "SQLITE_EM
bff0: 50 54 59 22 3b 20 20 20 20 20 20 20 20 20 20 20  PTY";           
c000: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c010: 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45 4d  ase SQLITE_SCHEM
c020: 41 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  A:             z
c030: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 53  Name = "SQLITE_S
c040: 43 48 45 4d 41 22 3b 20 20 20 20 20 20 20 20 20  CHEMA";         
c050: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c060: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42  case SQLITE_TOOB
c070: 49 47 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  IG:             
c080: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c090: 54 4f 4f 42 49 47 22 3b 20 20 20 20 20 20 20 20  TOOBIG";        
c0a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c0b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
c0c0: 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20 20 20  STRAINT:        
c0d0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c0e0: 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20 20 20  _CONSTRAINT";   
c0f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c100: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
c110: 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 3a  NSTRAINT_UNIQUE:
c120: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c130: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49  E_CONSTRAINT_UNI
c140: 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  QUE"; break;.   
c150: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
c160: 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45  ONSTRAINT_TRIGGE
c170: 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  R: zName = "SQLI
c180: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52  TE_CONSTRAINT_TR
c190: 49 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a 20 20  IGGER";break;.  
c1a0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c1b0: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
c1c0: 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20  GNKEY:.         
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1e0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c1f0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c200: 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b 20 20  T_FOREIGNKEY";  
c210: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c220: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
c230: 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20 7a 4e  AINT_CHECK:   zN
c240: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
c250: 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 22 3b  NSTRAINT_CHECK";
c260: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c270: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
c280: 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
c290: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
c2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2b0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c2c0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49  E_CONSTRAINT_PRI
c2d0: 4d 41 52 59 4b 45 59 22 3b 20 20 20 62 72 65 61  MARYKEY";   brea
c2e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c2f0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
c300: 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d  NOTNULL: zName =
c310: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
c320: 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65  INT_NOTNULL";bre
c330: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c340: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c350: 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20  _COMMITHOOK:.   
c360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c370: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
c380: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
c390: 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f  STRAINT_COMMITHO
c3a0: 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  OK";   break;.  
c3b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c3c0: 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 3a  CONSTRAINT_VTAB:
c3d0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c3e0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56  ITE_CONSTRAINT_V
c3f0: 54 41 42 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  TAB";   break;. 
c400: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c410: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43  _CONSTRAINT_FUNC
c420: 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20 20 20  TION:.          
c430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c440: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c450: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c460: 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20 20 20  _FUNCTION";     
c470: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c480: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
c490: 49 4e 54 5f 52 4f 57 49 44 3a 20 20 20 7a 4e 61  INT_ROWID:   zNa
c4a0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
c4b0: 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 22 3b 20  STRAINT_ROWID"; 
c4c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c4d0: 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  se SQLITE_MISMAT
c4e0: 43 48 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  CH:           zN
c4f0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49  ame = "SQLITE_MI
c500: 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20 20 20  SMATCH";        
c510: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c520: 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  ase SQLITE_MISUS
c530: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  E:             z
c540: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d  Name = "SQLITE_M
c550: 49 53 55 53 45 22 3b 20 20 20 20 20 20 20 20 20  ISUSE";         
c560: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c570: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  case SQLITE_NOLF
c580: 53 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S:              
c590: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c5a0: 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20 20 20  NOLFS";         
c5b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c5c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55 54   case SQLITE_AUT
c5d0: 48 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H:              
c5e0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c5f0: 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20 20 20  _AUTH";         
c600: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c610: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4f    case SQLITE_FO
c620: 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20 20 20  RMAT:           
c630: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c640: 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20 20  E_FORMAT";      
c650: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c660: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
c670: 41 4e 47 45 3a 20 20 20 20 20 20 20 20 20 20 20  ANGE:           
c680: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c690: 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20 20  TE_RANGE";      
c6a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c6b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c6c0: 4e 4f 54 41 44 42 3a 20 20 20 20 20 20 20 20 20  NOTADB:         
c6d0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c6e0: 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20  ITE_NOTADB";    
c6f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c700: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c710: 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 20 20 20  _ROW:           
c720: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c730: 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20 20 20  LITE_ROW";      
c740: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c750: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c760: 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20 20 20  E_NOTICE:       
c770: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c780: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b 20 20  QLITE_NOTICE";  
c790: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c7a0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c7b0: 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
c7c0: 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22  R_WAL: zName = "
c7d0: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
c7e0: 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65 61 6b  COVER_WAL";break
c7f0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c800: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
c810: 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20  ER_ROLLBACK:.   
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
c840: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54  me = "SQLITE_NOT
c850: 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c  ICE_RECOVER_ROLL
c860: 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20  BACK"; break;.  
c870: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c880: 57 41 52 4e 49 4e 47 3a 20 20 20 20 20 20 20 20  WARNING:        
c890: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c8a0: 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20 20 20  ITE_WARNING";   
c8b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c8c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c8d0: 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44  _WARNING_AUTOIND
c8e0: 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  EX:  zName = "SQ
c8f0: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54  LITE_WARNING_AUT
c900: 4f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  OINDEX"; break;.
c910: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c920: 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20 20 20  E_DONE:         
c930: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c940: 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20  QLITE_DONE";    
c950: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c960: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c970: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
c980: 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 42 75   static char zBu
c990: 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  f[50];.    sqlit
c9a0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
c9b0: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
c9c0: 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28  "SQLITE_UNKNOWN(
c9d0: 25 64 29 22 2c 20 6f 72 69 67 52 63 29 3b 0a 20  %d)", origRc);. 
c9e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75 66 3b     zName = zBuf;
c9f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
ca00: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ame;.}.#endif../
ca10: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
ca20: 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61 74  atic string that
ca30: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b   describes the k
ca40: 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65  ind of error spe
ca50: 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  cified in the.**
ca60: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f   argument..*/.co
ca70: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
ca80: 33 45 72 72 53 74 72 28 69 6e 74 20 72 63 29 7b  3ErrStr(int rc){
ca90: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
caa0: 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67  char* const aMsg
cab0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51  [] = {.    /* SQ
cac0: 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20  LITE_OK         
cad0: 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f   */ "not an erro
cae0: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
caf0: 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a 2f  E_ERROR       */
cb00: 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f   "SQL logic erro
cb10: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
cb20: 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f  E_INTERNAL    */
cb30: 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54   0,.    /* SQLIT
cb40: 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a 2f  E_PERM        */
cb50: 20 22 61 63 63 65 73 73 20 70 65 72 6d 69 73 73   "access permiss
cb60: 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20  ion denied",.   
cb70: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54   /* SQLITE_ABORT
cb80: 20 20 20 20 20 20 20 2a 2f 20 22 71 75 65 72 79         */ "query
cb90: 20 61 62 6f 72 74 65 64 22 2c 0a 20 20 20 20 2f   aborted",.    /
cba0: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20  * SQLITE_BUSY   
cbb0: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
cbc0: 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20  e is locked",.  
cbd0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b    /* SQLITE_LOCK
cbe0: 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61  ED      */ "data
cbf0: 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f  base table is lo
cc00: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
cc10: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20  LITE_NOMEM      
cc20: 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f   */ "out of memo
cc30: 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ry",.    /* SQLI
cc40: 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a  TE_READONLY    *
cc50: 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72  / "attempt to wr
cc60: 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64  ite a readonly d
cc70: 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a  atabase",.    /*
cc80: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
cc90: 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70  T   */ "interrup
cca0: 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ted",.    /* SQL
ccb0: 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20  ITE_IOERR       
ccc0: 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72  */ "disk I/O err
ccd0: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
cce0: 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a  TE_CORRUPT     *
ccf0: 2f 20 22 64 61 74 61 62 61 73 65 20 64 69 73 6b  / "database disk
cd00: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
cd10: 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  med",.    /* SQL
cd20: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20  ITE_NOTFOUND    
cd30: 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72  */ "unknown oper
cd40: 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53  ation",.    /* S
cd50: 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20  QLITE_FULL      
cd60: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f    */ "database o
cd70: 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c  r disk is full",
cd80: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
cd90: 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75  ANTOPEN    */ "u
cda0: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
cdb0: 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20  tabase file",.  
cdc0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54    /* SQLITE_PROT
cdd0: 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b  OCOL    */ "lock
cde0: 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20  ing protocol",. 
cdf0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50     /* SQLITE_EMP
ce00: 54 59 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20  TY       */ 0,. 
ce10: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48     /* SQLITE_SCH
ce20: 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74  EMA      */ "dat
ce30: 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
ce40: 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f   changed",.    /
ce50: 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20  * SQLITE_TOOBIG 
ce60: 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20       */ "string 
ce70: 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22  or blob too big"
ce80: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
ce90: 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22  CONSTRAINT  */ "
cea0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
ceb0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
cec0: 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f  E_MISMATCH    */
ced0: 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61   "datatype misma
cee0: 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  tch",.    /* SQL
cef0: 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20  ITE_MISUSE      
cf00: 2a 2f 20 22 62 61 64 20 70 61 72 61 6d 65 74 65  */ "bad paramete
cf10: 72 20 6f 72 20 6f 74 68 65 72 20 41 50 49 20 6d  r or other API m
cf20: 69 73 75 73 65 22 2c 0a 23 69 66 64 65 66 20 53  isuse",.#ifdef S
cf30: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
cf40: 53 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  S.    /* SQLITE_
cf50: 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 22  NOLFS       */ "
cf60: 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f  large file suppo
cf70: 72 74 20 69 73 20 64 69 73 61 62 6c 65 64 22 2c  rt is disabled",
cf80: 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 53 51  .#else.    /* SQ
cf90: 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20  LITE_NOLFS      
cfa0: 20 2a 2f 20 30 2c 0a 23 65 6e 64 69 66 0a 20 20   */ 0,.#endif.  
cfb0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48    /* SQLITE_AUTH
cfc0: 20 20 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68          */ "auth
cfd0: 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64  orization denied
cfe0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
cff0: 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20  _FORMAT      */ 
d000: 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  0,.    /* SQLITE
d010: 5f 52 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20  _RANGE       */ 
d020: 22 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75  "column index ou
d030: 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20 20  t of range",.   
d040: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44   /* SQLITE_NOTAD
d050: 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65 20  B      */ "file 
d060: 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73  is not a databas
d070: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
d080: 45 5f 4e 4f 54 49 43 45 20 20 20 20 20 20 2a 2f  E_NOTICE      */
d090: 20 22 6e 6f 74 69 66 69 63 61 74 69 6f 6e 20 6d   "notification m
d0a0: 65 73 73 61 67 65 22 2c 0a 20 20 20 20 2f 2a 20  essage",.    /* 
d0b0: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 20 20  SQLITE_WARNING  
d0c0: 20 20 20 2a 2f 20 22 77 61 72 6e 69 6e 67 20 6d     */ "warning m
d0d0: 65 73 73 61 67 65 22 2c 0a 20 20 7d 3b 0a 20 20  essage",.  };.  
d0e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
d0f0: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f   = "unknown erro
d100: 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63  r";.  switch( rc
d110: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
d120: 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
d130: 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72  CK: {.      zErr
d140: 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74 6f   = "abort due to
d150: 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20   ROLLBACK";.    
d160: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d170: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
d180: 4f 57 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72  OW: {.      zErr
d190: 20 3d 20 22 61 6e 6f 74 68 65 72 20 72 6f 77 20   = "another row 
d1a0: 61 76 61 69 6c 61 62 6c 65 22 3b 0a 20 20 20 20  available";.    
d1b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d1c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44     case SQLITE_D
d1d0: 4f 4e 45 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ONE: {.      zEr
d1e0: 72 20 3d 20 22 6e 6f 20 6d 6f 72 65 20 72 6f 77  r = "no more row
d1f0: 73 20 61 76 61 69 6c 61 62 6c 65 22 3b 0a 20 20  s available";.  
d200: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d210: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
d220: 20 20 20 20 20 20 72 63 20 26 3d 20 30 78 66 66        rc &= 0xff
d230: 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  ;.      if( ALWA
d240: 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c  YS(rc>=0) && rc<
d250: 41 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29 20  ArraySize(aMsg) 
d260: 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29  && aMsg[rc]!=0 )
d270: 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d  {.        zErr =
d280: 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20   aMsg[rc];.     
d290: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
d2a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
d2b0: 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zErr;.}../*.*
d2c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
d2d0: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79  mplements a busy
d2e0: 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73   callback that s
d2f0: 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a  leeps and tries.
d300: 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61  ** again until a
d310: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69   timeout value i
d320: 73 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20  s reached.  The 
d330: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
d340: 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e  .** an integer n
d350: 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
d360: 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20  conds passed in 
d370: 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  as the first.** 
d380: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
d390: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
d3a0: 74 6f 20 72 65 74 72 79 20 74 68 65 20 6c 6f 63  to retry the loc
d3b0: 6b 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20  k.  Return zero 
d3c0: 74 6f 20 73 74 6f 70 20 74 72 79 69 6e 67 0a 2a  to stop trying.*
d3d0: 2a 20 61 6e 64 20 63 61 75 73 65 20 53 51 4c 69  * and cause SQLi
d3e0: 74 65 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c  te to return SQL
d3f0: 49 54 45 5f 42 55 53 59 2e 0a 2a 2f 0a 73 74 61  ITE_BUSY..*/.sta
d400: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65  tic int sqliteDe
d410: 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63  faultBusyCallbac
d420: 6b 28 0a 20 20 76 6f 69 64 20 2a 70 74 72 2c 20  k(.  void *ptr, 
d430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d440: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
d450: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  tion */.  int co
d460: 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  unt,            
d470: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d480: 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20  times table has 
d490: 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 73  been busy */.  s
d4a0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
d4b0: 6c 65 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  le      /* The f
d4c0: 69 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 68 65  ile on which the
d4d0: 20 6c 6f 63 6b 20 6f 63 63 75 72 72 65 64 20 2a   lock occurred *
d4e0: 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  /.){.#if SQLITE_
d4f0: 4f 53 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f 55  OS_WIN || HAVE_U
d500: 53 4c 45 45 50 0a 20 20 2f 2a 20 54 68 69 73 20  SLEEP.  /* This 
d510: 63 61 73 65 20 69 73 20 66 6f 72 20 73 79 73 74  case is for syst
d520: 65 6d 73 20 74 68 61 74 20 68 61 76 65 20 73 75  ems that have su
d530: 70 70 6f 72 74 20 66 6f 72 20 73 6c 65 65 70 69  pport for sleepi
d540: 6e 67 20 66 6f 72 20 66 72 61 63 74 69 6f 6e 73  ng for fractions
d550: 20 6f 66 0a 20 20 2a 2a 20 61 20 73 65 63 6f 6e   of.  ** a secon
d560: 64 2e 20 20 45 78 61 6d 70 6c 65 73 3a 20 20 41  d.  Examples:  A
d570: 6c 6c 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65  ll windows syste
d580: 6d 73 2c 20 75 6e 69 78 20 73 79 73 74 65 6d 73  ms, unix systems
d590: 20 77 69 74 68 20 75 73 6c 65 65 70 28 29 20 2a   with usleep() *
d5a0: 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
d5b0: 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20   u8 delays[] =. 
d5c0: 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31      { 1, 2, 5, 1
d5d0: 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c 20 32  0, 15, 20, 25, 2
d5e0: 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20 35 30  5,  25,  50,  50
d5f0: 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61 74 69  , 100 };.  stati
d600: 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c  c const u8 total
d610: 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20  s[] =.     { 0, 
d620: 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20 33 33  1, 3,  8, 18, 33
d630: 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c 20 31  , 53, 78, 103, 1
d640: 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a  28, 178, 228 };.
d650: 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41 59 20  # define NDELAY 
d660: 41 72 72 61 79 53 69 7a 65 28 64 65 6c 61 79 73  ArraySize(delays
d670: 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ).  sqlite3 *db 
d680: 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72  = (sqlite3 *)ptr
d690: 3b 0a 20 20 69 6e 74 20 74 6d 6f 75 74 20 3d 20  ;.  int tmout = 
d6a0: 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b  db->busyTimeout;
d6b0: 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72  .  int delay, pr
d6c0: 69 6f 72 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ior;..#ifdef SQL
d6d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b  ITE_ENABLE_SETLK
d6e0: 5f 54 49 4d 45 4f 55 54 0a 20 20 69 66 28 20 73  _TIMEOUT.  if( s
d6f0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
d700: 72 6f 6c 28 70 46 69 6c 65 2c 53 51 4c 49 54 45  rol(pFile,SQLITE
d710: 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 5f 54 49 4d 45  _FCNTL_LOCK_TIME
d720: 4f 55 54 2c 26 74 6d 6f 75 74 29 3d 3d 53 51 4c  OUT,&tmout)==SQL
d730: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
d740: 28 20 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  ( count ){.     
d750: 20 74 6d 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20   tmout = 0;.    
d760: 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
d770: 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20 53 51  ontrol(pFile, SQ
d780: 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 5f  LITE_FCNTL_LOCK_
d790: 54 49 4d 45 4f 55 54 2c 20 26 74 6d 6f 75 74 29  TIMEOUT, &tmout)
d7a0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
d7b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d7c0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
d7d0: 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
d7e0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
d7f0: 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20  pFile);.#endif. 
d800: 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d   assert( count>=
d810: 30 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74  0 );.  if( count
d820: 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20   < NDELAY ){.   
d830: 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b   delay = delays[
d840: 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f  count];.    prio
d850: 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74  r = totals[count
d860: 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
d870: 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e  delay = delays[N
d880: 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72  DELAY-1];.    pr
d890: 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45  ior = totals[NDE
d8a0: 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28  LAY-1] + delay*(
d8b0: 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29  count-(NDELAY-1)
d8c0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69  );.  }.  if( pri
d8d0: 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 6d 6f  or + delay > tmo
d8e0: 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20  ut ){.    delay 
d8f0: 3d 20 74 6d 6f 75 74 20 2d 20 70 72 69 6f 72 3b  = tmout - prior;
d900: 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d  .    if( delay<=
d910: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
d920: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
d930: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c  ep(db->pVfs, del
d940: 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75  ay*1000);.  retu
d950: 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a  rn 1;.#else.  /*
d960: 20 54 68 69 73 20 63 61 73 65 20 66 6f 72 20 75   This case for u
d970: 6e 69 78 20 73 79 73 74 65 6d 73 20 74 68 61 74  nix systems that
d980: 20 6c 61 63 6b 20 75 73 6c 65 65 70 28 29 20 73   lack usleep() s
d990: 75 70 70 6f 72 74 2e 20 20 53 6c 65 65 70 69 6e  upport.  Sleepin
d9a0: 67 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 64  g.  ** must be d
d9b0: 6f 6e 65 20 69 6e 20 69 6e 63 72 65 6d 65 6e 74  one in increment
d9c0: 73 20 6f 66 20 77 68 6f 6c 65 20 73 65 63 6f 6e  s of whole secon
d9d0: 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ds */.  sqlite3 
d9e0: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
d9f0: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 6d 6f 75  )ptr;.  int tmou
da00: 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29  t = ((sqlite3 *)
da10: 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75  ptr)->busyTimeou
da20: 74 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  t;.  UNUSED_PARA
da30: 4d 45 54 45 52 28 70 46 69 6c 65 29 3b 0a 20 20  METER(pFile);.  
da40: 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30  if( (count+1)*10
da50: 30 30 20 3e 20 74 6d 6f 75 74 20 29 7b 0a 20 20  00 > tmout ){.  
da60: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
da70: 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70    sqlite3OsSleep
da80: 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30  (db->pVfs, 10000
da90: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  00);.  return 1;
daa0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
dab0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
dac0: 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a  n busy handler..
dad0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
dae0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
daf0: 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66  n an operation f
db00: 61 69 6c 65 64 20 74 6f 20 61 63 71 75 69 72 65  ailed to acquire
db10: 20 61 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 56 46   a.** lock on VF
db20: 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 0a 2a 2a  S file pFile..**
db30: 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74  .** If this rout
db40: 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ine returns non-
db50: 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
db60: 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20 69  s retried.  If i
db70: 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c 20  t.** returns 0, 
db80: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 62  the operation ab
db90: 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51 4c  orts with an SQL
dba0: 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a  ITE_BUSY error..
dbb0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
dbc0: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
dbd0: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 2c 20  BusyHandler *p, 
dbe0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
dbf0: 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ile){.  int rc;.
dc00: 20 20 69 66 28 20 70 2d 3e 78 42 75 73 79 48 61    if( p->xBusyHa
dc10: 6e 64 6c 65 72 3d 3d 30 20 7c 7c 20 70 2d 3e 6e  ndler==0 || p->n
dc20: 42 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20  Busy<0 ) return 
dc30: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 62 45 78 74  0;.  if( p->bExt
dc40: 72 61 46 69 6c 65 41 72 67 20 29 7b 0a 20 20 20  raFileArg ){.   
dc50: 20 2f 2a 20 41 64 64 20 61 6e 20 65 78 74 72 61   /* Add an extra
dc60: 20 70 61 72 61 6d 65 74 65 72 20 77 69 74 68 20   parameter with 
dc70: 74 68 65 20 70 46 69 6c 65 20 70 6f 69 6e 74 65  the pFile pointe
dc80: 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
dc90: 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 62  the.    ** callb
dca0: 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 6c 69 73  ack argument lis
dcb0: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28 2a 78  t */.    int (*x
dcc0: 54 72 61 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 73  Tra)(void*,int,s
dcd0: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 20  qlite3_file*);. 
dce0: 20 20 20 78 54 72 61 20 3d 20 28 69 6e 74 28 2a     xTra = (int(*
dcf0: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 73 71 6c 69  )(void*,int,sqli
dd00: 74 65 33 5f 66 69 6c 65 2a 29 29 70 2d 3e 78 42  te3_file*))p->xB
dd10: 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20  usyHandler;.    
dd20: 72 63 20 3d 20 78 54 72 61 28 70 2d 3e 70 42 75  rc = xTra(p->pBu
dd30: 73 79 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 2c  syArg, p->nBusy,
dd40: 20 70 46 69 6c 65 29 3b 0a 20 20 7d 65 6c 73 65   pFile);.  }else
dd50: 7b 0a 20 20 20 20 2f 2a 20 4c 65 67 61 63 79 20  {.    /* Legacy 
dd60: 73 74 79 6c 65 20 62 75 73 79 20 68 61 6e 64 6c  style busy handl
dd70: 65 72 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20  er callback */. 
dd80: 20 20 20 72 63 20 3d 20 70 2d 3e 78 42 75 73 79     rc = p->xBusy
dd90: 48 61 6e 64 6c 65 72 28 70 2d 3e 70 42 75 73 79  Handler(p->pBusy
dda0: 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a  Arg, p->nBusy);.
ddb0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20    }.  if( rc==0 
ddc0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 20  ){.    p->nBusy 
ddd0: 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
dde0: 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20     p->nBusy++;. 
ddf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20   }.  return rc; 
de00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
de10: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
de20: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f  busy callback fo
de30: 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61  r an Sqlite data
de40: 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67  base to the.** g
de50: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75  iven callback fu
de60: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
de70: 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  given argument..
de80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  */.int sqlite3_b
de90: 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73  usy_handler(.  s
dea0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e  qlite3 *db,.  in
deb0: 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a  t (*xBusy)(void*
dec0: 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
ded0: 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51  Arg.){.#ifdef SQ
dee0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
def0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
df00: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
df10: 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
df20: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
df30: 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
df40: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
df50: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
df60: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 42  ->busyHandler.xB
df70: 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75  usyHandler = xBu
df80: 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  sy;.  db->busyHa
df90: 6e 64 6c 65 72 2e 70 42 75 73 79 41 72 67 20 3d  ndler.pBusyArg =
dfa0: 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73   pArg;.  db->bus
dfb0: 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d  yHandler.nBusy =
dfc0: 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61   0;.  db->busyHa
dfd0: 6e 64 6c 65 72 2e 62 45 78 74 72 61 46 69 6c 65  ndler.bExtraFile
dfe0: 41 72 67 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62  Arg = 0;.  db->b
dff0: 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a  usyTimeout = 0;.
e000: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
e010: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
e020: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
e030: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
e040: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
e050: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f  GRESS_CALLBACK./
e060: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e070: 65 20 73 65 74 73 20 74 68 65 20 70 72 6f 67 72  e sets the progr
e080: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ess callback for
e090: 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62   an Sqlite datab
e0a0: 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69  ase to the.** gi
e0b0: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ven callback fun
e0c0: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
e0d0: 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  iven argument. T
e0e0: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
e0f0: 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  back will.** be 
e100: 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f  invoked every nO
e110: 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76  ps opcodes..*/.v
e120: 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67  oid sqlite3_prog
e130: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20  ress_handler(.  
e140: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
e150: 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20  int nOps,.  int 
e160: 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69  (*xProgress)(voi
e170: 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41  d*), .  void *pA
e180: 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  rg.){.#ifdef SQL
e190: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
e1a0: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
e1b0: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
e1c0: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
e1d0: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
e1e0: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
e1f0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
e200: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
e210: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
e220: 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20   if( nOps>0 ){. 
e230: 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73     db->xProgress
e240: 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20   = xProgress;.  
e250: 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f    db->nProgressO
e260: 70 73 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 6e  ps = (unsigned)n
e270: 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72  Ops;.    db->pPr
e280: 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41 72 67  ogressArg = pArg
e290: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
e2a0: 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30  b->xProgress = 0
e2b0: 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72  ;.    db->nProgr
e2c0: 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20  essOps = 0;.    
e2d0: 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67  db->pProgressArg
e2e0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
e2f0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
e300: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65  db->mutex);.}.#e
e310: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ndif.../*.** Thi
e320: 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c  s routine instal
e330: 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62 75 73  ls a default bus
e340: 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77  y handler that w
e350: 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20  aits for the.** 
e360: 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72  specified number
e370: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
e380: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
e390: 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  g 0..*/.int sqli
e3a0: 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
e3b0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
e3c0: 74 20 6d 73 29 7b 0a 23 69 66 64 65 66 20 53 51  t ms){.#ifdef SQ
e3d0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
e3e0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
e3f0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
e400: 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
e410: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
e420: 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  T;.#endif.  if( 
e430: 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ms>0 ){.    sqli
e440: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
e450: 28 64 62 2c 20 28 69 6e 74 28 2a 29 28 76 6f 69  (db, (int(*)(voi
e460: 64 2a 2c 69 6e 74 29 29 73 71 6c 69 74 65 44 65  d*,int))sqliteDe
e470: 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63  faultBusyCallbac
e480: 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k,.             
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20 20 20  (void*)db);.    
e4b0: 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20  db->busyTimeout 
e4c0: 3d 20 6d 73 3b 0a 20 20 20 20 64 62 2d 3e 62 75  = ms;.    db->bu
e4d0: 73 79 48 61 6e 64 6c 65 72 2e 62 45 78 74 72 61  syHandler.bExtra
e4e0: 46 69 6c 65 41 72 67 20 3d 20 31 3b 0a 20 20 7d  FileArg = 1;.  }
e4f0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
e500: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64  3_busy_handler(d
e510: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  b, 0, 0);.  }.  
e520: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e530: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65  ;.}../*.** Cause
e540: 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70 65   any pending ope
e550: 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61  ration to stop a
e560: 74 20 69 74 73 20 65 61 72 6c 69 65 73 74 20 6f  t its earliest o
e570: 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76  pportunity..*/.v
e580: 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  oid sqlite3_inte
e590: 72 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a 64  rrupt(sqlite3 *d
e5a0: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
e5b0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
e5c0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
e5d0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
e5e0: 62 29 20 26 26 20 28 64 62 3d 3d 30 20 7c 7c 20  b) && (db==0 || 
e5f0: 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54  db->magic!=SQLIT
e600: 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 29 20  E_MAGIC_ZOMBIE) 
e610: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
e620: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
e630: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
e640: 0a 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e 75 31  .#endif.  db->u1
e650: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d  .isInterrupted =
e660: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   1;.}.../*.** Th
e670: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  is function is e
e680: 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
e690: 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  as sqlite3_creat
e6a0: 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78  e_function(), ex
e6b0: 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20  cept.** that it 
e6c0: 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62  is designed to b
e6d0: 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65  e called by inte
e6e0: 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64  rnal code. The d
e6f0: 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20  ifference is.** 
e700: 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63  that if a malloc
e710: 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69  () fails in sqli
e720: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
e730: 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20  ion(), an error 
e740: 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72  code.** is retur
e750: 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c  ned and the mall
e760: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c  ocFailed flag cl
e770: 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73  eared. .*/.int s
e780: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
e790: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
e7a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e7b0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20  FunctionName,.  
e7c0: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
e7d0: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73  enc,.  void *pUs
e7e0: 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28  erData,.  void (
e7f0: 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33  *xSFunc)(sqlite3
e800: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
e810: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
e820: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
e830: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e840: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
e850: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
e860: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
e870: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76  3_context*),.  v
e880: 6f 69 64 20 28 2a 78 56 61 6c 75 65 29 28 73 71  oid (*xValue)(sq
e890: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c  lite3_context*),
e8a0: 0a 20 20 76 6f 69 64 20 28 2a 78 49 6e 76 65 72  .  void (*xInver
e8b0: 73 65 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  se)(sqlite3_cont
e8c0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
e8d0: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 46 75  _value **),.  Fu
e8e0: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44  ncDestructor *pD
e8f0: 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46  estructor.){.  F
e900: 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74  uncDef *p;.  int
e910: 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65 78   nName;.  int ex
e920: 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73 73  traFlags;..  ass
e930: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e940: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
e950: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
e960: 78 56 61 6c 75 65 3d 3d 30 20 7c 7c 20 78 53 46  xValue==0 || xSF
e970: 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  unc==0 );.  if( 
e980: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30  zFunctionName==0
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9a0: 2f 2a 20 4d 75 73 74 20 68 61 76 65 20 61 20 76  /* Must have a v
e9b0: 61 6c 69 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  alid name */.   
e9c0: 7c 7c 20 28 78 53 46 75 6e 63 21 3d 30 20 26 26  || (xSFunc!=0 &&
e9d0: 20 78 46 69 6e 61 6c 21 3d 30 29 20 20 20 20 20   xFinal!=0)     
e9e0: 20 20 20 2f 2a 20 4e 6f 74 20 62 6f 74 68 20 78     /* Not both x
e9f0: 53 46 75 6e 63 20 61 6e 64 20 78 46 69 6e 61 6c  SFunc and xFinal
ea00: 20 2a 2f 0a 20 20 20 7c 7c 20 28 28 78 46 69 6e   */.   || ((xFin
ea10: 61 6c 3d 3d 30 29 21 3d 28 78 53 74 65 70 3d 3d  al==0)!=(xStep==
ea20: 30 29 29 20 20 20 20 20 20 20 2f 2a 20 42 6f 74  0))       /* Bot
ea30: 68 20 6f 72 20 6e 65 69 74 68 65 72 20 6f 66 20  h or neither of 
ea40: 78 46 69 6e 61 6c 20 61 6e 64 20 78 53 74 65 70  xFinal and xStep
ea50: 20 2a 2f 0a 20 20 20 7c 7c 20 28 28 78 56 61 6c   */.   || ((xVal
ea60: 75 65 3d 3d 30 29 21 3d 28 78 49 6e 76 65 72 73  ue==0)!=(xInvers
ea70: 65 3d 3d 30 29 29 20 20 20 20 2f 2a 20 42 6f 74  e==0))    /* Bot
ea80: 68 20 6f 72 20 6e 65 69 74 68 65 72 20 6f 66 20  h or neither of 
ea90: 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73 65  xValue, xInverse
eaa0: 20 2a 2f 0a 20 20 20 7c 7c 20 28 6e 41 72 67 3c   */.   || (nArg<
eab0: 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54  -1 || nArg>SQLIT
eac0: 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
ead0: 52 47 29 0a 20 20 20 7c 7c 20 28 32 35 35 3c 28  RG).   || (255<(
eae0: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
eaf0: 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74 69  trlen30( zFuncti
eb00: 6f 6e 4e 61 6d 65 29 29 29 0a 20 20 29 7b 0a 20  onName))).  ){. 
eb10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
eb20: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
eb30: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  }..  assert( SQL
eb40: 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e  ITE_FUNC_CONSTAN
eb50: 54 3d 3d 53 51 4c 49 54 45 5f 44 45 54 45 52 4d  T==SQLITE_DETERM
eb60: 49 4e 49 53 54 49 43 20 29 3b 0a 20 20 65 78 74  INISTIC );.  ext
eb70: 72 61 46 6c 61 67 73 20 3d 20 65 6e 63 20 26 20  raFlags = enc & 
eb80: 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
eb90: 49 53 54 49 43 3b 0a 20 20 65 6e 63 20 26 3d 20  ISTIC;.  enc &= 
eba0: 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43  (SQLITE_FUNC_ENC
ebb0: 4d 41 53 4b 7c 53 51 4c 49 54 45 5f 41 4e 59 29  MASK|SQLITE_ANY)
ebc0: 3b 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.  .#ifndef SQL
ebd0: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
ebe0: 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54   /* If SQLITE_UT
ebf0: 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64  F16 is specified
ec00: 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
ec10: 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d   type, transform
ec20: 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e   this.  ** to on
ec30: 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31  e of SQLITE_UTF1
ec40: 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54  6LE or SQLITE_UT
ec50: 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a  F16BE using the.
ec60: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31    ** SQLITE_UTF1
ec70: 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53  6NATIVE macro. S
ec80: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e  QLITE_UTF16 is n
ec90: 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  ot used internal
eca0: 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ly..  **.  ** If
ecb0: 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20 73   SQLITE_ANY is s
ecc0: 70 65 63 69 66 69 65 64 2c 20 61 64 64 20 74 68  pecified, add th
ecd0: 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ree versions of 
ece0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  the function.  *
ecf0: 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61  * to the hash ta
ed00: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
ed10: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
ed20: 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53  6 ){.    enc = S
ed30: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
ed40: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  E;.  }else if( e
ed50: 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29  nc==SQLITE_ANY )
ed60: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
ed70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
ed80: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
ed90: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67  nctionName, nArg
eda0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 65 78  , SQLITE_UTF8|ex
edb0: 74 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20  traFlags,.      
edc0: 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 53     pUserData, xS
edd0: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
ede0: 6e 61 6c 2c 20 78 56 61 6c 75 65 2c 20 78 49 6e  nal, xValue, xIn
edf0: 76 65 72 73 65 2c 20 70 44 65 73 74 72 75 63 74  verse, pDestruct
ee00: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  or);.    if( rc=
ee10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ee20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ee30: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
ee40: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41  FunctionName, nA
ee50: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  rg, SQLITE_UTF16
ee60: 4c 45 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20  LE|extraFlags,. 
ee70: 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61           pUserDa
ee80: 74 61 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65  ta, xSFunc, xSte
ee90: 70 2c 20 78 46 69 6e 61 6c 2c 20 78 56 61 6c 75  p, xFinal, xValu
eea0: 65 2c 20 78 49 6e 76 65 72 73 65 2c 20 70 44 65  e, xInverse, pDe
eeb0: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d  structor);.    }
eec0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
eed0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
eee0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
eef0: 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  .    enc = SQLIT
ef00: 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23  E_UTF16BE;.  }.#
ef10: 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c  else.  enc = SQL
ef20: 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66  ITE_UTF8;.#endif
ef30: 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
ef40: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75  f an existing fu
ef50: 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
ef60: 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65  overridden or de
ef70: 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20  leted. If so,.  
ef80: 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
ef90: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65   active VMs, the
efa0: 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
efb0: 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74  BUSY. If a funct
efc0: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e  ion.  ** is bein
efd0: 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c  g overridden/del
efe0: 65 74 65 64 20 62 75 74 20 74 68 65 72 65 20 61  eted but there a
eff0: 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
f000: 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a  , allow the.  **
f010: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f   operation to co
f020: 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c  ntinue but inval
f030: 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d  idate all precom
f040: 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
f050: 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ..  */.  p = sql
f060: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
f070: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
f080: 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e  me, nArg, (u8)en
f090: 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26  c, 0);.  if( p &
f0a0: 26 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  & (p->funcFlags 
f0b0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e  & SQLITE_FUNC_EN
f0c0: 43 4d 41 53 4b 29 3d 3d 28 75 33 32 29 65 6e 63  CMASK)==(u32)enc
f0d0: 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72   && p->nArg==nAr
f0e0: 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  g ){.    if( db-
f0f0: 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a  >nVdbeActive ){.
f100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
f110: 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
f120: 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20  LITE_BUSY, .    
f130: 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64      "unable to d
f140: 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65  elete/modify use
f150: 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74  r-function due t
f160: 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  o active stateme
f170: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73  nts");.      ass
f180: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
f190: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
f1a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
f1b0: 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  SY;.    }else{. 
f1c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69       sqlite3Expi
f1d0: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
f1e0: 65 6e 74 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  ents(db, 0);.   
f1f0: 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71   }.  }..  p = sq
f200: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
f210: 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  n(db, zFunctionN
f220: 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65  ame, nArg, (u8)e
f230: 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74  nc, 1);.  assert
f240: 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  (p || db->malloc
f250: 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28 20 21  Failed);.  if( !
f260: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
f270: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
f280: 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  T;.  }..  /* If 
f290: 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  an older version
f2a0: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
f2b0: 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75 72   with a configur
f2c0: 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  ed destructor is
f2d0: 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c  .  ** being repl
f2e0: 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65 20  aced invoke the 
f2f0: 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74  destructor funct
f300: 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66  ion here. */.  f
f310: 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64  unctionDestroy(d
f320: 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70 44  b, p);..  if( pD
f330: 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
f340: 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52   pDestructor->nR
f350: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 75  ef++;.  }.  p->u
f360: 2e 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70  .pDestructor = p
f370: 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d  Destructor;.  p-
f380: 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70 2d  >funcFlags = (p-
f390: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
f3a0: 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b  ITE_FUNC_ENCMASK
f3b0: 29 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b 0a  ) | extraFlags;.
f3c0: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
f3d0: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
f3e0: 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20  E_DETERMINISTIC 
f3f0: 29 3b 0a 20 20 70 2d 3e 78 53 46 75 6e 63 20 3d  );.  p->xSFunc =
f400: 20 78 53 46 75 6e 63 20 3f 20 78 53 46 75 6e 63   xSFunc ? xSFunc
f410: 20 3a 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78   : xStep;.  p->x
f420: 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61  Finalize = xFina
f430: 6c 3b 0a 20 20 70 2d 3e 78 56 61 6c 75 65 20 3d  l;.  p->xValue =
f440: 20 78 56 61 6c 75 65 3b 0a 20 20 70 2d 3e 78 49   xValue;.  p->xI
f450: 6e 76 65 72 73 65 20 3d 20 78 49 6e 76 65 72 73  nverse = xInvers
f460: 65 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74  e;.  p->pUserDat
f470: 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20  a = pUserData;. 
f480: 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29   p->nArg = (u16)
f490: 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53  nArg;.  return S
f4a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f4b0: 2a 2a 20 57 6f 72 6b 65 72 20 66 75 6e 63 74 69  ** Worker functi
f4c0: 6f 6e 20 75 73 65 64 20 62 79 20 75 74 66 2d 38  on used by utf-8
f4d0: 20 41 50 49 73 20 74 68 61 74 20 63 72 65 61 74   APIs that creat
f4e0: 65 20 6e 65 77 20 66 75 6e 63 74 69 6f 6e 73 3a  e new functions:
f4f0: 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  .**.**    sqlite
f500: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
f510: 6e 28 29 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  n().**    sqlite
f520: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
f530: 6e 5f 76 32 28 29 0a 2a 2a 20 20 20 20 73 71 6c  n_v2().**    sql
f540: 69 74 65 33 5f 63 72 65 61 74 65 5f 77 69 6e 64  ite3_create_wind
f550: 6f 77 5f 66 75 6e 63 74 69 6f 6e 28 29 0a 2a 2f  ow_function().*/
f560: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61  .static int crea
f570: 74 65 46 75 6e 63 74 69 6f 6e 41 70 69 28 0a 20  teFunctionApi(. 
f580: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
f590: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
f5a0: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
f5b0: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
f5c0: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53   *p,.  void (*xS
f5d0: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
f5e0: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
f5f0: 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76  e3_value**),.  v
f600: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
f610: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
f620: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
f630: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
f640: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
f650: 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28  text*),.  void (
f660: 2a 78 56 61 6c 75 65 29 28 73 71 6c 69 74 65 33  *xValue)(sqlite3
f670: 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f  _context*),.  vo
f680: 69 64 20 28 2a 78 49 6e 76 65 72 73 65 29 28 73  id (*xInverse)(s
f690: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
f6a0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
f6b0: 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44  e**),.  void(*xD
f6c0: 65 73 74 72 6f 79 29 28 76 6f 69 64 2a 29 0a 29  estroy)(void*).)
f6d0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
f6e0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e  ITE_ERROR;.  Fun
f6f0: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72  cDestructor *pAr
f700: 67 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  g = 0;..#ifdef S
f710: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
f720: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
f730: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
f740: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
f750: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
f760: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e  SE_BKPT;.  }.#en
f770: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
f780: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
f790: 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65 73  tex);.  if( xDes
f7a0: 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72 67  troy ){.    pArg
f7b0: 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63 74   = (FuncDestruct
f7c0: 6f 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  or *)sqlite3Mall
f7d0: 6f 63 28 73 69 7a 65 6f 66 28 46 75 6e 63 44 65  oc(sizeof(FuncDe
f7e0: 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20  structor));.    
f7f0: 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20  if( !pArg ){.   
f800: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
f810: 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 78 44  lt(db);.      xD
f820: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20  estroy(p);.     
f830: 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d   goto out;.    }
f840: 0a 20 20 20 20 70 41 72 67 2d 3e 6e 52 65 66 20  .    pArg->nRef 
f850: 3d 20 30 3b 0a 20 20 20 20 70 41 72 67 2d 3e 78  = 0;.    pArg->x
f860: 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72  Destroy = xDestr
f870: 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55  oy;.    pArg->pU
f880: 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d  serData = p;.  }
f890: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43  .  rc = sqlite3C
f8a0: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
f8b0: 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20  unc, nArg, enc, 
f8c0: 70 2c 20 0a 20 20 20 20 20 20 78 53 46 75 6e 63  p, .      xSFunc
f8d0: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  , xStep, xFinal,
f8e0: 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73   xValue, xInvers
f8f0: 65 2c 20 70 41 72 67 0a 20 20 29 3b 0a 20 20 69  e, pArg.  );.  i
f900: 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
f910: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
f920: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
f930: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65  TE_OK );.    xDe
f940: 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71  stroy(p);.    sq
f950: 6c 69 74 65 33 5f 66 72 65 65 28 70 41 72 67 29  lite3_free(pArg)
f960: 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72  ;.  }.. out:.  r
f970: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
f980: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
f990: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
f9a0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
f9b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f9c0: 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75  .** Create new u
f9d0: 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ser functions..*
f9e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
f9f0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
fa00: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
fa10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
fa20: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
fa30: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
fa40: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53   *p,.  void (*xS
fa50: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
fa60: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
fa70: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
fa80: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
fa90: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
faa0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
fab0: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
fac0: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
fad0: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65  ontext*).){.  re
fae0: 74 75 72 6e 20 63 72 65 61 74 65 46 75 6e 63 74  turn createFunct
faf0: 69 6f 6e 41 70 69 28 64 62 2c 20 7a 46 75 6e 63  ionApi(db, zFunc
fb00: 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20  , nArg, enc, p, 
fb10: 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20  xSFunc, xStep,. 
fb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb40: 20 20 20 78 46 69 6e 61 6c 2c 20 30 2c 20 30 2c     xFinal, 0, 0,
fb50: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
fb60: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
fb70: 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  on_v2(.  sqlite3
fb80: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
fb90: 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74  ar *zFunc,.  int
fba0: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
fbb0: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
fbc0: 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71  oid (*xSFunc)(sq
fbd0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
fbe0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
fbf0: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
fc00: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
fc10: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
fc20: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
fc30: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
fc40: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
fc50: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  ,.  void (*xDest
fc60: 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a  roy)(void *).){.
fc70: 20 20 72 65 74 75 72 6e 20 63 72 65 61 74 65 46    return createF
fc80: 75 6e 63 74 69 6f 6e 41 70 69 28 64 62 2c 20 7a  unctionApi(db, z
fc90: 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Func, nArg, enc,
fca0: 20 70 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65   p, xSFunc, xSte
fcb0: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
fcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcd0: 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 30         xFinal, 0
fce0: 2c 20 30 2c 20 78 44 65 73 74 72 6f 79 29 3b 0a  , 0, xDestroy);.
fcf0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  }.int sqlite3_cr
fd00: 65 61 74 65 5f 77 69 6e 64 6f 77 5f 66 75 6e 63  eate_window_func
fd10: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  tion(.  sqlite3 
fd20: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
fd30: 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20  r *zFunc,.  int 
fd40: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  nArg,.  int enc,
fd50: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
fd60: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
fd70: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
fd80: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
fd90: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
fda0: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
fdb0: 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28  text*),.  void (
fdc0: 2a 78 56 61 6c 75 65 29 28 73 71 6c 69 74 65 33  *xValue)(sqlite3
fdd0: 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f  _context*),.  vo
fde0: 69 64 20 28 2a 78 49 6e 76 65 72 73 65 29 28 73  id (*xInverse)(s
fdf0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
fe00: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
fe10: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
fe20: 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a  xDestroy)(void *
fe30: 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 72  ).){.  return cr
fe40: 65 61 74 65 46 75 6e 63 74 69 6f 6e 41 70 69 28  eateFunctionApi(
fe50: 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c  db, zFunc, nArg,
fe60: 20 65 6e 63 2c 20 70 2c 20 30 2c 20 78 53 74 65   enc, p, 0, xSte
fe70: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe90: 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 78         xFinal, x
fea0: 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73 65 2c  Value, xInverse,
feb0: 20 78 44 65 73 74 72 6f 79 29 3b 0a 7d 0a 0a 23   xDestroy);.}..#
fec0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fed0: 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71 6c  IT_UTF16.int sql
fee0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
fef0: 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65  tion16(.  sqlite
ff00: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76  3 *db,.  const v
ff10: 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61  oid *zFunctionNa
ff20: 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  me,.  int nArg,.
ff30: 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a    int eTextRep,.
ff40: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
ff50: 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69  d (*xSFunc)(sqli
ff60: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
ff70: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
ff80: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
ff90: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
ffa0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
ffb0: 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64  value**),.  void
ffc0: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
ffd0: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a  e3_context*).){.
ffe0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
fff0: 20 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69 66 64 65   *zFunc8;..#ifde
10000 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10010 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
10020 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
10030 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 46 75  eckOk(db) || zFu
10040 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29 20  nctionName==0 ) 
10050 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
10060 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
10070 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
10080 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
10090 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
100a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
100b0 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73 71  );.  zFunc8 = sq
100c0 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62  lite3Utf16to8(db
100d0 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
100e0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31   -1, SQLITE_UTF1
100f0 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20 3d  6NATIVE);.  rc =
10100 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
10110 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e  nc(db, zFunc8, n
10120 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70  Arg, eTextRep, p
10130 2c 20 78 53 46 75 6e 63 2c 78 53 74 65 70 2c 78  , xSFunc,xStep,x
10140 46 69 6e 61 6c 2c 30 2c 30 2c 30 29 3b 0a 20 20  Final,0,0,0);.  
10150 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
10160 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20  , zFunc8);.  rc 
10170 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
10180 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
10190 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
101a0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
101b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
101c0 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  f.../*.** The fo
101d0 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20 69  llowing is the i
101e0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
101f0 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   an SQL function
10200 20 74 68 61 74 20 61 6c 77 61 79 73 0a 2a 2a 20   that always.** 
10210 66 61 69 6c 73 20 77 69 74 68 20 61 6e 20 65 72  fails with an er
10220 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 61 74  ror message stat
10230 69 6e 67 20 74 68 61 74 20 74 68 65 20 66 75 6e  ing that the fun
10240 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69 6e  ction is used in
10250 20 74 68 65 0a 2a 2a 20 77 72 6f 6e 67 20 63 6f   the.** wrong co
10260 6e 74 65 78 74 2e 20 20 54 68 65 20 73 71 6c 69  ntext.  The sqli
10270 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e  te3_overload_fun
10280 63 74 69 6f 6e 28 29 20 41 50 49 20 6d 69 67 68  ction() API migh
10290 74 20 63 6f 6e 73 74 72 75 63 74 0a 2a 2a 20 53  t construct.** S
102a0 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  QL function that
102b0 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   use this routin
102c0 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75  e so that the fu
102d0 6e 63 74 69 6f 6e 73 20 77 69 6c 6c 20 65 78 69  nctions will exi
102e0 73 74 0a 2a 2a 20 66 6f 72 20 6e 61 6d 65 20 72  st.** for name r
102f0 65 73 6f 6c 75 74 69 6f 6e 20 62 75 74 20 61 72  esolution but ar
10300 65 20 61 63 74 75 61 6c 6c 79 20 6f 76 65 72 6c  e actually overl
10310 6f 61 64 65 64 20 62 79 20 74 68 65 20 78 46 69  oaded by the xFi
10320 6e 64 46 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 65  ndFunction.** me
10330 74 68 6f 64 20 6f 66 20 76 69 72 74 75 61 6c 20  thod of virtual 
10340 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
10350 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 49 6e  c void sqlite3In
10360 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20  validFunction(. 
10370 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
10380 20 2a 63 6f 6e 74 65 78 74 2c 20 20 2f 2a 20 54   *context,  /* T
10390 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  he function call
103a0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
103b0 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 20 20 20   int NotUsed,   
103c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
103d0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
103e0 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ts to the functi
103f0 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
10400 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32  value **NotUsed2
10410 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 65     /* Value of e
10420 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
10430 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
10440 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
10450 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 75 73  char*)sqlite3_us
10460 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
10470 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  ;.  char *zErr;.
10480 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10490 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
104a0 55 73 65 64 32 29 3b 0a 20 20 7a 45 72 72 20 3d  Used2);.  zErr =
104b0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
104c0 28 0a 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20  (.      "unable 
104d0 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 20  to use function 
104e0 25 73 20 69 6e 20 74 68 65 20 72 65 71 75 65 73  %s in the reques
104f0 74 65 64 20 63 6f 6e 74 65 78 74 22 2c 20 7a 4e  ted context", zN
10500 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
10510 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
10520 74 65 78 74 2c 20 7a 45 72 72 2c 20 2d 31 29 3b  text, zErr, -1);
10530 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
10540 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zErr);.}../*.** 
10550 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20 66  Declare that a f
10560 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  unction has been
10570 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20 61   overloaded by a
10580 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
10590 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e  **.** If the fun
105a0 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65 78  ction already ex
105b0 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c 61  ists as a regula
105c0 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f  r global functio
105d0 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  n, then.** this 
105e0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
105f0 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63  op.  If the func
10600 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  tion does not ex
10610 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ist, then create
10620 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74 68  .** a new one th
10630 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77 73  at always throws
10640 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f   a run-time erro
10650 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  r.  .**.** When 
10660 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69  virtual tables i
10670 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64 65  ntend to provide
10680 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 66   an overloaded f
10690 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a  unction, they.**
106a0 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69   should call thi
106b0 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b  s routine to mak
106c0 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62 61  e sure the globa
106d0 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74  l function exist
106e0 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66  s..** A global f
106f0 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78 69  unction must exi
10700 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20  st in order for 
10710 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
10720 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65  to work.** prope
10730 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rly..*/.int sqli
10740 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e  te3_overload_fun
10750 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
10760 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
10770 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74  ar *zName,.  int
10780 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20 72   nArg.){.  int r
10790 63 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 70 79  c;.  char *zCopy
107a0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
107b0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
107c0 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
107d0 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
107e0 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c  ) || zName==0 ||
107f0 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20   nArg<-2 ){.    
10800 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
10810 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
10820 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
10830 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
10840 6d 75 74 65 78 29 3b 0a 20 20 72 63 20 3d 20 73  mutex);.  rc = s
10850 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
10860 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41  on(db, zName, nA
10870 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
10880 20 30 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65   0)!=0;.  sqlite
10890 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
108a0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
108b0 72 63 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  rc ) return SQLI
108c0 54 45 5f 4f 4b 3b 0a 20 20 7a 43 6f 70 79 20 3d  TE_OK;.  zCopy =
108d0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
108e0 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (zName);.  if( z
108f0 43 6f 70 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  Copy==0 ) return
10900 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10910 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
10920 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
10930 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41  v2(db, zName, nA
10940 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
10950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10960 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 70              zCop
10970 79 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69  y, sqlite3Invali
10980 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c  dFunction, 0, 0,
10990 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
109a0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
109b0 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a  E_OMIT_TRACE./*.
109c0 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 72  ** Register a tr
109d0 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ace function.  T
109e0 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65  he pArg from the
109f0 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69   previously regi
10a00 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a 20  stered trace.** 
10a10 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a  is returned.  .*
10a20 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63  *.** A NULL trac
10a30 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73  e function means
10a40 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e 67   that no tracing
10a50 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41   is executes.  A
10a60 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61   non-NULL.** tra
10a70 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ce is a pointer 
10a80 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68  to a function th
10a90 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74  at is invoked at
10aa0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
10ab0 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  ch.** SQL statem
10ac0 65 6e 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ent..*/.#ifndef 
10ad0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
10ae0 45 43 41 54 45 44 0a 76 6f 69 64 20 2a 73 71 6c  ECATED.void *sql
10af0 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74  ite3_trace(sqlit
10b00 65 33 20 2a 64 62 2c 20 76 6f 69 64 28 2a 78 54  e3 *db, void(*xT
10b10 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  race)(void*,cons
10b20 74 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a  t char*), void *
10b30 70 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70  pArg){.  void *p
10b40 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  Old;..#ifdef SQL
10b50 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
10b60 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
10b70 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
10b80 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
10b90 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
10ba0 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
10bb0 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
10bc0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10bd0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
10be0 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54  .  pOld = db->pT
10bf0 72 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 6d  raceArg;.  db->m
10c00 54 72 61 63 65 20 3d 20 78 54 72 61 63 65 20 3f  Trace = xTrace ?
10c10 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 4c 45   SQLITE_TRACE_LE
10c20 47 41 43 59 20 3a 20 30 3b 0a 20 20 64 62 2d 3e  GACY : 0;.  db->
10c30 78 54 72 61 63 65 20 3d 20 28 69 6e 74 28 2a 29  xTrace = (int(*)
10c40 28 75 33 32 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a  (u32,void*,void*
10c50 2c 76 6f 69 64 2a 29 29 78 54 72 61 63 65 3b 0a  ,void*))xTrace;.
10c60 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20    db->pTraceArg 
10c70 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
10c80 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
10c90 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
10ca0 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69  rn pOld;.}.#endi
10cb0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
10cc0 5f 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a  _DEPRECATED */..
10cd0 2f 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 72  /* Register a tr
10ce0 61 63 65 20 63 61 6c 6c 62 61 63 6b 20 75 73 69  ace callback usi
10cf0 6e 67 20 74 68 65 20 76 65 72 73 69 6f 6e 2d 32  ng the version-2
10d00 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69   interface..*/.i
10d10 6e 74 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65  nt sqlite3_trace
10d20 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
10d30 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d50 20 20 2f 2a 20 54 72 61 63 65 20 74 68 69 73 20    /* Trace this 
10d60 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
10d70 75 6e 73 69 67 6e 65 64 20 6d 54 72 61 63 65 2c  unsigned mTrace,
10d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
10da0 73 6b 20 6f 66 20 65 76 65 6e 74 73 20 74 6f 20  sk of events to 
10db0 62 65 20 74 72 61 63 65 64 20 2a 2f 0a 20 20 69  be traced */.  i
10dc0 6e 74 28 2a 78 54 72 61 63 65 29 28 75 6e 73 69  nt(*xTrace)(unsi
10dd0 67 6e 65 64 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a  gned,void*,void*
10de0 2c 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 43 61 6c  ,void*),  /* Cal
10df0 6c 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20  lback to invoke 
10e00 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  */.  void *pArg 
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e30 2f 2a 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b  /* Context */.){
10e40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10e50 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
10e60 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
10e70 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
10e80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10e90 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
10ea0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
10eb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
10ec0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
10ed0 20 69 66 28 20 6d 54 72 61 63 65 3d 3d 30 20 29   if( mTrace==0 )
10ee0 20 78 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 69   xTrace = 0;.  i
10ef0 66 28 20 78 54 72 61 63 65 3d 3d 30 20 29 20 6d  f( xTrace==0 ) m
10f00 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 64 62 2d  Trace = 0;.  db-
10f10 3e 6d 54 72 61 63 65 20 3d 20 6d 54 72 61 63 65  >mTrace = mTrace
10f20 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d  ;.  db->xTrace =
10f30 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70   xTrace;.  db->p
10f40 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b  TraceArg = pArg;
10f50 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10f60 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
10f70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
10f80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
10f90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
10fa0 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 52  PRECATED./*.** R
10fb0 65 67 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c  egister a profil
10fc0 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  e function.  The
10fd0 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70   pArg from the p
10fe0 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74  reviously regist
10ff0 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65  ered .** profile
11000 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74   function is ret
11010 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  urned.  .**.** A
11020 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75   NULL profile fu
11030 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61  nction means tha
11040 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69  t no profiling i
11050 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e  s executes.  A n
11060 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69  on-NULL.** profi
11070 6c 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  le is a pointer 
11080 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68  to a function th
11090 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74  at is invoked at
110a0 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
110b0 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73  of.** each SQL s
110c0 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73  tatement that is
110d0 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73   run..*/.void *s
110e0 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a  qlite3_profile(.
110f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
11100 20 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65   void (*xProfile
11110 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
11120 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36  ar*,sqlite_uint6
11130 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  4),.  void *pArg
11140 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  .){.  void *pOld
11150 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
11160 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
11170 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
11180 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
11190 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
111a0 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
111b0 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
111c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
111d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
111e0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
111f0 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66  pOld = db->pProf
11200 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50  ileArg;.  db->xP
11210 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c  rofile = xProfil
11220 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c  e;.  db->pProfil
11230 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 64  eArg = pArg;.  d
11240 62 2d 3e 6d 54 72 61 63 65 20 26 3d 20 53 51 4c  b->mTrace &= SQL
11250 49 54 45 5f 54 52 41 43 45 5f 4e 4f 4e 4c 45 47  ITE_TRACE_NONLEG
11260 41 43 59 5f 4d 41 53 4b 3b 0a 20 20 69 66 28 20  ACY_MASK;.  if( 
11270 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20 29 20 64  db->xProfile ) d
11280 62 2d 3e 6d 54 72 61 63 65 20 7c 3d 20 53 51 4c  b->mTrace |= SQL
11290 49 54 45 5f 54 52 41 43 45 5f 58 50 52 4f 46 49  ITE_TRACE_XPROFI
112a0 4c 45 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  LE;.  sqlite3_mu
112b0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
112c0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
112d0 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Old;.}.#endif /*
112e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
112f0 52 45 43 41 54 45 44 20 2a 2f 0a 23 65 6e 64 69  RECATED */.#endi
11300 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
11310 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
11320 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63   Register a func
11330 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
11340 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
11350 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a  ction commits..*
11360 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64  * If the invoked
11370 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
11380 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
11390 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f   the commit beco
113a0 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63  mes a.** rollbac
113b0 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  k..*/.void *sqli
113c0 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
113d0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
113f0 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
11400 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
11410 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
11420 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20  lback)(void*),  
11430 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69  /* Function to i
11440 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f  nvoke on each co
11450 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mmit */.  void *
11460 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
11470 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
11480 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
11490 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  */.){.  void *pO
114a0 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ld;..#ifdef SQLI
114b0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
114c0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
114d0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
114e0 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
114f0 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
11500 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
11510 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
11520 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
11530 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
11540 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f    pOld = db->pCo
11550 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78  mmitArg;.  db->x
11560 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d  CommitCallback =
11570 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
11580 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70  ->pCommitArg = p
11590 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
115a0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
115b0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
115c0 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pOld;.}../*.** R
115d0 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
115e0 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
115f0 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77   each time a row
11600 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20   is updated,.** 
11610 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65  inserted or dele
11620 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64  ted using this d
11630 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
11640 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
11650 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b  ite3_update_hook
11660 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
11670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11680 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
11690 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
116a0 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  e */.  void (*xC
116b0 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69  allback)(void*,i
116c0 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c  nt,char const *,
116d0 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c  char const *,sql
116e0 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f  ite_int64),.  vo
116f0 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
11700 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
11710 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
11720 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
11730 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66 20   *pRet;..#ifdef 
11740 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
11750 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
11760 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
11770 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
11780 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
11790 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
117a0 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
117b0 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
117c0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
117d0 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
117e0 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64  >pUpdateArg;.  d
117f0 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61  b->xUpdateCallba
11800 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
11810 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67    db->pUpdateArg
11820 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
11830 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
11840 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
11850 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
11860 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
11870 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
11880 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
11890 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
118a0 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62  rolled.** back b
118b0 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
118c0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
118d0 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c  oid *sqlite3_rol
118e0 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71  lback_hook(.  sq
118f0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
11900 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
11910 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
11920 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
11930 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63   void (*xCallbac
11940 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61  k)(void*), /* Ca
11950 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
11960 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  */.  void *pArg 
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11980 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * Argument to th
11990 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b  e function */.){
119a0 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a  .  void *pRet;..
119b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
119c0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
119d0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
119e0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
119f0 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
11a00 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
11a10 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
11a20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
11a30 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
11a40 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
11a50 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63  t = db->pRollbac
11a60 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c  kArg;.  db->xRol
11a70 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20  lbackCallback = 
11a80 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
11a90 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20  >pRollbackArg = 
11aa0 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
11ab0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
11ac0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
11ad0 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66   pRet;.}..#ifdef
11ae0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
11af0 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a  REUPDATE_HOOK./*
11b00 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
11b10 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
11b20 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
11b30 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64  a row is updated
11b40 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72  ,.** inserted or
11b50 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74   deleted using t
11b60 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
11b70 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
11b80 20 2a 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64   *sqlite3_preupd
11b90 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  ate_hook(.  sqli
11ba0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
11bb0 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
11bc0 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
11bd0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76   database */.  v
11be0 6f 69 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  oid(*xCallback)(
11bf0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c           /* Call
11c00 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  back function */
11c10 0a 20 20 20 20 76 6f 69 64 2a 2c 73 71 6c 69 74  .    void*,sqlit
11c20 65 33 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e  e3*,int,char con
11c30 73 74 2a 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c  st*,char const*,
11c40 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c 73 71  sqlite3_int64,sq
11c50 6c 69 74 65 33 5f 69 6e 74 36 34 29 2c 0a 20 20  lite3_int64),.  
11c60 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
11c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
11c80 73 74 20 63 61 6c 6c 62 61 63 6b 20 61 72 67 75  st callback argu
11c90 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  ment */.){.  voi
11ca0 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74  d *pRet;.  sqlit
11cb0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
11cc0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
11cd0 74 20 3d 20 64 62 2d 3e 70 50 72 65 55 70 64 61  t = db->pPreUpda
11ce0 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72  teArg;.  db->xPr
11cf0 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20  eUpdateCallback 
11d00 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
11d10 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67  b->pPreUpdateArg
11d20 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
11d30 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
11d40 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
11d50 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn pRet;.}.#end
11d60 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
11d70 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
11d80 4f 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  OK */..#ifndef S
11d90 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
11da0 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
11db0 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c  _wal_hook() call
11dc0 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20  back registered 
11dd0 62 79 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61  by sqlite3_wal_a
11de0 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e  utocheckpoint().
11df0 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74  .** Invoke sqlit
11e00 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
11e10 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t if the number 
11e20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65  of frames in the
11e30 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20   log file.** is 
11e40 67 72 65 61 74 65 72 20 74 68 61 6e 20 73 71 6c  greater than sql
11e50 69 74 65 33 2e 70 57 61 6c 41 72 67 20 63 61 73  ite3.pWalArg cas
11e60 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  t to an integer 
11e70 28 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69  (the value confi
11e80 67 75 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f  gured by.** wal_
11e90 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29  autocheckpoint()
11ea0 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  )..*/ .int sqlit
11eb0 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b  e3WalDefaultHook
11ec0 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e  (.  void *pClien
11ed0 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 41 72  tData,     /* Ar
11ee0 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69  gument */.  sqli
11ef0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
11f00 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
11f10 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
11f20 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a 20   *zDb,       /* 
11f30 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  Database */.  in
11f40 74 20 6e 46 72 61 6d 65 20 20 20 20 20 20 20 20  t nFrame        
11f50 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
11f60 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  WAL */.){.  if( 
11f70 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50  nFrame>=SQLITE_P
11f80 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e  TR_TO_INT(pClien
11f90 74 44 61 74 61 29 20 29 7b 0a 20 20 20 20 73 71  tData) ){.    sq
11fa0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
11fb0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71  Malloc();.    sq
11fc0 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
11fd0 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20  oint(db, zDb);. 
11fe0 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
11ff0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d  ignMalloc();.  }
12000 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12010 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
12020 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
12030 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69   */../*.** Confi
12040 67 75 72 65 20 61 6e 20 73 71 6c 69 74 65 33 5f  gure an sqlite3_
12050 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62  wal_hook() callb
12060 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69 63  ack to automatic
12070 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a  ally checkpoint.
12080 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 66  ** a database af
12090 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
120a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
120b0 74 68 65 72 65 20 61 72 65 20 6e 46 72 61 6d 65  there are nFrame
120c0 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d   or.** more fram
120d0 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69  es in the log fi
120e0 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a 65 72 6f  le. Passing zero
120f0 20 6f 72 20 61 20 6e 65 67 61 74 69 76 65 20 76   or a negative v
12100 61 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e  alue as the.** n
12110 46 72 61 6d 65 20 70 61 72 61 6d 65 74 65 72 20  Frame parameter 
12120 64 69 73 61 62 6c 65 73 20 61 75 74 6f 6d 61 74  disables automat
12130 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 65  ic checkpoints e
12140 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  ntirely..**.** T
12150 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69  he callback regi
12160 73 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  stered by this f
12170 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73  unction replaces
12180 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 63 61   any existing ca
12190 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74  llback.** regist
121a0 65 72 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ered using sqlit
121b0 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c  e3_wal_hook(). L
121c0 69 6b 65 77 69 73 65 2c 20 72 65 67 69 73 74 65  ikewise, registe
121d0 72 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a  ring a callback.
121e0 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ** using sqlite3
121f0 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61  _wal_hook() disa
12200 62 6c 65 73 20 74 68 65 20 61 75 74 6f 6d 61 74  bles the automat
12210 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65  ic checkpoint me
12220 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69  chanism.** confi
12230 67 75 72 65 64 20 62 79 20 74 68 69 73 20 66 75  gured by this fu
12240 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
12250 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
12260 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
12270 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d  3 *db, int nFram
12280 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e){.#ifdef SQLIT
12290 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55  E_OMIT_WAL.  UNU
122a0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
122b0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
122c0 4d 45 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23  METER(nFrame);.#
122d0 65 6c 73 65 0a 23 69 66 64 65 66 20 53 51 4c 49  else.#ifdef SQLI
122e0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
122f0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
12300 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
12310 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
12320 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
12330 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6e 46  .#endif.  if( nF
12340 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73 71  rame>0 ){.    sq
12350 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64  lite3_wal_hook(d
12360 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66  b, sqlite3WalDef
12370 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54 45  aultHook, SQLITE
12380 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72 61  _INT_TO_PTR(nFra
12390 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  me));.  }else{. 
123a0 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68     sqlite3_wal_h
123b0 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20  ook(db, 0, 0);. 
123c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
123d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
123e0 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
123f0 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
12400 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
12410 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
12420 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
12430 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d 61 68  nto the write-ah
12440 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69 73 20  ead-log by this 
12450 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12460 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
12470 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a  lite3_wal_hook(.
12480 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
12490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124a0 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
124b0 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 62 20  hook to this db 
124c0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 28  handle */.  int(
124d0 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
124e0 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f   *, sqlite3*, co
124f0 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c  nst char*, int),
12500 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
12510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12520 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
12530 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78  ment passed to x
12540 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29 7b  Callback() */.){
12550 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12560 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64 20  OMIT_WAL.  void 
12570 2a 70 52 65 74 3b 0a 23 69 66 64 65 66 20 53 51  *pRet;.#ifdef SQ
12580 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
12590 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
125a0 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
125b0 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
125c0 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
125d0 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
125e0 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
125f0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12600 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
12610 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
12620 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57  WalArg;.  db->xW
12630 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  alCallback = xCa
12640 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57  llback;.  db->pW
12650 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  alArg = pArg;.  
12660 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
12670 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
12680 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23    return pRet;.#
12690 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b  else.  return 0;
126a0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
126b0 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61   Checkpoint data
126c0 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74  base zDb..*/.int
126d0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
126e0 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71  ckpoint_v2(.  sq
126f0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
12700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12710 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
12720 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
12730 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20   *zDb,          
12740 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
12750 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
12760 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  se (or NULL) */.
12770 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20    int eMode,    
12780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12790 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
127a0 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a  KPOINT_* value *
127b0 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20  /.  int *pnLog, 
127c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127d0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
127e0 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66   of WAL log in f
127f0 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  rames */.  int *
12800 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20 20  pnCkpt          
12810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
12820 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  T: Total number 
12830 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b 70  of frames checkp
12840 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66  ointed */.){.#if
12850 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12860 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  WAL.  return SQL
12870 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
12880 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
12890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128a0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
128b0 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51  /.  int iDb = SQ
128c0 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
128d0 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61  D;  /* sqlite3.a
128e0 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62  Db[] index of db
128f0 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a   to checkpoint *
12900 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
12910 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
12920 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
12930 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
12940 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
12950 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
12960 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 69 74  endif..  /* Init
12970 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75  ialize the outpu
12980 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 2d  t variables to -
12990 31 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  1 in case an err
129a0 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
129b0 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c  if( pnLog ) *pnL
129c0 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70  og = -1;.  if( p
129d0 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74 20  nCkpt ) *pnCkpt 
129e0 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28  = -1;..  assert(
129f0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
12a00 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30 20 29 3b  NT_PASSIVE==0 );
12a10 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
12a20 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c  E_CHECKPOINT_FUL
12a30 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  L==1 );.  assert
12a40 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
12a50 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32 20 29  INT_RESTART==2 )
12a60 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
12a70 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52  TE_CHECKPOINT_TR
12a80 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 20 20 69  UNCATE==3 );.  i
12a90 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f  f( eMode<SQLITE_
12aa0 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
12ab0 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49  VE || eMode>SQLI
12ac0 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52  TE_CHECKPOINT_TR
12ad0 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 2f 2a  UNCATE ){.    /*
12ae0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
12af0 30 33 39 39 36 2d 31 32 30 38 38 20 54 68 65 20  03996-12088 The 
12b00 4d 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74  M parameter must
12b10 20 62 65 20 61 20 76 61 6c 69 64 20 63 68 65 63   be a valid chec
12b20 6b 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6d 6f  kpoint.    ** mo
12b30 64 65 3a 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  de: */.    retur
12b40 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
12b50 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
12b60 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
12b70 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44  mutex);.  if( zD
12b80 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a 20  b && zDb[0] ){. 
12b90 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
12ba0 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
12bb0 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  Db);.  }.  if( i
12bc0 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  Db<0 ){.    rc =
12bd0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
12be0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
12bf0 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54  ithMsg(db, SQLIT
12c00 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77  E_ERROR, "unknow
12c10 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c  n database: %s",
12c20 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   zDb);.  }else{.
12c30 20 20 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64      db->busyHand
12c40 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
12c50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
12c60 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44  heckpoint(db, iD
12c70 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c  b, eMode, pnLog,
12c80 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73 71   pnCkpt);.    sq
12c90 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
12ca0 63 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  c);.  }.  rc = s
12cb0 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
12cc0 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  , rc);..  /* If 
12cd0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74  there are no act
12ce0 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 2c 20  ive statements, 
12cf0 63 6c 65 61 72 20 74 68 65 20 69 6e 74 65 72 72  clear the interr
12d00 75 70 74 20 66 6c 61 67 20 61 74 20 74 68 69 73  upt flag at this
12d10 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 20 2a 2f  .  ** point.  */
12d20 0a 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65  .  if( db->nVdbe
12d30 41 63 74 69 76 65 3d 3d 30 20 29 7b 0a 20 20 20  Active==0 ){.   
12d40 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
12d50 75 70 74 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a  upted = 0;.  }..
12d60 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12d70 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
12d80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
12d90 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
12da0 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62  Checkpoint datab
12db0 61 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20  ase zDb. If zDb 
12dc0 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74  is NULL, or if t
12dd0 68 65 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f  he buffer zDb po
12de0 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61  ints.** to conta
12df0 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  ins a zero-lengt
12e00 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74  h string, all at
12e10 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
12e20 20 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f   are .** checkpo
12e30 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inted..*/.int sq
12e40 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
12e50 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  oint(sqlite3 *db
12e60 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
12e70 62 29 7b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  b){.  /* EVIDENC
12e80 45 2d 4f 46 3a 20 52 2d 34 31 36 31 33 2d 32 30  E-OF: R-41613-20
12e90 35 35 33 20 54 68 65 20 73 71 6c 69 74 65 33 5f  553 The sqlite3_
12ea0 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 44  wal_checkpoint(D
12eb0 2c 58 29 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ,X) is equivalen
12ec0 74 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65  t to.  ** sqlite
12ed0 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
12ee0 5f 76 32 28 44 2c 58 2c 53 51 4c 49 54 45 5f 43  _v2(D,X,SQLITE_C
12ef0 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
12f00 45 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20 72 65 74  E,0,0). */.  ret
12f10 75 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  urn sqlite3_wal_
12f20 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62  checkpoint_v2(db
12f30 2c 7a 44 62 2c 53 51 4c 49 54 45 5f 43 48 45 43  ,zDb,SQLITE_CHEC
12f40 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30  KPOINT_PASSIVE,0
12f50 2c 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ,0);.}..#ifndef 
12f60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
12f70 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65 63  /*.** Run a chec
12f80 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62 61  kpoint on databa
12f90 73 65 20 69 44 62 2e 20 54 68 69 73 20 69 73 20  se iDb. This is 
12fa0 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61 62  a no-op if datab
12fb0 61 73 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f  ase iDb is.** no
12fc0 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  t currently open
12fd0 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a   in WAL mode..**
12fe0 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
12ff0 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20  tion is open on 
13000 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69  the database bei
13010 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c  ng checkpointed,
13020 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
13030 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
13040 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20 63  E_LOCKED and a c
13050 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74  heckpoint is not
13060 20 61 74 74 65 6d 70 74 65 64 2e 20 49 66 20 0a   attempted. If .
13070 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
13080 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67  rs while running
13090 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c   the checkpoint,
130a0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
130b0 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74   code is .** ret
130c0 75 72 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c 49  urned (i.e. SQLI
130d0 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65 72  TE_IOERR). Other
130e0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
130f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
13100 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
13110 64 6c 65 20 64 62 20 73 68 6f 75 6c 64 20 62 65  dle db should be
13120 20 68 65 6c 64 20 62 79 20 74 68 65 20 63 61 6c   held by the cal
13130 6c 65 72 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a  ler. The mutex.*
13140 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
13150 68 20 74 68 65 20 73 70 65 63 69 66 69 63 20 62  h the specific b
13160 2d 74 72 65 65 20 62 65 69 6e 67 20 63 68 65 63  -tree being chec
13170 6b 70 6f 69 6e 74 65 64 20 69 73 20 74 61 6b 65  kpointed is take
13180 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e  n by.** this fun
13190 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 65 20  ction while the 
131a0 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 72 75  checkpoint is ru
131b0 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nning..**.** If 
131c0 69 44 62 20 69 73 20 70 61 73 73 65 64 20 53 51  iDb is passed SQ
131d0 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
131e0 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74 74 61  D, then all atta
131f0 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61  ched databases a
13200 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74  re.** checkpoint
13210 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
13220 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
13230 74 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d  t is returned im
13240 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e  mediately -.** n
13250 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  o attempt is mad
13260 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20  e to checkpoint 
13270 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 64 61  any remaining da
13280 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50  tabases..**.** P
13290 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 69  arameter eMode i
132a0 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  s one of SQLITE_
132b0 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
132c0 56 45 2c 20 46 55 4c 4c 2c 20 52 45 53 54 41 52  VE, FULL, RESTAR
132d0 54 0a 2a 2a 20 6f 72 20 54 52 55 4e 43 41 54 45  T.** or TRUNCATE
132e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
132f0 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  Checkpoint(sqlit
13300 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
13310 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20   int eMode, int 
13320 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43  *pnLog, int *pnC
13330 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  kpt){.  int rc =
13340 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
13350 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
13360 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
13370 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
13380 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
13390 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
133a0 68 72 6f 75 67 68 20 61 74 74 61 63 68 65 64 20  hrough attached 
133b0 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75  dbs */.  int bBu
133c0 73 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sy = 0;         
133d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
133e0 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   if SQLITE_BUSY 
133f0 68 61 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  has been encount
13400 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ered */..  asser
13410 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
13420 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
13430 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
13440 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d  nLog || *pnLog==
13450 2d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  -1 );.  assert( 
13460 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b  !pnCkpt || *pnCk
13470 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72  pt==-1 );..  for
13480 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20  (i=0; i<db->nDb 
13490 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
134a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
134b0 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53  i==iDb || iDb==S
134c0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
134d0 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ED ){.      rc =
134e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 68 65   sqlite3BtreeChe
134f0 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b  ckpoint(db->aDb[
13500 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70  i].pBt, eMode, p
13510 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20  nLog, pnCkpt);. 
13520 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a       pnLog = 0;.
13530 20 20 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30        pnCkpt = 0
13540 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
13550 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
13560 20 20 20 20 20 20 20 62 42 75 73 79 20 3d 20 31         bBusy = 1
13570 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
13580 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
13590 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
135a0 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
135b0 45 5f 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f  E_OK && bBusy) ?
135c0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72   SQLITE_BUSY : r
135d0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
135e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
135f0 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
13600 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
13610 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f  rue if main-memo
13620 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  ry should be use
13630 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
13640 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
13650 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70   for transient p
13660 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73  ager files and s
13670 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
13680 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  s..** The value 
13690 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73  returned depends
136a0 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
136b0 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
136c0 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61  (runtime.** para
136d0 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65 20 63  meter) and the c
136e0 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75  ompile time valu
136f0 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  e of SQLITE_TEMP
13700 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66  _STORE. The.** f
13710 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64  ollowing table d
13720 65 73 63 72 69 62 65 73 20 74 68 65 20 72 65 6c  escribes the rel
13730 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65  ationship betwee
13740 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75  n these two valu
13750 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66  es.** and this f
13760 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
13770 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  value..**.**   S
13780 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
13790 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74       db->temp_st
137a0 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e  ore     Location
137b0 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61   of temporary da
137c0 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d  tabase.**   ----
137d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
137e0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
137f0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
13800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13810 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
13820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
13830 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
13840 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
13850 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20  urn 0).**   1   
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13870 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
13880 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
13890 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31  return 0).**   1
138a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138b0 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
138c0 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
138d0 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
138e0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
138f0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
13900 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
13910 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
13920 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
13930 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
13940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
13950 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
13960 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  0).**   2       
13970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
13980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13990 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
139a0 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 1).**   2    
139b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139c0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
139d0 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
139e0 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20  eturn 1).**   3 
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a00 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
13a10 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
13a20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69   (return 1).*/.i
13a30 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  nt sqlite3TempIn
13a40 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c  Memory(const sql
13a50 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53  ite3 *db){.#if S
13a60 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
13a70 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64  ==1.  return ( d
13a80 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32  b->temp_store==2
13a90 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   );.#endif.#if S
13aa0 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
13ab0 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64  ==2.  return ( d
13ac0 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31  b->temp_store!=1
13ad0 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   );.#endif.#if S
13ae0 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
13af0 3d 3d 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ==3.  UNUSED_PAR
13b00 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65  AMETER(db);.  re
13b10 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23  turn 1;.#endif.#
13b20 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
13b30 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45  TORE<1 || SQLITE
13b40 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20  _TEMP_STORE>3.  
13b50 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
13b60 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  (db);.  return 0
13b70 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
13b80 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65  * Return UTF-8 e
13b90 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c  ncoded English l
13ba0 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74  anguage explanat
13bb0 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
13bc0 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e  recent.** error.
13bd0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
13be0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73  sqlite3_errmsg(s
13bf0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63  qlite3 *db){.  c
13c00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
13c10 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72  if( !db ){.    r
13c20 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
13c30 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  Str(SQLITE_NOMEM
13c40 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 69 66  _BKPT);.  }.  if
13c50 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
13c60 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
13c70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
13c80 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
13c90 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
13ca0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
13cb0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
13cc0 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64  >mutex);.  if( d
13cd0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
13ce0 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  ){.    z = sqlit
13cf0 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
13d00 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d  NOMEM_BKPT);.  }
13d10 65 6c 73 65 7b 0a 20 20 20 20 74 65 73 74 63 61  else{.    testca
13d20 73 65 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20  se( db->pErr==0 
13d30 29 3b 0a 20 20 20 20 7a 20 3d 20 64 62 2d 3e 65  );.    z = db->e
13d40 72 72 43 6f 64 65 20 3f 20 28 63 68 61 72 2a 29  rrCode ? (char*)
13d50 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
13d60 78 74 28 64 62 2d 3e 70 45 72 72 29 20 3a 20 30  xt(db->pErr) : 0
13d70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64  ;.    assert( !d
13d80 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
13d90 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
13da0 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  ){.      z = sql
13db0 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
13dc0 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  rrCode);.    }. 
13dd0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
13de0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
13df0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  ex);.  return z;
13e00 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
13e10 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
13e20 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31  .** Return UTF-1
13e30 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73  6 encoded Englis
13e40 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61  h language expla
13e50 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nation of the mo
13e60 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72  st recent.** err
13e70 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  or..*/.const voi
13e80 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  d *sqlite3_errms
13e90 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29  g16(sqlite3 *db)
13ea0 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
13eb0 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20   u16 outOfMem[] 
13ec0 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27  = {.    'o', 'u'
13ed0 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c  , 't', ' ', 'o',
13ee0 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20   'f', ' ', 'm', 
13ef0 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27  'e', 'm', 'o', '
13f00 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a  r', 'y', 0.  };.
13f10 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
13f20 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a  16 misuse[] = {.
13f30 20 20 20 20 27 62 27 2c 20 27 61 27 2c 20 27 64      'b', 'a', 'd
13f40 27 2c 20 27 20 27 2c 20 27 70 27 2c 20 27 61 27  ', ' ', 'p', 'a'
13f50 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 6d 27 2c  , 'r', 'a', 'm',
13f60 20 27 65 27 2c 20 27 74 27 2c 20 27 65 27 2c 20   'e', 't', 'e', 
13f70 27 72 27 2c 20 27 20 27 2c 0a 20 20 20 20 27 6f  'r', ' ',.    'o
13f80 27 2c 20 27 72 27 2c 20 27 20 27 2c 20 27 6f 27  ', 'r', ' ', 'o'
13f90 2c 20 27 74 27 2c 20 27 68 27 2c 20 27 65 27 2c  , 't', 'h', 'e',
13fa0 20 27 72 27 2c 20 27 20 27 2c 20 27 41 27 2c 20   'r', ' ', 'A', 
13fb0 27 50 27 2c 20 27 49 27 2c 20 27 20 27 2c 0a 20  'P', 'I', ' ',. 
13fc0 20 20 20 27 6d 27 2c 20 27 69 27 2c 20 27 73 27     'm', 'i', 's'
13fd0 2c 20 27 75 27 2c 20 27 73 27 2c 20 27 65 27 2c  , 'u', 's', 'e',
13fe0 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74   0.  };..  const
13ff0 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20   void *z;.  if( 
14000 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !db ){.    retur
14010 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d  n (void *)outOfM
14020 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  em;.  }.  if( !s
14030 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
14040 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
14050 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69  .    return (voi
14060 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a  d *)misuse;.  }.
14070 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14080 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
14090 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
140a0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
140b0 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f  z = (void *)outO
140c0 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fMem;.  }else{. 
140d0 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
140e0 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e  alue_text16(db->
140f0 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a  pErr);.    if( z
14100 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
14110 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
14120 28 64 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65  (db, db->errCode
14130 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
14140 64 62 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20  db->errCode));. 
14150 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
14160 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62  _value_text16(db
14170 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20  ->pErr);.    }. 
14180 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29     /* A malloc()
14190 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65 64   may have failed
141a0 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c   within the call
141b0 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   to sqlite3_valu
141c0 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a  e_text16().    *
141d0 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73  * above. If this
141e0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
141f0 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  en the db->mallo
14200 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65  cFailed flag nee
14210 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ds to.    ** be 
14220 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 72  cleared before r
14230 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69  eturning. Do thi
14240 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74  s directly, inst
14250 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a  ead of via.    *
14260 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  * sqlite3ApiExit
14270 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74  (), to avoid set
14280 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
14290 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d  e handle error m
142a0 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  essage..    */. 
142b0 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 43 6c 65     sqlite3OomCle
142c0 61 72 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71  ar(db);.  }.  sq
142d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
142e0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
142f0 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64  return z;.}.#end
14300 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
14310 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
14320 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73  * Return the mos
14330 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63  t recent error c
14340 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
14350 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69   an SQLite routi
14360 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a  ne. If NULL is.*
14370 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  * passed to this
14380 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73   function, we as
14390 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20  sume a malloc() 
143a0 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71  failed during sq
143b0 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f  lite3_open()..*/
143c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72  .int sqlite3_err
143d0 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  code(sqlite3 *db
143e0 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21  ){.  if( db && !
143f0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
14400 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
14410 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
14420 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
14430 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c  .  }.  if( !db |
14440 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
14450 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
14460 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
14470 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
14480 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64   db->errCode & d
14490 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e  b->errMask;.}.in
144a0 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  t sqlite3_extend
144b0 65 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74  ed_errcode(sqlit
144c0 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  e3 *db){.  if( d
144d0 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66  b && !sqlite3Saf
144e0 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
144f0 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
14500 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
14510 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
14520 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c   !db || db->mall
14530 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
14540 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
14550 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
14560 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f  return db->errCo
14570 64 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  de;.}.int sqlite
14580 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28 73  3_system_errno(s
14590 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
145a0 65 74 75 72 6e 20 64 62 20 3f 20 64 62 2d 3e 69  eturn db ? db->i
145b0 53 79 73 45 72 72 6e 6f 20 3a 20 30 3b 0a 7d 20  SysErrno : 0;.} 
145c0 20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20   ../*.** Return 
145d0 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
145e0 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64  scribes the kind
145f0 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66   of error specif
14600 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ied in the.** ar
14610 67 75 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77  gument.  For now
14620 2c 20 74 68 69 73 20 73 69 6d 70 6c 79 20 63 61  , this simply ca
14630 6c 6c 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  lls the internal
14640 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 29   sqlite3ErrStr()
14650 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  .** function..*/
14660 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
14670 69 74 65 33 5f 65 72 72 73 74 72 28 69 6e 74 20  ite3_errstr(int 
14680 72 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  rc){.  return sq
14690 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 3b  lite3ErrStr(rc);
146a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
146b0 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67   a new collating
146c0 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61   function for da
146d0 74 61 62 61 73 65 20 22 64 62 22 2e 20 20 54 68  tabase "db".  Th
146e0 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a  e name is zName.
146f0 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64  ** and the encod
14700 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73  ing is enc..*/.s
14710 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65  tatic int create
14720 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c  Collation(.  sql
14730 69 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73  ite3* db,.  cons
14740 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
14750 20 20 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64    u8 enc,.  void
14760 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
14770 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
14780 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
14790 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c  nt,const void*),
147a0 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76  .  void(*xDel)(v
147b0 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53  oid*).){.  CollS
147c0 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74  eq *pColl;.  int
147d0 20 65 6e 63 32 3b 0a 20 20 0a 20 20 61 73 73 65   enc2;.  .  asse
147e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
147f0 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
14800 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51  ) );..  /* If SQ
14810 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70  LITE_UTF16 is sp
14820 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65  ecified as the e
14830 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72  ncoding type, tr
14840 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a  ansform this.  *
14850 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49  * to one of SQLI
14860 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51  TE_UTF16LE or SQ
14870 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69  LITE_UTF16BE usi
14880 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ng the.  ** SQLI
14890 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d  TE_UTF16NATIVE m
148a0 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46  acro. SQLITE_UTF
148b0 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  16 is not used i
148c0 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  nternally..  */.
148d0 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20    enc2 = enc;.  
148e0 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d  testcase( enc2==
148f0 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a  SQLITE_UTF16 );.
14900 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32    testcase( enc2
14910 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  ==SQLITE_UTF16_A
14920 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20  LIGNED );.  if( 
14930 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
14940 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49  16 || enc2==SQLI
14950 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
14960 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53   ){.    enc2 = S
14970 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
14980 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63  E;.  }.  if( enc
14990 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  2<SQLITE_UTF8 ||
149a0 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46   enc2>SQLITE_UTF
149b0 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75  16BE ){.    retu
149c0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
149d0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
149e0 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 63   Check if this c
149f0 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20  all is removing 
14a00 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20  or replacing an 
14a10 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69  existing collati
14a20 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  on .  ** sequenc
14a30 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68  e. If so, and th
14a40 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
14a50 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e  Ms, return busy.
14a60 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61   If there.  ** a
14a70 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
14a80 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  , invalidate any
14a90 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74   pre-compiled st
14aa0 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
14ab0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
14ac0 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
14ad0 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c  (u8)enc2, zName,
14ae0 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   0);.  if( pColl
14af0 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   && pColl->xCmp 
14b00 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e  ){.    if( db->n
14b10 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20  VdbeActive ){.  
14b20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14b30 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49  WithMsg(db, SQLI
14b40 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
14b50 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c    "unable to del
14b60 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61  ete/modify colla
14b70 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75  tion sequence du
14b80 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74  e to active stat
14b90 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  ements");.      
14ba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
14bb0 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  SY;.    }.    sq
14bc0 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
14bd0 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
14be0 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  , 0);..    /* If
14bf0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
14c00 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72  nce pColl was cr
14c10 65 61 74 65 64 20 64 69 72 65 63 74 6c 79 20 62  eated directly b
14c20 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  y a call to.    
14c30 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  ** sqlite3_creat
14c40 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64  e_collation, and
14c50 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62   not generated b
14c60 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  y synthCollSeq()
14c70 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e  ,.    ** then an
14c80 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79  y copies made by
14c90 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20   synthCollSeq() 
14ca0 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  need to be inval
14cb0 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41  idated..    ** A
14cc0 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64  lso, collation d
14cd0 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c  estructor - Coll
14ce0 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e  Seq.xDel() - fun
14cf0 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20  ction may need. 
14d00 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c     ** to be call
14d10 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  ed..    */ .    
14d20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20  if( (pColl->enc 
14d30 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  & ~SQLITE_UTF16_
14d40 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29  ALIGNED)==enc2 )
14d50 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
14d60 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *aColl = sqlite3
14d70 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43  HashFind(&db->aC
14d80 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 29 3b 0a  ollSeq, zName);.
14d90 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
14da0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b     for(j=0; j<3;
14db0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   j++){.        C
14dc0 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f  ollSeq *p = &aCo
14dd0 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[j];.        i
14de0 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c  f( p->enc==pColl
14df0 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  ->enc ){.       
14e00 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29     if( p->xDel )
14e10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
14e20 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b  >xDel(p->pUser);
14e30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14e40 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d         p->xCmp =
14e50 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
14e60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14e70 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
14e80 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
14e90 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d  , (u8)enc2, zNam
14ea0 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f  e, 1);.  if( pCo
14eb0 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll==0 ) return S
14ec0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
14ed0 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20  ;.  pColl->xCmp 
14ee0 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43  = xCompare;.  pC
14ef0 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74  oll->pUser = pCt
14f00 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c  x;.  pColl->xDel
14f10 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c   = xDel;.  pColl
14f20 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63  ->enc = (u8)(enc
14f30 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54  2 | (enc & SQLIT
14f40 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
14f50 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  );.  sqlite3Erro
14f60 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  r(db, SQLITE_OK)
14f70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14f80 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
14f90 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e  This array defin
14fa0 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f  es hard upper bo
14fb0 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61  unds on limit va
14fc0 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e  lues.  The.** in
14fd0 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62  itializer must b
14fe0 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77  e kept in sync w
14ff0 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c  ith the SQLITE_L
15000 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e  IMIT_*.** #defin
15010 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e  es in sqlite3.h.
15020 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
15030 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b   int aHardLimit[
15040 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d  ] = {.  SQLITE_M
15050 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  AX_LENGTH,.  SQL
15060 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
15070 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
15080 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54  _COLUMN,.  SQLIT
15090 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
150a0 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ,.  SQLITE_MAX_C
150b0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a  OMPOUND_SELECT,.
150c0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42    SQLITE_MAX_VDB
150d0 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  E_OP,.  SQLITE_M
150e0 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c  AX_FUNCTION_ARG,
150f0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  .  SQLITE_MAX_AT
15100 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45  TACHED,.  SQLITE
15110 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
15120 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  N_LENGTH,.  SQLI
15130 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
15140 4e 55 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a 20  NUMBER,      /* 
15150 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33 32 33  IMP: R-38091-323
15160 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d  52 */.  SQLITE_M
15170 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
15180 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  ,.  SQLITE_MAX_W
15190 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d  ORKER_THREADS,.}
151a0 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  ;../*.** Make su
151b0 72 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69  re the hard limi
151c0 74 73 20 61 72 65 20 73 65 74 20 74 6f 20 72 65  ts are set to re
151d0 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a  asonable values.
151e0 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
151f0 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65  X_LENGTH<100.# e
15200 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
15210 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
15220 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64  t least 100.#end
15230 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
15240 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30  X_SQL_LENGTH<100
15250 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
15260 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d  MAX_SQL_LENGTH m
15270 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
15280 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  100.#endif.#if S
15290 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
152a0 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  NGTH>SQLITE_MAX_
152b0 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53  LENGTH.# error S
152c0 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
152d0 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65  NGTH must not be
152e0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53 51   greater than SQ
152f0 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a  LITE_MAX_LENGTH.
15300 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
15310 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
15320 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20  ELECT<2.# error 
15330 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
15340 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20  UND_SELECT must 
15350 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65  be at least 2.#e
15360 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
15370 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23  MAX_VDBE_OP<40.#
15380 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
15390 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62  X_VDBE_OP must b
153a0 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65  e at least 40.#e
153b0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
153c0 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
153d0 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  <0 || SQLITE_MAX
153e0 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 32  _FUNCTION_ARG>12
153f0 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  7.# error SQLITE
15400 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
15410 47 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  G must be betwee
15420 6e 20 30 20 61 6e 64 20 31 32 37 0a 23 65 6e 64  n 0 and 127.#end
15430 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
15440 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20  X_ATTACHED<0 || 
15450 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
15460 48 45 44 3e 31 32 35 0a 23 20 65 72 72 6f 72 20  HED>125.# error 
15470 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
15480 48 45 44 20 6d 75 73 74 20 62 65 20 62 65 74 77  HED must be betw
15490 65 65 6e 20 30 20 61 6e 64 20 31 32 35 0a 23 65  een 0 and 125.#e
154a0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
154b0 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
154c0 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f  _LENGTH<1.# erro
154d0 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b  r SQLITE_MAX_LIK
154e0 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
154f0 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
15500 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 1.#endif.#if S
15510 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
15520 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53  >32767.# error S
15530 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
15540 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64   must not exceed
15550 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69   32767.#endif.#i
15560 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49  f SQLITE_MAX_TRI
15570 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65  GGER_DEPTH<1.# e
15580 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
15590 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75  TRIGGER_DEPTH mu
155a0 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
155b0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
155c0 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
155d0 52 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49 54  READS<0 || SQLIT
155e0 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
155f0 45 41 44 53 3e 35 30 0a 23 20 65 72 72 6f 72 20  EADS>50.# error 
15600 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
15610 52 5f 54 48 52 45 41 44 53 20 6d 75 73 74 20 62  R_THREADS must b
15620 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
15630 35 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  50.#endif.../*.*
15640 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
15650 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20  ue of a limit.  
15660 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76  Report the old v
15670 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69  alue..** If an i
15680 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64  nvalid limit ind
15690 65 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20  ex is supplied, 
156a0 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61  report -1..** Ma
156b0 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75  ke no changes bu
156c0 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74  t still report t
156d0 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20  he old value if 
156e0 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74  the.** new limit
156f0 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   is negative..**
15700 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20  .** A new lower 
15710 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73  limit does not s
15720 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63  hrink existing c
15730 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74  onstructs..** It
15740 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73   merely prevents
15750 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20   new constructs 
15760 74 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20  that exceed the 
15770 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f  limit.** from fo
15780 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rming..*/.int sq
15790 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69  lite3_limit(sqli
157a0 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d  te3 *db, int lim
157b0 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d  itId, int newLim
157c0 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69  it){.  int oldLi
157d0 6d 69 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  mit;..#ifdef SQL
157e0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
157f0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
15800 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
15810 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
15820 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
15830 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
15840 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   -1;.  }.#endif.
15850 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
15860 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37  F: R-30189-54097
15870 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20   For each limit 
15880 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f  category SQLITE_
15890 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20  LIMIT_NAME.  ** 
158a0 74 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20  there is a hard 
158b0 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20  upper bound set 
158c0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
158d0 62 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73  by a C preproces
158e0 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63  sor.  ** macro c
158f0 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58  alled SQLITE_MAX
15900 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49  _NAME. (The "_LI
15910 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d  MIT_" in the nam
15920 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a  e is changed to.
15930 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20    ** "_MAX_".). 
15940 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48   */.  assert( aH
15950 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
15960 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53  LIMIT_LENGTH]==S
15970 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
15980 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
15990 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
159a0 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48  LIMIT_SQL_LENGTH
159b0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  ]==SQLITE_MAX_SQ
159c0 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  L_LENGTH );.  as
159d0 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
159e0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
159f0 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LUMN]==SQLITE_MA
15a00 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73  X_COLUMN );.  as
15a10 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
15a20 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58  [SQLITE_LIMIT_EX
15a30 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54  PR_DEPTH]==SQLIT
15a40 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
15a50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
15a60 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
15a70 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
15a80 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ELECT]==SQLITE_M
15a90 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
15aa0 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  CT);.  assert( a
15ab0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
15ac0 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d  _LIMIT_VDBE_OP]=
15ad0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45  =SQLITE_MAX_VDBE
15ae0 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OP );.  assert(
15af0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
15b00 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f  TE_LIMIT_FUNCTIO
15b10 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d  N_ARG]==SQLITE_M
15b20 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
15b30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
15b40 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
15b50 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d  IMIT_ATTACHED]==
15b60 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
15b70 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  HED );.  assert(
15b80 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
15b90 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41  TE_LIMIT_LIKE_PA
15ba0 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a  TTERN_LENGTH]==.
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 20 20 20 20 20 20 20 20 20 53                 S
15be0 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
15bf0 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b  ATTERN_LENGTH );
15c00 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
15c10 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
15c20 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
15c30 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ER]==SQLITE_MAX_
15c40 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29  VARIABLE_NUMBER)
15c50 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
15c60 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
15c70 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
15c80 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54  H]==SQLITE_MAX_T
15c90 52 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a  RIGGER_DEPTH );.
15ca0 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
15cb0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
15cc0 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
15cd0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  ]==SQLITE_MAX_WO
15ce0 52 4b 45 52 5f 54 48 52 45 41 44 53 20 29 3b 0a  RKER_THREADS );.
15cf0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
15d00 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
15d10 52 45 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e  READS==(SQLITE_N
15d20 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20  _LIMIT-1) );... 
15d30 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c   if( limitId<0 |
15d40 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54  | limitId>=SQLIT
15d50 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  E_N_LIMIT ){.   
15d60 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
15d70 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d    oldLimit = db-
15d80 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
15d90 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74  ;.  if( newLimit
15da0 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  >=0 ){          
15db0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
15dc0 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a   R-52476-28732 *
15dd0 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d  /.    if( newLim
15de0 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69  it>aHardLimit[li
15df0 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20  mitId] ){.      
15e00 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64  newLimit = aHard
15e10 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20  Limit[limitId]; 
15e20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33   /* IMP: R-51463
15e30 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a  -25634 */.    }.
15e40 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c      db->aLimit[l
15e50 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d  imitId] = newLim
15e60 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
15e70 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20   oldLimit;      
15e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15e90 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33  * IMP: R-53341-3
15ea0 35 34 31 39 20 2a 2f 0a 7d 0a 23 69 66 20 64 65  5419 */.}.#if de
15eb0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
15ec0 42 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49 4c 45  BLE_AUTO_PROFILE
15ed0 29 0a 2f 2a 20 73 74 64 65 72 72 20 6c 6f 67 67  )./* stderr logg
15ee0 69 6e 67 20 2a 2f 0a 76 6f 69 64 20 5f 73 71 6c  ing */.void _sql
15ef0 69 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65  ite_auto_profile
15f00 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73  (void *aux, cons
15f10 74 20 63 68 61 72 20 2a 73 71 6c 2c 20 75 36 34  t char *sql, u64
15f20 20 6e 73 29 3b 0a 76 6f 69 64 20 5f 73 71 6c 69   ns);.void _sqli
15f30 74 65 5f 61 75 74 6f 5f 74 72 61 63 65 28 76 6f  te_auto_trace(vo
15f40 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63  id *aux, const c
15f50 68 61 72 20 2a 73 71 6c 29 3b 0a 76 6f 69 64 20  har *sql);.void 
15f60 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 70 72 6f  _sqlite_auto_pro
15f70 66 69 6c 65 28 76 6f 69 64 20 2a 61 75 78 2c 20  file(void *aux, 
15f80 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 2c  const char *sql,
15f90 20 75 36 34 20 6e 73 29 20 7b 0a 23 70 72 61 67   u64 ns) {.#prag
15fa0 6d 61 20 75 6e 75 73 65 64 28 61 75 78 29 0a 09  ma unused(aux)..
15fb0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
15fc0 22 51 75 65 72 79 3a 20 25 73 5c 6e 20 45 78 65  "Query: %s\n Exe
15fd0 63 75 74 69 6f 6e 20 54 69 6d 65 3a 20 25 6c 6c  cution Time: %ll
15fe0 75 20 6d 73 5c 6e 22 2c 20 73 71 6c 2c 20 6e 73  u ms\n", sql, ns
15ff0 20 2f 20 31 30 30 30 30 30 30 29 3b 0a 7d 0a 76   / 1000000);.}.v
16000 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f  oid _sqlite_auto
16010 5f 74 72 61 63 65 28 76 6f 69 64 20 2a 61 75 78  _trace(void *aux
16020 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  , const char *sq
16030 6c 29 20 7b 0a 09 66 70 72 69 6e 74 66 28 73 74  l) {..fprintf(st
16040 64 65 72 72 2c 20 22 54 72 61 63 65 53 51 4c 28  derr, "TraceSQL(
16050 25 70 29 3a 20 25 73 5c 6e 22 2c 20 61 75 78 2c  %p): %s\n", aux,
16060 20 73 71 6c 29 3b 0a 7d 0a 0a 2f 2a 20 73 79 73   sql);.}../* sys
16070 6c 6f 67 20 6c 6f 67 67 69 6e 67 20 2a 2f 0a 23  log logging */.#
16080 69 6e 63 6c 75 64 65 20 3c 61 73 6c 2e 68 3e 0a  include <asl.h>.
16090 73 74 61 74 69 63 20 61 73 6c 63 6c 69 65 6e 74  static aslclient
160a0 20 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20   autolog_client 
160b0 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 76  = NULL;.static v
160c0 6f 69 64 20 5f 63 6c 6f 73 65 5f 61 73 6c 5f 6c  oid _close_asl_l
160d0 6f 67 28 29 20 7b 0a 20 20 69 66 28 20 4e 55 4c  og() {.  if( NUL
160e0 4c 21 3d 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e  L!=autolog_clien
160f0 74 20 29 7b 0a 20 20 20 20 61 73 6c 5f 63 6c 6f  t ){.    asl_clo
16100 73 65 28 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e  se(autolog_clien
16110 74 29 3b 0a 20 20 20 20 61 75 74 6f 6c 6f 67 5f  t);.    autolog_
16120 63 6c 69 65 6e 74 20 3d 20 4e 55 4c 4c 3b 0a 20  client = NULL;. 
16130 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
16140 20 5f 6f 70 65 6e 5f 61 73 6c 5f 6c 6f 67 28 29   _open_asl_log()
16150 20 7b 0a 20 20 69 66 28 20 4e 55 4c 4c 3d 3d 61   {.  if( NULL==a
16160 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20 29 7b  utolog_client ){
16170 0a 20 20 20 20 61 75 74 6f 6c 6f 67 5f 63 6c 69  .    autolog_cli
16180 65 6e 74 20 3d 20 61 73 6c 5f 6f 70 65 6e 28 22  ent = asl_open("
16190 53 51 4c 69 74 65 22 2c 20 4e 55 4c 4c 2c 20 30  SQLite", NULL, 0
161a0 29 3b 0a 20 20 20 20 61 74 65 78 69 74 28 5f 63  );.    atexit(_c
161b0 6c 6f 73 65 5f 61 73 6c 5f 6c 6f 67 29 3b 0a 20  lose_asl_log);. 
161c0 20 7d 0a 7d 0a 0a 76 6f 69 64 20 5f 73 71 6c 69   }.}..void _sqli
161d0 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65 5f  te_auto_profile_
161e0 73 79 73 6c 6f 67 28 76 6f 69 64 20 2a 61 75 78  syslog(void *aux
161f0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  , const char *sq
16200 6c 2c 20 75 36 34 20 6e 73 29 3b 0a 76 6f 69 64  l, u64 ns);.void
16210 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72   _sqlite_auto_tr
16220 61 63 65 5f 73 79 73 6c 6f 67 28 76 6f 69 64 20  ace_syslog(void 
16230 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72  *aux, const char
16240 20 2a 73 71 6c 29 3b 0a 76 6f 69 64 20 5f 73 71   *sql);.void _sq
16250 6c 69 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c  lite_auto_profil
16260 65 5f 73 79 73 6c 6f 67 28 76 6f 69 64 20 2a 61  e_syslog(void *a
16270 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ux, const char *
16280 73 71 6c 2c 20 75 36 34 20 6e 73 29 20 7b 0a 23  sql, u64 ns) {.#
16290 70 72 61 67 6d 61 20 75 6e 75 73 65 64 28 61 75  pragma unused(au
162a0 78 29 0a 09 61 73 6c 5f 6c 6f 67 28 61 75 74 6f  x)..asl_log(auto
162b0 6c 6f 67 5f 63 6c 69 65 6e 74 2c 20 4e 55 4c 4c  log_client, NULL
162c0 2c 20 41 53 4c 5f 4c 45 56 45 4c 5f 4e 4f 54 49  , ASL_LEVEL_NOTI
162d0 43 45 2c 20 22 51 75 65 72 79 3a 20 25 73 5c 6e  CE, "Query: %s\n
162e0 20 45 78 65 63 75 74 69 6f 6e 20 54 69 6d 65 3a   Execution Time:
162f0 20 25 6c 6c 75 20 6d 73 5c 6e 22 2c 20 73 71 6c   %llu ms\n", sql
16300 2c 20 6e 73 20 2f 20 31 30 30 30 30 30 30 29 3b  , ns / 1000000);
16310 0a 7d 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f  .}.void _sqlite_
16320 61 75 74 6f 5f 74 72 61 63 65 5f 73 79 73 6c 6f  auto_trace_syslo
16330 67 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e  g(void *aux, con
16340 73 74 20 63 68 61 72 20 2a 73 71 6c 29 20 7b 0a  st char *sql) {.
16350 09 61 73 6c 5f 6c 6f 67 28 61 75 74 6f 6c 6f 67  .asl_log(autolog
16360 5f 63 6c 69 65 6e 74 2c 20 4e 55 4c 4c 2c 20 41  _client, NULL, A
16370 53 4c 5f 4c 45 56 45 4c 5f 4e 4f 54 49 43 45 2c  SL_LEVEL_NOTICE,
16380 20 22 54 72 61 63 65 53 51 4c 28 25 70 29 3a 20   "TraceSQL(%p): 
16390 25 73 5c 6e 22 2c 20 61 75 78 2c 20 73 71 6c 29  %s\n", aux, sql)
163a0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
163b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
163c0 69 73 20 75 73 65 64 20 74 6f 20 70 61 72 73 65  is used to parse
163d0 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e   both URIs and n
163e0 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73  on-URI filenames
163f0 20 70 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a   passed by the.*
16400 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20 66 75  * user to API fu
16410 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f  nctions sqlite3_
16420 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65  open() or sqlite
16430 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64  3_open_v2(), and
16440 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a   for database.**
16450 20 55 52 49 73 20 73 70 65 63 69 66 69 65 64 20   URIs specified 
16460 61 73 20 70 61 72 74 20 6f 66 20 41 54 54 41 43  as part of ATTAC
16470 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  H statements..**
16480 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
16490 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
164a0 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e  unction is the n
164b0 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74  ame of the VFS t
164c0 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e  o use (or.** a N
164d0 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74  ULL to signify t
164e0 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 29 20  he default VFS) 
164f0 69 66 20 74 68 65 20 55 52 49 20 64 6f 65 73 20  if the URI does 
16500 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76  not contain a "v
16510 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79  fs=xxx".** query
16520 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20   parameter. The 
16530 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
16540 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49  contains the URI
16550 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c   (or non-URI fil
16560 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66  ename).** itself
16570 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  . When this func
16580 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
16590 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61  he *pFlags varia
165a0 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61  ble should conta
165b0 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c  in.** the defaul
165c0 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  t flags to open 
165d0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
165e0 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76 61  dle with. The va
165f0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  lue stored in.**
16600 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20   *pFlags may be 
16610 75 70 64 61 74 65 64 20 62 65 66 6f 72 65 20 72  updated before r
16620 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20  eturning if the 
16630 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e  URI filename con
16640 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65  tains .** "cache
16650 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78  =xxx" or "mode=x
16660 78 78 22 20 71 75 65 72 79 20 70 61 72 61 6d 65  xx" query parame
16670 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ters..**.** If s
16680 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
16690 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
166a0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a  . In this case *
166b0 70 70 56 66 73 20 69 73 20 73 65 74 20 74 6f 20  ppVfs is set to 
166c0 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
166d0 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20  VFS that should 
166e0 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20  be used to open 
166f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16700 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65  e. *pzFile is se
16710 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  t to.** point to
16720 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
16730 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66  ning the name of
16740 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65   the file to ope
16750 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  n. It is the .**
16760 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
16770 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
16780 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c   eventually call
16790 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20   sqlite3_free() 
167a0 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  to release.** th
167b0 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  is buffer..**.**
167c0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
167d0 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c  urs, then an SQL
167e0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
167f0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
16800 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20  pzErrMsg.** may 
16810 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  be set to point 
16820 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
16830 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73  aining an Englis
16840 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72  h language error
16850 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74   .** message. It
16860 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
16870 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
16880 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
16890 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  ly release.** th
168a0 69 73 20 62 75 66 66 65 72 20 62 79 20 63 61 6c  is buffer by cal
168b0 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  ling sqlite3_fre
168c0 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e()..*/.int sqli
168d0 74 65 33 50 61 72 73 65 55 72 69 28 0a 20 20 63  te3ParseUri(.  c
168e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61  onst char *zDefa
168f0 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f  ultVfs,        /
16900 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69 66 20  * VFS to use if 
16910 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75 65  no "vfs=xxx" que
16920 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63  ry option */.  c
16930 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c  onst char *zUri,
16940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16950 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * Nul-terminated
16960 20 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f   URI to parse */
16970 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
16980 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  *pFlags,        
16990 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51     /* IN/OUT: SQ
169a0 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c  LITE_OPEN_XXX fl
169b0 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ags */.  sqlite3
169c0 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20  _vfs **ppVfs,   
169d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
169e0 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a   VFS to use */ .
169f0 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c    char **pzFile,
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a10 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61    /* OUT: Filena
16a20 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  me component of 
16a30 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  URI */.  char **
16a40 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20  pzErrMsg        
16a50 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
16a60 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28   Error message (
16a70 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  if rc!=SQLITE_OK
16a80 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
16a90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16aa0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61  unsigned int fla
16ab0 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20  gs = *pFlags;.  
16ac0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
16ad0 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a   = zDefaultVfs;.
16ae0 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20    char *zFile;. 
16af0 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e   char c;.  int n
16b00 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Uri = sqlite3Str
16b10 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20  len30(zUri);..  
16b20 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73  assert( *pzErrMs
16b30 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  g==0 );..  if( (
16b40 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
16b50 4f 50 45 4e 5f 55 52 49 29 20 20 20 20 20 20 20  OPEN_URI)       
16b60 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
16b70 34 38 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a 20  48725-32206 */. 
16b80 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
16b90 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
16ba0 67 2e 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20 49  g.bOpenUri) /* I
16bb0 4d 50 3a 20 52 2d 35 31 36 38 39 2d 34 36 35 34  MP: R-51689-4654
16bc0 38 20 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69 3e  8 */.   && nUri>
16bd0 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72  =5 && memcmp(zUr
16be0 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d  i, "file:", 5)==
16bf0 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38  0 /* IMP: R-5788
16c00 34 2d 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a  4-37496 */.  ){.
16c10 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a      char *zOpt;.
16c20 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20      int eState; 
16c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c40 20 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74    /* Parser stat
16c50 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55  e when parsing U
16c60 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  RI */.    int iI
16c70 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
16c80 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
16c90 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78   character index
16ca0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74   */.    int iOut
16cb0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
16cc0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
16cd0 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20  character index 
16ce0 2a 2f 0a 20 20 20 20 75 36 34 20 6e 42 79 74 65  */.    u64 nByte
16cf0 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20   = nUri+2;      
16d00 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
16d10 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61   space to alloca
16d20 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61  te */..    /* Ma
16d30 6b 65 20 73 75 72 65 20 74 68 65 20 53 51 4c 49  ke sure the SQLI
16d40 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67  TE_OPEN_URI flag
16d50 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63   is set to indic
16d60 61 74 65 20 74 6f 20 74 68 65 20 56 46 53 20 78  ate to the VFS x
16d70 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74  Open .    ** met
16d80 68 6f 64 20 74 68 61 74 20 74 68 65 72 65 20 6d  hod that there m
16d90 61 79 20 62 65 20 65 78 74 72 61 20 70 61 72 61  ay be extra para
16da0 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67  meters following
16db0 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20   the file-name. 
16dc0 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   */.    flags |=
16dd0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
16de0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30  ;..    for(iIn=0
16df0 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b  ; iIn<nUri; iIn+
16e00 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72  +) nByte += (zUr
16e10 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20  i[iIn]=='&');.  
16e20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65    zFile = sqlite
16e30 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65  3_malloc64(nByte
16e40 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c  );.    if( !zFil
16e50 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
16e60 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 0a 20  E_NOMEM_BKPT;.. 
16e70 20 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66 64     iIn = 5;.#ifd
16e80 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f  ef SQLITE_ALLOW_
16e90 55 52 49 5f 41 55 54 48 4f 52 49 54 59 0a 20 20  URI_AUTHORITY.  
16ea0 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55    if( strncmp(zU
16eb0 72 69 2b 35 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d  ri+5, "///", 3)=
16ec0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20  =0 ){.      iIn 
16ed0 3d 20 37 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  = 7;.      /* Th
16ee0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64  e following cond
16ef0 69 74 69 6f 6e 20 63 61 75 73 65 73 20 55 52 49  ition causes URI
16f00 73 20 77 69 74 68 20 66 69 76 65 20 6c 65 61 64  s with five lead
16f10 69 6e 67 20 2f 20 63 68 61 72 61 63 74 65 72 73  ing / characters
16f20 0a 20 20 20 20 20 20 2a 2a 20 6c 69 6b 65 20 66  .      ** like f
16f30 69 6c 65 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61  ile://///host/pa
16f40 74 68 20 74 6f 20 62 65 20 63 6f 6e 76 65 72 74  th to be convert
16f50 65 64 20 69 6e 74 6f 20 55 4e 43 73 20 6c 69 6b  ed into UNCs lik
16f60 65 20 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 0a 20  e //host/path.. 
16f70 20 20 20 20 20 2a 2a 20 54 68 65 20 63 6f 72 72       ** The corr
16f80 65 63 74 20 55 52 49 20 66 6f 72 20 74 68 61 74  ect URI for that
16f90 20 55 4e 43 20 68 61 73 20 6f 6e 6c 79 20 74 77   UNC has only tw
16fa0 6f 20 6f 72 20 66 6f 75 72 20 6c 65 61 64 69 6e  o or four leadin
16fb0 67 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20  g / characters. 
16fc0 20 20 20 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68       ** file://h
16fd0 6f 73 74 2f 70 61 74 68 20 6f 72 20 66 69 6c 65  ost/path or file
16fe0 3a 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 20  :////host/path. 
16ff0 20 42 75 74 20 35 20 6c 65 61 64 69 6e 67 20 73   But 5 leading s
17000 6c 61 73 68 65 73 20 69 73 20 61 20 0a 20 20 20  lashes is a .   
17010 20 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72     ** common err
17020 6f 72 2c 20 77 65 20 61 72 65 20 74 6f 6c 64 2c  or, we are told,
17030 20 73 6f 20 77 65 20 68 61 6e 64 6c 65 20 69 74   so we handle it
17040 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61   as a special ca
17050 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  se. */.      if(
17060 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 37 2c   strncmp(zUri+7,
17070 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b   "///", 3)==0 ){
17080 20 69 49 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65   iIn++; }.    }e
17090 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
170a0 7a 55 72 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c  zUri+5, "//local
170b0 68 6f 73 74 2f 22 2c 20 31 32 29 3d 3d 30 20 29  host/", 12)==0 )
170c0 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 31 36  {.      iIn = 16
170d0 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
170e0 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
170f0 20 73 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68   scheme and auth
17100 6f 72 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f  ority segments o
17110 66 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20  f the URI. */.  
17120 20 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27    if( zUri[5]=='
17130 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27  /' && zUri[6]=='
17140 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20  /' ){.      iIn 
17150 3d 20 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 7;.      while
17160 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a  ( zUri[iIn] && z
17170 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20  Uri[iIn]!='/' ) 
17180 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  iIn++;.      if(
17190 20 69 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21   iIn!=7 && (iIn!
171a0 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c  =16 || memcmp("l
171b0 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69  ocalhost", &zUri
171c0 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20  [7], 9)) ){.    
171d0 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
171e0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
171f0 22 69 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74  "invalid uri aut
17200 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a  hority: %.*s", .
17210 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d              iIn-
17220 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20  7, &zUri[7]);.  
17230 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
17240 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
17250 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
17260 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
17270 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
17280 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e  * Copy the filen
17290 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72  ame and any quer
172a0 79 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74  y parameters int
172b0 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66  o the zFile buff
172c0 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f  er. .    ** Deco
172d0 64 65 20 25 48 48 20 65 73 63 61 70 65 20 63 6f  de %HH escape co
172e0 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61  des along the wa
172f0 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  y. .    **.    *
17300 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  * Within this lo
17310 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74  op, variable eSt
17320 61 74 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ate may be set t
17330 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70  o 0, 1 or 2, dep
17340 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e  ending.    ** on
17350 20 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   the parsing con
17360 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73  text. As follows
17370 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
17380 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c    0: Parsing fil
17390 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20  e-name..    **  
173a0 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65   1: Parsing name
173b0 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61   section of a na
173c0 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70  me=value query p
173d0 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a  arameter..    **
173e0 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61     2: Parsing va
173f0 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61  lue section of a
17400 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72   name=value quer
17410 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20  y parameter..   
17420 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d   */.    eState =
17430 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   0;.    while( (
17440 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d  c = zUri[iIn])!=
17450 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20  0 && c!='#' ){. 
17460 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20       iIn++;.    
17470 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20    if( c=='%' .  
17480 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49       && sqlite3I
17490 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e  sxdigit(zUri[iIn
174a0 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20 73 71  ]) .       && sq
174b0 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55  lite3Isxdigit(zU
174c0 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20  ri[iIn+1]) .    
174d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74    ){.        int
174e0 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65   octet = (sqlite
174f0 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69  3HexToInt(zUri[i
17500 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20  In++]) << 4);.  
17510 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73        octet += s
17520 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a  qlite3HexToInt(z
17530 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20  Uri[iIn++]);..  
17540 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63        assert( oc
17550 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c  tet>=0 && octet<
17560 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69  256 );.        i
17570 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 23  f( octet==0 ){.#
17580 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
17590 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52 4f  ABLE_URI_00_ERRO
175a0 52 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  R.          /* T
175b0 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
175c0 6b 65 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61  ken when "%00" a
175d0 70 70 65 61 72 73 20 77 69 74 68 69 6e 20 74 68  ppears within th
175e0 65 20 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20  e URI. In this. 
175f0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
17600 20 77 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74   we ignore all t
17610 65 78 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69  ext in the remai
17620 6e 64 65 72 20 6f 66 20 74 68 65 20 70 61 74 68  nder of the path
17630 2c 20 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20  , name or.      
17640 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72      ** value cur
17650 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72  rently being par
17660 73 65 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74  sed. So ignore t
17670 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 72 61  he current chara
17680 63 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  cter.          *
17690 2a 20 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68  * and skip to th
176a0 65 20 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20  e next "?", "=" 
176b0 6f 72 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f  or "&", as appro
176c0 70 72 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20  priate. */.     
176d0 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d       while( (c =
176e0 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26   zUri[iIn])!=0 &
176f0 26 20 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20  & c!='#' .      
17700 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
17710 74 65 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29  te!=0 || c!='?')
17720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
17730 26 20 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20  & (eState!=1 || 
17740 28 63 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26  (c!='=' && c!='&
17750 27 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ')).            
17760 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 32 20    && (eState!=2 
17770 7c 7c 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20  || c!='&').     
17780 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
17790 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20      iIn++;.     
177a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
177b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6c 73 65   continue;.#else
177c0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
177d0 20 45 4e 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45   ENABLE_URI_00_E
177e0 52 52 4f 52 20 69 73 20 64 65 66 69 6e 65 64 2c  RROR is defined,
177f0 20 22 25 30 30 22 20 69 6e 20 61 20 55 52 49 20   "%00" in a URI 
17800 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a  is an error. */.
17810 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72            *pzErr
17820 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
17830 72 69 6e 74 66 28 22 75 6e 65 78 70 65 63 74 65  rintf("unexpecte
17840 64 20 25 25 30 30 20 69 6e 20 75 72 69 22 29 3b  d %%00 in uri");
17850 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
17860 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
17870 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72          goto par
17880 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 23 65 6e 64  se_uri_out;.#end
17890 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  if.        }.   
178a0 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a       c = octet;.
178b0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
178c0 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d  eState==1 && (c=
178d0 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20  ='&' || c=='=') 
178e0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
178f0 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20  File[iOut-1]==0 
17900 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
17910 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20  An empty option 
17920 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69  name. Ignore thi
17930 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74  s option altoget
17940 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  her. */.        
17950 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49    while( zUri[iI
17960 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21  n] && zUri[iIn]!
17970 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e  ='#' && zUri[iIn
17980 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b  -1]!='&' ) iIn++
17990 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
179a0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
179b0 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
179c0 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  &' ){.          
179d0 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
179e0 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65  '\0';.        }e
179f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65  lse{.          e
17a00 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20  State = 2;.     
17a10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d     }.        c =
17a20 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
17a30 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26  if( (eState==0 &
17a40 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53  & c=='?') || (eS
17a50 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26  tate==2 && c=='&
17a60 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  ') ){.        c 
17a70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74  = 0;.        eSt
17a80 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ate = 1;.      }
17a90 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75  .      zFile[iOu
17aa0 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a  t++] = c;.    }.
17ab0 20 20 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d      if( eState==
17ac0 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b  1 ) zFile[iOut++
17ad0 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
17ae0 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
17af0 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f  0';.    zFile[iO
17b00 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  ut++] = '\0';.. 
17b10 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
17b20 68 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70  here were any op
17b30 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20  tions specified 
17b40 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69  that should be i
17b50 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20 20 20  nterpreted .    
17b60 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73  ** here. Options
17b70 20 74 68 61 74 20 61 72 65 20 69 6e 74 65 72 70   that are interp
17b80 72 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75  reted here inclu
17b90 64 65 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f  de "vfs" and tho
17ba0 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63  se that.    ** c
17bb0 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61  orrespond to fla
17bc0 67 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 70  gs that may be p
17bd0 61 73 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c  assed to the sql
17be0 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20  ite3_open_v2(). 
17bf0 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f     ** method. */
17c00 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69  .    zOpt = &zFi
17c10 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  le[sqlite3Strlen
17c20 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20  30(zFile)+1];.  
17c30 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d    while( zOpt[0]
17c40 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
17c50 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  pt = sqlite3Strl
17c60 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20  en30(zOpt);.    
17c70 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26    char *zVal = &
17c80 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20  zOpt[nOpt+1];.  
17c90 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73      int nVal = s
17ca0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
17cb0 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  Val);..      if(
17cc0 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63   nOpt==3 && memc
17cd0 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20  mp("vfs", zOpt, 
17ce0 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  3)==0 ){.       
17cf0 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20   zVfs = zVal;.  
17d00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17d10 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f     struct OpenMo
17d20 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63  de {.          c
17d30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
17d40 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65          int mode
17d50 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f  ;.        } *aMo
17d60 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
17d70 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20  char *zModeType 
17d80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
17d90 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20   mask = 0;.     
17da0 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30     int limit = 0
17db0 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ;..        if( n
17dc0 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70  Opt==5 && memcmp
17dd0 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20  ("cache", zOpt, 
17de0 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  5)==0 ){.       
17df0 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
17e00 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65   OpenMode aCache
17e10 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Mode[] = {.     
17e20 20 20 20 20 20 20 20 7b 20 22 73 68 61 72 65 64         { "shared
17e30 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
17e40 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20  SHAREDCACHE },. 
17e50 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 70 72             { "pr
17e60 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f  ivate", SQLITE_O
17e70 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
17e80 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
17e90 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20  { 0, 0 }.       
17ea0 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20     };..         
17eb0 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f   mask = SQLITE_O
17ec0 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c  PEN_SHAREDCACHE|
17ed0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
17ee0 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20  ATECACHE;.      
17ef0 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63      aMode = aCac
17f00 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  heMode;.        
17f10 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a    limit = mask;.
17f20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
17f30 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20  ype = "cache";. 
17f40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17f50 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20   if( nOpt==4 && 
17f60 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a  memcmp("mode", z
17f70 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20  Opt, 4)==0 ){.  
17f80 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73          static s
17f90 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61  truct OpenMode a
17fa0 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20  OpenMode[] = {. 
17fb0 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f             { "ro
17fc0 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
17fd0 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20  READONLY },.    
17fe0 20 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20          { "rw", 
17ff0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
18000 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20  DWRITE }, .     
18010 20 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20         { "rwc", 
18020 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
18030 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
18040 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20  PEN_CREATE },.  
18050 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d            { "mem
18060 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ory", SQLITE_OPE
18070 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20  N_MEMORY },.    
18080 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d          { 0, 0 }
18090 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20  .          };.. 
180a0 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20           mask = 
180b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
180c0 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50  ONLY | SQLITE_OP
180d0 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20  EN_READWRITE.   
180e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180f0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
18100 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
18110 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20  EN_MEMORY;.     
18120 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70       aMode = aOp
18130 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  enMode;.        
18140 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26    limit = mask &
18150 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20   flags;.        
18160 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 61    zModeType = "a
18170 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20 20 20  ccess";.        
18180 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  }..        if( a
18190 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
181a0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
181b0 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b     int mode = 0;
181c0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
181d0 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20  =0; aMode[i].z; 
181e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
181f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
18200 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20  = aMode[i].z;.  
18210 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 56            if( nV
18220 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65  al==sqlite3Strle
18230 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d  n30(z) && 0==mem
18240 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61  cmp(zVal, z, nVa
18250 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
18260 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65      mode = aMode
18270 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20  [i].mode;.      
18280 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18290 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
182a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
182b0 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29     if( mode==0 )
182c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
182d0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
182e0 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75  3_mprintf("no su
182f0 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c  ch %s mode: %s",
18300 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c   zModeType, zVal
18310 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
18320 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
18330 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
18340 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
18350 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
18360 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 6f 64          if( (mod
18370 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  e & ~SQLITE_OPEN
18380 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29  _MEMORY)>limit )
18390 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
183a0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
183b0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f  3_mprintf("%s mo
183c0 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20  de not allowed: 
183d0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
183e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f               zMo
18400 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20  deType, zVal);. 
18410 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
18420 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
18430 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61           goto pa
18440 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
18450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18460 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67     flags = (flag
18470 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64  s & ~mask) | mod
18480 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
18490 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74     }..      zOpt
184a0 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d   = &zVal[nVal+1]
184b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
184c0 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71  {.    zFile = sq
184d0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
184e0 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20  Uri+2);.    if( 
184f0 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  !zFile ) return 
18500 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
18510 54 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20  T;.    if( nUri 
18520 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
18530 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72  zFile, zUri, nUr
18540 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46  i);.    }.    zF
18550 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27  ile[nUri] = '\0'
18560 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69  ;.    zFile[nUri
18570 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  +1] = '\0';.    
18580 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
18590 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a  _OPEN_URI;.  }..
185a0 20 20 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74    *ppVfs = sqlit
185b0 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73  e3_vfs_find(zVfs
185c0 29 3b 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d  );.  if( *ppVfs=
185d0 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72  =0 ){.    *pzErr
185e0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
185f0 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76  rintf("no such v
18600 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a  fs: %s", zVfs);.
18610 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18620 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73  ERROR;.  }. pars
18630 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28  e_uri_out:.  if(
18640 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18650 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
18660 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a  ee(zFile);.    z
18670 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  File = 0;.  }.  
18680 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  *pFlags = flags;
18690 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69  .  *pzFile = zFi
186a0 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  le;.  return rc;
186b0 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
186c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 55  SQLITE_ENABLE_AU
186d0 54 4f 5f 50 52 4f 46 49 4c 45 29 0a 23 64 65 66  TO_PROFILE).#def
186e0 69 6e 65 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c  ine SQLITE_AUTOL
186f0 4f 47 47 49 4e 47 5f 53 54 44 45 52 52 20 31 0a  OGGING_STDERR 1.
18700 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 41  #define SQLITE_A
18710 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f  UTOLOGGING_SYSLO
18720 47 20 32 0a 73 74 61 74 69 63 20 76 6f 69 64 20  G 2.static void 
18730 65 6e 61 62 6c 65 41 75 74 6f 4c 6f 67 67 69 6e  enableAutoLoggin
18740 67 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  g(.  sqlite3 *db
18750 0a 29 7b 0a 20 20 63 68 61 72 20 2a 65 6e 76 70  .){.  char *envp
18760 72 6f 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28  rofile = getenv(
18770 22 53 51 4c 49 54 45 5f 41 55 54 4f 5f 50 52 4f  "SQLITE_AUTO_PRO
18780 46 49 4c 45 22 29 3b 0a 20 20 0a 20 20 69 66 28  FILE");.  .  if(
18790 20 65 6e 76 70 72 6f 66 69 6c 65 21 3d 4e 55 4c   envprofile!=NUL
187a0 4c 20 29 7b 0a 20 20 20 20 69 6e 74 20 77 68 65  L ){.    int whe
187b0 72 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  re = 0;.    if( 
187c0 21 73 74 72 6e 63 61 73 65 63 6d 70 28 22 31 22  !strncasecmp("1"
187d0 2c 20 65 6e 76 70 72 6f 66 69 6c 65 2c 20 31 29  , envprofile, 1)
187e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
187f0 61 74 74 79 28 32 29 20 29 7b 0a 20 20 20 20 20  atty(2) ){.     
18800 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54     where = SQLIT
18810 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54  E_AUTOLOGGING_ST
18820 44 45 52 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  DERR;.      }els
18830 65 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  e{.        where
18840 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f   = SQLITE_AUTOLO
18850 47 47 49 4e 47 5f 53 59 53 4c 4f 47 3b 0a 20 20  GGING_SYSLOG;.  
18860 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
18870 20 69 66 28 20 21 73 74 72 6e 63 61 73 65 63 6d   if( !strncasecm
18880 70 28 22 73 74 64 65 72 72 22 2c 20 65 6e 76 70  p("stderr", envp
18890 72 6f 66 69 6c 65 2c 20 36 29 20 29 7b 0a 20 20  rofile, 6) ){.  
188a0 20 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49      where = SQLI
188b0 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53  TE_AUTOLOGGING_S
188c0 54 44 45 52 52 3b 0a 20 20 20 20 7d 20 65 6c 73  TDERR;.    } els
188d0 65 20 69 66 28 20 21 73 74 72 6e 63 61 73 65 63  e if( !strncasec
188e0 6d 70 28 22 73 79 73 6c 6f 67 22 2c 20 65 6e 76  mp("syslog", env
188f0 70 72 6f 66 69 6c 65 2c 20 36 29 20 29 7b 0a 20  profile, 6) ){. 
18900 20 20 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c       where = SQL
18910 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f  ITE_AUTOLOGGING_
18920 53 59 53 4c 4f 47 3b 0a 20 20 20 20 7d 0a 20 20  SYSLOG;.    }.  
18930 20 20 69 66 28 20 77 68 65 72 65 3d 3d 53 51 4c    if( where==SQL
18940 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f  ITE_AUTOLOGGING_
18950 53 54 44 45 52 52 20 29 7b 0a 20 20 20 20 20 20  STDERR ){.      
18960 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28  sqlite3_profile(
18970 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f  db, _sqlite_auto
18980 5f 70 72 6f 66 69 6c 65 2c 20 64 62 29 3b 0a 20  _profile, db);. 
18990 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65     }else if( whe
189a0 72 65 3d 3d 53 51 4c 49 54 45 5f 41 55 54 4f 4c  re==SQLITE_AUTOL
189b0 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47 20 29 7b  OGGING_SYSLOG ){
189c0 0a 20 20 20 20 20 20 5f 6f 70 65 6e 5f 61 73 6c  .      _open_asl
189d0 5f 6c 6f 67 28 29 3b 0a 20 20 20 20 20 20 73 71  _log();.      sq
189e0 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 64 62  lite3_profile(db
189f0 2c 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 70  , _sqlite_auto_p
18a00 72 6f 66 69 6c 65 5f 73 79 73 6c 6f 67 2c 20 64  rofile_syslog, d
18a10 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
18a20 63 68 61 72 20 2a 65 6e 76 74 72 61 63 65 20 3d  char *envtrace =
18a30 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
18a40 41 55 54 4f 5f 54 52 41 43 45 22 29 3b 0a 20 20  AUTO_TRACE");.  
18a50 69 66 28 20 65 6e 76 74 72 61 63 65 21 3d 4e 55  if( envtrace!=NU
18a60 4c 4c 20 29 7b 0a 20 20 20 20 69 6e 74 20 77 68  LL ){.    int wh
18a70 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ere = 0;.    if(
18a80 20 21 73 74 72 6e 63 61 73 65 63 6d 70 28 22 31   !strncasecmp("1
18a90 22 2c 20 65 6e 76 74 72 61 63 65 2c 20 31 29 20  ", envtrace, 1) 
18aa0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 61  ){.      if( isa
18ab0 74 74 79 28 32 29 20 29 7b 0a 20 20 20 20 20 20  tty(2) ){.      
18ac0 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45    where = SQLITE
18ad0 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44  _AUTOLOGGING_STD
18ae0 45 52 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ERR;.      }else
18af0 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 20  {.        where 
18b00 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47  = SQLITE_AUTOLOG
18b10 47 49 4e 47 5f 53 59 53 4c 4f 47 3b 0a 20 20 20  GING_SYSLOG;.   
18b20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
18b30 69 66 28 20 21 73 74 72 6e 63 61 73 65 63 6d 70  if( !strncasecmp
18b40 28 22 73 74 64 65 72 72 22 2c 20 65 6e 76 74 72  ("stderr", envtr
18b50 61 63 65 2c 20 36 29 20 29 7b 0a 20 20 20 20 20  ace, 6) ){.     
18b60 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45 5f   where = SQLITE_
18b70 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44 45  AUTOLOGGING_STDE
18b80 52 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  RR;.    } else i
18b90 66 28 20 21 73 74 72 6e 63 61 73 65 63 6d 70 28  f( !strncasecmp(
18ba0 22 73 79 73 6c 6f 67 22 2c 20 65 6e 76 74 72 61  "syslog", envtra
18bb0 63 65 2c 20 36 29 20 29 7b 0a 20 20 20 20 20 20  ce, 6) ){.      
18bc0 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45 5f 41  where = SQLITE_A
18bd0 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f  UTOLOGGING_SYSLO
18be0 47 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  G;.    }.    if(
18bf0 20 77 68 65 72 65 3d 3d 53 51 4c 49 54 45 5f 41   where==SQLITE_A
18c00 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44 45 52  UTOLOGGING_STDER
18c10 52 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R ){.      sqlit
18c20 65 33 5f 74 72 61 63 65 28 64 62 2c 20 5f 73 71  e3_trace(db, _sq
18c30 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61 63 65 2c  lite_auto_trace,
18c40 20 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20   db);.    }else 
18c50 69 66 28 20 77 68 65 72 65 3d 3d 53 51 4c 49 54  if( where==SQLIT
18c60 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59  E_AUTOLOGGING_SY
18c70 53 4c 4f 47 20 29 7b 0a 20 20 20 20 20 20 5f 6f  SLOG ){.      _o
18c80 70 65 6e 5f 61 73 6c 5f 6c 6f 67 28 29 3b 0a 20  pen_asl_log();. 
18c90 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61       sqlite3_tra
18ca0 63 65 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61  ce(db, _sqlite_a
18cb0 75 74 6f 5f 74 72 61 63 65 5f 73 79 73 6c 6f 67  uto_trace_syslog
18cc0 2c 20 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , db);.    }.  }
18cd0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .}.#endif..#if d
18ce0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
18cf0 53 5f 43 4f 44 45 43 29 0a 2f 2a 0a 2a 2a 20 50  S_CODEC)./*.** P
18d00 72 6f 63 65 73 73 20 55 52 49 20 66 69 6c 65 6e  rocess URI filen
18d10 61 6d 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  ame query parame
18d20 74 65 72 73 20 72 65 6c 65 76 61 6e 74 20 74 6f  ters relevant to
18d30 20 74 68 65 20 53 51 4c 69 74 65 20 45 6e 63 72   the SQLite Encr
18d40 79 70 74 69 6f 6e 0a 2a 2a 20 45 78 74 65 6e 73  yption.** Extens
18d50 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ion.  Return tru
18d60 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  e if any of the 
18d70 72 65 6c 65 76 61 6e 74 20 71 75 65 72 79 20 70  relevant query p
18d80 61 72 61 6d 65 74 65 72 73 20 61 72 65 0a 2a 2a  arameters are.**
18d90 20 73 65 65 6e 20 61 6e 64 20 72 65 74 75 72 6e   seen and return
18da0 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
18db0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64  /.int sqlite3Cod
18dc0 65 63 51 75 65 72 79 50 61 72 61 6d 65 74 65 72  ecQueryParameter
18dd0 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s(.  sqlite3 *db
18de0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ,           /* D
18df0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
18e00 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
18e10 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f  ar *zDb,       /
18e20 2a 20 57 68 69 63 68 20 73 63 68 65 6d 61 20 69  * Which schema i
18e30 73 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 2f  s being created/
18e40 61 74 74 61 63 68 65 64 20 2a 2f 0a 20 20 63 6f  attached */.  co
18e50 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20 20  nst char *zUri  
18e60 20 20 20 20 20 2f 2a 20 55 52 49 20 66 69 6c 65       /* URI file
18e70 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  name */.){.  con
18e80 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20  st char *zKey;. 
18e90 20 69 66 28 20 28 7a 4b 65 79 20 3d 20 73 71 6c   if( (zKey = sql
18ea0 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
18eb0 65 72 28 7a 55 72 69 2c 20 22 68 65 78 6b 65 79  er(zUri, "hexkey
18ec0 22 29 29 21 3d 30 20 26 26 20 7a 4b 65 79 5b 30  "))!=0 && zKey[0
18ed0 5d 20 29 7b 0a 20 20 20 20 75 38 20 69 42 79 74  ] ){.    u8 iByt
18ee0 65 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  e;.    int i;.  
18ef0 20 20 63 68 61 72 20 7a 44 65 63 6f 64 65 64 5b    char zDecoded[
18f00 34 30 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  40];.    for(i=0
18f10 2c 20 69 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a  , iByte=0; i<siz
18f20 65 6f 66 28 7a 44 65 63 6f 64 65 64 29 2a 32 20  eof(zDecoded)*2 
18f30 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67  && sqlite3Isxdig
18f40 69 74 28 7a 4b 65 79 5b 69 5d 29 3b 20 69 2b 2b  it(zKey[i]); i++
18f50 29 7b 0a 20 20 20 20 20 20 69 42 79 74 65 20 3d  ){.      iByte =
18f60 20 28 69 42 79 74 65 3c 3c 34 29 20 2b 20 73 71   (iByte<<4) + sq
18f70 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 4b  lite3HexToInt(zK
18f80 65 79 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  ey[i]);.      if
18f90 28 20 28 69 26 31 29 21 3d 30 20 29 20 7a 44 65  ( (i&1)!=0 ) zDe
18fa0 63 6f 64 65 64 5b 69 2f 32 5d 20 3d 20 69 42 79  coded[i/2] = iBy
18fb0 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  te;.    }.    sq
18fc0 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c  lite3_key_v2(db,
18fd0 20 7a 44 62 2c 20 7a 44 65 63 6f 64 65 64 2c 20   zDb, zDecoded, 
18fe0 69 2f 32 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  i/2);.    return
18ff0 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
19000 28 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f  (zKey = sqlite3_
19010 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 55  uri_parameter(zU
19020 72 69 2c 20 22 6b 65 79 22 29 29 21 3d 30 20 29  ri, "key"))!=0 )
19030 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65  {.    sqlite3_ke
19040 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b  y_v2(db, zDb, zK
19050 65 79 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  ey, sqlite3Strle
19060 6e 33 30 28 7a 4b 65 79 29 29 3b 0a 20 20 20 20  n30(zKey));.    
19070 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73  return 1;.  }els
19080 65 20 69 66 28 20 28 7a 4b 65 79 20 3d 20 73 71  e if( (zKey = sq
19090 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
190a0 74 65 72 28 7a 55 72 69 2c 20 22 74 65 78 74 6b  ter(zUri, "textk
190b0 65 79 22 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ey"))!=0 ){.    
190c0 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64  sqlite3_key_v2(d
190d0 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 2d 31  b, zDb, zKey, -1
190e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
190f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
19100 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  turn 0;.  }.}.#e
19110 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
19120 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
19130 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e  e work of openin
19140 67 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20  g a database on 
19150 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c  behalf of.** sql
19160 69 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20  ite3_open() and 
19170 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29  sqlite3_open16()
19180 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  . The database f
19190 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61  ilename "zFilena
191a0 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d  me"  .** is UTF-
191b0 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74  8 encoded..*/.st
191c0 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74  atic int openDat
191d0 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63  abase(.  const c
191e0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
191f0 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
19200 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64  name UTF-8 encod
19210 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ed */.  sqlite3 
19220 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f  **ppDb,        /
19230 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20  * OUT: Returned 
19240 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
19250 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  */.  unsigned in
19260 74 20 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f  t flags,    /* O
19270 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73  perational flags
19280 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
19290 20 2a 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20   *zVfs       /* 
192a0 4e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  Name of the VFS 
192b0 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73  to use */.){.  s
192c0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
192d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
192e0 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65  * Store allocate
192f0 64 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  d handle here */
19300 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19320 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
19330 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68 72  e */.  int isThr
19340 65 61 64 73 61 66 65 3b 20 20 20 20 20 20 20 20  eadsafe;        
19350 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
19360 6f 72 20 74 68 72 65 61 64 73 61 66 65 20 63 6f  or threadsafe co
19370 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63  nnections */.  c
19380 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20  har *zOpen = 0; 
19390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
193a0 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d  * Filename argum
193b0 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 42  ent to pass to B
193c0 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  treeOpen() */.  
193d0 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
193e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
193f0 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  /* Error message
19400 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 50 61 72   from sqlite3Par
19410 73 65 55 72 69 28 29 20 2a 2f 0a 0a 23 69 66 64  seUri() */..#ifd
19420 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
19430 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
19440 20 70 70 44 62 3d 3d 30 20 29 20 72 65 74 75 72   ppDb==0 ) retur
19450 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
19460 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a  BKPT;.#endif.  *
19470 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65  ppDb = 0;.#ifnde
19480 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
19490 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71  TOINIT.  rc = sq
194a0 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
194b0 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ();.  if( rc ) r
194c0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
194d0 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  ..  if( sqlite3G
194e0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
194f0 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  eMutex==0 ){.   
19500 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
19510 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  0;.  }else if( f
19520 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
19530 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20  EN_NOMUTEX ){.  
19540 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
19550 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
19560 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
19570 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b  PEN_FULLMUTEX ){
19580 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
19590 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 1;.  }else{.
195a0 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
195b0 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
195c0 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
195d0 78 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 66 6c  x;.  }..  if( fl
195e0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
195f0 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 29  N_PRIVATECACHE )
19600 7b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e  {.    flags &= ~
19610 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
19620 45 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65  EDCACHE;.  }else
19630 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
19640 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43  alConfig.sharedC
19650 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20  acheEnabled ){. 
19660 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
19670 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
19680 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  CHE;.  }..  /* R
19690 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69  emove harmful bi
196a0 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67  ts from the flag
196b0 73 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a  s parameter.  **
196c0 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  .  ** The SQLITE
196d0 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e  _OPEN_NOMUTEX an
196e0 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  d SQLITE_OPEN_FU
196f0 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65  LLMUTEX flags we
19700 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69  re.  ** dealt wi
19710 74 68 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  th in the previo
19720 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20  us code block.  
19730 42 65 73 69 64 65 73 20 74 68 65 73 65 2c 20 74  Besides these, t
19740 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c  he only.  ** val
19750 69 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66  id input flags f
19760 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  or sqlite3_open_
19770 76 32 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f  v2() are SQLITE_
19780 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20  OPEN_READONLY,. 
19790 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ** SQLITE_OPEN_
197a0 52 45 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54  READWRITE, SQLIT
197b0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53  E_OPEN_CREATE, S
197c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
197d0 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c  DCACHE,.  ** SQL
197e0 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
197f0 43 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20  CACHE, and some 
19800 72 65 73 65 72 76 65 64 20 62 69 74 73 2e 20 20  reserved bits.  
19810 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20  Silently mask.  
19820 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72  ** off all other
19830 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66   flags..  */.  f
19840 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49  lags &=  ~( SQLI
19850 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
19860 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20  CLOSE |.        
19870 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
19880 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20  EN_EXCLUSIVE |. 
19890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
198a0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
198b0 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  B |.            
198c0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
198d0 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20  EMP_DB | .      
198e0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
198f0 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
19900 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  B | .           
19910 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
19920 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a  MAIN_JOURNAL | .
19930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
19940 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
19950 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20  JOURNAL | .     
19960 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
19970 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
19980 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
19990 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
199a0 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a  ASTER_JOURNAL |.
199b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
199c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
199d0 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EX |.           
199e0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
199f0 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20  FULLMUTEX |.    
19a00 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
19a10 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20  E_OPEN_WAL.     
19a20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a          );..  /*
19a30 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
19a40 6c 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74  lite data struct
19a50 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71  ure */.  db = sq
19a60 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
19a70 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29   sizeof(sqlite3)
19a80 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20   );.  if( db==0 
19a90 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75  ) goto opendb_ou
19aa0 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65 61  t;.  if( isThrea
19ab0 64 73 61 66 65 20 0a 23 69 66 64 65 66 20 53 51  dsafe .#ifdef SQ
19ac0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 55 4c 54  LITE_ENABLE_MULT
19ad0 49 54 48 52 45 41 44 45 44 5f 43 48 45 43 4b 53  ITHREADED_CHECKS
19ae0 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c  .   || sqlite3Gl
19af0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
19b00 4d 75 74 65 78 0a 23 65 6e 64 69 66 0a 20 20 29  Mutex.#endif.  )
19b10 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20  {.    db->mutex 
19b20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
19b30 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
19b40 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20  _RECURSIVE);.   
19b50 20 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d   if( db->mutex==
19b60 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
19b70 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20  e3_free(db);.   
19b80 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20     db = 0;.     
19b90 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
19ba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19bb0 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30 20  isThreadsafe==0 
19bc0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
19bd0 4d 75 74 65 78 57 61 72 6e 4f 6e 43 6f 6e 74 65  MutexWarnOnConte
19be0 6e 74 69 6f 6e 28 64 62 2d 3e 6d 75 74 65 78 29  ntion(db->mutex)
19bf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
19c00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
19c10 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
19c20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78  db->errMask = 0x
19c30 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20  ff;.  db->nDb = 
19c40 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  2;.  db->magic =
19c50 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55   SQLITE_MAGIC_BU
19c60 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20  SY;.  db->aDb = 
19c70 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20  db->aDbStatic;. 
19c80 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
19c90 44 69 73 61 62 6c 65 20 3d 20 31 3b 0a 0a 20 20  Disable = 1;..  
19ca0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64  assert( sizeof(d
19cb0 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65  b->aLimit)==size
19cc0 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29  of(aHardLimit) )
19cd0 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61  ;.  memcpy(db->a
19ce0 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69  Limit, aHardLimi
19cf0 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c  t, sizeof(db->aL
19d00 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 4c  imit));.  db->aL
19d10 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
19d20 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
19d30 5d 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  ] = SQLITE_DEFAU
19d40 4c 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  LT_WORKER_THREAD
19d50 53 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  S;.  db->autoCom
19d60 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e  mit = 1;.  db->n
19d70 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b  extAutovac = -1;
19d80 0a 20 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20  .  db->szMmap = 
19d90 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
19da0 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62  fig.szMmap;.  db
19db0 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d  ->nextPagesize =
19dc0 20 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61 78 53 6f   0;.  db->nMaxSo
19dd0 72 74 65 72 4d 6d 61 70 20 3d 20 30 78 37 46 46  rterMmap = 0x7FF
19de0 46 46 46 46 46 3b 0a 20 20 64 62 2d 3e 66 6c 61  FFFFF;.  db->fla
19df0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
19e00 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c  rtColNames | SQL
19e10 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65  ITE_EnableTrigge
19e20 72 20 7c 20 53 51 4c 49 54 45 5f 43 61 63 68 65  r | SQLITE_Cache
19e30 53 70 69 6c 6c 0a 23 69 66 20 21 64 65 66 69 6e  Spill.#if !defin
19e40 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ed(SQLITE_DEFAUL
19e50 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
19e60 58 29 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 46  X) || SQLITE_DEF
19e70 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  AULT_AUTOMATIC_I
19e80 4e 44 45 58 0a 20 20 20 20 20 20 20 20 20 20 20  NDEX.           
19e90 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
19ea0 75 74 6f 49 6e 64 65 78 0a 23 65 6e 64 69 66 0a  utoIndex.#endif.
19eb0 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
19ec0 4c 54 5f 43 4b 50 54 46 55 4c 4c 46 53 59 4e 43  LT_CKPTFULLFSYNC
19ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19ee0 20 20 7c 20 53 51 4c 49 54 45 5f 43 6b 70 74 46    | SQLITE_CkptF
19ef0 75 6c 6c 46 53 79 6e 63 0a 23 65 6e 64 69 66 0a  ullFSync.#endif.
19f00 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
19f10 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34  LT_FILE_FORMAT<4
19f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19f30 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61 63    | SQLITE_Legac
19f40 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a  yFileFmt.#endif.
19f50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
19f60 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  ABLE_LOAD_EXTENS
19f70 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ION.            
19f80 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f       | SQLITE_Lo
19f90 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64  adExtension.#end
19fa0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  if.#if SQLITE_DE
19fb0 46 41 55 4c 54 5f 52 45 43 55 52 53 49 56 45 5f  FAULT_RECURSIVE_
19fc0 54 52 49 47 47 45 52 53 0a 20 20 20 20 20 20 20  TRIGGERS.       
19fd0 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
19fe0 54 45 5f 52 65 63 54 72 69 67 67 65 72 73 0a 23  TE_RecTriggers.#
19ff0 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
1a000 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  d(SQLITE_DEFAULT
1a010 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29 20 26  _FOREIGN_KEYS) &
1a020 26 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  & SQLITE_DEFAULT
1a030 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20  _FOREIGN_KEYS.  
1a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1a050 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b   SQLITE_ForeignK
1a060 65 79 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  eys.#endif.#if d
1a070 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 52 45  efined(SQLITE_RE
1a080 56 45 52 53 45 5f 55 4e 4f 52 44 45 52 45 44 5f  VERSE_UNORDERED_
1a090 53 45 4c 45 43 54 53 29 0a 20 20 20 20 20 20 20  SELECTS).       
1a0a0 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
1a0b0 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 0a  TE_ReverseOrder.
1a0c0 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
1a0d0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1a0e0 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43  _OVERSIZE_CELL_C
1a0f0 48 45 43 4b 29 0a 20 20 20 20 20 20 20 20 20 20  HECK).          
1a100 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
1a110 43 65 6c 6c 53 69 7a 65 43 6b 0a 23 65 6e 64 69  CellSizeCk.#endi
1a120 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
1a130 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
1a140 5f 54 4f 4b 45 4e 49 5a 45 52 29 0a 20 20 20 20  _TOKENIZER).    
1a150 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
1a160 51 4c 49 54 45 5f 46 74 73 33 54 6f 6b 65 6e 69  QLITE_Fts3Tokeni
1a170 7a 65 72 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  zer.#endif.#if d
1a180 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1a190 41 42 4c 45 5f 51 50 53 47 29 0a 20 20 20 20 20  ABLE_QPSG).     
1a1a0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
1a1b0 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 0a  LITE_EnableQPSG.
1a1c0 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
1a1d0 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ed(SQLITE_DEFAUL
1a1e0 54 5f 44 45 46 45 4e 53 49 56 45 29 0a 20 20 20  T_DEFENSIVE).   
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1a200 53 51 4c 49 54 45 5f 44 65 66 65 6e 73 69 76 65  SQLITE_Defensive
1a210 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a  .#endif.      ;.
1a220 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
1a230 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  t(&db->aCollSeq)
1a240 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1a250 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
1a260 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68  LE.  sqlite3Hash
1a270 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  Init(&db->aModul
1a280 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  e);.#endif..  /*
1a290 20 41 64 64 20 74 68 65 20 64 65 66 61 75 6c 74   Add the default
1a2a0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1a2b0 6e 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41  nce BINARY. BINA
1a2c0 52 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74  RY works for bot
1a2d0 68 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64  h UTF-8.  ** and
1a2e0 20 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20   UTF-16, so add 
1a2f0 61 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61  a version for ea
1a300 63 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20  ch to avoid any 
1a310 75 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a  unnecessary.  **
1a320 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68   conversions. Th
1a330 65 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61  e only error tha
1a340 74 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65  t can occur here
1a350 20 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   is a malloc() f
1a360 61 69 6c 75 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ailure..  **.  *
1a370 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a380 2d 35 32 37 38 36 2d 34 34 38 37 38 20 53 51 4c  -52786-44878 SQL
1a390 69 74 65 20 64 65 66 69 6e 65 73 20 74 68 72 65  ite defines thre
1a3a0 65 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61  e built-in colla
1a3b0 74 69 6e 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69  ting.  ** functi
1a3c0 6f 6e 73 3a 0a 20 20 2a 2f 0a 20 20 63 72 65 61  ons:.  */.  crea
1a3d0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
1a3e0 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
1a3f0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
1a400 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
1a410 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
1a420 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65 33  tion(db, sqlite3
1a430 53 74 72 42 49 4e 41 52 59 2c 20 53 51 4c 49 54  StrBINARY, SQLIT
1a440 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69  E_UTF16BE, 0, bi
1a450 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
1a460 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
1a470 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42  (db, sqlite3StrB
1a480 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54  INARY, SQLITE_UT
1a490 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c  F16LE, 0, binCol
1a4a0 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
1a4b0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
1a4c0 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54   "NOCASE", SQLIT
1a4d0 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73  E_UTF8, 0, nocas
1a4e0 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20  eCollatingFunc, 
1a4f0 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c  0);.  createColl
1a500 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d  ation(db, "RTRIM
1a510 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
1a520 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c  (void*)1, binCol
1a530 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28  lFunc, 0);.  if(
1a540 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1a550 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  d ){.    goto op
1a560 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  endb_out;.  }.  
1a570 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a580 52 2d 30 38 33 30 38 2d 31 37 32 32 34 20 54 68  R-08308-17224 Th
1a590 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
1a5a0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ing function for
1a5b0 20 61 6c 6c 0a 20 20 2a 2a 20 73 74 72 69 6e 67   all.  ** string
1a5c0 73 20 69 73 20 42 49 4e 41 52 59 2e 20 0a 20 20  s is BINARY. .  
1a5d0 2a 2f 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f  */.  db->pDfltCo
1a5e0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
1a5f0 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49  CollSeq(db, SQLI
1a600 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33  TE_UTF8, sqlite3
1a610 53 74 72 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20  StrBINARY, 0);. 
1a620 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66   assert( db->pDf
1a630 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20  ltColl!=0 );..  
1a640 2f 2a 20 50 61 72 73 65 20 74 68 65 20 66 69 6c  /* Parse the fil
1a650 65 6e 61 6d 65 2f 55 52 49 20 61 72 67 75 6d 65  ename/URI argume
1a660 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 6c  nt.  **.  ** Onl
1a670 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65  y allow sensible
1a680 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
1a690 20 62 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61   bits in the fla
1a6a0 67 73 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20  gs argument.  . 
1a6b0 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72   ** Throw an err
1a6c0 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65  or if any non-se
1a6d0 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  nse combination 
1a6e0 69 73 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a  is used.  If we.
1a6f0 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63    ** do not bloc
1a700 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e  k illegal combin
1a710 61 74 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20  ations here, it 
1a720 63 6f 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20  could trigger.  
1a730 2a 2a 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ** assert() stat
1a740 65 6d 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72  ements in deeper
1a750 20 6c 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62   layers.  Sensib
1a760 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a  le combinations.
1a770 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20    ** are:.  **. 
1a780 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f   **  1:  SQLITE_
1a790 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20  OPEN_READONLY.  
1a7a0 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f  **  2:  SQLITE_O
1a7b0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20  PEN_READWRITE.  
1a7c0 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f  **  6:  SQLITE_O
1a7d0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
1a7e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1a7f0 54 45 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70  TE.  */.  db->op
1a800 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  enFlags = flags;
1a810 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
1a820 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
1a830 20 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73   == 0x01 );.  as
1a840 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
1a850 4e 5f 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30  N_READWRITE == 0
1a860 78 30 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  x02 );.  assert(
1a870 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
1a880 41 54 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29  ATE    == 0x04 )
1a890 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31  ;.  testcase( (1
1a8a0 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78  <<(flags&7))==0x
1a8b0 30 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c  02 ); /* READONL
1a8c0 59 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  Y */.  testcase(
1a8d0 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d   (1<<(flags&7))=
1a8e0 3d 30 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44  =0x04 ); /* READ
1a8f0 57 52 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63  WRITE */.  testc
1a900 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
1a910 37 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20  7))==0x40 ); /* 
1a920 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
1a930 54 45 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c  TE */.  if( ((1<
1a940 3c 28 66 6c 61 67 73 26 37 29 29 20 26 20 30 78  <(flags&7)) & 0x
1a950 34 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  46)==0 ){.    rc
1a960 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45   = SQLITE_MISUSE
1a970 5f 42 4b 50 54 3b 20 20 2f 2a 20 49 4d 50 3a 20  _BKPT;  /* IMP: 
1a980 52 2d 36 35 34 39 37 2d 34 34 35 39 34 20 2a 2f  R-65497-44594 */
1a990 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1a9a0 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55   = sqlite3ParseU
1a9b0 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61  ri(zVfs, zFilena
1a9c0 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d  me, &flags, &db-
1a9d0 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26  >pVfs, &zOpen, &
1a9e0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20  zErrMsg);.  }.  
1a9f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1aa00 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
1aa10 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20  =SQLITE_NOMEM ) 
1aa20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
1aa30 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
1aa40 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
1aa50 20 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22   rc, zErrMsg ? "
1aa60 25 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67  %s" : 0, zErrMsg
1aa70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1aa80 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
1aa90 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
1aaa0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65  t;.  }..  /* Ope
1aab0 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61  n the backend da
1aac0 74 61 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f  tabase driver */
1aad0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
1aae0 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
1aaf0 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64  s, zOpen, db, &d
1ab00 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30  b->aDb[0].pBt, 0
1ab10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ab20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
1ab30 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  | SQLITE_OPEN_MA
1ab40 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63  IN_DB);.  if( rc
1ab50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ab60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ab70 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b  E_IOERR_NOMEM ){
1ab80 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1ab90 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
1aba0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1abb0 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20  Error(db, rc);. 
1abc0 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
1abd0 75 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ut;.  }.  sqlite
1abe0 33 42 74 72 65 65 45 6e 74 65 72 28 64 62 2d 3e  3BtreeEnter(db->
1abf0 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64  aDb[0].pBt);.  d
1ac00 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d  b->aDb[0].pSchem
1ac10 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  a = sqlite3Schem
1ac20 61 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62  aGet(db, db->aDb
1ac30 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28 20  [0].pBt);.  if( 
1ac40 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1ac50 64 20 29 20 45 4e 43 28 64 62 29 20 3d 20 53 43  d ) ENC(db) = SC
1ac60 48 45 4d 41 5f 45 4e 43 28 64 62 29 3b 0a 20 20  HEMA_ENC(db);.  
1ac70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1ac80 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
1ac90 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  );.  db->aDb[1].
1aca0 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65  pSchema = sqlite
1acb0 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30  3SchemaGet(db, 0
1acc0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66  );..  /* The def
1acd0 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65  ault safety_leve
1ace0 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  l for the main d
1acf0 61 74 61 62 61 73 65 20 69 73 20 46 55 4c 4c 3b  atabase is FULL;
1ad00 20 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20   for the temp.  
1ad10 2a 2a 20 64 61 74 61 62 61 73 65 20 69 74 20 69  ** database it i
1ad20 73 20 4f 46 46 2e 20 54 68 69 73 20 6d 61 74 63  s OFF. This matc
1ad30 68 65 73 20 74 68 65 20 70 61 67 65 72 20 6c 61  hes the pager la
1ad40 79 65 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a  yer defaults.  .
1ad50 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30    */.  db->aDb[0
1ad60 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 22 6d 61  ].zDbSName = "ma
1ad70 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30  in";.  db->aDb[0
1ad80 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ].safety_level =
1ad90 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1ada0 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 3b 0a 20  SYNCHRONOUS+1;. 
1adb0 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62 53   db->aDb[1].zDbS
1adc0 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20  Name = "temp";. 
1add0 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65   db->aDb[1].safe
1ade0 74 79 5f 6c 65 76 65 6c 20 3d 20 50 41 47 45 52  ty_level = PAGER
1adf0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46  _SYNCHRONOUS_OFF
1ae00 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  ;..  db->magic =
1ae10 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50   SQLITE_MAGIC_OP
1ae20 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  EN;.  if( db->ma
1ae30 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1ae40 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
1ae50 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67  t;.  }..  /* Reg
1ae60 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d  ister all built-
1ae70 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75  in functions, bu
1ae80 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  t do not attempt
1ae90 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a   to read the.  *
1aea0 2a 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  * database schem
1aeb0 61 20 79 65 74 2e 20 54 68 69 73 20 69 73 20 64  a yet. This is d
1aec0 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65  elayed until the
1aed0 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 20   first time the 
1aee0 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73  database.  ** is
1aef0 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a   accessed..  */.
1af00 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
1af10 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
1af20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
1af30 50 65 72 43 6f 6e 6e 65 63 74 69 6f 6e 42 75 69  PerConnectionBui
1af40 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62  ltinFunctions(db
1af50 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1af60 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 0a  3_errcode(db);..
1af70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1af80 41 42 4c 45 5f 46 54 53 35 0a 20 20 2f 2a 20 52  ABLE_FTS5.  /* R
1af90 65 67 69 73 74 65 72 20 61 6e 79 20 62 75 69 6c  egister any buil
1afa0 74 2d 69 6e 20 46 54 53 35 20 6d 6f 64 75 6c 65  t-in FTS5 module
1afb0 20 62 65 66 6f 72 65 20 6c 6f 61 64 69 6e 67 20   before loading 
1afc0 74 68 65 20 61 75 74 6f 6d 61 74 69 63 0a 20 20  the automatic.  
1afd0 2a 2a 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 54  ** extensions. T
1afe0 68 69 73 20 61 6c 6c 6f 77 73 20 61 75 74 6f 6d  his allows autom
1aff0 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20  atic extensions 
1b000 74 6f 20 72 65 67 69 73 74 65 72 20 46 54 53 35  to register FTS5
1b010 20 0a 20 20 2a 2a 20 74 6f 6b 65 6e 69 7a 65 72   .  ** tokenizer
1b020 73 20 61 6e 64 20 61 75 78 69 6c 69 61 72 79 20  s and auxiliary 
1b030 66 75 6e 63 74 69 6f 6e 73 2e 20 20 2a 2f 0a 20  functions.  */. 
1b040 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
1b050 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
1b060 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1b070 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  c = sqlite3Fts5I
1b080 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
1b090 64 69 66 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61  dif..  /* Load a
1b0a0 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69  utomatic extensi
1b0b0 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73  ons - extensions
1b0c0 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
1b0d0 72 65 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20  registered.  ** 
1b0e0 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
1b0f0 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65  3_automatic_exte
1b100 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a  nsion() API..  *
1b110 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
1b120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
1b130 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65  ite3AutoLoadExte
1b140 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20  nsions(db);.    
1b150 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
1b160 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 69 66  code(db);.    if
1b170 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b180 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  ){.      goto op
1b190 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  endb_out;.    }.
1b1a0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
1b1b0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20  TE_ENABLE_FTS1. 
1b1c0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
1b1d0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78  Failed ){.    ex
1b1e0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
1b1f0 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33  Fts1Init(sqlite3
1b200 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  *);.    rc = sql
1b210 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62 29  ite3Fts1Init(db)
1b220 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
1b230 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1b240 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64  LE_FTS2.  if( !d
1b250 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1b260 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1b270 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69   ){.    extern i
1b280 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e  nt sqlite3Fts2In
1b290 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  it(sqlite3*);.  
1b2a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
1b2b0 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s2Init(db);.  }.
1b2c0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1b2d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
1b2e0 33 20 2f 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  3 /* automatical
1b2f0 6c 79 20 64 65 66 69 6e 65 64 20 62 79 20 53 51  ly defined by SQ
1b300 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34  LITE_ENABLE_FTS4
1b310 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d   */.  if( !db->m
1b320 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
1b330 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b340 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b350 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts3Init(db);.  
1b360 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
1b370 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1b380 42 4c 45 5f 49 43 55 29 20 7c 7c 20 64 65 66 69  BLE_ICU) || defi
1b390 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1b3a0 45 5f 49 43 55 5f 43 4f 4c 4c 41 54 49 4f 4e 53  E_ICU_COLLATIONS
1b3b0 29 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  ).  if( !db->mal
1b3c0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
1b3d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b3e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63    rc = sqlite3Ic
1b3f0 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  uInit(db);.  }.#
1b400 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
1b410 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45  LITE_ENABLE_RTRE
1b420 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  E.  if( !db->mal
1b430 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
1b440 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
1b450 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72   rc = sqlite3Rtr
1b460 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  eeInit(db);.  }.
1b470 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1b480 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50  QLITE_ENABLE_DBP
1b490 41 47 45 5f 56 54 41 42 0a 20 20 69 66 28 20 21  AGE_VTAB.  if( !
1b4a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1b4b0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1b4c0 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
1b4d0 69 74 65 33 44 62 70 61 67 65 52 65 67 69 73 74  ite3DbpageRegist
1b4e0 65 72 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  er(db);.  }.#end
1b4f0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1b500 45 5f 45 4e 41 42 4c 45 5f 44 42 53 54 41 54 5f  E_ENABLE_DBSTAT_
1b510 56 54 41 42 0a 20 20 69 66 28 20 21 64 62 2d 3e  VTAB.  if( !db->
1b520 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
1b530 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a  rc==SQLITE_OK){.
1b540 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b550 44 62 73 74 61 74 52 65 67 69 73 74 65 72 28 64  DbstatRegister(d
1b560 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
1b570 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1b580 41 42 4c 45 5f 4a 53 4f 4e 31 0a 20 20 69 66 28  ABLE_JSON1.  if(
1b590 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
1b5a0 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
1b5b0 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  _OK){.    rc = s
1b5c0 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28  qlite3Json1Init(
1b5d0 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
1b5e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1b5f0 4e 41 42 4c 45 5f 53 54 4d 54 56 54 41 42 0a 20  NABLE_STMTVTAB. 
1b600 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
1b610 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
1b620 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63  LITE_OK){.    rc
1b630 20 3d 20 73 71 6c 69 74 65 33 53 74 6d 74 56 74   = sqlite3StmtVt
1b640 61 62 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  abInit(db);.  }.
1b650 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53  #endif..  /* -DS
1b660 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
1b670 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b  CKING_MODE=1 mak
1b680 65 73 20 45 58 43 4c 55 53 49 56 45 20 74 68 65  es EXCLUSIVE the
1b690 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
1b6a0 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53  .  ** mode.  -DS
1b6b0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
1b6c0 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b  CKING_MODE=0 mak
1b6d0 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66  e NORMAL the def
1b6e0 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
1b6f0 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e  * mode.  Doing n
1b700 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c  othing at all al
1b710 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20  so makes NORMAL 
1b720 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a  the default..  *
1b730 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1b740 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
1b750 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c  MODE.  db->dfltL
1b760 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45  ockMode = SQLITE
1b770 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
1b780 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33  _MODE;.  sqlite3
1b790 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
1b7a0 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
1b7b0 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  er(db->aDb[0].pB
1b7c0 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1b7e0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
1b7f0 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64  KING_MODE);.#end
1b800 69 66 0a 0a 20 20 69 66 28 20 72 63 20 29 20 73  if..  if( rc ) s
1b810 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
1b820 72 63 29 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c  rc);..  /* Enabl
1b830 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d  e the lookaside-
1b840 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
1b850 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61   */.  setupLooka
1b860 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69  side(db, 0, sqli
1b870 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1b880 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20  szLookaside,.   
1b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8a0 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1b8b0 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73  alConfig.nLookas
1b8c0 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  ide);..  sqlite3
1b8d0 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
1b8e0 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  int(db, SQLITE_D
1b8f0 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43  EFAULT_WAL_AUTOC
1b900 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65  HECKPOINT);..ope
1b910 6e 64 62 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64  ndb_out:.  if( d
1b920 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
1b930 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c   db->mutex!=0 ||
1b940 20 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30   isThreadsafe==0
1b950 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  .           || s
1b960 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1b970 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30  ig.bFullMutex==0
1b980 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
1b990 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1b9a0 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63  mutex);.  }.  rc
1b9b0 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
1b9c0 64 65 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74  de(db);.  assert
1b9d0 28 20 64 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  ( db!=0 || rc==S
1b9e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
1b9f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ba00 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c  NOMEM ){.    sql
1ba10 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  ite3_close(db);.
1ba20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65      db = 0;.  }e
1ba30 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
1ba40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d  TE_OK ){.    db-
1ba50 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
1ba60 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a  MAGIC_SICK;.  }.
1ba70 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
1ba80 50 4c 45 5f 5f 29 20 26 26 20 45 4e 41 42 4c 45  PLE__) && ENABLE
1ba90 5f 46 4f 52 43 45 5f 57 41 4c 0a 20 20 69 66 28  _FORCE_WAL.  if(
1baa0 20 64 62 20 26 26 20 21 72 63 20 29 7b 0a 20 20   db && !rc ){.  
1bab0 20 20 69 66 20 28 28 30 20 3d 3d 20 61 63 63 65    if ((0 == acce
1bac0 73 73 28 22 2f 76 61 72 2f 64 62 2f 65 6e 61 62  ss("/var/db/enab
1bad0 6c 65 46 6f 72 63 65 57 41 4c 22 2c 20 52 5f 4f  leForceWAL", R_O
1bae0 4b 29 29 29 20 7b 0a 23 69 66 64 65 66 20 53 51  K))) {.#ifdef SQ
1baf0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
1bb00 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1bb10 20 22 53 51 4c 69 74 65 20 57 41 4c 20 6a 6f 75   "SQLite WAL jou
1bb20 72 6e 61 6c 5f 6d 6f 64 65 20 45 4e 41 42 4c 45  rnal_mode ENABLE
1bb30 44 20 62 79 20 64 65 66 61 75 6c 74 2e 5c 6e 22  D by default.\n"
1bb40 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1bb50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65  .      sqlite3_e
1bb60 78 65 63 28 64 62 2c 20 22 70 72 61 67 6d 61 20  xec(db, "pragma 
1bb70 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
1bb80 22 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e  ", NULL, NULL, N
1bb90 55 4c 4c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  ULL);.#ifdef SQL
1bba0 49 54 45 5f 44 45 42 55 47 0a 2f 2f 20 20 20 20  ITE_DEBUG.//    
1bbb0 7d 20 65 6c 73 65 20 7b 0a 2f 2f 20 20 20 20 20  } else {.//     
1bbc0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1bbd0 20 22 53 51 4c 69 74 65 20 57 41 4c 20 6a 6f 75   "SQLite WAL jou
1bbe0 72 6e 61 6c 5f 6d 6f 64 65 20 4e 4f 54 20 45 4e  rnal_mode NOT EN
1bbf0 41 42 4c 45 44 20 62 79 20 64 65 66 61 75 6c 74  ABLED by default
1bc00 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  .\n");.#endif.  
1bc10 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23    }.  }.#endif.#
1bc20 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1bc30 45 5f 45 4e 41 42 4c 45 5f 41 55 54 4f 5f 50 52  E_ENABLE_AUTO_PR
1bc40 4f 46 49 4c 45 29 0a 20 20 69 66 28 20 64 62 20  OFILE).  if( db 
1bc50 26 26 20 21 72 63 20 29 7b 0a 20 20 20 20 65 6e  && !rc ){.    en
1bc60 61 62 6c 65 41 75 74 6f 4c 6f 67 67 69 6e 67 28  ableAutoLogging(
1bc70 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
1bc80 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 23 69    *ppDb = db;.#i
1bc90 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1bca0 4c 45 5f 53 51 4c 52 52 0a 20 20 53 52 52 65 63  LE_SQLRR.  SRRec
1bcb0 4f 70 65 6e 28 64 62 2c 20 7a 46 69 6c 65 6e 61  Open(db, zFilena
1bcc0 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 23 65 6e 64  me, flags);.#end
1bcd0 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1bce0 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20  _ENABLE_SQLLOG. 
1bcf0 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
1bd00 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
1bd10 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69   ){.    /* Openi
1bd20 6e 67 20 61 20 64 62 20 68 61 6e 64 6c 65 2e 20  ng a db handle. 
1bd30 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65 72  Fourth parameter
1bd40 20 69 73 20 70 61 73 73 65 64 20 30 2e 20 2a 2f   is passed 0. */
1bd50 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20  .    void *pArg 
1bd60 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
1bd70 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
1bd80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
1bd90 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
1bda0 67 28 70 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c  g(pArg, db, zFil
1bdb0 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23  ename, 0);.  }.#
1bdc0 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
1bdd0 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  d(SQLITE_HAS_COD
1bde0 45 43 29 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  EC).  if( rc==SQ
1bdf0 4c 49 54 45 5f 4f 4b 20 29 20 73 71 6c 69 74 65  LITE_OK ) sqlite
1be00 33 43 6f 64 65 63 51 75 65 72 79 50 61 72 61 6d  3CodecQueryParam
1be10 65 74 65 72 73 28 64 62 2c 20 30 2c 20 7a 4f 70  eters(db, 0, zOp
1be20 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  en);.#endif.  sq
1be30 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e  lite3_free(zOpen
1be40 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 26  );.  return rc &
1be50 20 30 78 66 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   0xff;.}.../*.**
1be60 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61   Open a new data
1be70 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
1be80 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
1be90 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
1bea0 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71  zFilename, .  sq
1beb0 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b  lite3 **ppDb .){
1bec0 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61  .  return openDa
1bed0 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65  tabase(zFilename
1bee0 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20  , ppDb,.        
1bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1bf00 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1bf10 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
1bf20 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a  N_CREATE, 0);.}.
1bf30 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
1bf40 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  _v2(.  const cha
1bf50 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f  r *filename,   /
1bf60 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
1bf70 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ame (UTF-8) */. 
1bf80 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c   sqlite3 **ppDb,
1bf90 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1bfa0 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c   SQLite db handl
1bfb0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
1bfc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1bfd0 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e  * Flags */.  con
1bfe0 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20  st char *zVfs   
1bff0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1c000 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73  VFS module to us
1c010 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  e */.){.  return
1c020 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66 69   openDatabase(fi
1c030 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75  lename, ppDb, (u
1c040 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67  nsigned int)flag
1c050 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66  s, zVfs);.}..#if
1c060 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c070 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65  _UTF16./*.** Ope
1c080 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
1c090 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
1c0a0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a  sqlite3_open16(.
1c0b0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46    const void *zF
1c0c0 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69  ilename, .  sqli
1c0d0 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20  te3 **ppDb.){.  
1c0e0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
1c0f0 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69  ename8;   /* zFi
1c100 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69  lename encoded i
1c110 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20  n UTF-8 instead 
1c120 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73  of UTF-16 */.  s
1c130 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
1c140 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  al;.  int rc;..#
1c150 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1c160 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1c170 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72 65  if( ppDb==0 ) re
1c180 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
1c190 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
1c1a0 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66    *ppDb = 0;.#if
1c1b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c1c0 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
1c1d0 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
1c1e0 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
1c1f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
1c200 64 69 66 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e  dif.  if( zFilen
1c210 61 6d 65 3d 3d 30 20 29 20 7a 46 69 6c 65 6e 61  ame==0 ) zFilena
1c220 6d 65 20 3d 20 22 5c 30 30 30 5c 30 30 30 22 3b  me = "\000\000";
1c230 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  pVal = sqlite
1c240 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20  3ValueNew(0);.  
1c250 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
1c260 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69  tr(pVal, -1, zFi
1c270 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55  lename, SQLITE_U
1c280 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49  TF16NATIVE, SQLI
1c290 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46  TE_STATIC);.  zF
1c2a0 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74  ilename8 = sqlit
1c2b0 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
1c2c0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
1c2d0 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38    if( zFilename8
1c2e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   ){.    rc = ope
1c2f0 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e  nDatabase(zFilen
1c300 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20  ame8, ppDb,.    
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c320 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
1c330 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
1c340 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29  _OPEN_CREATE, 0)
1c350 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ;.    assert( *p
1c360 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  pDb || rc==SQLIT
1c370 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69  E_NOMEM );.    i
1c380 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c390 20 26 26 20 21 44 62 48 61 73 50 72 6f 70 65 72   && !DbHasProper
1c3a0 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f  ty(*ppDb, 0, DB_
1c3b0 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b  SchemaLoaded) ){
1c3c0 0a 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45 4e  .      SCHEMA_EN
1c3d0 43 28 2a 70 70 44 62 29 20 3d 20 45 4e 43 28 2a  C(*ppDb) = ENC(*
1c3e0 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55  ppDb) = SQLITE_U
1c3f0 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20  TF16NATIVE;.    
1c400 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
1c410 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1c420 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BKPT;.  }.  sql
1c430 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
1c440 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  al);..  return r
1c450 63 20 26 20 30 78 66 66 3b 0a 7d 0a 23 65 6e 64  c & 0xff;.}.#end
1c460 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1c470 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
1c480 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
1c490 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1c4a0 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
1c4b0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
1c4c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1c4d0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
1c4e0 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
1c4f0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
1c500 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e  zName, .  int en
1c510 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
1c520 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
1c530 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
1c540 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
1c550 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 72  st void*).){.  r
1c560 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72  eturn sqlite3_cr
1c570 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
1c580 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63  2(db, zName, enc
1c590 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
1c5a0 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 0);.}../*.** R
1c5b0 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
1c5c0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1c5d0 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
1c5e0 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
1c5f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
1c600 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
1c610 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
1c620 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
1c630 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e  zName, .  int en
1c640 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
1c650 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
1c660 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
1c670 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
1c680 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  st void*),.  voi
1c690 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a  d(*xDel)(void*).
1c6a0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  ){.  int rc;..#i
1c6b0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1c6c0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1c6d0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1c6e0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20  yCheckOk(db) || 
1c6f0 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
1c700 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1c710 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
1c720 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1c730 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1c740 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
1c750 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1c760 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
1c770 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
1c780 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78  (u8)enc, pCtx, x
1c790 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a  Compare, xDel);.
1c7a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
1c7b0 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
1c7c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1c7d0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1c7e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c7f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c800 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
1c810 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
1c820 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1c830 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
1c840 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
1c850 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
1c860 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31  reate_collation1
1c870 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  6(.  sqlite3* db
1c880 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  , .  const void 
1c890 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e  *zName,.  int en
1c8a0 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
1c8b0 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
1c8c0 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
1c8d0 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
1c8e0 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  st void*).){.  i
1c8f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1c900 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  K;.  char *zName
1c910 38 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  8;..#ifdef SQLIT
1c920 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1c930 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1c940 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1c950 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29  b) || zName==0 )
1c960 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1c970 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
1c980 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
1c990 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1c9a0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
1c9b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c9c0 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73   );.  zName8 = s
1c9d0 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
1c9e0 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  b, zName, -1, SQ
1c9f0 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
1ca00 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20  );.  if( zName8 
1ca10 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61  ){.    rc = crea
1ca20 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
1ca30 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c  zName8, (u8)enc,
1ca40 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
1ca50 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1ca60 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
1ca70 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  8);.  }.  rc = s
1ca80 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
1ca90 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
1caa0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1cab0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1cac0 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
1cad0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
1cae0 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
1caf0 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69  gister a collati
1cb00 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
1cb10 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  ory callback wit
1cb20 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
1cb30 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70  andle.** db. Rep
1cb40 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75  lace any previou
1cb50 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f  sly installed co
1cb60 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1cb70 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74   factory..*/.int
1cb80 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
1cb90 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c  on_needed(.  sql
1cba0 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69  ite3 *db, .  voi
1cbb0 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  d *pCollNeededAr
1cbc0 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c  g, .  void(*xCol
1cbd0 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73  lNeeded)(void*,s
1cbe0 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78  qlite3*,int eTex
1cbf0 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a  tRep,const char*
1cc00 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ).){.#ifdef SQLI
1cc10 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1cc20 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1cc30 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1cc40 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
1cc50 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1cc60 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1cc70 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1cc80 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
1cc90 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43  xCollNeeded = xC
1cca0 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d  ollNeeded;.  db-
1ccb0 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
1ccc0 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e   0;.  db->pCollN
1ccd0 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
1cce0 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
1ccf0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1cd00 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
1cd10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1cd20 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1cd30 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
1cd40 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
1cd50 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1cd60 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
1cd70 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
1cd80 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
1cd90 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
1cda0 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
1cdb0 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
1cdc0 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
1cdd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
1cde0 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31  ollation_needed1
1cdf0 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
1ce00 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c  , .  void *pColl
1ce10 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f  NeededArg, .  vo
1ce20 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31  id(*xCollNeeded1
1ce30 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33  6)(void*,sqlite3
1ce40 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63  *,int eTextRep,c
1ce50 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 23  onst void*).){.#
1ce60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1ce70 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1ce80 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1ce90 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
1cea0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1ceb0 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
1cec0 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1ced0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1cee0 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  x);.  db->xCollN
1cef0 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d  eeded = 0;.  db-
1cf00 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
1cf10 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a   xCollNeeded16;.
1cf20 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
1cf30 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
1cf40 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  edArg;.  sqlite3
1cf50 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1cf60 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1cf70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1cf80 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1cf90 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23  OMIT_UTF16 */..#
1cfa0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1cfb0 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
1cfc0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1cfd0 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63  n is now an anac
1cfe0 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64  hronism. It used
1cff0 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72   to be used to r
1d000 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a  ecover from a.**
1d010 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
1d020 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f  e, but SQLite no
1d030 77 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f  w does this auto
1d040 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e  matically..*/.in
1d050 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c  t sqlite3_global
1d060 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a  _recover(void){.
1d070 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d080 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
1d090 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20  .** Test to see 
1d0a0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
1d0b0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1d0c0 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74  ection is in aut
1d0d0 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e  ocommit.** mode.
1d0e0 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
1d0f0 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45   it is and FALSE
1d100 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f   if not.  Autoco
1d110 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a  mmit mode is on.
1d120 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ** by default.  
1d130 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69  Autocommit is di
1d140 73 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49  sabled by a BEGI
1d150 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  N statement and 
1d160 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20  reenabled.** by 
1d170 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20  the next COMMIT 
1d180 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a  or ROLLBACK..*/.
1d190 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  int sqlite3_get_
1d1a0 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74  autocommit(sqlit
1d1b0 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20  e3 *db){.#ifdef 
1d1c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1d1d0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1d1e0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1d1f0 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
1d200 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
1d210 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
1d220 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
1d230 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61  f.  return db->a
1d240 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a  utoCommit;.}../*
1d250 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1d260 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73  g routines are s
1d270 75 62 73 74 69 74 75 74 65 73 20 66 6f 72 20 63  ubstitutes for c
1d280 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f  onstants SQLITE_
1d290 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49  CORRUPT,.** SQLI
1d2a0 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54  TE_MISUSE, SQLIT
1d2b0 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49  E_CANTOPEN, SQLI
1d2c0 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 70 6f 73  TE_NOMEM and pos
1d2d0 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f  sibly other erro
1d2e0 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20  r.** constants. 
1d2f0 20 54 68 65 79 20 73 65 72 76 65 20 74 77 6f 20   They serve two 
1d300 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20  purposes:.**.** 
1d310 20 20 31 2e 20 20 53 65 72 76 65 20 61 73 20 61    1.  Serve as a
1d320 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
1d330 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
1d340 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67  point in a debug
1d350 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20  ger.**       to 
1d360 64 65 74 65 63 74 20 77 68 65 6e 20 76 65 72 73  detect when vers
1d370 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74  ion error condit
1d380 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  ions occurs..**.
1d390 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20  **   2.  Invoke 
1d3a0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f  sqlite3_log() to
1d3b0 20 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75   provide the sou
1d3c0 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f  rce code locatio
1d3d0 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20  n where.**      
1d3e0 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72   a low-level err
1d3f0 6f 72 20 69 73 20 66 69 72 73 74 20 64 65 74 65  or is first dete
1d400 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  cted..*/.int sql
1d410 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28  ite3ReportError(
1d420 69 6e 74 20 69 45 72 72 2c 20 69 6e 74 20 6c 69  int iErr, int li
1d430 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72  neno, const char
1d440 20 2a 7a 54 79 70 65 29 7b 0a 20 20 73 71 6c 69   *zType){.  sqli
1d450 74 65 33 5f 6c 6f 67 28 69 45 72 72 2c 20 22 25  te3_log(iErr, "%
1d460 73 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20  s at line %d of 
1d470 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20  [%.10s]",.      
1d480 20 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 6c          zType, l
1d490 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65  ineno, 20+sqlite
1d4a0 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20  3_sourceid());. 
1d4b0 20 72 65 74 75 72 6e 20 69 45 72 72 3b 0a 7d 0a   return iErr;.}.
1d4c0 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75  int sqlite3Corru
1d4d0 70 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  ptError(int line
1d4e0 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
1d4f0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1d500 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
1d510 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1d520 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49  ReportError(SQLI
1d530 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e 65  TE_CORRUPT, line
1d540 6e 6f 2c 20 22 64 61 74 61 62 61 73 65 20 63 6f  no, "database co
1d550 72 72 75 70 74 69 6f 6e 22 29 3b 0a 7d 0a 69 6e  rruption");.}.in
1d560 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45  t sqlite3MisuseE
1d570 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
1d580 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
1d590 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1d5a0 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72  g.xLog!=0 );.  r
1d5b0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70  eturn sqlite3Rep
1d5c0 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  ortError(SQLITE_
1d5d0 4d 49 53 55 53 45 2c 20 6c 69 6e 65 6e 6f 2c 20  MISUSE, lineno, 
1d5e0 22 6d 69 73 75 73 65 22 29 3b 0a 7d 0a 69 6e 74  "misuse");.}.int
1d5f0 20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e   sqlite3Cantopen
1d600 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f  Error(int lineno
1d610 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  ){.  testcase( s
1d620 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1d630 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
1d640 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65  return sqlite3Re
1d650 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45  portError(SQLITE
1d660 5f 43 41 4e 54 4f 50 45 4e 2c 20 6c 69 6e 65 6e  _CANTOPEN, linen
1d670 6f 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  o, "cannot open 
1d680 66 69 6c 65 22 29 3b 0a 7d 0a 23 69 66 64 65 66  file");.}.#ifdef
1d690 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
1d6a0 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74  t sqlite3Corrupt
1d6b0 50 67 6e 6f 45 72 72 6f 72 28 69 6e 74 20 6c 69  PgnoError(int li
1d6c0 6e 65 6e 6f 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  neno, Pgno pgno)
1d6d0 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 31 30  {.  char zMsg[10
1d6e0 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  0];.  sqlite3_sn
1d6f0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4d  printf(sizeof(zM
1d700 73 67 29 2c 20 7a 4d 73 67 2c 20 22 64 61 74 61  sg), zMsg, "data
1d710 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
1d720 70 61 67 65 20 25 64 22 2c 20 70 67 6e 6f 29 3b  page %d", pgno);
1d730 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
1d740 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1d750 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65  .xLog!=0 );.  re
1d760 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f  turn sqlite3Repo
1d770 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  rtError(SQLITE_C
1d780 4f 52 52 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20  ORRUPT, lineno, 
1d790 7a 4d 73 67 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  zMsg);.}.int sql
1d7a0 69 74 65 33 4e 6f 6d 65 6d 45 72 72 6f 72 28 69  ite3NomemError(i
1d7b0 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
1d7c0 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
1d7d0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
1d7e0 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
1d7f0 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72  sqlite3ReportErr
1d800 6f 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  or(SQLITE_NOMEM,
1d810 20 6c 69 6e 65 6e 6f 2c 20 22 4f 4f 4d 22 29 3b   lineno, "OOM");
1d820 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6f  .}.int sqlite3Io
1d830 65 72 72 6e 6f 6d 65 6d 45 72 72 6f 72 28 69 6e  errnomemError(in
1d840 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
1d850 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
1d860 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
1d870 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
1d880 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f  qlite3ReportErro
1d890 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  r(SQLITE_IOERR_N
1d8a0 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 49  OMEM, lineno, "I
1d8b0 2f 4f 20 4f 4f 4d 20 65 72 72 6f 72 22 29 3b 0a  /O OOM error");.
1d8c0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
1d8d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
1d8e0 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54  PRECATED./*.** T
1d8f0 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e 69  his is a conveni
1d900 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68 61  ence routine tha
1d910 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61  t makes sure tha
1d920 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70 65  t all thread-spe
1d930 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f  cific.** data fo
1d940 72 20 74 68 69 73 20 74 68 72 65 61 64 20 68 61  r this thread ha
1d950 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74  s been deallocat
1d960 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  ed..**.** SQLite
1d970 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20   no longer uses 
1d980 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 20  thread-specific 
1d990 64 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f 75  data so this rou
1d9a0 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a  tine is now a.**
1d9b0 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20 72   no-op.  It is r
1d9c0 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73 74  etained for hist
1d9d0 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62 69  orical compatibi
1d9e0 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lity..*/.void sq
1d9f0 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
1da00 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65  anup(void){.}.#e
1da10 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
1da20 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  rn meta informat
1da30 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63  ion about a spec
1da40 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  ific column of a
1da50 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
1da60 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20  .** See comment 
1da70 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71  in sqlite3.h (sq
1da80 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64  lite.h.in) for d
1da90 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73  etails..*/.int s
1daa0 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
1dab0 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20  umn_metadata(.  
1dac0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1dad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1dae0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
1daf0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1db00 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20 20   *zDbName,      
1db10 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61    /* Database na
1db20 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  me or NULL */.  
1db30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
1db40 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54  leName,     /* T
1db50 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63  able name */.  c
1db60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
1db70 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f  mnName,    /* Co
1db80 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63  lumn name */.  c
1db90 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61  har const **pzDa
1dba0 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55  taType,    /* OU
1dbb0 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20 64  TPUT: Declared d
1dbc0 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68  ata type */.  ch
1dbd0 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c  ar const **pzCol
1dbe0 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54  lSeq,     /* OUT
1dbf0 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73  PUT: Collation s
1dc00 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a  equence name */.
1dc10 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c    int *pNotNull,
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dc30 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
1dc40 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
1dc50 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 20  aint exists */. 
1dc60 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65   int *pPrimaryKe
1dc70 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
1dc80 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20  OUTPUT: True if 
1dc90 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20 50  column part of P
1dca0 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74  K */.  int *pAut
1dcb0 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  oinc            
1dcc0 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
1dcd0 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20  ue if column is 
1dce0 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a  auto-increment *
1dcf0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
1dd00 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
1dd10 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   0;.  Table *pTa
1dd20 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20  b = 0;.  Column 
1dd30 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pCol = 0;.  int
1dd40 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 63 68 61   iCol = 0;.  cha
1dd50 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79  r const *zDataTy
1dd60 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  pe = 0;.  char c
1dd70 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d  onst *zCollSeq =
1dd80 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c   0;.  int notnul
1dd90 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69  l = 0;.  int pri
1dda0 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69  marykey = 0;.  i
1ddb0 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a  nt autoinc = 0;.
1ddc0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1ddd0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1dde0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1ddf0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1de00 20 7c 7c 20 7a 54 61 62 6c 65 4e 61 6d 65 3d 3d   || zTableName==
1de10 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1de20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1de30 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  PT;.  }.#endif..
1de40 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20    /* Ensure the 
1de50 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
1de60 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20  has been loaded 
1de70 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
1de80 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1de90 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
1dea0 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
1deb0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49  .  rc = sqlite3I
1dec0 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67  nit(db, &zErrMsg
1ded0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
1dee0 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f  OK!=rc ){.    go
1def0 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
1df00 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
1df10 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73  he table in ques
1df20 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d  tion */.  pTab =
1df30 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
1df40 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65  e(db, zTableName
1df50 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66  , zDbName);.  if
1df60 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d  ( !pTab || pTab-
1df70 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
1df80 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f  pTab = 0;.    go
1df90 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
1dfa0 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  }..  /* Find the
1dfb0 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63   column for whic
1dfc0 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73  h info is reques
1dfd0 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a 43 6f  ted */.  if( zCo
1dfe0 6c 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  lumnName==0 ){. 
1dff0 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6f 72 20     /* Query for 
1e000 65 78 69 73 74 61 6e 63 65 20 6f 66 20 74 61 62  existance of tab
1e010 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d 65 6c  le only */.  }el
1e020 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c  se{.    for(iCol
1e030 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
1e040 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
1e050 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
1e060 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
1e070 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
1e080 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e  e3StrICmp(pCol->
1e090 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61  zName, zColumnNa
1e0a0 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  me) ){.        b
1e0b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1e0c0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
1e0d0 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  ==pTab->nCol ){.
1e0e0 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77        if( HasRow
1e0f0 69 64 28 70 54 61 62 29 20 26 26 20 73 71 6c 69  id(pTab) && sqli
1e100 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75  te3IsRowid(zColu
1e110 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  mnName) ){.     
1e120 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     iCol = pTab->
1e130 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70  iPKey;.        p
1e140 43 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20  Col = iCol>=0 ? 
1e150 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
1e160 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  ] : 0;.      }el
1e170 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62  se{.        pTab
1e180 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
1e190 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
1e1a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e1b0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1e1c0 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73  ing block stores
1e1d0 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d   the meta inform
1e1e0 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ation that will 
1e1f0 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a  be returned.  **
1e200 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69   to the caller i
1e210 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  n local variable
1e220 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f  s zDataType, zCo
1e230 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20  llSeq, notnull, 
1e240 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20  primarykey.  ** 
1e250 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20  and autoinc. At 
1e260 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
1e270 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69   are two possibi
1e280 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20  lities:.  ** .  
1e290 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73 70  **     1. The sp
1e2a0 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e  ecified column n
1e2b0 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20  ame was rowid", 
1e2c0 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64  "oid" or "_rowid
1e2d0 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  _" .  **        
1e2e0 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
1e2f0 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61  explicitly decla
1e300 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20  red IPK column. 
1e310 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32  .  **.  **     2
1e320 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e  . The table is n
1e330 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20 74 68  ot a view and th
1e340 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64  e column name id
1e350 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a  entified an .  *
1e360 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69 63 69  *        explici
1e370 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  tly declared col
1e380 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69  umn. Copy meta i
1e390 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
1e3a0 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69  *pCol..  */ .  i
1e3b0 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a  f( pCol ){.    z
1e3c0 44 61 74 61 54 79 70 65 20 3d 20 73 71 6c 69 74  DataType = sqlit
1e3d0 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f  e3ColumnType(pCo
1e3e0 6c 2c 30 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53  l,0);.    zCollS
1e3f0 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c  eq = pCol->zColl
1e400 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20  ;.    notnull = 
1e410 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30  pCol->notNull!=0
1e420 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79  ;.    primarykey
1e430 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c    = (pCol->colFl
1e440 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52  ags & COLFLAG_PR
1e450 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20 61  IMKEY)!=0;.    a
1e460 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69  utoinc = pTab->i
1e470 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70  PKey==iCol && (p
1e480 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
1e490 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
1e4a0 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )!=0;.  }else{. 
1e4b0 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22     zDataType = "
1e4c0 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72  INTEGER";.    pr
1e4d0 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20  imarykey = 1;.  
1e4e0 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65  }.  if( !zCollSe
1e4f0 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65  q ){.    zCollSe
1e500 71 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49  q = sqlite3StrBI
1e510 4e 41 52 59 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72  NARY;.  }..error
1e520 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 42  _out:.  sqlite3B
1e530 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
1e540 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20  ;..  /* Whether 
1e550 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  the function cal
1e560 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72 20 66  l succeeded or f
1e570 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f  ailed, set the o
1e580 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
1e590 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65  .  ** to whateve
1e5a0 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f  r their local co
1e5b0 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61  unterparts conta
1e5c0 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  in. If an error 
1e5d0 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20  did occur,.  ** 
1e5e0 74 68 69 73 20 68 61 73 20 74 68 65 20 65 66 66  this has the eff
1e5f0 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61  ect of zeroing a
1e600 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  ll output parame
1e610 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ters..  */.  if(
1e620 20 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70   pzDataType ) *p
1e630 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74  zDataType = zDat
1e640 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43  aType;.  if( pzC
1e650 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c  ollSeq ) *pzColl
1e660 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a  Seq = zCollSeq;.
1e670 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29    if( pNotNull )
1e680 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74   *pNotNull = not
1e690 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69  null;.  if( pPri
1e6a0 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d  maryKey ) *pPrim
1e6b0 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79  aryKey = primary
1e6c0 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f  key;.  if( pAuto
1e6d0 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20  inc ) *pAutoinc 
1e6e0 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66  = autoinc;..  if
1e6f0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20  ( SQLITE_OK==rc 
1e700 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
1e710 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1e720 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
1e730 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
1e740 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f  3MPrintf(db, "no
1e750 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c 75   such table colu
1e760 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61 62  mn: %s.%s", zTab
1e770 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  leName,.        
1e780 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20  zColumnName);.  
1e790 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
1e7a0 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ROR;.  }.  sqlit
1e7b0 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
1e7c0 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f  b, rc, (zErrMsg?
1e7d0 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67  "%s":0), zErrMsg
1e7e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1e7f0 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b  ee(db, zErrMsg);
1e800 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
1e810 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
1e820 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1e830 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1e840 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1e850 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
1e860 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
1e870 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
1e880 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
1e890 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pt..*/.int sqlit
1e8a0 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29  e3_sleep(int ms)
1e8b0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
1e8c0 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  *pVfs;.  int rc;
1e8d0 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65  .  pVfs = sqlite
1e8e0 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20  3_vfs_find(0);. 
1e8f0 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20 72   if( pVfs==0 ) r
1e900 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54  eturn 0;..  /* T
1e910 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72  his function wor
1e920 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e  ks in millisecon
1e930 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64 65  ds, but the unde
1e940 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28 29  rlying OsSleep()
1e950 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73 20   .  ** API uses 
1e960 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65  microseconds. He
1e970 6e 63 65 20 74 68 65 20 31 30 30 30 27 73 2e 0a  nce the 1000's..
1e980 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c    */.  rc = (sql
1e990 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66 73  ite3OsSleep(pVfs
1e9a0 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30 29  , 1000*ms)/1000)
1e9b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1e9c0 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f  ../*.** Enable o
1e9d0 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 65 78  r disable the ex
1e9e0 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f  tended result co
1e9f0 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  des..*/.int sqli
1ea00 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  te3_extended_res
1ea10 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65  ult_codes(sqlite
1ea20 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66  3 *db, int onoff
1ea30 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
1ea40 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1ea50 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1ea60 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1ea70 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
1ea80 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
1ea90 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
1eaa0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
1eab0 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72  mutex);.  db->er
1eac0 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20  rMask = onoff ? 
1ead0 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 78 66  0xffffffff : 0xf
1eae0 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  f;.  sqlite3_mut
1eaf0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1eb00 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
1eb10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1eb20 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69  * Invoke the xFi
1eb30 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  leControl method
1eb40 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
1eb50 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e   database..*/.in
1eb60 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  t sqlite3_file_c
1eb70 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a  ontrol(sqlite3 *
1eb80 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1eb90 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c  zDbName, int op,
1eba0 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
1ebb0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1ebc0 45 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a  ERROR;.  Btree *
1ebd0 70 42 74 72 65 65 3b 0a 0a 23 69 66 64 65 66 20  pBtree;..#ifdef 
1ebe0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1ebf0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1ec00 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1ec10 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
1ec20 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
1ec30 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
1ec40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1ec50 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
1ec60 70 42 74 72 65 65 20 3d 20 73 71 6c 69 74 65 33  pBtree = sqlite3
1ec70 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62  DbNameToBtree(db
1ec80 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66  , zDbName);.  if
1ec90 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
1eca0 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
1ecb0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
1ecc0 2a 66 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  *fd;.    sqlite3
1ecd0 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
1ece0 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  e);.    pPager =
1ecf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
1ed00 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
1ed10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
1ed20 30 20 29 3b 0a 20 20 20 20 66 64 20 3d 20 73 71  0 );.    fd = sq
1ed30 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
1ed40 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65  Pager);.    asse
1ed50 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20  rt( fd!=0 );.   
1ed60 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f   if( op==SQLITE_
1ed70 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54  FCNTL_FILE_POINT
1ed80 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71  ER ){.      *(sq
1ed90 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72  lite3_file**)pAr
1eda0 67 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 72 63  g = fd;.      rc
1edb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1edc0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
1edd0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53  SQLITE_FCNTL_VFS
1ede0 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20  _POINTER ){.    
1edf0 20 20 2a 28 73 71 6c 69 74 65 33 5f 76 66 73 2a    *(sqlite3_vfs*
1ee00 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33  *)pArg = sqlite3
1ee10 50 61 67 65 72 56 66 73 28 70 50 61 67 65 72 29  PagerVfs(pPager)
1ee20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1ee30 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
1ee40 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45  e if( op==SQLITE
1ee50 5f 46 43 4e 54 4c 5f 4a 4f 55 52 4e 41 4c 5f 50  _FCNTL_JOURNAL_P
1ee60 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20  OINTER ){.      
1ee70 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a  *(sqlite3_file**
1ee80 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50  )pArg = sqlite3P
1ee90 61 67 65 72 4a 72 6e 6c 46 69 6c 65 28 70 50 61  agerJrnlFile(pPa
1eea0 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ger);.      rc =
1eeb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 6e   SQLITE_OK;.#ifn
1eec0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1eed0 57 41 4c 0a 20 20 20 20 20 20 69 66 28 20 28 72  WAL.      if( (r
1eee0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 26 26 28  c==SQLITE_OK)&&(
1eef0 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c  op==SQLITE_FCNTL
1ef00 5f 4c 41 53 54 5f 45 52 52 4e 4f 29 26 26 28 2a  _LAST_ERRNO)&&(*
1ef10 28 69 6e 74 20 2a 29 70 41 72 67 3d 3d 30 29 20  (int *)pArg==0) 
1ef20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1ef30 65 33 5f 66 69 6c 65 20 2a 70 57 61 6c 46 64 20  e3_file *pWalFd 
1ef40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 61  = sqlite3PagerWa
1ef50 6c 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20  lFile(pPager);. 
1ef60 20 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 46         if( pWalF
1ef70 64 26 26 28 70 57 61 6c 46 64 2d 3e 70 4d 65 74  d&&(pWalFd->pMet
1ef80 68 6f 64 73 29 20 29 7b 0a 20 20 20 20 20 20 20  hods) ){.       
1ef90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1efa0 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 57 61  sFileControl(pWa
1efb0 6c 46 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a  lFd, op, pArg);.
1efc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1efd0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  }.#endif.    }el
1efe0 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54  se if( op==SQLIT
1eff0 45 5f 46 43 4e 54 4c 5f 44 41 54 41 5f 56 45 52  E_FCNTL_DATA_VER
1f000 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2a 28  SION ){.      *(
1f010 75 6e 73 69 67 6e 65 64 20 69 6e 74 2a 29 70 41  unsigned int*)pA
1f020 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rg = sqlite3Page
1f030 72 44 61 74 61 56 65 72 73 69 6f 6e 28 70 50 61  rDataVersion(pPa
1f040 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ger);.      rc =
1f050 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f060 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1f070 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
1f080 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70  ontrol(fd, op, p
1f090 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Arg);.    }.    
1f0a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1f0b0 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
1f0c0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
1f0d0 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
1f0e0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1f0f0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1f100 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
1f110 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20  nterface to the 
1f120 74 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a  testing logic..*
1f130 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65  /.int sqlite3_te
1f140 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f  st_control(int o
1f150 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72  p, ...){.  int r
1f160 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  c = 0;.#ifdef SQ
1f170 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a  LITE_UNTESTABLE.
1f180 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1f190 45 52 28 6f 70 29 3b 0a 23 65 6c 73 65 0a 20 20  ER(op);.#else.  
1f1a0 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61  va_list ap;.  va
1f1b0 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a  _start(ap, op);.
1f1c0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1f1d0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
1f1e0 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
1f1f0 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e  state of the PRN
1f200 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  G..    */.    ca
1f210 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1f220 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a  RL_PRNG_SAVE: {.
1f230 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e        sqlite3Prn
1f240 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20  gSaveState();.  
1f250 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f260 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1f270 52 65 73 74 6f 72 65 20 74 68 65 20 73 74 61 74  Restore the stat
1f280 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f  e of the PRNG to
1f290 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 20   the last state 
1f2a0 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20  saved using.    
1f2b0 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49  ** PRNG_SAVE.  I
1f2c0 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20  f PRNG_SAVE has 
1f2d0 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65  never before bee
1f2e0 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20  n called, then. 
1f2f0 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20     ** this verb 
1f300 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52  acts like PRNG_R
1f310 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ESET..    */.   
1f320 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1f330 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f  TCTRL_PRNG_RESTO
1f340 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  RE: {.      sqli
1f350 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74  te3PrngRestoreSt
1f360 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65  ate();.      bre
1f370 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1f380 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74  *.    ** Reset t
1f390 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20  he PRNG back to 
1f3a0 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  its uninitialize
1f3b0 64 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65  d state.  The ne
1f3c0 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  xt call.    ** t
1f3d0 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d  o sqlite3_random
1f3e0 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65  ness() will rese
1f3f0 65 64 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e  ed the PRNG usin
1f400 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a  g a single call.
1f410 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52      ** to the xR
1f420 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64  andomness method
1f430 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   of the default 
1f440 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  VFS..    */.    
1f450 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1f460 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a  CTRL_PRNG_RESET:
1f470 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1f480 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29  _randomness(0,0)
1f490 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f4a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1f4b0 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
1f4c0 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43  t_control(BITVEC
1f4d0 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f  _TEST, size, pro
1f4e0 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20  gram).    **.   
1f4f0 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61   ** Run a test a
1f500 67 61 69 6e 73 74 20 61 20 42 69 74 76 65 63 20  gainst a Bitvec 
1f510 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20  object of size. 
1f520 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67   The program arg
1f530 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20  ument.    ** is 
1f540 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65  an array of inte
1f550 67 65 72 73 20 74 68 61 74 20 64 65 66 69 6e 65  gers that define
1f560 73 20 74 68 65 20 74 65 73 74 2e 20 20 52 65 74  s the test.  Ret
1f570 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20  urn -1 on a.    
1f580 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ** memory alloca
1f590 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e  tion error, 0 on
1f5a0 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e   success, or non
1f5b0 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72  -zero for an err
1f5c0 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74  or..    ** See t
1f5d0 68 65 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  he sqlite3Bitvec
1f5e0 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f  BuiltinTest() fo
1f5f0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
1f600 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
1f610 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1f620 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43  _TESTCTRL_BITVEC
1f630 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69  _TEST: {.      i
1f640 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
1f650 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
1f660 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61  nt *aProg = va_a
1f670 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20  rg(ap, int*);.  
1f680 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f690 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73  BitvecBuiltinTes
1f6a0 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20  t(sz, aProg);.  
1f6b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f6c0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1f6d0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1f6e0 6e 74 72 6f 6c 28 46 41 55 4c 54 5f 49 4e 53 54  ntrol(FAULT_INST
1f6f0 41 4c 4c 2c 20 78 43 61 6c 6c 62 61 63 6b 29 0a  ALL, xCallback).
1f700 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 72      **.    ** Ar
1f710 72 61 6e 67 65 20 74 6f 20 69 6e 76 6f 6b 65 20  range to invoke 
1f720 78 43 61 6c 6c 62 61 63 6b 28 29 20 77 68 65 6e  xCallback() when
1f730 65 76 65 72 20 73 71 6c 69 74 65 33 46 61 75 6c  ever sqlite3Faul
1f740 74 53 69 6d 28 29 20 69 73 20 63 61 6c 6c 65 64  tSim() is called
1f750 2c 0a 20 20 20 20 2a 2a 20 69 66 20 78 43 61 6c  ,.    ** if xCal
1f760 6c 62 61 63 6b 20 69 73 20 6e 6f 74 20 4e 55 4c  lback is not NUL
1f770 4c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  L..    **.    **
1f780 20 41 73 20 61 20 74 65 73 74 20 6f 66 20 74 68   As a test of th
1f790 65 20 66 61 75 6c 74 20 73 69 6d 75 6c 61 74 6f  e fault simulato
1f7a0 72 20 6d 65 63 68 61 6e 69 73 6d 20 69 74 73 65  r mechanism itse
1f7b0 6c 66 2c 20 73 71 6c 69 74 65 33 46 61 75 6c 74  lf, sqlite3Fault
1f7c0 53 69 6d 28 30 29 0a 20 20 20 20 2a 2a 20 69 73  Sim(0).    ** is
1f7d0 20 63 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74   called immediat
1f7e0 65 6c 79 20 61 66 74 65 72 20 69 6e 73 74 61 6c  ely after instal
1f7f0 6c 69 6e 67 20 74 68 65 20 6e 65 77 20 63 61 6c  ling the new cal
1f800 6c 62 61 63 6b 20 61 6e 64 20 74 68 65 20 72 65  lback and the re
1f810 74 75 72 6e 0a 20 20 20 20 2a 2a 20 76 61 6c 75  turn.    ** valu
1f820 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 46 61  e from sqlite3Fa
1f830 75 6c 74 53 69 6d 28 30 29 20 62 65 63 6f 6d 65  ultSim(0) become
1f840 73 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f  s the return fro
1f850 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  m.    ** sqlite3
1f860 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e  _test_control().
1f870 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1f880 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1f890 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20  _FAULT_INSTALL: 
1f8a0 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20  {.      /* MSVC 
1f8b0 69 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70  is picky about p
1f8c0 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73  ulling func ptrs
1f8d0 20 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a   from va lists..
1f8e0 20 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f        ** http://
1f8f0 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66  support.microsof
1f900 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20  t.com/kb/47961. 
1f910 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47       ** sqlite3G
1f920 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73  lobalConfig.xTes
1f930 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61  tCallback = va_a
1f940 72 67 28 61 70 2c 20 69 6e 74 28 2a 29 28 69 6e  rg(ap, int(*)(in
1f950 74 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20  t));.      */.  
1f960 20 20 20 20 74 79 70 65 64 65 66 20 69 6e 74 28      typedef int(
1f970 2a 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e  *TESTCALLBACKFUN
1f980 43 5f 74 29 28 69 6e 74 29 3b 0a 20 20 20 20 20  C_t)(int);.     
1f990 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1f9a0 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61  nfig.xTestCallba
1f9b0 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ck = va_arg(ap, 
1f9c0 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43  TESTCALLBACKFUNC
1f9d0 5f 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  _t);.      rc = 
1f9e0 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
1f9f0 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
1fa00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1fa10 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
1fa20 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49  est_control(BENI
1fa30 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c  GN_MALLOC_HOOKS,
1fa40 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20   xBegin, xEnd). 
1fa50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67     **.    ** Reg
1fa60 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63  ister hooks to c
1fa70 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65 20  all to indicate 
1fa80 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66  which malloc() f
1fa90 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a 20  ailures .    ** 
1faa0 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20  are benign..    
1fab0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1fac0 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49  TE_TESTCTRL_BENI
1fad0 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a  GN_MALLOC_HOOKS:
1fae0 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65 66   {.      typedef
1faf0 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e   void (*void_fun
1fb00 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20  ction)(void);.  
1fb10 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f      void_functio
1fb20 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a  n xBenignBegin;.
1fb30 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74        void_funct
1fb40 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a  ion xBenignEnd;.
1fb50 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65 67        xBenignBeg
1fb60 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  in = va_arg(ap, 
1fb70 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a  void_function);.
1fb80 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e 64        xBenignEnd
1fb90 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
1fba0 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20  id_function);.  
1fbb0 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69 67      sqlite3Benig
1fbc0 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65  nMallocHooks(xBe
1fbd0 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69  nignBegin, xBeni
1fbe0 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62 72  gnEnd);.      br
1fbf0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1fc00 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1fc10 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1fc20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1fc30 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e  PENDING_BYTE, un
1fc40 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20 20  signed int X).  
1fc50 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20    **.    ** Set 
1fc60 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
1fc70 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e   to the value in
1fc80 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 69   the argument, i
1fc90 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61  f X>0..    ** Ma
1fca0 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66  ke no changes if
1fcb0 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20 74   X==0.  Return t
1fcc0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1fcd0 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20 20  pending byte.   
1fce0 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74 69   ** as it existi
1fcf0 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ng before this r
1fd00 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
1fd10 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
1fd20 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68 61   IMPORTANT:  Cha
1fd30 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e  nging the PENDIN
1fd40 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34 30  G byte from 0x40
1fd50 30 30 30 30 30 30 20 72 65 73 75 6c 74 73 20 69  000000 results i
1fd60 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f  n.    ** an inco
1fd70 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62 61 73  mpatible databas
1fd80 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20  e file format.  
1fd90 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e  Changing the PEN
1fda0 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a 2a  DING byte.    **
1fdb0 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61 62   while any datab
1fdc0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ase connection i
1fdd0 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20 69  s open results i
1fde0 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a  n undefined and.
1fdf0 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 72 69 6f      ** deleterio
1fe00 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20  us behavior..   
1fe10 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1fe20 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e  ITE_TESTCTRL_PEN
1fe30 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20  DING_BYTE: {.   
1fe40 20 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f     rc = PENDING_
1fe50 42 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53 51  BYTE;.#ifndef SQ
1fe60 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20  LITE_OMIT_WSD.  
1fe70 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75 6e      {.        un
1fe80 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56 61  signed int newVa
1fe90 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  l = va_arg(ap, u
1fea0 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
1feb0 20 20 20 20 20 20 69 66 28 20 6e 65 77 56 61 6c        if( newVal
1fec0 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69 6e   ) sqlite3Pendin
1fed0 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a  gByte = newVal;.
1fee0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1fef0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ff00 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1ff10 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1ff20 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1ff30 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 69  STCTRL_ASSERT, i
1ff40 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
1ff50 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20   ** This action 
1ff60 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74  provides a run-t
1ff70 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20  ime test to see 
1ff80 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20  whether or not. 
1ff90 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 77     ** assert() w
1ffa0 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  as enabled at co
1ffb0 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20  mpile-time.  If 
1ffc0 58 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 73  X is true and as
1ffd0 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69 73  sert().    ** is
1ffe0 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74   enabled, then t
1fff0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
20000 69 73 20 74 72 75 65 2e 20 20 49 66 20 58 20 69  is true.  If X i
20010 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20 2a  s true and.    *
20020 2a 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  * assert() is di
20030 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  sabled, then the
20040 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
20050 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73 0a   zero.  If X is.
20060 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64      ** false and
20070 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61   assert() is ena
20080 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 61  bled, then the a
20090 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20 61  ssertion fires a
200a0 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72  nd the.    ** pr
200b0 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20 49  ocess aborts.  I
200c0 66 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e 64  f X is false and
200d0 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73   assert() is dis
200e0 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a  abled, then the.
200f0 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61      ** return va
20100 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20  lue is zero..   
20110 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
20120 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
20130 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c  ERT: {.      vol
20140 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b  atile int x = 0;
20150 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2f  .      assert( /
20160 2a 73 69 64 65 2d 65 66 66 65 63 74 73 2d 6f 6b  *side-effects-ok
20170 2a 2f 20 28 78 20 3d 20 76 61 5f 61 72 67 28 61  */ (x = va_arg(a
20180 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20  p,int))!=0 );.  
20190 20 20 20 20 72 63 20 3d 20 78 3b 0a 20 20 20 20      rc = x;.    
201a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
201b0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
201c0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
201d0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
201e0 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74  CTRL_ALWAYS, int
201f0 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   X).    **.    *
20200 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72  * This action pr
20210 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d  ovides a run-tim
20220 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 68 6f  e test to see ho
20230 77 20 74 68 65 20 41 4c 57 41 59 53 20 61 6e 64  w the ALWAYS and
20240 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61  .    ** NEVER ma
20250 63 72 6f 73 20 77 65 72 65 20 64 65 66 69 6e 65  cros were define
20260 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
20270 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
20280 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
20290 65 20 69 73 20 41 4c 57 41 59 53 28 58 29 20 69  e is ALWAYS(X) i
202a0 66 20 58 20 69 73 20 74 72 75 65 2c 20 6f 72 20  f X is true, or 
202b0 30 20 69 66 20 58 20 69 73 20 66 61 6c 73 65 2e  0 if X is false.
202c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
202d0 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74  he recommended t
202e0 65 73 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66  est is X==2.  If
202f0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
20300 65 20 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61  e is 2, that mea
20310 6e 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53  ns.    ** ALWAYS
20320 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61  () and NEVER() a
20330 72 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61  re both no-op pa
20340 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f  ss-through macro
20350 73 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  s, which is the.
20360 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73      ** default s
20370 65 74 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20  etting.  If the 
20380 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
20390 31 2c 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29  1, then ALWAYS()
203a0 20 69 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a   is either.    *
203b0 2a 20 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20  * hard-coded to 
203c0 74 72 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20  true or else it 
203d0 61 73 73 65 72 74 73 20 69 66 20 69 74 73 20 61  asserts if its a
203e0 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65  rgument is false
203f0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72  ..    ** The fir
20400 73 74 20 62 65 68 61 76 69 6f 72 20 28 68 61 72  st behavior (har
20410 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29  d-coded to true)
20420 20 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a   is the case if.
20430 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45      ** SQLITE_TE
20440 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68  STCTRL_ASSERT sh
20450 6f 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28  ows that assert(
20460 29 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e  ) is disabled an
20470 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20  d the second.   
20480 20 2a 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73   ** behavior (as
20490 73 65 72 74 20 69 66 20 74 68 65 20 61 72 67 75  sert if the argu
204a0 6d 65 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29  ment to ALWAYS()
204b0 20 69 73 20 66 61 6c 73 65 29 20 69 73 20 74 68   is false) is th
204c0 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a  e case if.    **
204d0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
204e0 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68  _ASSERT shows th
204f0 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20 65  at assert() is e
20500 6e 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  nabled..    **. 
20510 20 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69     ** The run-ti
20520 6d 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72  me test procedur
20530 65 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d  e might look som
20540 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73  ething like this
20550 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
20560 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74     if( sqlite3_t
20570 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
20580 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
20590 59 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20  YS, 2)==2 ){.   
205a0 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41   **      // ALWA
205b0 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29  YS() and NEVER()
205c0 20 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d   are no-op pass-
205d0 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20  through macros. 
205e0 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69     **    }else i
205f0 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  f( sqlite3_test_
20600 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
20610 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20  ESTCTRL_ASSERT, 
20620 31 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20  1) ){.    **    
20630 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61    // ALWAYS(x) a
20640 73 73 65 72 74 73 20 74 68 61 74 20 78 20 69 73  sserts that x is
20650 20 74 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20   true. NEVER(x) 
20660 61 73 73 65 72 74 73 20 78 20 69 73 20 66 61 6c  asserts x is fal
20670 73 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65  se..    **    }e
20680 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  lse{.    **     
20690 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73   // ALWAYS(x) is
206a0 20 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20   a constant 1.  
206b0 4e 45 56 45 52 28 78 29 20 69 73 20 61 20 63 6f  NEVER(x) is a co
206c0 6e 73 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a  nstant 0..    **
206d0 20 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20      }.    */.   
206e0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
206f0 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a  TCTRL_ALWAYS: {.
20700 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61        int x = va
20710 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20  _arg(ap,int);.  
20720 20 20 20 20 72 63 20 3d 20 78 20 3f 20 41 4c 57      rc = x ? ALW
20730 41 59 53 28 78 29 20 3a 20 30 3b 0a 20 20 20 20  AYS(x) : 0;.    
20740 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
20750 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
20760 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
20770 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
20780 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 29 3b  CTRL_BYTEORDER);
20790 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
207a0 68 65 20 69 6e 74 65 67 65 72 20 72 65 74 75 72  he integer retur
207b0 6e 65 64 20 72 65 76 65 61 6c 73 20 74 68 65 20  ned reveals the 
207c0 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74 68  byte-order of th
207d0 65 20 63 6f 6d 70 75 74 65 72 20 6f 6e 20 77 68  e computer on wh
207e0 69 63 68 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74  ich.    ** SQLit
207f0 65 20 69 73 20 72 75 6e 6e 69 6e 67 3a 0a 20 20  e is running:.  
20800 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
20810 20 20 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69    1     big-endi
20820 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65  an,    determine
20830 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20  d at run-time.  
20840 20 20 2a 2a 20 20 20 20 20 20 31 30 20 20 20 20    **      10    
20850 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20   little-endian, 
20860 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75  determined at ru
20870 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 34  n-time.    **  4
20880 33 32 31 30 31 20 20 20 20 20 62 69 67 2d 65 6e  32101     big-en
20890 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69  dian,    determi
208a0 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ned at compile-t
208b0 69 6d 65 0a 20 20 20 20 2a 2a 20 20 31 32 33 34  ime.    **  1234
208c0 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e  10     little-en
208d0 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64  dian, determined
208e0 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
208f0 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 63 61 73  .    */ .    cas
20900 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
20910 4c 5f 42 59 54 45 4f 52 44 45 52 3a 20 7b 0a 20  L_BYTEORDER: {. 
20920 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
20930 5f 42 59 54 45 4f 52 44 45 52 2a 31 30 30 20 2b  _BYTEORDER*100 +
20940 20 53 51 4c 49 54 45 5f 4c 49 54 54 4c 45 45 4e   SQLITE_LITTLEEN
20950 44 49 41 4e 2a 31 30 20 2b 20 53 51 4c 49 54 45  DIAN*10 + SQLITE
20960 5f 42 49 47 45 4e 44 49 41 4e 3b 0a 20 20 20 20  _BIGENDIAN;.    
20970 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
20980 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
20990 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
209a0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45  LITE_TESTCTRL_RE
209b0 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20 2a  SERVE, sqlite3 *
209c0 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a  db, int N).    *
209d0 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65  *.    ** Set the
209e0 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20 74   nReserve size t
209f0 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  o N for the main
20a00 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68 65   database on the
20a10 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
20a20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a   connection db..
20a30 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
20a40 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
20a50 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20 20  RESERVE: {.     
20a60 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
20a70 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
20a80 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78  3*);.      int x
20a90 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
20aa0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20ab0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
20ac0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73  >mutex);.      s
20ad0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
20ae0 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30  geSize(db->aDb[0
20af0 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b  ].pBt, 0, x, 0);
20b00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
20b10 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
20b20 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65  utex);.      bre
20b30 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
20b40 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
20b50 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
20b60 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
20b70 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a  TIONS, sqlite3 *
20b80 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a  db, int N).    *
20b90 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20  *.    ** Enable 
20ba0 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72 69 6f  or disable vario
20bb0 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  us optimizations
20bc0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
20bd0 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20 20  poses.  The .   
20be0 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20 69   ** argument N i
20bf0 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f  s a bitmask of o
20c00 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20  ptimizations to 
20c10 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46 6f  be disabled.  Fo
20c20 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20  r normal.    ** 
20c30 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75  operation N shou
20c40 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 69 64  ld be 0.  The id
20c50 65 61 20 69 73 20 74 68 61 74 20 61 20 74 65 73  ea is that a tes
20c60 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20  t program (like 
20c70 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c  the.    ** SQL L
20c80 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c 54  ogic Test or SLT
20c90 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63 61   test module) ca
20ca0 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20 53  n run the same S
20cb0 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  QL multiple time
20cc0 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76 61  s.    ** with va
20cd0 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69  rious optimizati
20ce0 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f 20  ons disabled to 
20cf0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
20d00 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20 20  same answer.    
20d10 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ** is obtained i
20d20 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20 20  n every case..  
20d30 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
20d40 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
20d50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20  TIMIZATIONS: {. 
20d60 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
20d70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
20d80 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64  lite3*);.      d
20d90 62 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d 20  b->dbOptFlags = 
20da0 28 75 31 36 29 28 76 61 5f 61 72 67 28 61 70 2c  (u16)(va_arg(ap,
20db0 20 69 6e 74 29 20 26 20 30 78 66 66 66 66 29 3b   int) & 0xffff);
20dc0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20dd0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71    }..    /*   sq
20de0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
20df0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
20e00 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55  RL_LOCALTIME_FAU
20e10 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a  LT, int onoff);.
20e20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
20e30 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66   parameter onoff
20e40 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 75   is non-zero, su
20e50 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
20e60 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29 0a 20 20  o localtime().  
20e70 20 20 2a 2a 20 61 6e 64 20 69 74 73 20 76 61 72    ** and its var
20e80 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66 20 6f  iants fail. If o
20e90 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 20 75 6e  noff is zero, un
20ea0 64 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e  do this setting.
20eb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
20ec0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
20ed0 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
20ee0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
20ef0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c  3GlobalConfig.bL
20f00 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20  ocaltimeFault = 
20f10 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
20f20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20f30 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71    }..    /*   sq
20f40 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
20f50 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
20f60 52 4c 5f 49 4e 54 45 52 4e 41 4c 5f 46 55 4e 43  RL_INTERNAL_FUNC
20f70 53 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20  S, int onoff);. 
20f80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
20f90 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20  parameter onoff 
20fa0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 6e 74  is non-zero, int
20fb0 65 72 6e 61 6c 2d 75 73 65 2d 6f 6e 6c 79 20 53  ernal-use-only S
20fc0 51 4c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20  QL functions.   
20fd0 20 2a 2a 20 61 72 65 20 76 69 73 69 62 6c 65 20   ** are visible 
20fe0 74 6f 20 6f 72 64 69 6e 61 72 79 20 53 51 4c 2e  to ordinary SQL.
20ff0 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c    This is useful
21000 20 66 6f 72 20 74 65 73 74 69 6e 67 20 62 75 74   for testing but
21010 20 69 73 0a 20 20 20 20 2a 2a 20 75 6e 73 61 66   is.    ** unsaf
21020 65 20 62 65 63 61 75 73 65 20 69 6e 76 61 6c 69  e because invali
21030 64 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20  d parameters to 
21040 74 68 6f 73 65 20 69 6e 74 65 72 6e 61 6c 2d 75  those internal-u
21050 73 65 2d 6f 6e 6c 79 20 66 75 6e 63 74 69 6f 6e  se-only function
21060 73 0a 20 20 20 20 2a 2a 20 63 61 6e 20 72 65 73  s.    ** can res
21070 75 6c 74 20 69 6e 20 63 72 61 73 68 65 73 20 6f  ult in crashes o
21080 72 20 73 65 67 66 61 75 6c 74 73 2e 0a 20 20 20  r segfaults..   
21090 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
210a0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4e 54  ITE_TESTCTRL_INT
210b0 45 52 4e 41 4c 5f 46 55 4e 43 54 49 4f 4e 53 3a  ERNAL_FUNCTIONS:
210c0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
210d0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 49 6e  GlobalConfig.bIn
210e0 74 65 72 6e 61 6c 46 75 6e 63 74 69 6f 6e 73 20  ternalFunctions 
210f0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
21100 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
21110 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
21120 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
21130 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
21140 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55  CTRL_NEVER_CORRU
21150 50 54 2c 20 69 6e 74 29 3b 0a 20 20 20 20 2a 2a  PT, int);.    **
21160 0a 20 20 20 20 2a 2a 20 53 65 74 20 6f 72 20 63  .    ** Set or c
21170 6c 65 61 72 20 61 20 66 6c 61 67 20 74 68 61 74  lear a flag that
21180 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
21190 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
211a0 65 20 69 73 20 61 6c 77 61 79 73 20 77 65 6c 6c  e is always well
211b0 2d 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 65 64 20  -.    ** formed 
211c0 61 6e 64 20 6e 65 76 65 72 20 63 6f 72 72 75 70  and never corrup
211d0 74 2e 20 20 54 68 69 73 20 66 6c 61 67 20 69 73  t.  This flag is
211e0 20 63 6c 65 61 72 20 62 79 20 64 65 66 61 75 6c   clear by defaul
211f0 74 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  t, indicating th
21200 61 74 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  at.    ** databa
21210 73 65 20 66 69 6c 65 73 20 6d 69 67 68 74 20 68  se files might h
21220 61 76 65 20 61 72 62 69 74 72 61 72 79 20 63 6f  ave arbitrary co
21230 72 72 75 70 74 69 6f 6e 2e 20 20 53 65 74 74 69  rruption.  Setti
21240 6e 67 20 74 68 65 20 66 6c 61 67 20 64 75 72 69  ng the flag duri
21250 6e 67 0a 20 20 20 20 2a 2a 20 74 65 73 74 69 6e  ng.    ** testin
21260 67 20 63 61 75 73 65 73 20 63 65 72 74 61 69 6e  g causes certain
21270 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
21280 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 64 65  ents in the code
21290 20 74 6f 20 62 65 20 61 63 74 69 76 61 74 65 64   to be activated
212a0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 65 6d  .    ** that dem
212b0 6f 6e 73 74 72 61 74 20 69 6e 76 61 72 69 61 6e  onstrat invarian
212c0 74 73 20 6f 6e 20 77 65 6c 6c 2d 66 6f 72 6d 65  ts on well-forme
212d0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  d database files
212e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
212f0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
21300 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 3a  L_NEVER_CORRUPT:
21310 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
21320 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 65 76  GlobalConfig.nev
21330 65 72 43 6f 72 72 75 70 74 20 3d 20 76 61 5f 61  erCorrupt = va_a
21340 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
21350 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
21360 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
21370 74 68 72 65 73 68 6f 6c 64 20 61 74 20 77 68 69  threshold at whi
21380 63 68 20 4f 50 5f 4f 6e 63 65 20 63 6f 75 6e 74  ch OP_Once count
21390 65 72 73 20 72 65 73 65 74 20 62 61 63 6b 20 74  ers reset back t
213a0 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2a 20 42  o zero..    ** B
213b0 79 20 64 65 66 61 75 6c 74 20 74 68 69 73 20 69  y default this i
213c0 73 20 30 78 37 66 66 66 66 66 66 65 20 28 6f 76  s 0x7ffffffe (ov
213d0 65 72 20 32 20 62 69 6c 6c 69 6f 6e 29 2c 20 62  er 2 billion), b
213e0 75 74 20 74 68 61 74 20 76 61 6c 75 65 20 69 73  ut that value is
213f0 0a 20 20 20 20 2a 2a 20 74 6f 6f 20 62 69 67 20  .    ** too big 
21400 74 6f 20 74 65 73 74 20 69 6e 20 61 20 72 65 61  to test in a rea
21410 73 6f 6e 61 62 6c 65 20 61 6d 6f 75 6e 74 20 6f  sonable amount o
21420 66 20 74 69 6d 65 2c 20 73 6f 20 74 68 69 73 20  f time, so this 
21430 63 6f 6e 74 72 6f 6c 20 69 73 0a 20 20 20 20 2a  control is.    *
21440 2a 20 70 72 6f 76 69 64 65 64 20 74 6f 20 73 65  * provided to se
21450 74 20 61 20 73 6d 61 6c 6c 20 61 6e 64 20 65 61  t a small and ea
21460 73 69 6c 79 20 72 65 61 63 68 61 62 6c 65 20 72  sily reachable r
21470 65 73 65 74 20 76 61 6c 75 65 2e 0a 20 20 20 20  eset value..    
21480 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
21490 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 4e 43 45  TE_TESTCTRL_ONCE
214a0 5f 52 45 53 45 54 5f 54 48 52 45 53 48 4f 4c 44  _RESET_THRESHOLD
214b0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
214c0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 4f  3GlobalConfig.iO
214d0 6e 63 65 52 65 73 65 74 54 68 72 65 73 68 6f 6c  nceResetThreshol
214e0 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  d = va_arg(ap, i
214f0 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
21500 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
21510 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
21520 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
21530 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45  STCTRL_VDBE_COVE
21540 52 41 47 45 2c 20 78 43 61 6c 6c 62 61 63 6b 2c  RAGE, xCallback,
21550 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a 0a 20 20   ptr);.    **.  
21560 20 20 2a 2a 20 53 65 74 20 74 68 65 20 56 44 42    ** Set the VDB
21570 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c 6c 62  E coverage callb
21580 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  ack function to 
21590 78 43 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 63  xCallback with c
215a0 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2a 20 70  ontext .    ** p
215b0 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20 20 20 20  ointer ptr..    
215c0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
215d0 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45  TE_TESTCTRL_VDBE
215e0 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a 23 69 66  _COVERAGE: {.#if
215f0 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
21600 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20 74  COVERAGE.      t
21610 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 62 72  ypedef void (*br
21620 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29 28 76  anch_callback)(v
21630 6f 69 64 2a 2c 75 6e 73 69 67 6e 65 64 20 69 6e  oid*,unsigned in
21640 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
21650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21660 20 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65           unsigne
21670 64 20 63 68 61 72 2c 75 6e 73 69 67 6e 65 64 20  d char,unsigned 
21680 63 68 61 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  char);.      sql
21690 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
216a0 2e 78 56 64 62 65 42 72 61 6e 63 68 20 3d 20 76  .xVdbeBranch = v
216b0 61 5f 61 72 67 28 61 70 2c 62 72 61 6e 63 68 5f  a_arg(ap,branch_
216c0 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20  callback);.     
216d0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
216e0 6e 66 69 67 2e 70 56 64 62 65 42 72 61 6e 63 68  nfig.pVdbeBranch
216f0 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Arg = va_arg(ap,
21700 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 20  void*);.#endif. 
21710 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21720 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
21730 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
21740 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
21750 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62  _SORTER_MMAP, db
21760 2c 20 6e 4d 61 78 29 3b 20 2a 2f 0a 20 20 20 20  , nMax); */.    
21770 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
21780 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50  CTRL_SORTER_MMAP
21790 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
217a0 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61  3 *db = va_arg(a
217b0 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  p, sqlite3*);.  
217c0 20 20 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74      db->nMaxSort
217d0 65 72 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28  erMmap = va_arg(
217e0 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
217f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
21800 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
21810 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
21820 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e  TE_TESTCTRL_ISIN
21830 49 54 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  IT);.    **.    
21840 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
21850 5f 4f 4b 20 69 66 20 53 51 4c 69 74 65 20 68 61  _OK if SQLite ha
21860 73 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  s been initializ
21870 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 45 52  ed and SQLITE_ER
21880 52 4f 52 20 69 66 0a 20 20 20 20 2a 2a 20 6e 6f  ROR if.    ** no
21890 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
218a0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
218b0 52 4c 5f 49 53 49 4e 49 54 3a 20 7b 0a 20 20 20  RL_ISINIT: {.   
218c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
218d0 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69  obalConfig.isIni
218e0 74 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49  t==0 ) rc = SQLI
218f0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
21900 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
21910 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    /*  sqlite3_te
21920 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
21930 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
21940 54 45 52 2c 20 64 62 2c 20 64 62 4e 61 6d 65 2c  TER, db, dbName,
21950 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a 20   onOff, tnum);. 
21960 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
21970 73 20 74 65 73 74 20 63 6f 6e 74 72 6f 6c 20 69  s test control i
21980 73 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65  s used to create
21990 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73   imposter tables
219a0 2e 20 20 22 64 62 22 20 69 73 20 61 20 70 6f 69  .  "db" is a poi
219b0 6e 74 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 74  nter.    ** to t
219c0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
219d0 65 63 74 69 6f 6e 2e 20 20 64 62 4e 61 6d 65 20  ection.  dbName 
219e0 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
219f0 6e 61 6d 65 20 28 65 78 3a 20 22 6d 61 69 6e 22  name (ex: "main"
21a00 20 6f 72 0a 20 20 20 20 2a 2a 20 22 74 65 6d 70   or.    ** "temp
21a10 22 29 20 77 68 69 63 68 20 77 69 6c 6c 20 72 65  ") which will re
21a20 63 65 69 76 65 20 74 68 65 20 69 6d 70 6f 73 74  ceive the impost
21a30 65 72 2e 20 20 22 6f 6e 4f 66 66 22 20 74 75 72  er.  "onOff" tur
21a40 6e 73 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65  ns imposter mode
21a50 20 6f 6e 0a 20 20 20 20 2a 2a 20 6f 72 20 6f 66   on.    ** or of
21a60 66 2e 20 20 22 74 6e 75 6d 22 20 69 73 20 74 68  f.  "tnum" is th
21a70 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
21a80 68 65 20 62 2d 74 72 65 65 20 74 6f 20 77 68 69  he b-tree to whi
21a90 63 68 20 74 68 65 20 69 6d 70 6f 73 74 65 72 0a  ch the imposter.
21aa0 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 73 68 6f      ** table sho
21ab0 75 6c 64 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20  uld connect..   
21ac0 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c   **.    ** Enabl
21ad0 65 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20  e imposter mode 
21ae0 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 20 73 63  only when the sc
21af0 68 65 6d 61 20 68 61 73 20 61 6c 72 65 61 64 79  hema has already
21b00 20 62 65 65 6e 20 70 61 72 73 65 64 2e 20 20 54   been parsed.  T
21b10 68 65 6e 0a 20 20 20 20 2a 2a 20 72 75 6e 20 61  hen.    ** run a
21b20 20 73 69 6e 67 6c 65 20 43 52 45 41 54 45 20 54   single CREATE T
21b30 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 74  ABLE statement t
21b40 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
21b50 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 69  imposter table i
21b60 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 72  n.    ** the par
21b70 73 65 64 20 73 63 68 65 6d 61 2e 20 20 54 68 65  sed schema.  The
21b80 6e 20 74 75 72 6e 20 69 6d 70 6f 73 74 65 72 20  n turn imposter 
21b90 6d 6f 64 65 20 62 61 63 6b 20 6f 66 66 20 61 67  mode back off ag
21ba0 61 69 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ain..    **.    
21bb0 2a 2a 20 49 66 20 6f 6e 4f 66 66 3d 3d 30 20 61  ** If onOff==0 a
21bc0 6e 64 20 74 6e 75 6d 3e 30 20 74 68 65 6e 20 72  nd tnum>0 then r
21bd0 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20  eset the schema 
21be0 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
21bf0 73 2c 20 63 61 75 73 69 6e 67 0a 20 20 20 20 2a  s, causing.    *
21c00 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
21c10 62 65 20 72 65 70 61 72 73 65 64 20 74 68 65 20  be reparsed the 
21c20 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20  next time it is 
21c30 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20 68 61  needed.  This ha
21c40 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 66 66  s the.    ** eff
21c50 65 63 74 20 6f 66 20 65 72 61 73 69 6e 67 20 61  ect of erasing a
21c60 6c 6c 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  ll imposter tabl
21c70 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  es..    */.    c
21c80 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
21c90 54 52 4c 5f 49 4d 50 4f 53 54 45 52 3a 20 7b 0a  TRL_IMPOSTER: {.
21ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
21cb0 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
21cc0 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
21cd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
21ce0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
21cf0 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 69        db->init.i
21d00 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
21d10 44 62 4e 61 6d 65 28 64 62 2c 20 76 61 5f 61 72  DbName(db, va_ar
21d20 67 28 61 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a  g(ap,const char*
21d30 29 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e  ));.      db->in
21d40 69 74 2e 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e  it.busy = db->in
21d50 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65  it.imposterTable
21d60 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
21d70 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69  );.      db->ini
21d80 74 2e 6e 65 77 54 6e 75 6d 20 3d 20 76 61 5f 61  t.newTnum = va_a
21d90 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
21da0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
21db0 75 73 79 3d 3d 30 20 26 26 20 64 62 2d 3e 69 6e  usy==0 && db->in
21dc0 69 74 2e 6e 65 77 54 6e 75 6d 3e 30 20 29 7b 0a  it.newTnum>0 ){.
21dd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
21de0 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
21df0 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a  Connection(db);.
21e00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
21e10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
21e20 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
21e30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
21e40 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 59 59  ..#if defined(YY
21e50 43 4f 56 45 52 41 47 45 29 0a 20 20 20 20 2f 2a  COVERAGE).    /*
21e60 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
21e70 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
21e80 53 54 43 54 52 4c 5f 50 41 52 53 45 52 5f 43 4f  STCTRL_PARSER_CO
21e90 56 45 52 41 47 45 2c 20 46 49 4c 45 20 2a 6f 75  VERAGE, FILE *ou
21ea0 74 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t).    **.    **
21eb0 20 54 68 69 73 20 74 65 73 74 20 63 6f 6e 74 72   This test contr
21ec0 6f 6c 20 28 6f 6e 6c 79 20 61 76 61 69 6c 61 62  ol (only availab
21ed0 6c 65 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69  le when SQLite i
21ee0 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a  s compiled with.
21ef0 20 20 20 20 2a 2a 20 2d 44 59 59 43 4f 56 45 52      ** -DYYCOVER
21f00 41 47 45 29 20 77 72 69 74 65 73 20 61 20 72 65  AGE) writes a re
21f10 70 6f 72 74 20 6f 6e 74 6f 20 22 6f 75 74 22 20  port onto "out" 
21f20 74 68 61 74 20 73 68 6f 77 73 20 61 6c 6c 0a 20  that shows all. 
21f30 20 20 20 2a 2a 20 73 74 61 74 65 2f 6c 6f 6f 6b     ** state/look
21f40 61 68 65 61 64 20 63 6f 6d 62 69 6e 61 74 69 6f  ahead combinatio
21f50 6e 73 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  ns in the parser
21f60 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 0a 20   state machine. 
21f70 20 20 20 2a 2a 20 77 68 69 63 68 20 61 72 65 20     ** which are 
21f80 6e 65 76 65 72 20 65 78 65 72 63 69 73 65 64 2e  never exercised.
21f90 20 20 49 66 20 61 6e 79 20 73 74 61 74 65 20 69    If any state i
21fa0 73 20 6d 69 73 73 65 64 2c 20 6d 61 6b 65 20 74  s missed, make t
21fb0 68 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  he.    ** return
21fc0 20 63 6f 64 65 20 53 51 4c 49 54 45 5f 45 52 52   code SQLITE_ERR
21fd0 4f 52 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  OR..    */.    c
21fe0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
21ff0 54 52 4c 5f 50 41 52 53 45 52 5f 43 4f 56 45 52  TRL_PARSER_COVER
22000 41 47 45 3a 20 7b 0a 20 20 20 20 20 20 46 49 4c  AGE: {.      FIL
22010 45 20 2a 6f 75 74 20 3d 20 76 61 5f 61 72 67 28  E *out = va_arg(
22020 61 70 2c 20 46 49 4c 45 2a 29 3b 0a 20 20 20 20  ap, FILE*);.    
22030 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 72    if( sqlite3Par
22040 73 65 72 43 6f 76 65 72 61 67 65 28 6f 75 74 29  serCoverage(out)
22050 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45   ) rc = SQLITE_E
22060 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
22070 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
22080 2f 2a 20 64 65 66 69 6e 65 64 28 59 59 43 4f 56  /* defined(YYCOV
22090 45 52 41 47 45 29 20 2a 2f 0a 20 20 7d 0a 20 20  ERAGE) */.  }.  
220a0 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64  va_end(ap);.#end
220b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 4e 54  if /* SQLITE_UNT
220c0 45 53 54 41 42 4c 45 20 2a 2f 0a 20 20 72 65 74  ESTABLE */.  ret
220d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
220e0 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69   This is a utili
220f0 74 79 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66  ty routine, usef
22100 75 6c 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d  ul to VFS implem
22110 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20  entations, that 
22120 63 68 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65  checks.** to see
22130 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66   if a database f
22140 69 6c 65 20 77 61 73 20 61 20 55 52 49 20 74 68  ile was a URI th
22150 61 74 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73  at contained a s
22160 70 65 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a  pecific query .*
22170 2a 20 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64  * parameter, and
22180 20 69 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74   if so obtains t
22190 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
221a0 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
221b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
221c0 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
221d0 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f   the filename po
221e0 69 6e 74 65 72 20 70 61 73 73 65 64 20 69 6e 74  inter passed int
221f0 6f 20 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a  o the xOpen().**
22200 20 6d 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53   method of a VFS
22210 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
22220 20 20 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67    The zParam arg
22230 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d  ument is the nam
22240 65 20 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72  e of the.** quer
22250 79 20 70 61 72 61 6d 65 74 65 72 20 77 65 20 73  y parameter we s
22260 65 65 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69  eek.  This routi
22270 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 76  ne returns the v
22280 61 6c 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72  alue of the zPar
22290 61 6d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  am.** parameter 
222a0 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 20 49  if it exists.  I
222b0 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
222c0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
222d0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
222e0 72 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70  returns a NULL p
222f0 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74  ointer..*/.const
22300 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75   char *sqlite3_u
22310 72 69 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e  ri_parameter(con
22320 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
22330 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
22340 7a 50 61 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a  zParam){.  if( z
22350 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
22360 50 61 72 61 6d 3d 3d 30 20 29 20 72 65 74 75 72  Param==0 ) retur
22370 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  n 0;.  zFilename
22380 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
22390 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  n30(zFilename) +
223a0 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46 69   1;.  while( zFi
223b0 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
223c0 20 69 6e 74 20 78 20 3d 20 73 74 72 63 6d 70 28   int x = strcmp(
223d0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61  zFilename, zPara
223e0 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  m);.    zFilenam
223f0 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
22400 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20  en30(zFilename) 
22410 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d  + 1;.    if( x==
22420 30 20 29 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  0 ) return zFile
22430 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  name;.    zFilen
22440 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  ame += sqlite3St
22450 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
22460 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  ) + 1;.  }.  ret
22470 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
22480 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e  Return a boolean
22490 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65   value for a que
224a0 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f  ry parameter..*/
224b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 75 72 69  .int sqlite3_uri
224c0 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63  _boolean(const c
224d0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
224e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
224f0 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a  am, int bDflt){.
22500 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
22510 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  = sqlite3_uri_pa
22520 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d  rameter(zFilenam
22530 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44  e, zParam);.  bD
22540 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a  flt = bDflt!=0;.
22550 20 20 72 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c    return z ? sql
22560 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
22570 2c 20 62 44 66 6c 74 29 20 3a 20 62 44 66 6c 74  , bDflt) : bDflt
22580 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
22590 6e 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  n a 64-bit integ
225a0 65 72 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71  er value for a q
225b0 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
225c0 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  */.sqlite3_int64
225d0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74   sqlite3_uri_int
225e0 36 34 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  64(.  const char
225f0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
22600 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 73 20 70  /* Filename as p
22610 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a  assed to xOpen *
22620 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
22630 7a 50 61 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a  zParam,       /*
22640 20 55 52 49 20 70 61 72 61 6d 65 74 65 72 20 73   URI parameter s
22650 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ought */.  sqlit
22660 65 33 5f 69 6e 74 36 34 20 62 44 66 6c 74 20 20  e3_int64 bDflt  
22670 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 69       /* return i
22680 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6d  f parameter is m
22690 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63  issing */.){.  c
226a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
226b0 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
226c0 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  eter(zFilename, 
226d0 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74  zParam);.  sqlit
226e0 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69 66  e3_int64 v;.  if
226f0 28 20 7a 20 26 26 20 73 71 6c 69 74 65 33 44 65  ( z && sqlite3De
22700 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26  cOrHexToI64(z, &
22710 76 29 3d 3d 30 20 29 7b 0a 20 20 20 20 62 44 66  v)==0 ){.    bDf
22720 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65  lt = v;.  }.  re
22730 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f  turn bDflt;.}../
22740 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
22750 42 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69 64  Btree pointer id
22760 65 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62 4e  entified by zDbN
22770 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ame.  Return NUL
22780 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
22790 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74 65  */.Btree *sqlite
227a0 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 73  3DbNameToBtree(s
227b0 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
227c0 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29  t char *zDbName)
227d0 7b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 7a 44  {.  int iDb = zD
227e0 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 33 46  bName ? sqlite3F
227f0 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44  indDbName(db, zD
22800 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 72 65  bName) : 0;.  re
22810 74 75 72 6e 20 69 44 62 3c 30 20 3f 20 30 20 3a  turn iDb<0 ? 0 :
22820 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
22830 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
22840 72 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  rn the filename 
22850 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
22860 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22870 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
22880 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e  nnection..*/.con
22890 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
228a0 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c  _db_filename(sql
228b0 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
228c0 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
228d0 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23 69    Btree *pBt;.#i
228e0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
228f0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
22900 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
22910 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
22920 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
22930 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
22940 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
22950 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d 20 73  #endif.  pBt = s
22960 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
22970 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ree(db, zDbName)
22980 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f  ;.  return pBt ?
22990 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
229a0 46 69 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a 20  Filename(pBt) : 
229b0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
229c0 72 6e 20 31 20 69 66 20 64 61 74 61 62 61 73 65  rn 1 if database
229d0 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72   is read-only or
229e0 20 30 20 69 66 20 72 65 61 64 2f 77 72 69 74 65   0 if read/write
229f0 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 0a  .  Return -1 if.
22a00 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61 74 61 62  ** no such datab
22a10 61 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69  ase exists..*/.i
22a20 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  nt sqlite3_db_re
22a30 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a  adonly(sqlite3 *
22a40 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
22a50 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65  zDbName){.  Btre
22a60 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53  e *pBt;.#ifdef S
22a70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
22a80 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
22a90 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
22aa0 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
22ab0 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
22ac0 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
22ad0 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn -1;.  }.#endi
22ae0 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65  f.  pBt = sqlite
22af0 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64  3DbNameToBtree(d
22b00 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72  b, zDbName);.  r
22b10 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69  eturn pBt ? sqli
22b20 74 65 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e  te3BtreeIsReadon
22b30 6c 79 28 70 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a  ly(pBt) : -1;.}.
22b40 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42  #if (SQLITE_ENAB
22b50 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20  LE_APPLE_SPI>0) 
22b60 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
22b70 4c 45 5f 5f 29 0a 0a 23 69 6e 63 6c 75 64 65 20  LE__)..#include 
22b80 22 73 71 6c 69 74 65 33 5f 70 72 69 76 61 74 65  "sqlite3_private
22b90 2e 68 22 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 73 74  .h"../* .** Test
22ba0 69 6e 67 20 61 20 66 69 6c 65 20 70 61 74 68 20  ing a file path 
22bb0 66 6f 72 20 73 71 6c 69 74 65 20 6c 6f 63 6b 73  for sqlite locks
22bc0 20 68 65 6c 64 20 62 79 20 61 20 70 72 6f 63 65   held by a proce
22bd0 73 73 20 49 44 2e 20 0a 2a 2a 20 52 65 74 75 72  ss ID. .** Retur
22be0 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54  ns SQLITE_LOCKST
22bf0 41 54 45 5f 4f 4e 20 69 66 20 6c 6f 63 6b 73 20  ATE_ON if locks 
22c00 61 72 65 20 70 72 65 73 65 6e 74 20 6f 6e 20 70  are present on p
22c10 61 74 68 0a 2a 2a 20 74 68 61 74 20 77 6f 75 6c  ath.** that woul
22c20 64 20 70 72 65 76 65 6e 74 20 77 72 69 74 69 6e  d prevent writin
22c30 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
22c40 65 2e 0a 2a 2f 0a 69 6e 74 20 5f 73 71 6c 69 74  e..*/.int _sqlit
22c50 65 33 5f 6c 6f 63 6b 73 74 61 74 65 28 63 6f 6e  e3_lockstate(con
22c60 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 70  st char *path, p
22c70 69 64 5f 74 20 70 69 64 29 7b 0a 20 20 73 71 6c  id_t pid){.  sql
22c80 69 74 65 33 20 2a 64 62 20 3d 20 4e 55 4c 4c 3b  ite3 *db = NULL;
22c90 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65  .  .  if( sqlite
22ca0 33 5f 6f 70 65 6e 5f 76 32 28 70 61 74 68 2c 20  3_open_v2(path, 
22cb0 26 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  &db, SQLITE_OPEN
22cc0 5f 52 45 41 44 4f 4e 4c 59 2c 20 4e 55 4c 4c 29  _READONLY, NULL)
22cd0 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   == SQLITE_OK ){
22ce0 0a 20 20 20 20 4c 6f 63 6b 73 74 61 74 65 50 49  .    LockstatePI
22cf0 44 20 6c 6f 63 6b 73 74 61 74 65 20 3d 20 7b 70  D lockstate = {p
22d00 69 64 2c 20 2d 31 7d 3b 0a 20 20 20 20 73 71 6c  id, -1};.    sql
22d10 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
22d20 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49  l(db, NULL, SQLI
22d30 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
22d40 54 45 5f 50 49 44 2c 20 26 6c 6f 63 6b 73 74 61  TE_PID, &locksta
22d50 74 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  te);.    sqlite3
22d60 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20  _close(db);.    
22d70 69 6e 74 20 73 74 61 74 65 20 3d 20 6c 6f 63 6b  int state = lock
22d80 73 74 61 74 65 2e 73 74 61 74 65 3b 0a 20 20 20  state.state;.   
22d90 20 72 65 74 75 72 6e 20 73 74 61 74 65 3b 0a 20   return state;. 
22da0 20 7d 0a 20 20 69 66 28 20 4e 55 4c 4c 21 3d 64   }.  if( NULL!=d
22db0 62 20 29 7b 20 0a 20 20 20 20 73 71 6c 69 74 65  b ){ .    sqlite
22dc0 33 5f 63 6c 6f 73 65 28 64 62 29 3b 20 2f 2a 20  3_close(db); /* 
22dd0 6e 65 65 64 20 74 6f 20 63 6c 6f 73 65 20 65 76  need to close ev
22de0 65 6e 20 69 66 20 6f 70 65 6e 20 72 65 74 75 72  en if open retur
22df0 6e 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  ns an error */. 
22e00 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
22e10 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 45 52 52  TE_LOCKSTATE_ERR
22e20 4f 52 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OR;.}..#endif /*
22e30 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
22e40 50 50 4c 45 5f 53 50 49 20 2a 2f 0a 0a 23 69 66  PPLE_SPI */..#if
22e50 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
22e60 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a  E_SNAPSHOT./*.**
22e70 20 4f 62 74 61 69 6e 20 61 20 73 6e 61 70 73 68   Obtain a snapsh
22e80 6f 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68  ot handle for th
22e90 65 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 64 61  e snapshot of da
22ea0 74 61 62 61 73 65 20 7a 44 62 20 63 75 72 72 65  tabase zDb curre
22eb0 6e 74 6c 79 20 0a 2a 2a 20 62 65 69 6e 67 20 72  ntly .** being r
22ec0 65 61 64 20 62 79 20 68 61 6e 64 6c 65 20 64 62  ead by handle db
22ed0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22ee0 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 0a 20  _snapshot_get(. 
22ef0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
22f00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
22f10 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  ,.  sqlite3_snap
22f20 73 68 6f 74 20 2a 2a 70 70 53 6e 61 70 73 68 6f  shot **ppSnapsho
22f30 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t.){.  int rc = 
22f40 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69  SQLITE_ERROR;.#i
22f50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22f60 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51  T_WAL..#ifdef SQ
22f70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
22f80 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
22f90 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
22fa0 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
22fb0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
22fc0 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
22fd0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
22fe0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
22ff0 65 78 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  ex);..  if( db->
23000 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  autoCommit==0 ){
23010 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73  .    int iDb = s
23020 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
23030 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69  (db, zDb);.    i
23040 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62  f( iDb==0 || iDb
23050 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74 72 65  >1 ){.      Btre
23060 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
23070 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
23080 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 42   if( 0==sqlite3B
23090 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
230a0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
230b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
230c0 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30  eginTrans(pBt, 0
230d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
230e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
230f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
23100 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e  = sqlite3PagerSn
23110 61 70 73 68 6f 74 47 65 74 28 73 71 6c 69 74 65  apshotGet(sqlite
23120 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
23130 2c 20 70 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20  , ppSnapshot);. 
23140 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23150 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
23160 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
23170 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65  e(db->mutex);.#e
23180 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45  ndif   /* SQLITE
23190 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72  _OMIT_WAL */.  r
231a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
231b0 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 74  ** Open a read-t
231c0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
231d0 65 20 73 6e 61 70 73 68 6f 74 20 69 64 65 6e 64  e snapshot idend
231e0 69 66 69 65 64 20 62 79 20 70 53 6e 61 70 73 68  ified by pSnapsh
231f0 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ot..*/.int sqlit
23200 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e  e3_snapshot_open
23210 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
23220 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
23230 7a 44 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  zDb, .  sqlite3_
23240 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73  snapshot *pSnaps
23250 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  hot.){.  int rc 
23260 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
23270 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
23280 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20  MIT_WAL..#ifdef 
23290 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
232a0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
232b0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
232c0 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  kOk(db) ){.    r
232d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
232e0 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
232f0 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
23300 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
23310 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d  utex);.  if( db-
23320 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29  >autoCommit==0 )
23330 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20  {.    int iDb;. 
23340 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
23350 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
23360 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  Db);.    if( iDb
23370 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a  ==0 || iDb>1 ){.
23380 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
23390 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
233a0 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  pBt;.      if( s
233b0 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
233c0 72 61 6e 73 28 70 42 74 29 3d 3d 30 20 29 7b 0a  rans(pBt)==0 ){.
233d0 20 20 20 20 20 20 20 20 50 61 67 65 72 20 2a 70          Pager *p
233e0 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
233f0 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
23400 20 20 20 20 20 20 20 20 69 6e 74 20 62 55 6e 6c          int bUnl
23410 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ock = 0;.       
23420 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
23430 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 70  eIsInReadTrans(p
23440 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Bt) ){.         
23450 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63   if( db->nVdbeAc
23460 74 69 76 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tive==0 ){.     
23470 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
23480 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74  te3PagerSnapshot
23490 43 68 65 63 6b 28 70 50 61 67 65 72 2c 20 70 53  Check(pPager, pS
234a0 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20  napshot);.      
234b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
234c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
234d0 20 20 20 20 20 20 20 20 20 62 55 6e 6c 6f 63 6b           bUnlock
234e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
234f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23500 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29  BtreeCommit(pBt)
23510 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
23520 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23530 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23540 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23550 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
23560 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
23570 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23580 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23590 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 4f  e3PagerSnapshotO
235a0 70 65 6e 28 70 50 61 67 65 72 2c 20 70 53 6e 61  pen(pPager, pSna
235b0 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pshot);.        
235c0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
235d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
235e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
235f0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
23600 72 61 6e 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  rans(pBt, 0, 0);
23610 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23620 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 4f  e3PagerSnapshotO
23630 70 65 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  pen(pPager, 0);.
23640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23650 20 20 69 66 28 20 62 55 6e 6c 6f 63 6b 20 29 7b    if( bUnlock ){
23660 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23670 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 55  e3PagerSnapshotU
23680 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
23690 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
236a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
236b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
236c0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65  e(db->mutex);.#e
236d0 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45  ndif   /* SQLITE
236e0 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72  _OMIT_WAL */.  r
236f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23700 2a 2a 20 52 65 63 6f 76 65 72 20 61 73 20 6d 61  ** Recover as ma
23710 6e 79 20 73 6e 61 70 73 68 6f 74 73 20 61 73 20  ny snapshots as 
23720 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68  possible from th
23730 65 20 77 61 6c 20 66 69 6c 65 20 61 73 73 6f 63  e wal file assoc
23740 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 73 63  iated with.** sc
23750 68 65 6d 61 20 7a 44 62 20 6f 66 20 64 61 74 61  hema zDb of data
23760 62 61 73 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  base db..*/.int 
23770 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
23780 5f 72 65 63 6f 76 65 72 28 73 71 6c 69 74 65 33  _recover(sqlite3
23790 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
237a0 20 2a 7a 44 62 29 7b 0a 20 20 69 6e 74 20 72 63   *zDb){.  int rc
237b0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
237c0 0a 20 20 69 6e 74 20 69 44 62 3b 0a 23 69 66 6e  .  int iDb;.#ifn
237d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
237e0 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  WAL..#ifdef SQLI
237f0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
23800 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
23810 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
23820 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
23830 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
23840 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
23850 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
23860 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
23870 78 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  x);.  iDb = sqli
23880 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
23890 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 69 44  , zDb);.  if( iD
238a0 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b  b==0 || iDb>1 ){
238b0 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
238c0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
238d0 42 74 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73  Bt;.    if( 0==s
238e0 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 52  qlite3BtreeIsInR
238f0 65 61 64 54 72 61 6e 73 28 70 42 74 29 20 29 7b  eadTrans(pBt) ){
23900 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23910 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
23920 6e 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  ns(pBt, 0, 0);. 
23930 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
23940 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
23960 67 65 72 53 6e 61 70 73 68 6f 74 52 65 63 6f 76  gerSnapshotRecov
23970 65 72 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  er(sqlite3BtreeP
23980 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20  ager(pBt));.    
23990 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
239a0 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20  Commit(pBt);.   
239b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
239c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
239d0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
239e0 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c  .#endif   /* SQL
239f0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
23a00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23a10 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73 6e 61  /*.** Free a sna
23a20 70 73 68 6f 74 20 68 61 6e 64 6c 65 20 6f 62 74  pshot handle obt
23a30 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
23a40 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28  e3_snapshot_get(
23a50 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
23a60 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65  e3_snapshot_free
23a70 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f  (sqlite3_snapsho
23a80 74 20 2a 70 53 6e 61 70 73 68 6f 74 29 7b 0a 20  t *pSnapshot){. 
23a90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
23aa0 6e 61 70 73 68 6f 74 29 3b 0a 7d 0a 23 65 6e 64  napshot);.}.#end
23ab0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
23ac0 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a  BLE_SNAPSHOT */.
23ad0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23ae0 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49  OMIT_COMPILEOPTI
23af0 4f 4e 5f 44 49 41 47 53 0a 2f 2a 0a 2a 2a 20 47  ON_DIAGS./*.** G
23b00 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
23b10 20 61 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20   a compile-time 
23b20 6f 70 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 74  option, return t
23b30 72 75 65 20 69 66 20 74 68 61 74 20 6f 70 74 69  rue if that opti
23b40 6f 6e 0a 2a 2a 20 77 61 73 20 75 73 65 64 20 61  on.** was used a
23b50 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
23b60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 61 6d 65 20  .**.** The name 
23b70 63 61 6e 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62  can optionally b
23b80 65 67 69 6e 20 77 69 74 68 20 22 53 51 4c 49 54  egin with "SQLIT
23b90 45 5f 22 20 62 75 74 20 74 68 65 20 22 53 51 4c  E_" but the "SQL
23ba0 49 54 45 5f 22 20 70 72 65 66 69 78 0a 2a 2a 20  ITE_" prefix.** 
23bb0 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
23bc0 66 6f 72 20 61 20 6d 61 74 63 68 2e 0a 2a 2f 0a  for a match..*/.
23bd0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70  int sqlite3_comp
23be0 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28 63  ileoption_used(c
23bf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e  onst char *zOptN
23c00 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e  ame){.  int i, n
23c10 3b 0a 20 20 69 6e 74 20 6e 4f 70 74 3b 0a 20 20  ;.  int nOpt;.  
23c20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 43  const char **azC
23c30 6f 6d 70 69 6c 65 4f 70 74 3b 0a 20 0a 23 69 66  ompileOpt;. .#if
23c40 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
23c50 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 7a  PI_ARMOR.  if( z
23c60 4f 70 74 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  OptName==0 ){.  
23c70 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
23c80 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
23c90 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
23ca0 6e 64 69 66 0a 0a 20 20 61 7a 43 6f 6d 70 69 6c  ndif..  azCompil
23cb0 65 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 43 6f  eOpt = sqlite3Co
23cc0 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 28 26 6e 4f  mpileOptions(&nO
23cd0 70 74 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  pt);..  if( sqli
23ce0 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4f 70 74  te3StrNICmp(zOpt
23cf0 4e 61 6d 65 2c 20 22 53 51 4c 49 54 45 5f 22 2c  Name, "SQLITE_",
23d00 20 37 29 3d 3d 30 20 29 20 7a 4f 70 74 4e 61 6d   7)==0 ) zOptNam
23d10 65 20 2b 3d 20 37 3b 0a 20 20 6e 20 3d 20 73 71  e += 7;.  n = sq
23d20 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f  lite3Strlen30(zO
23d30 70 74 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53  ptName);..  /* S
23d40 69 6e 63 65 20 6e 4f 70 74 20 69 73 20 6e 6f 72  ince nOpt is nor
23d50 6d 61 6c 6c 79 20 69 6e 20 73 69 6e 67 6c 65 20  mally in single 
23d60 64 69 67 69 74 73 2c 20 61 20 6c 69 6e 65 61 72  digits, a linear
23d70 20 73 65 61 72 63 68 20 69 73 20 0a 20 20 2a 2a   search is .  **
23d80 20 61 64 65 71 75 61 74 65 2e 20 4e 6f 20 6e 65   adequate. No ne
23d90 65 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20  ed for a binary 
23da0 73 65 61 72 63 68 2e 20 2a 2f 0a 20 20 66 6f 72  search. */.  for
23db0 28 69 3d 30 3b 20 69 3c 6e 4f 70 74 3b 20 69 2b  (i=0; i<nOpt; i+
23dc0 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
23dd0 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4f 70 74  te3StrNICmp(zOpt
23de0 4e 61 6d 65 2c 20 61 7a 43 6f 6d 70 69 6c 65 4f  Name, azCompileO
23df0 70 74 5b 69 5d 2c 20 6e 29 3d 3d 30 0a 20 20 20  pt[i], n)==0.   
23e00 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 49 64    && sqlite3IsId
23e10 43 68 61 72 28 28 75 6e 73 69 67 6e 65 64 20 63  Char((unsigned c
23e20 68 61 72 29 61 7a 43 6f 6d 70 69 6c 65 4f 70 74  har)azCompileOpt
23e30 5b 69 5d 5b 6e 5d 29 3d 3d 30 0a 20 20 20 20 29  [i][n])==0.    )
23e40 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
23e50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
23e60 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
23e70 20 52 65 74 75 72 6e 20 74 68 65 20 4e 2d 74 68   Return the N-th
23e80 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
23e90 74 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20 49 66  tion string.  If
23ea0 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   N is out of ran
23eb0 67 65 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  ge,.** return a 
23ec0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  NULL pointer..*/
23ed0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
23ee0 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69  ite3_compileopti
23ef0 6f 6e 5f 67 65 74 28 69 6e 74 20 4e 29 7b 0a 20  on_get(int N){. 
23f00 20 69 6e 74 20 6e 4f 70 74 3b 0a 20 20 63 6f 6e   int nOpt;.  con
23f10 73 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6d 70  st char **azComp
23f20 69 6c 65 4f 70 74 3b 0a 20 20 61 7a 43 6f 6d 70  ileOpt;.  azComp
23f30 69 6c 65 4f 70 74 20 3d 20 73 71 6c 69 74 65 33  ileOpt = sqlite3
23f40 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 28 26  CompileOptions(&
23f50 6e 4f 70 74 29 3b 0a 20 20 69 66 28 20 4e 3e 3d  nOpt);.  if( N>=
23f60 30 20 26 26 20 4e 3c 6e 4f 70 74 20 29 7b 0a 20  0 && N<nOpt ){. 
23f70 20 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6d 70     return azComp
23f80 69 6c 65 4f 70 74 5b 4e 5d 3b 0a 20 20 7d 0a 20  ileOpt[N];.  }. 
23f90 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
23fa0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
23fb0 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e  IT_COMPILEOPTION
23fc0 5f 44 49 41 47 53 20 2a 2f 0a                    _DIAGS */.