/ Hex Artifact Content
Login

Artifact 02da20a8e4baffb775b62a6757343b9b9b0846ec8994f6a88e3951c95940b2af:


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 20 20 7b 20 53 51 4c 49 54 45 5f 44 42       { SQLITE_DB
7440: 43 4f 4e 46 49 47 5f 4c 45 47 41 43 59 5f 41 4c  CONFIG_LEGACY_AL
7450: 54 45 52 5f 54 41 42 4c 45 2c 20 20 20 20 53 51  TER_TABLE,    SQ
7460: 4c 49 54 45 5f 4c 65 67 61 63 79 41 6c 74 65 72  LITE_LegacyAlter
7470: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b      },.        {
7480: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
7490: 5f 44 51 53 5f 44 44 4c 2c 20 20 20 20 20 20 20  _DQS_DDL,       
74a0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
74b0: 71 73 44 44 4c 20 20 20 20 20 20 20 20 20 7d 2c  qsDDL         },
74c0: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
74d0: 45 5f 44 42 43 4f 4e 46 49 47 5f 44 51 53 5f 44  E_DBCONFIG_DQS_D
74e0: 4d 4c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ML,             
74f0: 20 20 53 51 4c 49 54 45 5f 44 71 73 44 4d 4c 20    SQLITE_DqsDML 
7500: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
7510: 20 7d 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e   };.      unsign
7520: 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20  ed int i;.      
7530: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
7540: 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37  R; /* IMP: R-427
7550: 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20 20 20 20  90-23372 */.    
7560: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
7570: 61 79 53 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b  aySize(aFlagOp);
7580: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
7590: 66 28 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70  f( aFlagOp[i].op
75a0: 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ==op ){.        
75b0: 20 20 69 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61    int onoff = va
75c0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
75d0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 2a 70 52           int *pR
75e0: 65 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  es = va_arg(ap, 
75f0: 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 20 20 20  int*);.         
7600: 20 75 36 34 20 6f 6c 64 46 6c 61 67 73 20 3d 20   u64 oldFlags = 
7610: 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20  db->flags;.     
7620: 20 20 20 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30       if( onoff>0
7630: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7640: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c  db->flags |= aFl
7650: 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20  agOp[i].mask;.  
7660: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
7670: 28 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20  ( onoff==0 ){.  
7680: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
7690: 61 67 73 20 26 3d 20 7e 28 75 36 34 29 61 46 6c  ags &= ~(u64)aFl
76a0: 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20  agOp[i].mask;.  
76b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
76c0: 20 20 20 20 69 66 28 20 6f 6c 64 46 6c 61 67 73      if( oldFlags
76d0: 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29 7b 0a 20  !=db->flags ){. 
76e0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
76f0: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
7700: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 2c 20 30  Statements(db, 0
7710: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
7720: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65           if( pRe
7730: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
7740: 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c   *pRes = (db->fl
7750: 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d  ags & aFlagOp[i]
7760: 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20  .mask)!=0;.     
7770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7780: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
7790: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
77a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
77b0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
77c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
77d0: 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72  end(ap);.  retur
77e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
77f0: 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
7800: 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  lt collating fun
7810: 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e  ction named "BIN
7820: 41 52 59 22 20 77 68 69 63 68 20 69 73 20 61 6c  ARY" which is al
7830: 77 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c  ways.** availabl
7840: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
7850: 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20   binCollFunc(.  
7860: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
7870: 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
7880: 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20  t void *pKey1,. 
7890: 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73   int nKey2, cons
78a0: 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b  t void *pKey2.){
78b0: 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20  .  int rc, n;.  
78c0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
78d0: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 6e 20 3d  (NotUsed);.  n =
78e0: 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e   nKey1<nKey2 ? n
78f0: 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20  Key1 : nKey2;.  
7900: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
7910: 52 2d 36 35 30 33 33 2d 32 38 34 34 39 20 54 68  R-65033-28449 Th
7920: 65 20 62 75 69 6c 74 2d 69 6e 20 42 49 4e 41 52  e built-in BINAR
7930: 59 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 6f 6d 70  Y collation comp
7940: 61 72 65 73 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ares.  ** string
7950: 73 20 62 79 74 65 20 62 79 20 62 79 74 65 20 75  s byte by byte u
7960: 73 69 6e 67 20 74 68 65 20 6d 65 6d 63 6d 70 28  sing the memcmp(
7970: 29 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20  ) function from 
7980: 74 68 65 20 73 74 61 6e 64 61 72 64 20 43 0a 20  the standard C. 
7990: 20 2a 2a 20 6c 69 62 72 61 72 79 2e 20 2a 2f 0a   ** library. */.
79a0: 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 31 20    assert( pKey1 
79b0: 26 26 20 70 4b 65 79 32 20 29 3b 0a 20 20 72 63  && pKey2 );.  rc
79c0: 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c   = memcmp(pKey1,
79d0: 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66   pKey2, n);.  if
79e0: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc==0 ){.    r
79f0: 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79  c = nKey1 - nKey
7a00: 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
7a10: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
7a20: 73 20 69 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  s is the collati
7a30: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ng function name
7a40: 64 20 22 52 54 52 49 4d 22 20 77 68 69 63 68 20  d "RTRIM" which 
7a50: 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61  is always.** ava
7a60: 69 6c 61 62 6c 65 2e 20 20 49 67 6e 6f 72 65 20  ilable.  Ignore 
7a70: 74 72 61 69 6c 69 6e 67 20 73 70 61 63 65 73 2e  trailing spaces.
7a80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
7a90: 74 72 69 6d 43 6f 6c 6c 46 75 6e 63 28 0a 20 20  trimCollFunc(.  
7aa0: 76 6f 69 64 20 2a 70 55 73 65 72 2c 0a 20 20 69  void *pUser,.  i
7ab0: 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
7ac0: 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69  void *pKey1,.  i
7ad0: 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20  nt nKey2, const 
7ae0: 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20  void *pKey2.){. 
7af0: 20 63 6f 6e 73 74 20 75 38 20 2a 70 4b 31 20 3d   const u8 *pK1 =
7b00: 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79   (const u8*)pKey
7b10: 31 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  1;.  const u8 *p
7b20: 4b 32 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29  K2 = (const u8*)
7b30: 70 4b 65 79 32 3b 0a 20 20 77 68 69 6c 65 28 20  pKey2;.  while( 
7b40: 6e 4b 65 79 31 20 26 26 20 70 4b 31 5b 6e 4b 65  nKey1 && pK1[nKe
7b50: 79 31 2d 31 5d 3d 3d 27 20 27 20 29 20 6e 4b 65  y1-1]==' ' ) nKe
7b60: 79 31 2d 2d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  y1--;.  while( n
7b70: 4b 65 79 32 20 26 26 20 70 4b 32 5b 6e 4b 65 79  Key2 && pK2[nKey
7b80: 32 2d 31 5d 3d 3d 27 20 27 20 29 20 6e 4b 65 79  2-1]==' ' ) nKey
7b90: 32 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 62 69  2--;.  return bi
7ba0: 6e 43 6f 6c 6c 46 75 6e 63 28 70 55 73 65 72 2c  nCollFunc(pUser,
7bb0: 20 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 6e   nKey1, pKey1, n
7bc0: 4b 65 79 32 2c 20 70 4b 65 79 32 29 3b 0a 7d 0a  Key2, pKey2);.}.
7bd0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
7be0: 75 65 20 69 66 20 43 6f 6c 6c 53 65 71 20 69 73  ue if CollSeq is
7bf0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 62 75 69   the default bui
7c00: 6c 74 2d 69 6e 20 42 49 4e 41 52 59 2e 0a 2a 2f  lt-in BINARY..*/
7c10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 42 69  .int sqlite3IsBi
7c20: 6e 61 72 79 28 63 6f 6e 73 74 20 43 6f 6c 6c 53  nary(const CollS
7c30: 65 71 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  eq *p){.  assert
7c40: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 78 43 6d  ( p==0 || p->xCm
7c50: 70 21 3d 62 69 6e 43 6f 6c 6c 46 75 6e 63 20 7c  p!=binCollFunc |
7c60: 7c 20 73 74 72 63 6d 70 28 70 2d 3e 7a 4e 61 6d  | strcmp(p->zNam
7c70: 65 2c 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 29  e,"BINARY")==0 )
7c80: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3d 3d 30 20  ;.  return p==0 
7c90: 7c 7c 20 70 2d 3e 78 43 6d 70 3d 3d 62 69 6e 43  || p->xCmp==binC
7ca0: 6f 6c 6c 46 75 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  ollFunc;.}../*.*
7cb0: 2a 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d  * Another built-
7cc0: 69 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  in collating seq
7cd0: 75 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a  uence: NOCASE. .
7ce0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61  **.** This colla
7cf0: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  ting sequence is
7d00: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20   intended to be 
7d10: 75 73 65 64 20 66 6f 72 20 22 63 61 73 65 20 69  used for "case i
7d20: 6e 64 65 70 65 6e 64 65 6e 74 0a 2a 2a 20 63 6f  ndependent.** co
7d30: 6d 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74  mparison". SQLit
7d40: 65 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66  e's knowledge of
7d50: 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72   upper and lower
7d60: 20 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74   case equivalent
7d70: 73 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c  s.** extends onl
7d80: 79 20 74 6f 20 74 68 65 20 32 36 20 63 68 61 72  y to the 26 char
7d90: 61 63 74 65 72 73 20 75 73 65 64 20 69 6e 20 74  acters used in t
7da0: 68 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  he English langu
7db0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68  age..**.** At th
7dc0: 65 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69  e moment there i
7dd0: 73 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69  s only a UTF-8 i
7de0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a  mplementation..*
7df0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63  /.static int noc
7e00: 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63  aseCollatingFunc
7e10: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
7e20: 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  d,.  int nKey1, 
7e30: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
7e40: 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20  1,.  int nKey2, 
7e50: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
7e60: 32 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73  2.){.  int r = s
7e70: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a  qlite3StrNICmp(.
7e80: 20 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61        (const cha
7e90: 72 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73  r *)pKey1, (cons
7ea0: 74 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20  t char *)pKey2, 
7eb0: 28 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b  (nKey1<nKey2)?nK
7ec0: 65 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e  ey1:nKey2);.  UN
7ed0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
7ee0: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30  otUsed);.  if( 0
7ef0: 3d 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e  ==r ){.    r = n
7f00: 4b 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a  Key1-nKey2;.  }.
7f10: 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f    return r;.}../
7f20: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
7f30: 52 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73  ROWID of the mos
7f40: 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a  t recent insert.
7f50: 2a 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  */.sqlite_int64 
7f60: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
7f70: 65 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65  ert_rowid(sqlite
7f80: 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53  3 *db){.#ifdef S
7f90: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
7fa0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
7fb0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
7fc0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
7fd0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
7fe0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
7ff0: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
8000: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61  .  return db->la
8010: 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  stRowid;.}../*.*
8020: 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
8030: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
8040: 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73  sqlite3_last_ins
8050: 65 72 74 5f 72 6f 77 69 64 28 29 20 41 50 49 20  ert_rowid() API 
8060: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
8070: 64 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 6c 61  d sqlite3_set_la
8080: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
8090: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 73 71 6c  sqlite3 *db, sql
80a0: 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69  ite3_int64 iRowi
80b0: 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  d){.#ifdef SQLIT
80c0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
80d0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
80e0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
80f0: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
8100: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
8110: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
8120: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
8130: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
8140: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
8150: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 69  b->lastRowid = i
8160: 52 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33  Rowid;.  sqlite3
8170: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
8180: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >mutex);.}../*.*
8190: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
81a0: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69  ber of changes i
81b0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
81c0: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
81d0: 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74  3_exec()..*/.int
81e0: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
81f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23  (sqlite3 *db){.#
8200: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
8210: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
8220: 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
8230: 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b  tyCheckOk(db) ){
8240: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
8250: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
8260: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
8270: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
8280: 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a   db->nChange;.}.
8290: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
82a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e  e number of chan
82b0: 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 64 61  ges since the da
82c0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61  tabase handle wa
82d0: 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  s opened..*/.int
82e0: 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63   sqlite3_total_c
82f0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
8300: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
8310: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
8320: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
8330: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
8340: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
8350: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
8360: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
8370: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
8380: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61  return db->nTota
8390: 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  lChange;.}../*.*
83a0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e  * Close all open
83b0: 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69   savepoints. Thi
83c0: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20  s function only 
83d0: 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c  manipulates fiel
83e0: 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ds of the.** dat
83f0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a  abase handle obj
8400: 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  ect, it does not
8410: 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70   close any savep
8420: 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62  oints that may b
8430: 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65  e open.** at the
8440: 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65   b-tree/pager le
8450: 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  vel..*/.void sql
8460: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
8470: 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
8480: 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70  {.  while( db->p
8490: 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
84a0: 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70   Savepoint *pTmp
84b0: 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
84c0: 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65  t;.    db->pSave
84d0: 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e  point = pTmp->pN
84e0: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
84f0: 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29  DbFree(db, pTmp)
8500: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76  ;.  }.  db->nSav
8510: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62  epoint = 0;.  db
8520: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
8530: 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61  ;.  db->isTransa
8540: 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
8550: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   0;.}../*.** Inv
8560: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
8570: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f  or function asso
8580: 63 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63  ciated with Func
8590: 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45  Def p, if any. E
85a0: 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69  xcept,.** if thi
85b0: 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  s is not the las
85c0: 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75  t copy of the fu
85d0: 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69  nction, do not i
85e0: 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70  nvoke it. Multip
85f0: 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20  le.** copies of 
8600: 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f  a single functio
8610: 6e 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68  n are created wh
8620: 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69  en create_functi
8630: 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a  on() is called.*
8640: 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e  * with SQLITE_AN
8650: 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  Y as the encodin
8660: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
8670: 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f  d functionDestro
8680: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46  y(sqlite3 *db, F
8690: 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75  uncDef *p){.  Fu
86a0: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44  ncDestructor *pD
86b0: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 75  estructor = p->u
86c0: 2e 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20  .pDestructor;.  
86d0: 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20  if( pDestructor 
86e0: 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74  ){.    pDestruct
86f0: 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  or->nRef--;.    
8700: 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d  if( pDestructor-
8710: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
8720: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78    pDestructor->x
8730: 44 65 73 74 72 6f 79 28 70 44 65 73 74 72 75 63  Destroy(pDestruc
8740: 74 6f 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b  tor->pUserData);
8750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
8760: 46 72 65 65 28 64 62 2c 20 70 44 65 73 74 72 75  Free(db, pDestru
8770: 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ctor);.    }.  }
8780: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e  .}../*.** Discon
8790: 6e 65 63 74 20 61 6c 6c 20 73 71 6c 69 74 65 33  nect all sqlite3
87a0: 5f 76 74 61 62 20 6f 62 6a 65 63 74 73 20 74 68  _vtab objects th
87b0: 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 64 61 74  at belong to dat
87c0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
87d0: 0a 2a 2a 20 64 62 2e 20 54 68 69 73 20 69 73 20  .** db. This is 
87e0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 64 62 20 69  called when db i
87f0: 73 20 62 65 69 6e 67 20 63 6c 6f 73 65 64 2e 0a  s being closed..
8800: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
8810: 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62  isconnectAllVtab
8820: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23  (sqlite3 *db){.#
8830: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8840: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
8850: 20 20 69 6e 74 20 69 3b 0a 20 20 48 61 73 68 45    int i;.  HashE
8860: 6c 65 6d 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  lem *p;.  sqlite
8870: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
8880: 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  b);.  for(i=0; i
8890: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
88a0: 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68      Schema *pSch
88b0: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  ema = db->aDb[i]
88c0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66  .pSchema;.    if
88d0: 28 20 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ( pSchema ){.   
88e0: 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48     for(p=sqliteH
88f0: 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d  ashFirst(&pSchem
8900: 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 3b 20  a->tblHash); p; 
8910: 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  p=sqliteHashNext
8920: 28 70 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61  (p)){.        Ta
8930: 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61 62  ble *pTab = (Tab
8940: 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  le *)sqliteHashD
8950: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ata(p);.        
8960: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
8970: 61 62 29 20 29 20 73 71 6c 69 74 65 33 56 74 61  ab) ) sqlite3Vta
8980: 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20  bDisconnect(db, 
8990: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pTab);.      }. 
89a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70     }.  }.  for(p
89b0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
89c0: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20  (&db->aModule); 
89d0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
89e0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 4d 6f 64  ext(p)){.    Mod
89f0: 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64  ule *pMod = (Mod
8a00: 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68  ule *)sqliteHash
8a10: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 69 66 28  Data(p);.    if(
8a20: 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 20 29   pMod->pEpoTab )
8a30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8a40: 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62  tabDisconnect(db
8a50: 2c 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 29  , pMod->pEpoTab)
8a60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
8a70: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
8a80: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
8a90: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
8aa0: 64 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  db);.#else.  UNU
8ab0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
8ac0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
8ad0: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
8ae0: 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  f database conne
8af0: 63 74 69 6f 6e 20 64 62 20 68 61 73 20 75 6e 66  ction db has unf
8b00: 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65  inalized prepare
8b10: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  d.** statements 
8b20: 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71  or unfinished sq
8b30: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a  lite3_backup obj
8b40: 65 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  ects.  .*/.stati
8b50: 63 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  c int connection
8b60: 49 73 42 75 73 79 28 73 71 6c 69 74 65 33 20 2a  IsBusy(sqlite3 *
8b70: 64 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  db){.  int j;.  
8b80: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
8b90: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
8ba0: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 64  utex) );.  if( d
8bb0: 62 2d 3e 70 56 64 62 65 20 29 20 72 65 74 75 72  b->pVdbe ) retur
8bc0: 6e 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  n 1;.  for(j=0; 
8bd0: 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b  j<db->nDb; j++){
8be0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
8bf0: 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74  = db->aDb[j].pBt
8c00: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26  ;.    if( pBt &&
8c10: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
8c20: 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29 20 72  nBackup(pBt) ) r
8c30: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
8c40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
8c50: 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74  * Close an exist
8c60: 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62  ing SQLite datab
8c70: 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ase.*/.static in
8c80: 74 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 73  t sqlite3Close(s
8c90: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
8ca0: 66 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20  forceZombie){.  
8cb0: 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 2f  if( !db ){.    /
8cc0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
8cd0: 2d 36 33 32 35 37 2d 31 31 37 34 30 20 43 61 6c  -63257-11740 Cal
8ce0: 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 63 6c 6f  ling sqlite3_clo
8cf0: 73 65 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  se() or.    ** s
8d00: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28  qlite3_close_v2(
8d10: 29 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f  ) with a NULL po
8d20: 69 6e 74 65 72 20 61 72 67 75 6d 65 6e 74 20 69  inter argument i
8d30: 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
8d40: 6f 70 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  op. */.    retur
8d50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
8d60: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
8d70: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
8d80: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
8d90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
8da0: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73  SE_BKPT;.  }.  s
8db0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
8dc0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
8dd0: 20 69 66 28 20 64 62 2d 3e 6d 54 72 61 63 65 20   if( db->mTrace 
8de0: 26 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 43  & SQLITE_TRACE_C
8df0: 4c 4f 53 45 20 29 7b 0a 20 20 20 20 64 62 2d 3e  LOSE ){.    db->
8e00: 78 54 72 61 63 65 28 53 51 4c 49 54 45 5f 54 52  xTrace(SQLITE_TR
8e10: 41 43 45 5f 43 4c 4f 53 45 2c 20 64 62 2d 3e 70  ACE_CLOSE, db->p
8e20: 54 72 61 63 65 41 72 67 2c 20 64 62 2c 20 30 29  TraceArg, db, 0)
8e30: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 63  ;.  }..  /* Forc
8e40: 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 63 61  e xDisconnect ca
8e50: 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75  lls on all virtu
8e60: 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64  al tables */.  d
8e70: 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62  isconnectAllVtab
8e80: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  (db);..  /* If a
8e90: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
8ea0: 6f 70 65 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e  open, the discon
8eb0: 6e 65 63 74 41 6c 6c 56 74 61 62 28 29 20 63 61  nectAllVtab() ca
8ec0: 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69  ll above.  ** wi
8ed0: 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c  ll not have call
8ee0: 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65  ed the xDisconne
8ef0: 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61  ct() method on a
8f00: 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20  ny virtual.  ** 
8f10: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62  tables in the db
8f20: 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61  ->aVTrans[] arra
8f30: 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  y. The following
8f40: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
8f50: 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c  back().  ** call
8f60: 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20   will do so. We 
8f70: 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20  need to do this 
8f80: 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b  before the check
8f90: 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a   for active.  **
8fa0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20   SQL statements 
8fb0: 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d  below, as the v-
8fc0: 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61  table implementa
8fd0: 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72  tion may be stor
8fe0: 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72  ing.  ** some pr
8ff0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
9000: 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  s internally..  
9010: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  */.  sqlite3Vtab
9020: 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20  Rollback(db);.. 
9030: 20 2f 2a 20 4c 65 67 61 63 79 20 62 65 68 61 76   /* Legacy behav
9040: 69 6f 72 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f  ior (sqlite3_clo
9050: 73 65 28 29 20 62 65 68 61 76 69 6f 72 29 20 69  se() behavior) i
9060: 73 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a  s to return.  **
9070: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20   SQLITE_BUSY if 
9080: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  the connection c
9090: 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64  an not be closed
90a0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
90b0: 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72 63 65 5a  */.  if( !forceZ
90c0: 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65 63 74  ombie && connect
90d0: 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b  ionIsBusy(db) ){
90e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
90f0: 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c  rWithMsg(db, SQL
9100: 49 54 45 5f 42 55 53 59 2c 20 22 75 6e 61 62 6c  ITE_BUSY, "unabl
9110: 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20 74  e to close due t
9120: 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22 0a  o unfinalized ".
9130: 20 20 20 20 20 20 20 22 73 74 61 74 65 6d 65 6e         "statemen
9140: 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64  ts or unfinished
9150: 20 62 61 63 6b 75 70 73 22 29 3b 0a 20 20 20 20   backups");.    
9160: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
9170: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
9180: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9190: 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69 66  E_BUSY;.  }..#if
91a0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
91b0: 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73  E_SQLLOG.  if( s
91c0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
91d0: 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20  ig.xSqllog ){.  
91e0: 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68 65    /* Closing the
91f0: 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68 20   handle. Fourth 
9200: 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61 73  parameter is pas
9210: 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 32 2e  sed the value 2.
9220: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 47   */.    sqlite3G
9230: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
9240: 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  log(sqlite3Globa
9250: 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41  lConfig.pSqllogA
9260: 72 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a 20  rg, db, 0, 2);. 
9270: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
9280: 43 6f 6e 76 65 72 74 20 74 68 65 20 63 6f 6e 6e  Convert the conn
9290: 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a 6f  ection into a zo
92a0: 6d 62 69 65 20 61 6e 64 20 74 68 65 6e 20 63 6c  mbie and then cl
92b0: 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 64  ose it..  */.  d
92c0: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
92d0: 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b 0a  E_MAGIC_ZOMBIE;.
92e0: 20 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75    sqlite3LeaveMu
92f0: 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69  texAndCloseZombi
9300: 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(db);.  return 
9310: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
9320: 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61 74 69 6f  .** Two variatio
9330: 6e 73 20 6f 6e 20 74 68 65 20 70 75 62 6c 69 63  ns on the public
9340: 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20 63   interface for c
9350: 6c 6f 73 69 6e 67 20 61 20 64 61 74 61 62 61 73  losing a databas
9360: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
9370: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f   The sqlite3_clo
9380: 73 65 28 29 20 76 65 72 73 69 6f 6e 20 72 65 74  se() version ret
9390: 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59  urns SQLITE_BUSY
93a0: 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20 74   and.** leaves t
93b0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  he connection op
93c0: 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72  tion if there ar
93d0: 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70 72  e unfinalized pr
93e0: 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d  epared.** statem
93f0: 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68  ents or unfinish
9400: 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  ed sqlite3_backu
9410: 70 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ps.  The sqlite3
9420: 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20 76  _close_v2().** v
9430: 65 72 73 69 6f 6e 20 66 6f 72 63 65 73 20 74 68  ersion forces th
9440: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
9450: 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65 20  become a zombie 
9460: 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  if there are.** 
9470: 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75 72 63  unclosed resourc
9480: 65 73 2c 20 61 6e 64 20 61 72 72 61 6e 67 65 73  es, and arranges
9490: 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69 6f   for deallocatio
94a0: 6e 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 0a  n when the last.
94b0: 2a 2a 20 70 72 65 70 61 72 65 20 73 74 61 74 65  ** prepare state
94c0: 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74 65 33 5f  ment or sqlite3_
94d0: 62 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a 2a  backup closes..*
94e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c  /.int sqlite3_cl
94f0: 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ose(sqlite3 *db)
9500: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
9510: 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a 69  Close(db,0); }.i
9520: 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  nt sqlite3_close
9530: 5f 76 32 28 73 71 6c 69 74 65 33 20 2a 64 62 29  _v2(sqlite3 *db)
9540: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
9550: 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a 0a  Close(db,1); }..
9560: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
9570: 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61   mutex on databa
9580: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
9590: 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72 6d  ..**.** Furtherm
95a0: 6f 72 65 2c 20 69 66 20 64 61 74 61 62 61 73 65  ore, if database
95b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69   connection db i
95c0: 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61 6e  s a zombie (mean
95d0: 69 6e 67 20 74 68 61 74 20 74 68 65 72 65 0a 2a  ing that there.*
95e0: 2a 20 68 61 73 20 62 65 65 6e 20 61 20 70 72 69  * has been a pri
95f0: 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  or call to sqlit
9600: 65 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72 20  e3_close(db) or 
9610: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
9620: 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76 65  (db)) and.** eve
9630: 72 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ry sqlite3_stmt 
9640: 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 66 69 6e  has now been fin
9650: 61 6c 69 7a 65 64 20 61 6e 64 20 65 76 65 72 79  alized and every
9660: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
9670: 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64 2c  has.** finished,
9680: 20 74 68 65 6e 20 66 72 65 65 20 61 6c 6c 20 72   then free all r
9690: 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f 69  esources..*/.voi
96a0: 64 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d 75  d sqlite3LeaveMu
96b0: 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62 69  texAndCloseZombi
96c0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
96d0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20 20    HashElem *i;  
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96f0: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
9700: 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e  iterator */.  in
9710: 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t j;..  /* If th
9720: 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
9730: 69 6e 67 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ing sqlite3_stmt
9740: 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63 6b   or sqlite3_back
9750: 75 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a 20  up objects.  ** 
9760: 6f 72 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  or if the connec
9770: 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74  tion has not yet
9780: 20 62 65 65 6e 20 63 6c 6f 73 65 64 20 62 79 20   been closed by 
9790: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
97a0: 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a 75  (),.  ** then ju
97b0: 73 74 20 6c 65 61 76 65 20 74 68 65 20 6d 75 74  st leave the mut
97c0: 65 78 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ex and return.. 
97d0: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
97e0: 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47 49  gic!=SQLITE_MAGI
97f0: 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e 6e  C_ZOMBIE || conn
9800: 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29  ectionIsBusy(db)
9810: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
9820: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
9830: 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75  mutex);.    retu
9840: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  rn;.  }..  /* If
9850: 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
9860: 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20 74  oint, it means t
9870: 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
9880: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 0a   connection has.
9890: 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c 20    ** closed all 
98a0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e 64  sqlite3_stmt and
98b0: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
98c0: 6f 62 6a 65 63 74 73 20 61 6e 64 20 68 61 73 20  objects and has 
98d0: 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65 64  been.  ** passed
98e0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73   to sqlite3_clos
98f0: 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  e (meaning that 
9900: 69 74 20 69 73 20 61 20 7a 6f 6d 62 69 65 29 2e  it is a zombie).
9910: 20 20 54 68 65 72 65 66 6f 72 65 2c 0a 20 20 2a    Therefore,.  *
9920: 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 66  * go ahead and f
9930: 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65  ree all resource
9940: 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  s..  */..  /* If
9950: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
9960: 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74 20  s open, roll it 
9970: 62 61 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f 20  back. This also 
9980: 65 6e 73 75 72 65 73 20 74 68 61 74 20 69 66 0a  ensures that if.
9990: 20 20 2a 2a 20 61 6e 79 20 64 61 74 61 62 61 73    ** any databas
99a0: 65 20 73 63 68 65 6d 61 73 20 68 61 76 65 20 62  e schemas have b
99b0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 62 79 20  een modified by 
99c0: 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20 74  an uncommitted t
99d0: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
99e0: 74 68 65 79 20 61 72 65 20 72 65 73 65 74 2e 20  they are reset. 
99f0: 41 6e 64 20 74 68 61 74 20 74 68 65 20 72 65 71  And that the req
9a00: 75 69 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74  uired b-tree mut
9a10: 65 78 20 69 73 20 68 65 6c 64 20 74 6f 20 6d 61  ex is held to ma
9a20: 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  ke.  ** the page
9a30: 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73  r rollback and s
9a40: 63 68 65 6d 61 20 72 65 73 65 74 20 61 6e 20 61  chema reset an a
9a50: 74 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e 2e  tomic operation.
9a60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f 6c   */.  sqlite3Rol
9a70: 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
9a80: 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20 46  ITE_OK);..  /* F
9a90: 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64  ree any outstand
9aa0: 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20 73 74  ing Savepoint st
9ab0: 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20 73  ructures. */.  s
9ac0: 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70  qlite3CloseSavep
9ad0: 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f 2a  oints(db);..  /*
9ae0: 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61 62   Close all datab
9af0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
9b00: 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  */.  for(j=0; j<
9b10: 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20  db->nDb; j++){. 
9b20: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
9b30: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b  b = &db->aDb[j];
9b40: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
9b50: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
9b60: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62  e3BtreeClose(pDb
9b70: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44  ->pBt);.      pD
9b80: 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20  b->pBt = 0;.    
9b90: 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20    if( j!=1 ){.  
9ba0: 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65        pDb->pSche
9bb0: 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ma = 0;.      }.
9bc0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 43      }.  }.  /* C
9bd0: 6c 65 61 72 20 74 68 65 20 54 45 4d 50 20 73 63  lear the TEMP sc
9be0: 68 65 6d 61 20 73 65 70 61 72 61 74 65 6c 79 20  hema separately 
9bf0: 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69 66  and last */.  if
9c00: 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ( db->aDb[1].pSc
9c10: 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c 69  hema ){.    sqli
9c20: 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64  te3SchemaClear(d
9c30: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
9c40: 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  a);.  }.  sqlite
9c50: 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28  3VtabUnlockList(
9c60: 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  db);..  /* Free 
9c70: 75 70 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  up the array of 
9c80: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
9c90: 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ses */.  sqlite3
9ca0: 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65  CollapseDatabase
9cb0: 41 72 72 61 79 28 64 62 29 3b 0a 20 20 61 73 73  Array(db);.  ass
9cc0: 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20  ert( db->nDb<=2 
9cd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  );.  assert( db-
9ce0: 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb==db->aDbSta
9cf0: 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65 6c  tic );..  /* Tel
9d00: 6c 20 74 68 65 20 63 6f 64 65 20 69 6e 20 6e 6f  l the code in no
9d10: 74 69 66 79 2e 63 20 74 68 61 74 20 74 68 65 20  tify.c that the 
9d20: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c 6f  connection no lo
9d30: 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a 20  nger holds any. 
9d40: 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64 6f   ** locks and do
9d50: 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
9d60: 6e 79 20 66 75 72 74 68 65 72 20 75 6e 6c 6f 63  ny further unloc
9d70: 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63  k-notify callbac
9d80: 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ks..  */.  sqlit
9d90: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f 73  e3ConnectionClos
9da0: 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69  ed(db);..  for(i
9db0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
9dc0: 28 26 64 62 2d 3e 61 46 75 6e 63 29 3b 20 69 3b  (&db->aFunc); i;
9dd0: 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
9de0: 74 28 69 29 29 7b 0a 20 20 20 20 46 75 6e 63 44  t(i)){.    FuncD
9df0: 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 3b 0a 20  ef *pNext, *p;. 
9e00: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 48 61 73     p = sqliteHas
9e10: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 64 6f  hData(i);.    do
9e20: 7b 0a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e  {.      function
9e30: 44 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a  Destroy(db, p);.
9e40: 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d        pNext = p-
9e50: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
9e60: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9e70: 70 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 70 4e  p);.      p = pN
9e80: 65 78 74 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ext;.    }while(
9e90: 20 70 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   p );.  }.  sqli
9ea0: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62  te3HashClear(&db
9eb0: 2d 3e 61 46 75 6e 63 29 3b 0a 20 20 66 6f 72 28  ->aFunc);.  for(
9ec0: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
9ed0: 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  t(&db->aCollSeq)
9ee0: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
9ef0: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43  hNext(i)){.    C
9f00: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
9f10: 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74  (CollSeq *)sqlit
9f20: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
9f30: 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20    /* Invoke any 
9f40: 64 65 73 74 72 75 63 74 6f 72 73 20 72 65 67 69  destructors regi
9f50: 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61  stered for colla
9f60: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73  tion sequence us
9f70: 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20  er data. */.    
9f80: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b  for(j=0; j<3; j+
9f90: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  +){.      if( pC
9fa0: 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20  oll[j].xDel ){. 
9fb0: 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e         pColl[j].
9fc0: 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55  xDel(pColl[j].pU
9fd0: 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ser);.      }.  
9fe0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
9ff0: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29  bFree(db, pColl)
a000: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
a010: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43  ashClear(&db->aC
a020: 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66  ollSeq);.#ifndef
a030: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
a040: 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28  TUALTABLE.  for(
a050: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
a060: 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
a070: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
a080: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f  Next(i)){.    Mo
a090: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
a0a0: 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73  dule *)sqliteHas
a0b0: 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
a0c0: 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79  ( pMod->xDestroy
a0d0: 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e   ){.      pMod->
a0e0: 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70  xDestroy(pMod->p
a0f0: 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Aux);.    }.    
a100: 73 71 6c 69 74 65 33 56 74 61 62 45 70 6f 6e 79  sqlite3VtabEpony
a110: 6d 6f 75 73 54 61 62 6c 65 43 6c 65 61 72 28 64  mousTableClear(d
a120: 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 20 20 73 71  b, pMod);.    sq
a130: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
a140: 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pMod);.  }.  sql
a150: 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64  ite3HashClear(&d
a160: 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e  b->aModule);.#en
a170: 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72  dif..  sqlite3Er
a180: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
a190: 4b 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  K); /* Deallocat
a1a0: 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72  es any cached er
a1b0: 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a  ror strings. */.
a1c0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
a1d0: 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  ee(db->pErr);.  
a1e0: 73 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65  sqlite3CloseExte
a1f0: 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 23 69 66 20  nsions(db);.#if 
a200: 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
a210: 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 73 71 6c  ENTICATION.  sql
a220: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75  ite3_free(db->au
a230: 74 68 2e 7a 41 75 74 68 55 73 65 72 29 3b 0a 20  th.zAuthUser);. 
a240: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
a250: 2d 3e 61 75 74 68 2e 7a 41 75 74 68 50 57 29 3b  ->auth.zAuthPW);
a260: 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d  .#endif..  db->m
a270: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
a280: 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a  GIC_ERROR;..  /*
a290: 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61   The temp-databa
a2a0: 73 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c  se schema is all
a2b0: 6f 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74  ocated different
a2c0: 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  ly from the othe
a2d0: 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62  r schema.  ** ob
a2e0: 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c  jects (using sql
a2f0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65  iteMalloc() dire
a300: 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66  ctly, instead of
a310: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
a320: 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20  ema())..  ** So 
a330: 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  it needs to be f
a340: 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a  reed here. Todo:
a350: 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68   Why not roll th
a360: 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e  e temp schema in
a370: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  to.  ** the same
a380: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
a390: 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20  as the one that 
a3a0: 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61  allocates the da
a3b0: 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72  tabase .  ** str
a3c0: 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73  ucture?.  */.  s
a3d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a3e0: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
a3f0: 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ema);.  sqlite3_
a400: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
a410: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61  mutex);.  db->ma
a420: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
a430: 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c  IC_CLOSED;.  sql
a440: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
a450: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
a460: 73 65 72 74 28 20 73 71 6c 69 74 65 33 4c 6f 6f  sert( sqlite3Loo
a470: 6b 61 73 69 64 65 55 73 65 64 28 64 62 2c 30 29  kasideUsed(db,0)
a480: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  ==0 );.  if( db-
a490: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
a4a0: 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  oced ){.    sqli
a4b0: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f  te3_free(db->loo
a4c0: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a  kaside.pStart);.
a4d0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
a4e0: 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 52 52 0a 20  E_ENABLE_SQLRR. 
a4f0: 20 53 52 52 65 63 43 6c 6f 73 65 28 64 62 29 3b   SRRecClose(db);
a500: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 71 6c  .#endif.  .  sql
a510: 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d  ite3_free(db);.}
a520: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
a530: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 66 69   all database fi
a540: 6c 65 73 2e 20 20 49 66 20 74 72 69 70 43 6f 64  les.  If tripCod
a550: 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  e is not SQLITE_
a560: 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20  OK, then.** any 
a570: 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
a580: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 22  e invalidated ("
a590: 74 72 69 70 70 65 64 22 20 2d 20 61 73 20 69 6e  tripped" - as in
a5a0: 20 22 74 72 69 70 70 69 6e 67 20 61 20 63 69 72   "tripping a cir
a5b0: 63 75 69 74 0a 2a 2a 20 62 72 65 61 6b 65 72 22  cuit.** breaker"
a5c0: 29 20 61 6e 64 20 6d 61 64 65 20 74 6f 20 72 65  ) and made to re
a5d0: 74 75 72 6e 20 74 72 69 70 43 6f 64 65 20 69 66  turn tripCode if
a5e0: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 66   there are any f
a5f0: 75 72 74 68 65 72 0a 2a 2a 20 61 74 74 65 6d 70  urther.** attemp
a600: 74 73 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ts to use that c
a610: 75 72 73 6f 72 2e 20 20 52 65 61 64 20 63 75 72  ursor.  Read cur
a620: 73 6f 72 73 20 72 65 6d 61 69 6e 20 6f 70 65 6e  sors remain open
a630: 20 61 6e 64 20 76 61 6c 69 64 0a 2a 2a 20 62 75   and valid.** bu
a640: 74 20 61 72 65 20 22 73 61 76 65 64 22 20 69 6e  t are "saved" in
a650: 20 63 61 73 65 20 74 68 65 20 74 61 62 6c 65 20   case the table 
a660: 70 61 67 65 73 20 61 72 65 20 6d 6f 76 65 64 20  pages are moved 
a670: 61 72 6f 75 6e 64 2e 0a 2a 2f 0a 76 6f 69 64 20  around..*/.void 
a680: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
a690: 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
a6a0: 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b 0a 20  int tripCode){. 
a6b0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 6e   int i;.  int in
a6c0: 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 69 6e 74  Trans = 0;.  int
a6d0: 20 73 63 68 65 6d 61 43 68 61 6e 67 65 3b 0a 20   schemaChange;. 
a6e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a6f0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
a700: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
a710: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
a720: 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62  lloc();..  /* Ob
a730: 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20  tain all b-tree 
a740: 6d 75 74 65 78 65 73 20 62 65 66 6f 72 65 20 6d  mutexes before m
a750: 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20  aking any calls 
a760: 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  to BtreeRollback
a770: 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20 69  (). .  ** This i
a780: 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63  s important in c
a790: 61 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ase the transact
a7a0: 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64  ion being rolled
a7b0: 20 62 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d   back has.  ** m
a7c0: 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61  odified the data
a7d0: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
a7e0: 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78  the b-tree mutex
a7f0: 65 73 20 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e  es are not taken
a800: 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e  .  ** here, then
a810: 20 61 6e 6f 74 68 65 72 20 73 68 61 72 65 64 2d   another shared-
a820: 63 61 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  cache connection
a830: 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 20   might sneak in 
a840: 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65  between.  ** the
a850: 20 64 61 74 61 62 61 73 65 20 72 6f 6c 6c 62 61   database rollba
a860: 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65  ck and schema re
a870: 73 65 74 2c 20 77 68 69 63 68 20 63 61 6e 20 63  set, which can c
a880: 61 75 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20  ause false.  ** 
a890: 63 6f 72 72 75 70 74 69 6f 6e 20 72 65 70 6f 72  corruption repor
a8a0: 74 73 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73  ts in some cases
a8b0: 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
a8c0: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
a8d0: 3b 0a 20 20 73 63 68 65 6d 61 43 68 61 6e 67 65  ;.  schemaChange
a8e0: 20 3d 20 28 64 62 2d 3e 6d 44 62 46 6c 61 67 73   = (db->mDbFlags
a8f0: 20 26 20 44 42 46 4c 41 47 5f 53 63 68 65 6d 61   & DBFLAG_Schema
a900: 43 68 61 6e 67 65 29 21 3d 30 20 26 26 20 64 62  Change)!=0 && db
a910: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 3b 0a  ->init.busy==0;.
a920: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
a930: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
a940: 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e   Btree *p = db->
a950: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
a960: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 69  if( p ){.      i
a970: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
a980: 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20  sInTrans(p) ){. 
a990: 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d         inTrans =
a9a0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
a9b0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
a9c0: 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69 70 43 6f  llback(p, tripCo
a9d0: 64 65 2c 20 21 73 63 68 65 6d 61 43 68 61 6e 67  de, !schemaChang
a9e0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
a9f0: 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62  sqlite3VtabRollb
aa00: 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ack(db);.  sqlit
aa10: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
aa20: 63 28 29 3b 0a 0a 20 20 69 66 28 20 73 63 68 65  c();..  if( sche
aa30: 6d 61 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20  maChange ){.    
aa40: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
aa50: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
aa60: 64 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  db, 0);.    sqli
aa70: 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d  te3ResetAllSchem
aa80: 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64  asOfConnection(d
aa90: 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  b);.  }.  sqlite
aaa0: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
aab0: 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65  b);..  /* Any de
aac0: 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
aad0: 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76  t violations hav
aae0: 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c  e now been resol
aaf0: 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44  ved. */.  db->nD
ab00: 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b  eferredCons = 0;
ab10: 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  .  db->nDeferred
ab20: 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64  ImmCons = 0;.  d
ab30: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 75 36  b->flags &= ~(u6
ab40: 34 29 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b  4)SQLITE_DeferFK
ab50: 73 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20  s;..  /* If one 
ab60: 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75  has been configu
ab70: 72 65 64 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  red, invoke the 
ab80: 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61  rollback-hook ca
ab90: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20  llback */.  if( 
aba0: 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c  db->xRollbackCal
abb0: 6c 62 61 63 6b 20 26 26 20 28 69 6e 54 72 61 6e  lback && (inTran
abc0: 73 20 7c 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f  s || !db->autoCo
abd0: 6d 6d 69 74 29 20 29 7b 0a 20 20 20 20 64 62 2d  mmit) ){.    db-
abe0: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
abf0: 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  ck(db->pRollback
ac00: 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Arg);.  }.}../*.
ac10: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 61 74  ** Return a stat
ac20: 69 63 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69  ic string contai
ac30: 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 63 6f  ning the name co
ac40: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
ac50: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  he error code.**
ac60: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
ac70: 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  e argument..*/.#
ac80: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
ac90: 45 5f 4e 45 45 44 5f 45 52 52 5f 4e 41 4d 45 29  E_NEED_ERR_NAME)
aca0: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
acb0: 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 20  ite3ErrName(int 
acc0: 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rc){.  const cha
acd0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
ace0: 69 6e 74 20 69 2c 20 6f 72 69 67 52 63 20 3d 20  int i, origRc = 
acf0: 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rc;.  for(i=0; i
ad00: 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20  <2 && zName==0; 
ad10: 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66 66 29  i++, rc &= 0xff)
ad20: 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 72 63  {.    switch( rc
ad30: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53   ){.      case S
ad40: 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20  QLITE_OK:       
ad50: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
ad60: 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20  = "SQLITE_OK";  
ad70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
ad80: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
ad90: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20  SQLITE_ERROR:   
ada0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
adb0: 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52   = "SQLITE_ERROR
adc0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
add0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ade0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 5f 53 4e   SQLITE_ERROR_SN
adf0: 41 50 53 48 4f 54 3a 20 20 20 20 20 7a 4e 61 6d  APSHOT:     zNam
ae00: 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f  e = "SQLITE_ERRO
ae10: 52 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20 20 20  R_SNAPSHOT";    
ae20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ae30: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  e SQLITE_INTERNA
ae40: 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  L:           zNa
ae50: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54  me = "SQLITE_INT
ae60: 45 52 4e 41 4c 22 3b 20 20 20 20 20 20 20 20 20  ERNAL";         
ae70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ae80: 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20  se SQLITE_PERM: 
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
aea0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45  ame = "SQLITE_PE
aeb0: 52 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  RM";            
aec0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
aed0: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
aee0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
aef0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41  Name = "SQLITE_A
af00: 42 4f 52 54 22 3b 20 20 20 20 20 20 20 20 20 20  BORT";          
af10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
af20: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
af30: 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20  T_ROLLBACK:     
af40: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
af50: 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b  ABORT_ROLLBACK";
af60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
af70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53   case SQLITE_BUS
af80: 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:              
af90: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
afa0: 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20 20 20  _BUSY";         
afb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
afc0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
afd0: 53 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 20 20  SY_RECOVERY:    
afe0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
aff0: 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 22  E_BUSY_RECOVERY"
b000: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
b010: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
b020: 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20  USY_SNAPSHOT:   
b030: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b040: 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54  TE_BUSY_SNAPSHOT
b050: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
b060: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b070: 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20  LOCKED:         
b080: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b090: 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20  ITE_LOCKED";    
b0a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b0b0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b0c0: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
b0d0: 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  CHE: zName = "SQ
b0e0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
b0f0: 45 44 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a  EDCACHE";break;.
b100: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b110: 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20  E_NOMEM:        
b120: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b130: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20  QLITE_NOMEM";   
b140: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b150: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b160: 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20  TE_READONLY:    
b170: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b180: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22  SQLITE_READONLY"
b190: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
b1a0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b1b0: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43  ITE_READONLY_REC
b1c0: 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20  OVERY:  zName = 
b1d0: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
b1e0: 5f 52 45 43 4f 56 45 52 59 22 3b 20 62 72 65 61  _RECOVERY"; brea
b1f0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b200: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41  LITE_READONLY_CA
b210: 4e 54 49 4e 49 54 3a 20 20 7a 4e 61 6d 65 20 3d  NTINIT:  zName =
b220: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
b230: 59 5f 43 41 4e 54 49 4e 49 54 22 3b 20 62 72 65  Y_CANTINIT"; bre
b240: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b250: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
b260: 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20  OLLBACK:  zName 
b270: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
b280: 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72  LY_ROLLBACK"; br
b290: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b2a0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
b2b0: 44 42 4d 4f 56 45 44 3a 20 20 20 7a 4e 61 6d 65  DBMOVED:   zName
b2c0: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
b2d0: 4e 4c 59 5f 44 42 4d 4f 56 45 44 22 3b 20 20 62  NLY_DBMOVED";  b
b2e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b2f0: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
b300: 5f 44 49 52 45 43 54 4f 52 59 3a 20 7a 4e 61 6d  _DIRECTORY: zNam
b310: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
b320: 4f 4e 4c 59 5f 44 49 52 45 43 54 4f 52 59 22 3b  ONLY_DIRECTORY";
b330: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b340: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  e SQLITE_INTERRU
b350: 50 54 3a 20 20 20 20 20 20 20 20 20 20 7a 4e 61  PT:          zNa
b360: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54  me = "SQLITE_INT
b370: 45 52 52 55 50 54 22 3b 20 20 20 20 20 20 20 20  ERRUPT";        
b380: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
b390: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a  se SQLITE_IOERR:
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
b3b0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
b3c0: 45 52 52 22 3b 20 20 20 20 20 20 20 20 20 20 20  ERR";           
b3d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b3e0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
b3f0: 5f 52 45 41 44 3a 20 20 20 20 20 20 20 20 20 7a  _READ:         z
b400: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
b410: 4f 45 52 52 5f 52 45 41 44 22 3b 20 20 20 20 20  OERR_READ";     
b420: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b430: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
b440: 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20 20 20  R_SHORT_READ:   
b450: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b460: 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
b470: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
b480: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
b490: 52 52 5f 57 52 49 54 45 3a 20 20 20 20 20 20 20  RR_WRITE:       
b4a0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
b4b0: 5f 49 4f 45 52 52 5f 57 52 49 54 45 22 3b 20 20  _IOERR_WRITE";  
b4c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b4d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
b4e0: 45 52 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 20  ERR_FSYNC:      
b4f0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
b500: 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20  E_IOERR_FSYNC"; 
b510: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b520: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
b530: 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20  OERR_DIR_FSYNC: 
b540: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b550: 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
b560: 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  NC";   break;.  
b570: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b580: 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3a 20  IOERR_TRUNCATE: 
b590: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b5a0: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
b5b0: 54 45 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  TE";    break;. 
b5c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b5d0: 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a 20 20 20  _IOERR_FSTAT:   
b5e0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b5f0: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
b600: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
b610: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b620: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20  E_IOERR_UNLOCK: 
b630: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b640: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
b650: 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  CK";      break;
b660: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b670: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a  TE_IOERR_RDLOCK:
b680: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b690: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
b6a0: 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b  OCK";      break
b6b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b6c0: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
b6d0: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
b6e0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  "SQLITE_IOERR_DE
b6f0: 4c 45 54 45 22 3b 20 20 20 20 20 20 62 72 65 61  LETE";      brea
b700: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b710: 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
b720: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
b730: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e   "SQLITE_IOERR_N
b740: 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65  OMEM";       bre
b750: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b760: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
b770: 53 53 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  SS:       zName 
b780: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b790: 41 43 43 45 53 53 22 3b 20 20 20 20 20 20 62 72  ACCESS";      br
b7a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b7b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
b7c0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a  CKRESERVEDLOCK:.
b7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7f0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
b800: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
b810: 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b  VEDLOCK"; break;
b820: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b830: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20  TE_IOERR_LOCK:  
b840: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b850: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
b860: 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  K";        break
b870: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b880: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a  ITE_IOERR_CLOSE:
b890: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b8a0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  "SQLITE_IOERR_CL
b8b0: 4f 53 45 22 3b 20 20 20 20 20 20 20 62 72 65 61  OSE";       brea
b8c0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b8d0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43  LITE_IOERR_DIR_C
b8e0: 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d  LOSE:    zName =
b8f0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44   "SQLITE_IOERR_D
b900: 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20 62 72 65  IR_CLOSE";   bre
b910: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b920: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
b930: 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  PEN:      zName 
b940: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
b950: 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20 20 62 72  SHMOPEN";     br
b960: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b970: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
b980: 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65  SIZE:      zName
b990: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
b9a0: 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20 20 20 62  _SHMSIZE";     b
b9b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b9c0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
b9d0: 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d  MLOCK:      zNam
b9e0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
b9f0: 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20  R_SHMLOCK";     
ba00: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
ba10: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
ba20: 48 4d 4d 41 50 3a 20 20 20 20 20 20 20 7a 4e 61  HMMAP:       zNa
ba30: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
ba40: 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20 20 20 20  RR_SHMMAP";     
ba50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ba60: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
ba70: 53 45 45 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e  SEEK:         zN
ba80: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
ba90: 45 52 52 5f 53 45 45 4b 22 3b 20 20 20 20 20 20  ERR_SEEK";      
baa0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bab0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
bac0: 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a  _DELETE_NOENT: z
bad0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
bae0: 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
baf0: 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  T";break;.      
bb00: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
bb10: 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20 20 20 20  R_MMAP:         
bb20: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
bb30: 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20 20 20 20  IOERR_MMAP";    
bb40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
bb50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
bb60: 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 3a 20  RR_GETTEMPPATH: 
bb70: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
bb80: 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
bb90: 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  TH"; break;.    
bba0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
bbb0: 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a 20 20 20  ERR_CONVPATH:   
bbc0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
bbd0: 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48  E_IOERR_CONVPATH
bbe0: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
bbf0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
bc00: 4f 45 52 52 5f 56 4e 4f 44 45 3a 20 20 20 20 20  OERR_VNODE:     
bc10: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
bc20: 54 45 5f 49 4f 45 52 52 5f 56 4e 4f 44 45 22 3b  TE_IOERR_VNODE";
bc30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bc40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
bc50: 43 4f 52 52 55 50 54 3a 20 20 20 20 20 20 20 20  CORRUPT:        
bc60: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
bc70: 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20 20  ITE_CORRUPT";   
bc80: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bc90: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
bca0: 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3a 20 20  _CORRUPT_VTAB:  
bcb0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
bcc0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
bcd0: 42 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  B";      break;.
bce0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
bcf0: 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20 20 20  E_NOTFOUND:     
bd00: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
bd10: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b  QLITE_NOTFOUND";
bd20: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
bd30: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
bd40: 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20 20 20  TE_FULL:        
bd50: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
bd60: 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20  SQLITE_FULL";   
bd70: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
bd80: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
bd90: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20 20 20  ITE_CANTOPEN:   
bda0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bdb0: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
bdc0: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
bdd0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
bde0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f  LITE_CANTOPEN_NO
bdf0: 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65 20 3d  TEMPDIR: zName =
be00: 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45   "SQLITE_CANTOPE
be10: 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62 72 65  N_NOTEMPDIR";bre
be20: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
be30: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
be40: 53 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d 65 20  SDIR:     zName 
be50: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
be60: 45 4e 5f 49 53 44 49 52 22 3b 20 20 20 20 62 72  EN_ISDIR";    br
be70: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
be80: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
be90: 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61 6d 65  FULLPATH:  zName
bea0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
beb0: 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b 20 62  PEN_FULLPATH"; b
bec0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
bed0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
bee0: 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e 61 6d  _CONVPATH:  zNam
bef0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
bf00: 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22 3b 20  OPEN_CONVPATH"; 
bf10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
bf20: 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  e SQLITE_PROTOCO
bf30: 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  L:           zNa
bf40: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 52 4f  me = "SQLITE_PRO
bf50: 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20 20 20  TOCOL";         
bf60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
bf70: 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3a  se SQLITE_EMPTY:
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
bf90: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 4d  ame = "SQLITE_EM
bfa0: 50 54 59 22 3b 20 20 20 20 20 20 20 20 20 20 20  PTY";           
bfb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
bfc0: 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48 45 4d  ase SQLITE_SCHEM
bfd0: 41 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  A:             z
bfe0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 53  Name = "SQLITE_S
bff0: 43 48 45 4d 41 22 3b 20 20 20 20 20 20 20 20 20  CHEMA";         
c000: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c010: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f 42  case SQLITE_TOOB
c020: 49 47 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  IG:             
c030: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c040: 54 4f 4f 42 49 47 22 3b 20 20 20 20 20 20 20 20  TOOBIG";        
c050: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c060: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
c070: 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20 20 20  STRAINT:        
c080: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c090: 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20 20 20  _CONSTRAINT";   
c0a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c0b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
c0c0: 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 3a  NSTRAINT_UNIQUE:
c0d0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c0e0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49  E_CONSTRAINT_UNI
c0f0: 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  QUE"; break;.   
c100: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
c110: 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45  ONSTRAINT_TRIGGE
c120: 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  R: zName = "SQLI
c130: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52  TE_CONSTRAINT_TR
c140: 49 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a 20 20  IGGER";break;.  
c150: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c160: 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
c170: 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20  GNKEY:.         
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c190: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
c1a0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
c1b0: 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b 20 20  T_FOREIGNKEY";  
c1c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c1d0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
c1e0: 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20 7a 4e  AINT_CHECK:   zN
c1f0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
c200: 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 22 3b  NSTRAINT_CHECK";
c210: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c220: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
c230: 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
c240: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c260: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c270: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49  E_CONSTRAINT_PRI
c280: 4d 41 52 59 4b 45 59 22 3b 20 20 20 62 72 65 61  MARYKEY";   brea
c290: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
c2a0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
c2b0: 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d  NOTNULL: zName =
c2c0: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
c2d0: 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65  INT_NOTNULL";bre
c2e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
c2f0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c300: 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20  _COMMITHOOK:.   
c310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c320: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
c330: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
c340: 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f  STRAINT_COMMITHO
c350: 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  OK";   break;.  
c360: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c370: 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 3a  CONSTRAINT_VTAB:
c380: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c390: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56  ITE_CONSTRAINT_V
c3a0: 54 41 42 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  TAB";   break;. 
c3b0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c3c0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43  _CONSTRAINT_FUNC
c3d0: 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20 20 20  TION:.          
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3f0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c400: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
c410: 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20 20 20  _FUNCTION";     
c420: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
c430: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
c440: 49 4e 54 5f 52 4f 57 49 44 3a 20 20 20 7a 4e 61  INT_ROWID:   zNa
c450: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
c460: 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 22 3b 20  STRAINT_ROWID"; 
c470: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
c480: 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  se SQLITE_MISMAT
c490: 43 48 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  CH:           zN
c4a0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49  ame = "SQLITE_MI
c4b0: 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20 20 20  SMATCH";        
c4c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
c4d0: 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  ase SQLITE_MISUS
c4e0: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  E:             z
c4f0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4d  Name = "SQLITE_M
c500: 49 53 55 53 45 22 3b 20 20 20 20 20 20 20 20 20  ISUSE";         
c510: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
c520: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  case SQLITE_NOLF
c530: 53 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S:              
c540: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
c550: 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20 20 20  NOLFS";         
c560: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c570: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55 54   case SQLITE_AUT
c580: 48 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H:              
c590: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
c5a0: 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20 20 20  _AUTH";         
c5b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c5c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4f    case SQLITE_FO
c5d0: 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20 20 20  RMAT:           
c5e0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
c5f0: 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20 20 20  E_FORMAT";      
c600: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c610: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
c620: 41 4e 47 45 3a 20 20 20 20 20 20 20 20 20 20 20  ANGE:           
c630: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
c640: 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20 20 20  TE_RANGE";      
c650: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c660: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c670: 4e 4f 54 41 44 42 3a 20 20 20 20 20 20 20 20 20  NOTADB:         
c680: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c690: 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20 20 20  ITE_NOTADB";    
c6a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c6b0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c6c0: 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 20 20 20  _ROW:           
c6d0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
c6e0: 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20 20 20  LITE_ROW";      
c6f0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
c700: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c710: 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20 20 20  E_NOTICE:       
c720: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c730: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b 20 20  QLITE_NOTICE";  
c740: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c750: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
c760: 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
c770: 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22  R_WAL: zName = "
c780: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
c790: 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65 61 6b  COVER_WAL";break
c7a0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
c7b0: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
c7c0: 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20  ER_ROLLBACK:.   
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
c7f0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54  me = "SQLITE_NOT
c800: 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c  ICE_RECOVER_ROLL
c810: 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20  BACK"; break;.  
c820: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
c830: 57 41 52 4e 49 4e 47 3a 20 20 20 20 20 20 20 20  WARNING:        
c840: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
c850: 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20 20 20  ITE_WARNING";   
c860: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
c870: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
c880: 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44  _WARNING_AUTOIND
c890: 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  EX:  zName = "SQ
c8a0: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54  LITE_WARNING_AUT
c8b0: 4f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  OINDEX"; break;.
c8c0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
c8d0: 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20 20 20  E_DONE:         
c8e0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
c8f0: 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20 20 20  QLITE_DONE";    
c900: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c910: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
c920: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
c930: 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 42 75   static char zBu
c940: 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  f[50];.    sqlit
c950: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
c960: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
c970: 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28  "SQLITE_UNKNOWN(
c980: 25 64 29 22 2c 20 6f 72 69 67 52 63 29 3b 0a 20  %d)", origRc);. 
c990: 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75 66 3b     zName = zBuf;
c9a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e  .  }.  return zN
c9b0: 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ame;.}.#endif../
c9c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
c9d0: 61 74 69 63 20 73 74 72 69 6e 67 20 74 68 61 74  atic string that
c9e0: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b   describes the k
c9f0: 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65  ind of error spe
ca00: 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  cified in the.**
ca10: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f   argument..*/.co
ca20: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
ca30: 33 45 72 72 53 74 72 28 69 6e 74 20 72 63 29 7b  3ErrStr(int rc){
ca40: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
ca50: 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d 73 67  char* const aMsg
ca60: 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20 53 51  [] = {.    /* SQ
ca70: 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20  LITE_OK         
ca80: 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72 72 6f   */ "not an erro
ca90: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
caa0: 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20 2a 2f  E_ERROR       */
cab0: 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72 72 6f   "SQL logic erro
cac0: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
cad0: 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f  E_INTERNAL    */
cae0: 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54   0,.    /* SQLIT
caf0: 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a 2f  E_PERM        */
cb00: 20 22 61 63 63 65 73 73 20 70 65 72 6d 69 73 73   "access permiss
cb10: 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20  ion denied",.   
cb20: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54   /* SQLITE_ABORT
cb30: 20 20 20 20 20 20 20 2a 2f 20 22 71 75 65 72 79         */ "query
cb40: 20 61 62 6f 72 74 65 64 22 2c 0a 20 20 20 20 2f   aborted",.    /
cb50: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20  * SQLITE_BUSY   
cb60: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
cb70: 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20  e is locked",.  
cb80: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b    /* SQLITE_LOCK
cb90: 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61  ED      */ "data
cba0: 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f  base table is lo
cbb0: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
cbc0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20  LITE_NOMEM      
cbd0: 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f   */ "out of memo
cbe0: 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ry",.    /* SQLI
cbf0: 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a  TE_READONLY    *
cc00: 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72  / "attempt to wr
cc10: 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64  ite a readonly d
cc20: 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a  atabase",.    /*
cc30: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
cc40: 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70  T   */ "interrup
cc50: 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ted",.    /* SQL
cc60: 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20  ITE_IOERR       
cc70: 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72  */ "disk I/O err
cc80: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
cc90: 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a  TE_CORRUPT     *
cca0: 2f 20 22 64 61 74 61 62 61 73 65 20 64 69 73 6b  / "database disk
ccb0: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
ccc0: 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  med",.    /* SQL
ccd0: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20  ITE_NOTFOUND    
cce0: 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72  */ "unknown oper
ccf0: 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53  ation",.    /* S
cd00: 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20  QLITE_FULL      
cd10: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f    */ "database o
cd20: 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c  r disk is full",
cd30: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
cd40: 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75  ANTOPEN    */ "u
cd50: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
cd60: 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20  tabase file",.  
cd70: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54    /* SQLITE_PROT
cd80: 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b  OCOL    */ "lock
cd90: 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20  ing protocol",. 
cda0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50     /* SQLITE_EMP
cdb0: 54 59 20 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20  TY       */ 0,. 
cdc0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48     /* SQLITE_SCH
cdd0: 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74  EMA      */ "dat
cde0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
cdf0: 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f   changed",.    /
ce00: 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20  * SQLITE_TOOBIG 
ce10: 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20       */ "string 
ce20: 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22  or blob too big"
ce30: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
ce40: 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22  CONSTRAINT  */ "
ce50: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
ce60: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
ce70: 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f  E_MISMATCH    */
ce80: 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61   "datatype misma
ce90: 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  tch",.    /* SQL
cea0: 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20  ITE_MISUSE      
ceb0: 2a 2f 20 22 62 61 64 20 70 61 72 61 6d 65 74 65  */ "bad paramete
cec0: 72 20 6f 72 20 6f 74 68 65 72 20 41 50 49 20 6d  r or other API m
ced0: 69 73 75 73 65 22 2c 0a 23 69 66 64 65 66 20 53  isuse",.#ifdef S
cee0: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
cef0: 53 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  S.    /* SQLITE_
cf00: 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 22  NOLFS       */ "
cf10: 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f  large file suppo
cf20: 72 74 20 69 73 20 64 69 73 61 62 6c 65 64 22 2c  rt is disabled",
cf30: 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 53 51  .#else.    /* SQ
cf40: 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20  LITE_NOLFS      
cf50: 20 2a 2f 20 30 2c 0a 23 65 6e 64 69 66 0a 20 20   */ 0,.#endif.  
cf60: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48    /* SQLITE_AUTH
cf70: 20 20 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68          */ "auth
cf80: 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64  orization denied
cf90: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
cfa0: 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20  _FORMAT      */ 
cfb0: 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  0,.    /* SQLITE
cfc0: 5f 52 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20  _RANGE       */ 
cfd0: 22 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75  "column index ou
cfe0: 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20 20  t of range",.   
cff0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44   /* SQLITE_NOTAD
d000: 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c 65 20  B      */ "file 
d010: 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73  is not a databas
d020: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
d030: 45 5f 4e 4f 54 49 43 45 20 20 20 20 20 20 2a 2f  E_NOTICE      */
d040: 20 22 6e 6f 74 69 66 69 63 61 74 69 6f 6e 20 6d   "notification m
d050: 65 73 73 61 67 65 22 2c 0a 20 20 20 20 2f 2a 20  essage",.    /* 
d060: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 20 20  SQLITE_WARNING  
d070: 20 20 20 2a 2f 20 22 77 61 72 6e 69 6e 67 20 6d     */ "warning m
d080: 65 73 73 61 67 65 22 2c 0a 20 20 7d 3b 0a 20 20  essage",.  };.  
d090: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
d0a0: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f   = "unknown erro
d0b0: 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63  r";.  switch( rc
d0c0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
d0d0: 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
d0e0: 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72  CK: {.      zErr
d0f0: 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74 6f   = "abort due to
d100: 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20   ROLLBACK";.    
d110: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d120: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
d130: 4f 57 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72  OW: {.      zErr
d140: 20 3d 20 22 61 6e 6f 74 68 65 72 20 72 6f 77 20   = "another row 
d150: 61 76 61 69 6c 61 62 6c 65 22 3b 0a 20 20 20 20  available";.    
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 44     case SQLITE_D
d180: 4f 4e 45 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ONE: {.      zEr
d190: 72 20 3d 20 22 6e 6f 20 6d 6f 72 65 20 72 6f 77  r = "no more row
d1a0: 73 20 61 76 61 69 6c 61 62 6c 65 22 3b 0a 20 20  s available";.  
d1b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d1c0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
d1d0: 20 20 20 20 20 20 72 63 20 26 3d 20 30 78 66 66        rc &= 0xff
d1e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  ;.      if( ALWA
d1f0: 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c  YS(rc>=0) && rc<
d200: 41 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29 20  ArraySize(aMsg) 
d210: 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29  && aMsg[rc]!=0 )
d220: 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d  {.        zErr =
d230: 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20   aMsg[rc];.     
d240: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
d250: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
d260: 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zErr;.}../*.*
d270: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
d280: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79  mplements a busy
d290: 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73   callback that s
d2a0: 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a  leeps and tries.
d2b0: 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61  ** again until a
d2c0: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69   timeout value i
d2d0: 73 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20  s reached.  The 
d2e0: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
d2f0: 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e  .** an integer n
d300: 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
d310: 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20  conds passed in 
d320: 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  as the first.** 
d330: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
d340: 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
d350: 74 6f 20 72 65 74 72 79 20 74 68 65 20 6c 6f 63  to retry the loc
d360: 6b 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20  k.  Return zero 
d370: 74 6f 20 73 74 6f 70 20 74 72 79 69 6e 67 0a 2a  to stop trying.*
d380: 2a 20 61 6e 64 20 63 61 75 73 65 20 53 51 4c 69  * and cause SQLi
d390: 74 65 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c  te to return SQL
d3a0: 49 54 45 5f 42 55 53 59 2e 0a 2a 2f 0a 73 74 61  ITE_BUSY..*/.sta
d3b0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65  tic int sqliteDe
d3c0: 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63  faultBusyCallbac
d3d0: 6b 28 0a 20 20 76 6f 69 64 20 2a 70 74 72 2c 20  k(.  void *ptr, 
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d3f0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
d400: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 63 6f  tion */.  int co
d410: 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  unt,            
d420: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d430: 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20  times table has 
d440: 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 73  been busy */.  s
d450: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
d460: 6c 65 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66  le      /* The f
d470: 69 6c 65 20 6f 6e 20 77 68 69 63 68 20 74 68 65  ile on which the
d480: 20 6c 6f 63 6b 20 6f 63 63 75 72 72 65 64 20 2a   lock occurred *
d490: 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  /.){.#if SQLITE_
d4a0: 4f 53 5f 57 49 4e 20 7c 7c 20 48 41 56 45 5f 55  OS_WIN || HAVE_U
d4b0: 53 4c 45 45 50 0a 20 20 2f 2a 20 54 68 69 73 20  SLEEP.  /* This 
d4c0: 63 61 73 65 20 69 73 20 66 6f 72 20 73 79 73 74  case is for syst
d4d0: 65 6d 73 20 74 68 61 74 20 68 61 76 65 20 73 75  ems that have su
d4e0: 70 70 6f 72 74 20 66 6f 72 20 73 6c 65 65 70 69  pport for sleepi
d4f0: 6e 67 20 66 6f 72 20 66 72 61 63 74 69 6f 6e 73  ng for fractions
d500: 20 6f 66 0a 20 20 2a 2a 20 61 20 73 65 63 6f 6e   of.  ** a secon
d510: 64 2e 20 20 45 78 61 6d 70 6c 65 73 3a 20 20 41  d.  Examples:  A
d520: 6c 6c 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65  ll windows syste
d530: 6d 73 2c 20 75 6e 69 78 20 73 79 73 74 65 6d 73  ms, unix systems
d540: 20 77 69 74 68 20 75 73 6c 65 65 70 28 29 20 2a   with usleep() *
d550: 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
d560: 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20   u8 delays[] =. 
d570: 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31      { 1, 2, 5, 1
d580: 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c 20 32  0, 15, 20, 25, 2
d590: 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20 35 30  5,  25,  50,  50
d5a0: 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61 74 69  , 100 };.  stati
d5b0: 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c  c const u8 total
d5c0: 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20  s[] =.     { 0, 
d5d0: 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20 33 33  1, 3,  8, 18, 33
d5e0: 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c 20 31  , 53, 78, 103, 1
d5f0: 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a  28, 178, 228 };.
d600: 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41 59 20  # define NDELAY 
d610: 41 72 72 61 79 53 69 7a 65 28 64 65 6c 61 79 73  ArraySize(delays
d620: 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ).  sqlite3 *db 
d630: 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72  = (sqlite3 *)ptr
d640: 3b 0a 20 20 69 6e 74 20 74 6d 6f 75 74 20 3d 20  ;.  int tmout = 
d650: 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b  db->busyTimeout;
d660: 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72  .  int delay, pr
d670: 69 6f 72 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ior;..#ifdef SQL
d680: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b  ITE_ENABLE_SETLK
d690: 5f 54 49 4d 45 4f 55 54 0a 20 20 69 66 28 20 73  _TIMEOUT.  if( s
d6a0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
d6b0: 72 6f 6c 28 70 46 69 6c 65 2c 53 51 4c 49 54 45  rol(pFile,SQLITE
d6c0: 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 5f 54 49 4d 45  _FCNTL_LOCK_TIME
d6d0: 4f 55 54 2c 26 74 6d 6f 75 74 29 3d 3d 53 51 4c  OUT,&tmout)==SQL
d6e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
d6f0: 28 20 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  ( count ){.     
d700: 20 74 6d 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20   tmout = 0;.    
d710: 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43    sqlite3OsFileC
d720: 6f 6e 74 72 6f 6c 28 70 46 69 6c 65 2c 20 53 51  ontrol(pFile, SQ
d730: 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 5f  LITE_FCNTL_LOCK_
d740: 54 49 4d 45 4f 55 54 2c 20 26 74 6d 6f 75 74 29  TIMEOUT, &tmout)
d750: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
d760: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d770: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
d780: 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55   }.  }.#else.  U
d790: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
d7a0: 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20  pFile);.#endif. 
d7b0: 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d   assert( count>=
d7c0: 30 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74  0 );.  if( count
d7d0: 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20   < NDELAY ){.   
d7e0: 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b   delay = delays[
d7f0: 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f  count];.    prio
d800: 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74  r = totals[count
d810: 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
d820: 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e  delay = delays[N
d830: 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72  DELAY-1];.    pr
d840: 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45  ior = totals[NDE
d850: 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28  LAY-1] + delay*(
d860: 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29  count-(NDELAY-1)
d870: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69  );.  }.  if( pri
d880: 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 6d 6f  or + delay > tmo
d890: 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20  ut ){.    delay 
d8a0: 3d 20 74 6d 6f 75 74 20 2d 20 70 72 69 6f 72 3b  = tmout - prior;
d8b0: 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d  .    if( delay<=
d8c0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
d8d0: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
d8e0: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c  ep(db->pVfs, del
d8f0: 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75  ay*1000);.  retu
d900: 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a  rn 1;.#else.  /*
d910: 20 54 68 69 73 20 63 61 73 65 20 66 6f 72 20 75   This case for u
d920: 6e 69 78 20 73 79 73 74 65 6d 73 20 74 68 61 74  nix systems that
d930: 20 6c 61 63 6b 20 75 73 6c 65 65 70 28 29 20 73   lack usleep() s
d940: 75 70 70 6f 72 74 2e 20 20 53 6c 65 65 70 69 6e  upport.  Sleepin
d950: 67 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 64  g.  ** must be d
d960: 6f 6e 65 20 69 6e 20 69 6e 63 72 65 6d 65 6e 74  one in increment
d970: 73 20 6f 66 20 77 68 6f 6c 65 20 73 65 63 6f 6e  s of whole secon
d980: 64 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ds */.  sqlite3 
d990: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
d9a0: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 6d 6f 75  )ptr;.  int tmou
d9b0: 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29  t = ((sqlite3 *)
d9c0: 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75  ptr)->busyTimeou
d9d0: 74 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  t;.  UNUSED_PARA
d9e0: 4d 45 54 45 52 28 70 46 69 6c 65 29 3b 0a 20 20  METER(pFile);.  
d9f0: 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30  if( (count+1)*10
da00: 30 30 20 3e 20 74 6d 6f 75 74 20 29 7b 0a 20 20  00 > tmout ){.  
da10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
da20: 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70    sqlite3OsSleep
da30: 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30  (db->pVfs, 10000
da40: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  00);.  return 1;
da50: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
da60: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
da70: 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a  n busy handler..
da80: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
da90: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
daa0: 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66  n an operation f
dab0: 61 69 6c 65 64 20 74 6f 20 61 63 71 75 69 72 65  ailed to acquire
dac0: 20 61 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 56 46   a.** lock on VF
dad0: 53 20 66 69 6c 65 20 70 46 69 6c 65 2e 0a 2a 2a  S file pFile..**
dae0: 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74  .** If this rout
daf0: 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  ine returns non-
db00: 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69  zero, the lock i
db10: 73 20 72 65 74 72 69 65 64 2e 20 20 49 66 20 69  s retried.  If i
db20: 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c 20  t.** returns 0, 
db30: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 62  the operation ab
db40: 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53 51 4c  orts with an SQL
db50: 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a  ITE_BUSY error..
db60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
db70: 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
db80: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 2c 20  BusyHandler *p, 
db90: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
dba0: 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ile){.  int rc;.
dbb0: 20 20 69 66 28 20 70 2d 3e 78 42 75 73 79 48 61    if( p->xBusyHa
dbc0: 6e 64 6c 65 72 3d 3d 30 20 7c 7c 20 70 2d 3e 6e  ndler==0 || p->n
dbd0: 42 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20  Busy<0 ) return 
dbe0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 62 45 78 74  0;.  if( p->bExt
dbf0: 72 61 46 69 6c 65 41 72 67 20 29 7b 0a 20 20 20  raFileArg ){.   
dc00: 20 2f 2a 20 41 64 64 20 61 6e 20 65 78 74 72 61   /* Add an extra
dc10: 20 70 61 72 61 6d 65 74 65 72 20 77 69 74 68 20   parameter with 
dc20: 74 68 65 20 70 46 69 6c 65 20 70 6f 69 6e 74 65  the pFile pointe
dc30: 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
dc40: 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 62  the.    ** callb
dc50: 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 6c 69 73  ack argument lis
dc60: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28 2a 78  t */.    int (*x
dc70: 54 72 61 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 73  Tra)(void*,int,s
dc80: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 20  qlite3_file*);. 
dc90: 20 20 20 78 54 72 61 20 3d 20 28 69 6e 74 28 2a     xTra = (int(*
dca0: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 73 71 6c 69  )(void*,int,sqli
dcb0: 74 65 33 5f 66 69 6c 65 2a 29 29 70 2d 3e 78 42  te3_file*))p->xB
dcc0: 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20  usyHandler;.    
dcd0: 72 63 20 3d 20 78 54 72 61 28 70 2d 3e 70 42 75  rc = xTra(p->pBu
dce0: 73 79 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 2c  syArg, p->nBusy,
dcf0: 20 70 46 69 6c 65 29 3b 0a 20 20 7d 65 6c 73 65   pFile);.  }else
dd00: 7b 0a 20 20 20 20 2f 2a 20 4c 65 67 61 63 79 20  {.    /* Legacy 
dd10: 73 74 79 6c 65 20 62 75 73 79 20 68 61 6e 64 6c  style busy handl
dd20: 65 72 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20  er callback */. 
dd30: 20 20 20 72 63 20 3d 20 70 2d 3e 78 42 75 73 79     rc = p->xBusy
dd40: 48 61 6e 64 6c 65 72 28 70 2d 3e 70 42 75 73 79  Handler(p->pBusy
dd50: 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a  Arg, p->nBusy);.
dd60: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20    }.  if( rc==0 
dd70: 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 20  ){.    p->nBusy 
dd80: 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
dd90: 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20     p->nBusy++;. 
dda0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20   }.  return rc; 
ddb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
ddc0: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
ddd0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f  busy callback fo
dde0: 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61  r an Sqlite data
ddf0: 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67  base to the.** g
de00: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75  iven callback fu
de10: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
de20: 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  given argument..
de30: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  */.int sqlite3_b
de40: 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73  usy_handler(.  s
de50: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e  qlite3 *db,.  in
de60: 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a  t (*xBusy)(void*
de70: 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
de80: 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51  Arg.){.#ifdef SQ
de90: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
dea0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
deb0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
dec0: 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
ded0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
dee0: 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  T;.#endif.  sqli
def0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
df00: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
df10: 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 42  ->busyHandler.xB
df20: 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78 42 75  usyHandler = xBu
df30: 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  sy;.  db->busyHa
df40: 6e 64 6c 65 72 2e 70 42 75 73 79 41 72 67 20 3d  ndler.pBusyArg =
df50: 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73   pArg;.  db->bus
df60: 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d  yHandler.nBusy =
df70: 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61   0;.  db->busyHa
df80: 6e 64 6c 65 72 2e 62 45 78 74 72 61 46 69 6c 65  ndler.bExtraFile
df90: 41 72 67 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62  Arg = 0;.  db->b
dfa0: 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a  usyTimeout = 0;.
dfb0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
dfc0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
dfd0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
dfe0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
dff0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
e000: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f  GRESS_CALLBACK./
e010: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e020: 65 20 73 65 74 73 20 74 68 65 20 70 72 6f 67 72  e sets the progr
e030: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ess callback for
e040: 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62   an Sqlite datab
e050: 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69  ase to the.** gi
e060: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ven callback fun
e070: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
e080: 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  iven argument. T
e090: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
e0a0: 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  back will.** be 
e0b0: 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f  invoked every nO
e0c0: 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76  ps opcodes..*/.v
e0d0: 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67  oid sqlite3_prog
e0e0: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20  ress_handler(.  
e0f0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
e100: 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20  int nOps,.  int 
e110: 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69  (*xProgress)(voi
e120: 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41  d*), .  void *pA
e130: 72 67 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  rg.){.#ifdef SQL
e140: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
e150: 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
e160: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
e170: 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
e180: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
e190: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
e1a0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
e1b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
e1c0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
e1d0: 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20   if( nOps>0 ){. 
e1e0: 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73     db->xProgress
e1f0: 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20   = xProgress;.  
e200: 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f    db->nProgressO
e210: 70 73 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 6e  ps = (unsigned)n
e220: 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72  Ops;.    db->pPr
e230: 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41 72 67  ogressArg = pArg
e240: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
e250: 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30  b->xProgress = 0
e260: 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72  ;.    db->nProgr
e270: 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20  essOps = 0;.    
e280: 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67  db->pProgressArg
e290: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
e2a0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
e2b0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65  db->mutex);.}.#e
e2c0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ndif.../*.** Thi
e2d0: 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c  s routine instal
e2e0: 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62 75 73  ls a default bus
e2f0: 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77  y handler that w
e300: 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20  aits for the.** 
e310: 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72  specified number
e320: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
e330: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
e340: 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  g 0..*/.int sqli
e350: 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
e360: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
e370: 74 20 6d 73 29 7b 0a 23 69 66 64 65 66 20 53 51  t ms){.#ifdef SQ
e380: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
e390: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
e3a0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
e3b0: 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
e3c0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
e3d0: 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  T;.#endif.  if( 
e3e0: 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ms>0 ){.    sqli
e3f0: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
e400: 28 64 62 2c 20 28 69 6e 74 28 2a 29 28 76 6f 69  (db, (int(*)(voi
e410: 64 2a 2c 69 6e 74 29 29 73 71 6c 69 74 65 44 65  d*,int))sqliteDe
e420: 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63  faultBusyCallbac
e430: 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k,.             
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e450: 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20 20 20  (void*)db);.    
e460: 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20  db->busyTimeout 
e470: 3d 20 6d 73 3b 0a 20 20 20 20 64 62 2d 3e 62 75  = ms;.    db->bu
e480: 73 79 48 61 6e 64 6c 65 72 2e 62 45 78 74 72 61  syHandler.bExtra
e490: 46 69 6c 65 41 72 67 20 3d 20 31 3b 0a 20 20 7d  FileArg = 1;.  }
e4a0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
e4b0: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64  3_busy_handler(d
e4c0: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  b, 0, 0);.  }.  
e4d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e4e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65  ;.}../*.** Cause
e4f0: 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70 65   any pending ope
e500: 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61  ration to stop a
e510: 74 20 69 74 73 20 65 61 72 6c 69 65 73 74 20 6f  t its earliest o
e520: 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76  pportunity..*/.v
e530: 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  oid sqlite3_inte
e540: 72 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a 64  rrupt(sqlite3 *d
e550: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
e560: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
e570: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
e580: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
e590: 62 29 20 26 26 20 28 64 62 3d 3d 30 20 7c 7c 20  b) && (db==0 || 
e5a0: 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54  db->magic!=SQLIT
e5b0: 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 29 20  E_MAGIC_ZOMBIE) 
e5c0: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
e5d0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
e5e0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
e5f0: 0a 23 65 6e 64 69 66 0a 20 20 64 62 2d 3e 75 31  .#endif.  db->u1
e600: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d  .isInterrupted =
e610: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   1;.}.../*.** Th
e620: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  is function is e
e630: 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
e640: 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  as sqlite3_creat
e650: 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78  e_function(), ex
e660: 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20  cept.** that it 
e670: 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62  is designed to b
e680: 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65  e called by inte
e690: 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64  rnal code. The d
e6a0: 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20  ifference is.** 
e6b0: 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63  that if a malloc
e6c0: 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69  () fails in sqli
e6d0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
e6e0: 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20  ion(), an error 
e6f0: 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72  code.** is retur
e700: 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c  ned and the mall
e710: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c  ocFailed flag cl
e720: 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73  eared. .*/.int s
e730: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
e740: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
e750: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e760: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20  FunctionName,.  
e770: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
e780: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73  enc,.  void *pUs
e790: 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28  erData,.  void (
e7a0: 2a 78 53 46 75 6e 63 29 28 73 71 6c 69 74 65 33  *xSFunc)(sqlite3
e7b0: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
e7c0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
e7d0: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
e7e0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e7f0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
e800: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
e810: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
e820: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76  3_context*),.  v
e830: 6f 69 64 20 28 2a 78 56 61 6c 75 65 29 28 73 71  oid (*xValue)(sq
e840: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c  lite3_context*),
e850: 0a 20 20 76 6f 69 64 20 28 2a 78 49 6e 76 65 72  .  void (*xInver
e860: 73 65 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  se)(sqlite3_cont
e870: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
e880: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 46 75  _value **),.  Fu
e890: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44  ncDestructor *pD
e8a0: 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46  estructor.){.  F
e8b0: 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74  uncDef *p;.  int
e8c0: 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65 78   nName;.  int ex
e8d0: 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73 73  traFlags;..  ass
e8e0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e8f0: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
e900: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
e910: 78 56 61 6c 75 65 3d 3d 30 20 7c 7c 20 78 53 46  xValue==0 || xSF
e920: 75 6e 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  unc==0 );.  if( 
e930: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30  zFunctionName==0
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e950: 2f 2a 20 4d 75 73 74 20 68 61 76 65 20 61 20 76  /* Must have a v
e960: 61 6c 69 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  alid name */.   
e970: 7c 7c 20 28 78 53 46 75 6e 63 21 3d 30 20 26 26  || (xSFunc!=0 &&
e980: 20 78 46 69 6e 61 6c 21 3d 30 29 20 20 20 20 20   xFinal!=0)     
e990: 20 20 20 2f 2a 20 4e 6f 74 20 62 6f 74 68 20 78     /* Not both x
e9a0: 53 46 75 6e 63 20 61 6e 64 20 78 46 69 6e 61 6c  SFunc and xFinal
e9b0: 20 2a 2f 0a 20 20 20 7c 7c 20 28 28 78 46 69 6e   */.   || ((xFin
e9c0: 61 6c 3d 3d 30 29 21 3d 28 78 53 74 65 70 3d 3d  al==0)!=(xStep==
e9d0: 30 29 29 20 20 20 20 20 20 20 2f 2a 20 42 6f 74  0))       /* Bot
e9e0: 68 20 6f 72 20 6e 65 69 74 68 65 72 20 6f 66 20  h or neither of 
e9f0: 78 46 69 6e 61 6c 20 61 6e 64 20 78 53 74 65 70  xFinal and xStep
ea00: 20 2a 2f 0a 20 20 20 7c 7c 20 28 28 78 56 61 6c   */.   || ((xVal
ea10: 75 65 3d 3d 30 29 21 3d 28 78 49 6e 76 65 72 73  ue==0)!=(xInvers
ea20: 65 3d 3d 30 29 29 20 20 20 20 2f 2a 20 42 6f 74  e==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 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73 65  xValue, xInverse
ea50: 20 2a 2f 0a 20 20 20 7c 7c 20 28 6e 41 72 67 3c   */.   || (nArg<
ea60: 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54  -1 || nArg>SQLIT
ea70: 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
ea80: 52 47 29 0a 20 20 20 7c 7c 20 28 32 35 35 3c 28  RG).   || (255<(
ea90: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
eaa0: 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74 69  trlen30( zFuncti
eab0: 6f 6e 4e 61 6d 65 29 29 29 0a 20 20 29 7b 0a 20  onName))).  ){. 
eac0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ead0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
eae0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  }..  assert( SQL
eaf0: 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e  ITE_FUNC_CONSTAN
eb00: 54 3d 3d 53 51 4c 49 54 45 5f 44 45 54 45 52 4d  T==SQLITE_DETERM
eb10: 49 4e 49 53 54 49 43 20 29 3b 0a 20 20 65 78 74  INISTIC );.  ext
eb20: 72 61 46 6c 61 67 73 20 3d 20 65 6e 63 20 26 20  raFlags = enc & 
eb30: 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
eb40: 49 53 54 49 43 3b 0a 20 20 65 6e 63 20 26 3d 20  ISTIC;.  enc &= 
eb50: 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43  (SQLITE_FUNC_ENC
eb60: 4d 41 53 4b 7c 53 51 4c 49 54 45 5f 41 4e 59 29  MASK|SQLITE_ANY)
eb70: 3b 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.  .#ifndef SQL
eb80: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
eb90: 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54   /* If SQLITE_UT
eba0: 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64  F16 is specified
ebb0: 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
ebc0: 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d   type, transform
ebd0: 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e   this.  ** to on
ebe0: 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31  e of SQLITE_UTF1
ebf0: 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54  6LE or SQLITE_UT
ec00: 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a  F16BE using the.
ec10: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31    ** SQLITE_UTF1
ec20: 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53  6NATIVE macro. S
ec30: 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e  QLITE_UTF16 is n
ec40: 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  ot used internal
ec50: 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ly..  **.  ** If
ec60: 20 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20 73   SQLITE_ANY is s
ec70: 70 65 63 69 66 69 65 64 2c 20 61 64 64 20 74 68  pecified, add th
ec80: 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ree versions of 
ec90: 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  the function.  *
eca0: 2a 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61  * to the hash ta
ecb0: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
ecc0: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
ecd0: 36 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53  6 ){.    enc = S
ece0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
ecf0: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65  E;.  }else if( e
ed00: 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29  nc==SQLITE_ANY )
ed10: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
ed20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
ed30: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
ed40: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67  nctionName, nArg
ed50: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 65 78  , SQLITE_UTF8|ex
ed60: 74 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20  traFlags,.      
ed70: 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 53     pUserData, xS
ed80: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
ed90: 6e 61 6c 2c 20 78 56 61 6c 75 65 2c 20 78 49 6e  nal, xValue, xIn
eda0: 76 65 72 73 65 2c 20 70 44 65 73 74 72 75 63 74  verse, pDestruct
edb0: 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  or);.    if( rc=
edc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
edd0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ede0: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
edf0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41  FunctionName, nA
ee00: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  rg, SQLITE_UTF16
ee10: 4c 45 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20  LE|extraFlags,. 
ee20: 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61           pUserDa
ee30: 74 61 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65  ta, xSFunc, xSte
ee40: 70 2c 20 78 46 69 6e 61 6c 2c 20 78 56 61 6c 75  p, xFinal, xValu
ee50: 65 2c 20 78 49 6e 76 65 72 73 65 2c 20 70 44 65  e, xInverse, pDe
ee60: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d  structor);.    }
ee70: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
ee80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ee90: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
eea0: 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  .    enc = SQLIT
eeb0: 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23  E_UTF16BE;.  }.#
eec0: 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c  else.  enc = SQL
eed0: 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66  ITE_UTF8;.#endif
eee0: 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
eef0: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75  f an existing fu
ef00: 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
ef10: 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65  overridden or de
ef20: 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20  leted. If so,.  
ef30: 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
ef40: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65   active VMs, the
ef50: 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
ef60: 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74  BUSY. If a funct
ef70: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e  ion.  ** is bein
ef80: 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c  g overridden/del
ef90: 65 74 65 64 20 62 75 74 20 74 68 65 72 65 20 61  eted but there a
efa0: 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
efb0: 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a  , allow the.  **
efc0: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f   operation to co
efd0: 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c  ntinue but inval
efe0: 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d  idate all precom
eff0: 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
f000: 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ..  */.  p = sql
f010: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
f020: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
f030: 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e  me, nArg, (u8)en
f040: 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26  c, 0);.  if( p &
f050: 26 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20  & (p->funcFlags 
f060: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e  & SQLITE_FUNC_EN
f070: 43 4d 41 53 4b 29 3d 3d 28 75 33 32 29 65 6e 63  CMASK)==(u32)enc
f080: 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72   && p->nArg==nAr
f090: 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  g ){.    if( db-
f0a0: 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a  >nVdbeActive ){.
f0b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
f0c0: 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
f0d0: 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20  LITE_BUSY, .    
f0e0: 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64      "unable to d
f0f0: 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73 65  elete/modify use
f100: 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20 74  r-function due t
f110: 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  o active stateme
f120: 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73 73  nts");.      ass
f130: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
f140: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
f150: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
f160: 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  SY;.    }else{. 
f170: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69       sqlite3Expi
f180: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
f190: 65 6e 74 73 28 64 62 2c 20 30 29 3b 0a 20 20 20  ents(db, 0);.   
f1a0: 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71   }.  }..  p = sq
f1b0: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
f1c0: 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  n(db, zFunctionN
f1d0: 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65  ame, nArg, (u8)e
f1e0: 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74  nc, 1);.  assert
f1f0: 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  (p || db->malloc
f200: 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28 20 21  Failed);.  if( !
f210: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
f220: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
f230: 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  T;.  }..  /* If 
f240: 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  an older version
f250: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
f260: 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75 72   with a configur
f270: 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  ed destructor is
f280: 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c  .  ** being repl
f290: 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65 20  aced invoke the 
f2a0: 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74  destructor funct
f2b0: 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66  ion here. */.  f
f2c0: 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64  unctionDestroy(d
f2d0: 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70 44  b, p);..  if( pD
f2e0: 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
f2f0: 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52   pDestructor->nR
f300: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 75  ef++;.  }.  p->u
f310: 2e 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70  .pDestructor = p
f320: 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d  Destructor;.  p-
f330: 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70 2d  >funcFlags = (p-
f340: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
f350: 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b  ITE_FUNC_ENCMASK
f360: 29 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b 0a  ) | extraFlags;.
f370: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
f380: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
f390: 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20  E_DETERMINISTIC 
f3a0: 29 3b 0a 20 20 70 2d 3e 78 53 46 75 6e 63 20 3d  );.  p->xSFunc =
f3b0: 20 78 53 46 75 6e 63 20 3f 20 78 53 46 75 6e 63   xSFunc ? xSFunc
f3c0: 20 3a 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78   : xStep;.  p->x
f3d0: 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61  Finalize = xFina
f3e0: 6c 3b 0a 20 20 70 2d 3e 78 56 61 6c 75 65 20 3d  l;.  p->xValue =
f3f0: 20 78 56 61 6c 75 65 3b 0a 20 20 70 2d 3e 78 49   xValue;.  p->xI
f400: 6e 76 65 72 73 65 20 3d 20 78 49 6e 76 65 72 73  nverse = xInvers
f410: 65 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74  e;.  p->pUserDat
f420: 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20  a = pUserData;. 
f430: 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29   p->nArg = (u16)
f440: 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53  nArg;.  return S
f450: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
f460: 2a 2a 20 57 6f 72 6b 65 72 20 66 75 6e 63 74 69  ** Worker functi
f470: 6f 6e 20 75 73 65 64 20 62 79 20 75 74 66 2d 38  on used by utf-8
f480: 20 41 50 49 73 20 74 68 61 74 20 63 72 65 61 74   APIs that creat
f490: 65 20 6e 65 77 20 66 75 6e 63 74 69 6f 6e 73 3a  e new functions:
f4a0: 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  .**.**    sqlite
f4b0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
f4c0: 6e 28 29 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  n().**    sqlite
f4d0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
f4e0: 6e 5f 76 32 28 29 0a 2a 2a 20 20 20 20 73 71 6c  n_v2().**    sql
f4f0: 69 74 65 33 5f 63 72 65 61 74 65 5f 77 69 6e 64  ite3_create_wind
f500: 6f 77 5f 66 75 6e 63 74 69 6f 6e 28 29 0a 2a 2f  ow_function().*/
f510: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61  .static int crea
f520: 74 65 46 75 6e 63 74 69 6f 6e 41 70 69 28 0a 20  teFunctionApi(. 
f530: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
f540: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
f550: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
f560: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
f570: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53   *p,.  void (*xS
f580: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
f590: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
f5a0: 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76  e3_value**),.  v
f5b0: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
f5c0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
f5d0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
f5e0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
f5f0: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
f600: 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28  text*),.  void (
f610: 2a 78 56 61 6c 75 65 29 28 73 71 6c 69 74 65 33  *xValue)(sqlite3
f620: 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f  _context*),.  vo
f630: 69 64 20 28 2a 78 49 6e 76 65 72 73 65 29 28 73  id (*xInverse)(s
f640: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
f650: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
f660: 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44  e**),.  void(*xD
f670: 65 73 74 72 6f 79 29 28 76 6f 69 64 2a 29 0a 29  estroy)(void*).)
f680: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
f690: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e  ITE_ERROR;.  Fun
f6a0: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72  cDestructor *pAr
f6b0: 67 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53  g = 0;..#ifdef S
f6c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
f6d0: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
f6e0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
f6f0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
f700: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
f710: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e  SE_BKPT;.  }.#en
f720: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
f730: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
f740: 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65 73  tex);.  if( xDes
f750: 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72 67  troy ){.    pArg
f760: 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63 74   = (FuncDestruct
f770: 6f 72 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  or *)sqlite3Mall
f780: 6f 63 28 73 69 7a 65 6f 66 28 46 75 6e 63 44 65  oc(sizeof(FuncDe
f790: 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20  structor));.    
f7a0: 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20  if( !pArg ){.   
f7b0: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
f7c0: 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 20 78 44  lt(db);.      xD
f7d0: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20  estroy(p);.     
f7e0: 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d   goto out;.    }
f7f0: 0a 20 20 20 20 70 41 72 67 2d 3e 6e 52 65 66 20  .    pArg->nRef 
f800: 3d 20 30 3b 0a 20 20 20 20 70 41 72 67 2d 3e 78  = 0;.    pArg->x
f810: 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72  Destroy = xDestr
f820: 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55  oy;.    pArg->pU
f830: 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d  serData = p;.  }
f840: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43  .  rc = sqlite3C
f850: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
f860: 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20  unc, nArg, enc, 
f870: 70 2c 20 0a 20 20 20 20 20 20 78 53 46 75 6e 63  p, .      xSFunc
f880: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  , xStep, xFinal,
f890: 20 78 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73   xValue, xInvers
f8a0: 65 2c 20 70 41 72 67 0a 20 20 29 3b 0a 20 20 69  e, pArg.  );.  i
f8b0: 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
f8c0: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
f8d0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
f8e0: 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65  TE_OK );.    xDe
f8f0: 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71  stroy(p);.    sq
f900: 6c 69 74 65 33 5f 66 72 65 65 28 70 41 72 67 29  lite3_free(pArg)
f910: 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72  ;.  }.. out:.  r
f920: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
f930: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
f940: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
f950: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
f960: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
f970: 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75  .** Create new u
f980: 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ser functions..*
f990: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
f9a0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
f9b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
f9c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
f9d0: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
f9e0: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
f9f0: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53   *p,.  void (*xS
fa00: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
fa10: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
fa20: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
fa30: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
fa40: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
fa50: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
fa60: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
fa70: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
fa80: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65  ontext*).){.  re
fa90: 74 75 72 6e 20 63 72 65 61 74 65 46 75 6e 63 74  turn createFunct
faa0: 69 6f 6e 41 70 69 28 64 62 2c 20 7a 46 75 6e 63  ionApi(db, zFunc
fab0: 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20  , nArg, enc, p, 
fac0: 78 53 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20  xSFunc, xStep,. 
fad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faf0: 20 20 20 78 46 69 6e 61 6c 2c 20 30 2c 20 30 2c     xFinal, 0, 0,
fb00: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
fb10: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
fb20: 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  on_v2(.  sqlite3
fb30: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
fb40: 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74  ar *zFunc,.  int
fb50: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
fb60: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
fb70: 6f 69 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71  oid (*xSFunc)(sq
fb80: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
fb90: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
fba0: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
fbb0: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
fbc0: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
fbd0: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
fbe0: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
fbf0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
fc00: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  ,.  void (*xDest
fc10: 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a  roy)(void *).){.
fc20: 20 20 72 65 74 75 72 6e 20 63 72 65 61 74 65 46    return createF
fc30: 75 6e 63 74 69 6f 6e 41 70 69 28 64 62 2c 20 7a  unctionApi(db, z
fc40: 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Func, nArg, enc,
fc50: 20 70 2c 20 78 53 46 75 6e 63 2c 20 78 53 74 65   p, xSFunc, xSte
fc60: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc80: 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 30         xFinal, 0
fc90: 2c 20 30 2c 20 78 44 65 73 74 72 6f 79 29 3b 0a  , 0, xDestroy);.
fca0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  }.int sqlite3_cr
fcb0: 65 61 74 65 5f 77 69 6e 64 6f 77 5f 66 75 6e 63  eate_window_func
fcc0: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  tion(.  sqlite3 
fcd0: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
fce0: 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20  r *zFunc,.  int 
fcf0: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  nArg,.  int enc,
fd00: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
fd10: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
fd20: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
fd30: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
fd40: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
fd50: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
fd60: 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28  text*),.  void (
fd70: 2a 78 56 61 6c 75 65 29 28 73 71 6c 69 74 65 33  *xValue)(sqlite3
fd80: 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f  _context*),.  vo
fd90: 69 64 20 28 2a 78 49 6e 76 65 72 73 65 29 28 73  id (*xInverse)(s
fda0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
fdb0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
fdc0: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
fdd0: 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a  xDestroy)(void *
fde0: 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 72  ).){.  return cr
fdf0: 65 61 74 65 46 75 6e 63 74 69 6f 6e 41 70 69 28  eateFunctionApi(
fe00: 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c  db, zFunc, nArg,
fe10: 20 65 6e 63 2c 20 70 2c 20 30 2c 20 78 53 74 65   enc, p, 0, xSte
fe20: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
fe30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe40: 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c 20 78         xFinal, x
fe50: 56 61 6c 75 65 2c 20 78 49 6e 76 65 72 73 65 2c  Value, xInverse,
fe60: 20 78 44 65 73 74 72 6f 79 29 3b 0a 7d 0a 0a 23   xDestroy);.}..#
fe70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fe80: 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71 6c  IT_UTF16.int sql
fe90: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
fea0: 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65  tion16(.  sqlite
feb0: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76  3 *db,.  const v
fec0: 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61  oid *zFunctionNa
fed0: 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  me,.  int nArg,.
fee0: 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a    int eTextRep,.
fef0: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
ff00: 64 20 28 2a 78 53 46 75 6e 63 29 28 73 71 6c 69  d (*xSFunc)(sqli
ff10: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
ff20: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
ff30: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
ff40: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
ff50: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
ff60: 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64  value**),.  void
ff70: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
ff80: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a  e3_context*).){.
ff90: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
ffa0: 20 2a 7a 46 75 6e 63 38 3b 0a 0a 23 69 66 64 65   *zFunc8;..#ifde
ffb0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ffc0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
ffd0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
ffe0: 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 46 75  eckOk(db) || zFu
fff0: 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 29 20  nctionName==0 ) 
10000 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
10010 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
10020 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
10030 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
10040 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
10050 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
10060 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73 71  );.  zFunc8 = sq
10070 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62  lite3Utf16to8(db
10080 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
10090 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31   -1, SQLITE_UTF1
100a0 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20 3d  6NATIVE);.  rc =
100b0 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
100c0 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e  nc(db, zFunc8, n
100d0 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70  Arg, eTextRep, p
100e0 2c 20 78 53 46 75 6e 63 2c 78 53 74 65 70 2c 78  , xSFunc,xStep,x
100f0 46 69 6e 61 6c 2c 30 2c 30 2c 30 29 3b 0a 20 20  Final,0,0,0);.  
10100 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
10110 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20  , zFunc8);.  rc 
10120 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
10130 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
10140 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
10150 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
10160 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
10170 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  f.../*.** The fo
10180 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20 69  llowing is the i
10190 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
101a0 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   an SQL function
101b0 20 74 68 61 74 20 61 6c 77 61 79 73 0a 2a 2a 20   that always.** 
101c0 66 61 69 6c 73 20 77 69 74 68 20 61 6e 20 65 72  fails with an er
101d0 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 61 74  ror message stat
101e0 69 6e 67 20 74 68 61 74 20 74 68 65 20 66 75 6e  ing that the fun
101f0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69 6e  ction is used in
10200 20 74 68 65 0a 2a 2a 20 77 72 6f 6e 67 20 63 6f   the.** wrong co
10210 6e 74 65 78 74 2e 20 20 54 68 65 20 73 71 6c 69  ntext.  The sqli
10220 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e  te3_overload_fun
10230 63 74 69 6f 6e 28 29 20 41 50 49 20 6d 69 67 68  ction() API migh
10240 74 20 63 6f 6e 73 74 72 75 63 74 0a 2a 2a 20 53  t construct.** S
10250 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  QL function that
10260 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   use this routin
10270 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 75  e so that the fu
10280 6e 63 74 69 6f 6e 73 20 77 69 6c 6c 20 65 78 69  nctions will exi
10290 73 74 0a 2a 2a 20 66 6f 72 20 6e 61 6d 65 20 72  st.** for name r
102a0 65 73 6f 6c 75 74 69 6f 6e 20 62 75 74 20 61 72  esolution but ar
102b0 65 20 61 63 74 75 61 6c 6c 79 20 6f 76 65 72 6c  e actually overl
102c0 6f 61 64 65 64 20 62 79 20 74 68 65 20 78 46 69  oaded by the xFi
102d0 6e 64 46 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 65  ndFunction.** me
102e0 74 68 6f 64 20 6f 66 20 76 69 72 74 75 61 6c 20  thod of virtual 
102f0 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
10300 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 49 6e  c void sqlite3In
10310 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20  validFunction(. 
10320 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
10330 20 2a 63 6f 6e 74 65 78 74 2c 20 20 2f 2a 20 54   *context,  /* T
10340 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  he function call
10350 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
10360 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c 20 20 20   int NotUsed,   
10370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10380 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
10390 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ts to the functi
103a0 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
103b0 76 61 6c 75 65 20 2a 2a 4e 6f 74 55 73 65 64 32  value **NotUsed2
103c0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 65     /* Value of e
103d0 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
103e0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
103f0 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
10400 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 75 73  char*)sqlite3_us
10410 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29  er_data(context)
10420 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  ;.  char *zErr;.
10430 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10440 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
10450 55 73 65 64 32 29 3b 0a 20 20 7a 45 72 72 20 3d  Used2);.  zErr =
10460 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
10470 28 0a 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20  (.      "unable 
10480 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 20  to use function 
10490 25 73 20 69 6e 20 74 68 65 20 72 65 71 75 65 73  %s in the reques
104a0 74 65 64 20 63 6f 6e 74 65 78 74 22 2c 20 7a 4e  ted context", zN
104b0 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
104c0 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
104d0 74 65 78 74 2c 20 7a 45 72 72 2c 20 2d 31 29 3b  text, zErr, -1);
104e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
104f0 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zErr);.}../*.** 
10500 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20 66  Declare that a f
10510 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  unction has been
10520 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20 61   overloaded by a
10530 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
10540 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e  **.** If the fun
10550 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65 78  ction already ex
10560 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c 61  ists as a regula
10570 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f  r global functio
10580 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  n, then.** this 
10590 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
105a0 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e 63  op.  If the func
105b0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  tion does not ex
105c0 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ist, then create
105d0 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74 68  .** a new one th
105e0 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77 73  at always throws
105f0 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f   a run-time erro
10600 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  r.  .**.** When 
10610 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 69  virtual tables i
10620 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64 65  ntend to provide
10630 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 66   an overloaded f
10640 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a  unction, they.**
10650 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69   should call thi
10660 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b  s routine to mak
10670 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62 61  e sure the globa
10680 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74  l function exist
10690 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66  s..** A global f
106a0 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78 69  unction must exi
106b0 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20  st in order for 
106c0 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
106d0 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65  to work.** prope
106e0 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rly..*/.int sqli
106f0 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e  te3_overload_fun
10700 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
10710 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
10720 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74  ar *zName,.  int
10730 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20 72   nArg.){.  int r
10740 63 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 70 79  c;.  char *zCopy
10750 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
10760 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
10770 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
10780 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
10790 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c  ) || zName==0 ||
107a0 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20   nArg<-2 ){.    
107b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
107c0 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
107d0 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
107e0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
107f0 6d 75 74 65 78 29 3b 0a 20 20 72 63 20 3d 20 73  mutex);.  rc = s
10800 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
10810 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41  on(db, zName, nA
10820 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
10830 20 30 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65   0)!=0;.  sqlite
10840 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
10850 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
10860 72 63 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  rc ) return SQLI
10870 54 45 5f 4f 4b 3b 0a 20 20 7a 43 6f 70 79 20 3d  TE_OK;.  zCopy =
10880 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
10890 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  (zName);.  if( z
108a0 43 6f 70 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  Copy==0 ) return
108b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
108c0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
108d0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
108e0 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41  v2(db, zName, nA
108f0 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
10900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10910 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f 70              zCop
10920 79 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69  y, sqlite3Invali
10930 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c  dFunction, 0, 0,
10940 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
10950 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
10960 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a  E_OMIT_TRACE./*.
10970 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 72  ** Register a tr
10980 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ace function.  T
10990 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65  he pArg from the
109a0 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69   previously regi
109b0 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a 20  stered trace.** 
109c0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a  is returned.  .*
109d0 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63  *.** A NULL trac
109e0 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73  e function means
109f0 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e 67   that no tracing
10a00 20 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41   is executes.  A
10a10 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61   non-NULL.** tra
10a20 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ce is a pointer 
10a30 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68  to a function th
10a40 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74  at is invoked at
10a50 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
10a60 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  ch.** SQL statem
10a70 65 6e 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ent..*/.#ifndef 
10a80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
10a90 45 43 41 54 45 44 0a 76 6f 69 64 20 2a 73 71 6c  ECATED.void *sql
10aa0 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74  ite3_trace(sqlit
10ab0 65 33 20 2a 64 62 2c 20 76 6f 69 64 28 2a 78 54  e3 *db, void(*xT
10ac0 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  race)(void*,cons
10ad0 74 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a  t char*), void *
10ae0 70 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70  pArg){.  void *p
10af0 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  Old;..#ifdef SQL
10b00 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
10b10 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
10b20 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
10b30 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
10b40 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
10b50 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
10b60 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
10b70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10b80 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
10b90 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54  .  pOld = db->pT
10ba0 72 61 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 6d  raceArg;.  db->m
10bb0 54 72 61 63 65 20 3d 20 78 54 72 61 63 65 20 3f  Trace = xTrace ?
10bc0 20 53 51 4c 49 54 45 5f 54 52 41 43 45 5f 4c 45   SQLITE_TRACE_LE
10bd0 47 41 43 59 20 3a 20 30 3b 0a 20 20 64 62 2d 3e  GACY : 0;.  db->
10be0 78 54 72 61 63 65 20 3d 20 28 69 6e 74 28 2a 29  xTrace = (int(*)
10bf0 28 75 33 32 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a  (u32,void*,void*
10c00 2c 76 6f 69 64 2a 29 29 78 54 72 61 63 65 3b 0a  ,void*))xTrace;.
10c10 20 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20    db->pTraceArg 
10c20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
10c30 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
10c40 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
10c50 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69  rn pOld;.}.#endi
10c60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
10c70 5f 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a 0a  _DEPRECATED */..
10c80 2f 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 72  /* Register a tr
10c90 61 63 65 20 63 61 6c 6c 62 61 63 6b 20 75 73 69  ace callback usi
10ca0 6e 67 20 74 68 65 20 76 65 72 73 69 6f 6e 2d 32  ng the version-2
10cb0 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69   interface..*/.i
10cc0 6e 74 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65  nt sqlite3_trace
10cd0 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
10ce0 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
10cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d00 20 20 2f 2a 20 54 72 61 63 65 20 74 68 69 73 20    /* Trace this 
10d10 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
10d20 75 6e 73 69 67 6e 65 64 20 6d 54 72 61 63 65 2c  unsigned mTrace,
10d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
10d50 73 6b 20 6f 66 20 65 76 65 6e 74 73 20 74 6f 20  sk of events to 
10d60 62 65 20 74 72 61 63 65 64 20 2a 2f 0a 20 20 69  be traced */.  i
10d70 6e 74 28 2a 78 54 72 61 63 65 29 28 75 6e 73 69  nt(*xTrace)(unsi
10d80 67 6e 65 64 2c 76 6f 69 64 2a 2c 76 6f 69 64 2a  gned,void*,void*
10d90 2c 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 43 61 6c  ,void*),  /* Cal
10da0 6c 62 61 63 6b 20 74 6f 20 69 6e 76 6f 6b 65 20  lback to invoke 
10db0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  */.  void *pArg 
10dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10de0 2f 2a 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b  /* Context */.){
10df0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
10e00 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
10e10 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
10e20 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
10e30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10e40 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
10e50 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
10e60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
10e70 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
10e80 20 69 66 28 20 6d 54 72 61 63 65 3d 3d 30 20 29   if( mTrace==0 )
10e90 20 78 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 69   xTrace = 0;.  i
10ea0 66 28 20 78 54 72 61 63 65 3d 3d 30 20 29 20 6d  f( xTrace==0 ) m
10eb0 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 64 62 2d  Trace = 0;.  db-
10ec0 3e 6d 54 72 61 63 65 20 3d 20 6d 54 72 61 63 65  >mTrace = mTrace
10ed0 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d  ;.  db->xTrace =
10ee0 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70   xTrace;.  db->p
10ef0 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b  TraceArg = pArg;
10f00 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10f10 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
10f20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
10f30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
10f40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
10f50 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 52  PRECATED./*.** R
10f60 65 67 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c  egister a profil
10f70 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  e function.  The
10f80 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70   pArg from the p
10f90 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74  reviously regist
10fa0 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65  ered .** profile
10fb0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74   function is ret
10fc0 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  urned.  .**.** A
10fd0 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75   NULL profile fu
10fe0 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61  nction means tha
10ff0 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69  t no profiling i
11000 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e  s executes.  A n
11010 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69  on-NULL.** profi
11020 6c 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  le is a pointer 
11030 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68  to a function th
11040 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74  at is invoked at
11050 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
11060 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73  of.** each SQL s
11070 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73  tatement that is
11080 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73   run..*/.void *s
11090 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a  qlite3_profile(.
110a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
110b0 20 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65   void (*xProfile
110c0 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
110d0 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36  ar*,sqlite_uint6
110e0 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  4),.  void *pArg
110f0 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  .){.  void *pOld
11100 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
11110 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
11120 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
11130 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
11140 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
11150 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
11160 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
11170 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
11180 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
11190 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
111a0 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66  pOld = db->pProf
111b0 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50  ileArg;.  db->xP
111c0 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c  rofile = xProfil
111d0 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c  e;.  db->pProfil
111e0 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 64  eArg = pArg;.  d
111f0 62 2d 3e 6d 54 72 61 63 65 20 26 3d 20 53 51 4c  b->mTrace &= SQL
11200 49 54 45 5f 54 52 41 43 45 5f 4e 4f 4e 4c 45 47  ITE_TRACE_NONLEG
11210 41 43 59 5f 4d 41 53 4b 3b 0a 20 20 69 66 28 20  ACY_MASK;.  if( 
11220 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20 29 20 64  db->xProfile ) d
11230 62 2d 3e 6d 54 72 61 63 65 20 7c 3d 20 53 51 4c  b->mTrace |= SQL
11240 49 54 45 5f 54 52 41 43 45 5f 58 50 52 4f 46 49  ITE_TRACE_XPROFI
11250 4c 45 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  LE;.  sqlite3_mu
11260 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
11270 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
11280 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  Old;.}.#endif /*
11290 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
112a0 52 45 43 41 54 45 44 20 2a 2f 0a 23 65 6e 64 69  RECATED */.#endi
112b0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
112c0 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
112d0 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63   Register a func
112e0 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
112f0 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
11300 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a  ction commits..*
11310 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64  * If the invoked
11320 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
11330 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
11340 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f   the commit beco
11350 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63  mes a.** rollbac
11360 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  k..*/.void *sqli
11370 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
11380 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
11390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
113a0 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
113b0 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
113c0 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
113d0 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20  lback)(void*),  
113e0 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69  /* Function to i
113f0 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f  nvoke on each co
11400 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mmit */.  void *
11410 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
11420 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
11430 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
11440 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  */.){.  void *pO
11450 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ld;..#ifdef SQLI
11460 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
11470 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
11480 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
11490 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
114a0 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
114b0 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
114c0 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
114d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
114e0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
114f0 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f    pOld = db->pCo
11500 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78  mmitArg;.  db->x
11510 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d  CommitCallback =
11520 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
11530 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70  ->pCommitArg = p
11540 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
11550 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
11560 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
11570 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pOld;.}../*.** R
11580 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
11590 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
115a0 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77   each time a row
115b0 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20   is updated,.** 
115c0 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65  inserted or dele
115d0 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64  ted using this d
115e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
115f0 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  on..*/.void *sql
11600 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b  ite3_update_hook
11610 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
11620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11630 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b   Attach the hook
11640 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
11650 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43  e */.  void (*xC
11660 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69  allback)(void*,i
11670 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c  nt,char const *,
11680 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c  char const *,sql
11690 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f  ite_int64),.  vo
116a0 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
116b0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
116c0 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
116d0 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
116e0 20 2a 70 52 65 74 3b 0a 0a 23 69 66 64 65 66 20   *pRet;..#ifdef 
116f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
11700 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
11710 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
11720 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
11730 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
11740 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
11750 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
11760 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
11770 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
11780 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
11790 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64  >pUpdateArg;.  d
117a0 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61  b->xUpdateCallba
117b0 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
117c0 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67    db->pUpdateArg
117d0 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
117e0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
117f0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
11800 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
11810 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
11820 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
11830 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
11840 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
11850 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62  rolled.** back b
11860 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
11870 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
11880 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c  oid *sqlite3_rol
11890 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71  lback_hook(.  sq
118a0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
118b0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
118c0 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
118d0 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
118e0 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63   void (*xCallbac
118f0 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61  k)(void*), /* Ca
11900 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
11910 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  */.  void *pArg 
11920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11930 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * Argument to th
11940 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b  e function */.){
11950 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a  .  void *pRet;..
11960 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
11970 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
11980 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
11990 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
119a0 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49  {.    (void)SQLI
119b0 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
119c0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
119d0 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
119e0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
119f0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
11a00 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63  t = db->pRollbac
11a10 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c  kArg;.  db->xRol
11a20 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20  lbackCallback = 
11a30 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
11a40 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20  >pRollbackArg = 
11a50 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
11a60 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
11a70 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
11a80 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66   pRet;.}..#ifdef
11a90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50   SQLITE_ENABLE_P
11aa0 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a  REUPDATE_HOOK./*
11ab0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
11ac0 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
11ad0 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
11ae0 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64  a row is updated
11af0 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72  ,.** inserted or
11b00 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74   deleted using t
11b10 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
11b20 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
11b30 20 2a 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64   *sqlite3_preupd
11b40 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  ate_hook(.  sqli
11b50 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
11b60 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
11b70 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
11b80 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76   database */.  v
11b90 6f 69 64 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  oid(*xCallback)(
11ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c           /* Call
11bb0 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  back function */
11bc0 0a 20 20 20 20 76 6f 69 64 2a 2c 73 71 6c 69 74  .    void*,sqlit
11bd0 65 33 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e  e3*,int,char con
11be0 73 74 2a 2c 63 68 61 72 20 63 6f 6e 73 74 2a 2c  st*,char const*,
11bf0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2c 73 71  sqlite3_int64,sq
11c00 6c 69 74 65 33 5f 69 6e 74 36 34 29 2c 0a 20 20  lite3_int64),.  
11c10 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
11c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
11c30 73 74 20 63 61 6c 6c 62 61 63 6b 20 61 72 67 75  st callback argu
11c40 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  ment */.){.  voi
11c50 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74  d *pRet;.  sqlit
11c60 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
11c70 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
11c80 74 20 3d 20 64 62 2d 3e 70 50 72 65 55 70 64 61  t = db->pPreUpda
11c90 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72  teArg;.  db->xPr
11ca0 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20  eUpdateCallback 
11cb0 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
11cc0 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67  b->pPreUpdateArg
11cd0 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
11ce0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
11cf0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
11d00 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64  urn pRet;.}.#end
11d10 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
11d20 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
11d30 4f 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  OK */..#ifndef S
11d40 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
11d50 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
11d60 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c  _wal_hook() call
11d70 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20  back registered 
11d80 62 79 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61  by sqlite3_wal_a
11d90 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e  utocheckpoint().
11da0 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74  .** Invoke sqlit
11db0 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
11dc0 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t if the number 
11dd0 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65  of frames in the
11de0 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20   log file.** is 
11df0 67 72 65 61 74 65 72 20 74 68 61 6e 20 73 71 6c  greater than sql
11e00 69 74 65 33 2e 70 57 61 6c 41 72 67 20 63 61 73  ite3.pWalArg cas
11e10 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  t to an integer 
11e20 28 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69  (the value confi
11e30 67 75 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f  gured by.** wal_
11e40 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29  autocheckpoint()
11e50 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  )..*/ .int sqlit
11e60 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b  e3WalDefaultHook
11e70 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e  (.  void *pClien
11e80 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 41 72  tData,     /* Ar
11e90 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69  gument */.  sqli
11ea0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
11eb0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
11ec0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
11ed0 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a 20   *zDb,       /* 
11ee0 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  Database */.  in
11ef0 74 20 6e 46 72 61 6d 65 20 20 20 20 20 20 20 20  t nFrame        
11f00 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
11f10 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  WAL */.){.  if( 
11f20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50  nFrame>=SQLITE_P
11f30 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e  TR_TO_INT(pClien
11f40 74 44 61 74 61 29 20 29 7b 0a 20 20 20 20 73 71  tData) ){.    sq
11f50 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
11f60 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71  Malloc();.    sq
11f70 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
11f80 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20  oint(db, zDb);. 
11f90 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
11fa0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d  ignMalloc();.  }
11fb0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11fc0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
11fd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
11fe0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69   */../*.** Confi
11ff0 67 75 72 65 20 61 6e 20 73 71 6c 69 74 65 33 5f  gure an sqlite3_
12000 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62  wal_hook() callb
12010 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69 63  ack to automatic
12020 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a  ally checkpoint.
12030 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 66  ** a database af
12040 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
12050 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
12060 74 68 65 72 65 20 61 72 65 20 6e 46 72 61 6d 65  there are nFrame
12070 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d   or.** more fram
12080 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69  es in the log fi
12090 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a 65 72 6f  le. Passing zero
120a0 20 6f 72 20 61 20 6e 65 67 61 74 69 76 65 20 76   or a negative v
120b0 61 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e  alue as the.** n
120c0 46 72 61 6d 65 20 70 61 72 61 6d 65 74 65 72 20  Frame parameter 
120d0 64 69 73 61 62 6c 65 73 20 61 75 74 6f 6d 61 74  disables automat
120e0 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 65  ic checkpoints e
120f0 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  ntirely..**.** T
12100 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69  he callback regi
12110 73 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  stered by this f
12120 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73  unction replaces
12130 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 63 61   any existing ca
12140 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74  llback.** regist
12150 65 72 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ered using sqlit
12160 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c  e3_wal_hook(). L
12170 69 6b 65 77 69 73 65 2c 20 72 65 67 69 73 74 65  ikewise, registe
12180 72 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a  ring a callback.
12190 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ** using sqlite3
121a0 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61  _wal_hook() disa
121b0 62 6c 65 73 20 74 68 65 20 61 75 74 6f 6d 61 74  bles the automat
121c0 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65  ic checkpoint me
121d0 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69  chanism.** confi
121e0 67 75 72 65 64 20 62 79 20 74 68 69 73 20 66 75  gured by this fu
121f0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
12200 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
12210 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
12220 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d  3 *db, int nFram
12230 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e){.#ifdef SQLIT
12240 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55  E_OMIT_WAL.  UNU
12250 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
12260 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
12270 4d 45 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23  METER(nFrame);.#
12280 65 6c 73 65 0a 23 69 66 64 65 66 20 53 51 4c 49  else.#ifdef SQLI
12290 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
122a0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
122b0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
122c0 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
122d0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
122e0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6e 46  .#endif.  if( nF
122f0 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20 73 71  rame>0 ){.    sq
12300 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64  lite3_wal_hook(d
12310 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66  b, sqlite3WalDef
12320 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49 54 45  aultHook, SQLITE
12330 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46 72 61  _INT_TO_PTR(nFra
12340 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  me));.  }else{. 
12350 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68     sqlite3_wal_h
12360 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20  ook(db, 0, 0);. 
12370 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
12380 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12390 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
123a0 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
123b0 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
123c0 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
123d0 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
123e0 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d 61 68  nto the write-ah
123f0 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69 73 20  ead-log by this 
12400 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12410 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
12420 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a  lite3_wal_hook(.
12430 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
12440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12450 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
12460 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 62 20  hook to this db 
12470 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 28  handle */.  int(
12480 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64  *xCallback)(void
12490 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f   *, sqlite3*, co
124a0 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c  nst char*, int),
124b0 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
124c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124d0 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
124e0 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 78  ment passed to x
124f0 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a 29 7b  Callback() */.){
12500 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12510 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69 64 20  OMIT_WAL.  void 
12520 2a 70 52 65 74 3b 0a 23 69 66 64 65 66 20 53 51  *pRet;.#ifdef SQ
12530 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
12540 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
12550 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
12560 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
12570 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
12580 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
12590 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
125a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
125b0 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
125c0 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
125d0 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57  WalArg;.  db->xW
125e0 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  alCallback = xCa
125f0 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57  llback;.  db->pW
12600 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  alArg = pArg;.  
12610 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
12620 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
12630 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23    return pRet;.#
12640 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b  else.  return 0;
12650 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
12660 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61   Checkpoint data
12670 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74  base zDb..*/.int
12680 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
12690 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71  ckpoint_v2(.  sq
126a0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
126c0 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
126d0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
126e0 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20   *zDb,          
126f0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
12700 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
12710 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  se (or NULL) */.
12720 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20    int eMode,    
12730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12740 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
12750 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a  KPOINT_* value *
12760 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20  /.  int *pnLog, 
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12780 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
12790 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66   of WAL log in f
127a0 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  rames */.  int *
127b0 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20 20  pnCkpt          
127c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
127d0 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  T: Total number 
127e0 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b 70  of frames checkp
127f0 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66  ointed */.){.#if
12800 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12810 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  WAL.  return SQL
12820 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
12830 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
12840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12850 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
12860 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51  /.  int iDb = SQ
12870 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
12880 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61  D;  /* sqlite3.a
12890 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62  Db[] index of db
128a0 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a   to checkpoint *
128b0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
128c0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
128d0 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
128e0 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
128f0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
12900 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
12910 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 6e 69 74  endif..  /* Init
12920 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75  ialize the outpu
12930 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 2d  t variables to -
12940 31 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  1 in case an err
12950 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
12960 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c  if( pnLog ) *pnL
12970 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70  og = -1;.  if( p
12980 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74 20  nCkpt ) *pnCkpt 
12990 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28  = -1;..  assert(
129a0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
129b0 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30 20 29 3b  NT_PASSIVE==0 );
129c0 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
129d0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c  E_CHECKPOINT_FUL
129e0 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  L==1 );.  assert
129f0 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
12a00 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32 20 29  INT_RESTART==2 )
12a10 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
12a20 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52  TE_CHECKPOINT_TR
12a30 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 20 20 69  UNCATE==3 );.  i
12a40 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f  f( eMode<SQLITE_
12a50 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
12a60 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49  VE || eMode>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 20 29 7b 0a 20 20 20 20 2f 2a  UNCATE ){.    /*
12a90 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
12aa0 30 33 39 39 36 2d 31 32 30 38 38 20 54 68 65 20  03996-12088 The 
12ab0 4d 20 70 61 72 61 6d 65 74 65 72 20 6d 75 73 74  M parameter must
12ac0 20 62 65 20 61 20 76 61 6c 69 64 20 63 68 65 63   be a valid chec
12ad0 6b 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 6d 6f  kpoint.    ** mo
12ae0 64 65 3a 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  de: */.    retur
12af0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b  n SQLITE_MISUSE;
12b00 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
12b10 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
12b20 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a 44  mutex);.  if( zD
12b30 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a 20  b && zDb[0] ){. 
12b40 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
12b50 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
12b60 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  Db);.  }.  if( i
12b70 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  Db<0 ){.    rc =
12b80 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
12b90 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57     sqlite3ErrorW
12ba0 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54  ithMsg(db, SQLIT
12bb0 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77  E_ERROR, "unknow
12bc0 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c  n database: %s",
12bd0 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   zDb);.  }else{.
12be0 20 20 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64      db->busyHand
12bf0 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
12c00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
12c10 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44  heckpoint(db, iD
12c20 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c  b, eMode, pnLog,
12c30 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73 71   pnCkpt);.    sq
12c40 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
12c50 63 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  c);.  }.  rc = s
12c60 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
12c70 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  , rc);..  /* If 
12c80 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74  there are no act
12c90 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 2c 20  ive statements, 
12ca0 63 6c 65 61 72 20 74 68 65 20 69 6e 74 65 72 72  clear the interr
12cb0 75 70 74 20 66 6c 61 67 20 61 74 20 74 68 69 73  upt flag at this
12cc0 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 20 2a 2f  .  ** point.  */
12cd0 0a 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65  .  if( db->nVdbe
12ce0 41 63 74 69 76 65 3d 3d 30 20 29 7b 0a 20 20 20  Active==0 ){.   
12cf0 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
12d00 75 70 74 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 0a  upted = 0;.  }..
12d10 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12d20 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
12d30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
12d40 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
12d50 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62  Checkpoint datab
12d60 61 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20  ase zDb. If zDb 
12d70 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74  is NULL, or if t
12d80 68 65 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f  he buffer zDb po
12d90 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61  ints.** to conta
12da0 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  ins a zero-lengt
12db0 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74  h string, all at
12dc0 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
12dd0 20 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f   are .** checkpo
12de0 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inted..*/.int sq
12df0 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
12e00 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  oint(sqlite3 *db
12e10 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
12e20 62 29 7b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  b){.  /* EVIDENC
12e30 45 2d 4f 46 3a 20 52 2d 34 31 36 31 33 2d 32 30  E-OF: R-41613-20
12e40 35 35 33 20 54 68 65 20 73 71 6c 69 74 65 33 5f  553 The sqlite3_
12e50 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 44  wal_checkpoint(D
12e60 2c 58 29 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ,X) is equivalen
12e70 74 20 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65  t to.  ** sqlite
12e80 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
12e90 5f 76 32 28 44 2c 58 2c 53 51 4c 49 54 45 5f 43  _v2(D,X,SQLITE_C
12ea0 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
12eb0 45 2c 30 2c 30 29 2e 20 2a 2f 0a 20 20 72 65 74  E,0,0). */.  ret
12ec0 75 72 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  urn sqlite3_wal_
12ed0 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62  checkpoint_v2(db
12ee0 2c 7a 44 62 2c 53 51 4c 49 54 45 5f 43 48 45 43  ,zDb,SQLITE_CHEC
12ef0 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30  KPOINT_PASSIVE,0
12f00 2c 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ,0);.}..#ifndef 
12f10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
12f20 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68 65 63  /*.** Run a chec
12f30 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61 62 61  kpoint on databa
12f40 73 65 20 69 44 62 2e 20 54 68 69 73 20 69 73 20  se iDb. This is 
12f50 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74 61 62  a no-op if datab
12f60 61 73 65 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f  ase iDb is.** no
12f70 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  t currently open
12f80 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a   in WAL mode..**
12f90 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
12fa0 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20  tion is open on 
12fb0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 69  the database bei
12fc0 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c  ng checkpointed,
12fd0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
12fe0 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
12ff0 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61 20 63  E_LOCKED and a c
13000 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74  heckpoint is not
13010 20 61 74 74 65 6d 70 74 65 64 2e 20 49 66 20 0a   attempted. If .
13020 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
13030 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67  rs while running
13040 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c   the checkpoint,
13050 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
13060 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74   code is .** ret
13070 75 72 6e 65 64 20 28 69 2e 65 2e 20 53 51 4c 49  urned (i.e. SQLI
13080 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68 65 72  TE_IOERR). Other
13090 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
130a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
130b0 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e   on database han
130c0 64 6c 65 20 64 62 20 73 68 6f 75 6c 64 20 62 65  dle db should be
130d0 20 68 65 6c 64 20 62 79 20 74 68 65 20 63 61 6c   held by the cal
130e0 6c 65 72 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a  ler. The mutex.*
130f0 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
13100 68 20 74 68 65 20 73 70 65 63 69 66 69 63 20 62  h the specific b
13110 2d 74 72 65 65 20 62 65 69 6e 67 20 63 68 65 63  -tree being chec
13120 6b 70 6f 69 6e 74 65 64 20 69 73 20 74 61 6b 65  kpointed is take
13130 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e  n by.** this fun
13140 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68 65 20  ction while the 
13150 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 72 75  checkpoint is ru
13160 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nning..**.** If 
13170 69 44 62 20 69 73 20 70 61 73 73 65 64 20 53 51  iDb is passed SQ
13180 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
13190 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74 74 61  D, then all atta
131a0 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61  ched databases a
131b0 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74  re.** checkpoint
131c0 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
131d0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
131e0 74 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6d  t is returned im
131f0 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e  mediately -.** n
13200 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  o attempt is mad
13210 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20  e to checkpoint 
13220 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20 64 61  any remaining da
13230 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50  tabases..**.** P
13240 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 69  arameter eMode i
13250 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  s one of SQLITE_
13260 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
13270 56 45 2c 20 46 55 4c 4c 2c 20 52 45 53 54 41 52  VE, FULL, RESTAR
13280 54 0a 2a 2a 20 6f 72 20 54 52 55 4e 43 41 54 45  T.** or TRUNCATE
13290 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
132a0 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  Checkpoint(sqlit
132b0 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
132c0 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20   int eMode, int 
132d0 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43  *pnLog, int *pnC
132e0 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  kpt){.  int rc =
132f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
13300 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
13310 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
13320 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
13330 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
13340 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
13350 68 72 6f 75 67 68 20 61 74 74 61 63 68 65 64 20  hrough attached 
13360 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75  dbs */.  int bBu
13370 73 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sy = 0;         
13380 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
13390 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   if SQLITE_BUSY 
133a0 68 61 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  has been encount
133b0 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ered */..  asser
133c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
133d0 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
133e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
133f0 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d  nLog || *pnLog==
13400 2d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  -1 );.  assert( 
13410 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b  !pnCkpt || *pnCk
13420 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72  pt==-1 );..  for
13430 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20  (i=0; i<db->nDb 
13440 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
13450 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
13460 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53  i==iDb || iDb==S
13470 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
13480 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ED ){.      rc =
13490 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 68 65   sqlite3BtreeChe
134a0 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b  ckpoint(db->aDb[
134b0 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70  i].pBt, eMode, p
134c0 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20  nLog, pnCkpt);. 
134d0 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a       pnLog = 0;.
134e0 20 20 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30        pnCkpt = 0
134f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
13500 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
13510 20 20 20 20 20 20 20 62 42 75 73 79 20 3d 20 31         bBusy = 1
13520 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
13530 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
13540 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
13550 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
13560 45 5f 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f  E_OK && bBusy) ?
13570 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72   SQLITE_BUSY : r
13580 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
13590 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
135a0 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
135b0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
135c0 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f  rue if main-memo
135d0 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  ry should be use
135e0 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
135f0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
13600 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70   for transient p
13610 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73  ager files and s
13620 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
13630 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  s..** The value 
13640 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73  returned depends
13650 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
13660 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
13670 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61  (runtime.** para
13680 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65 20 63  meter) and the c
13690 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75  ompile time valu
136a0 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  e of SQLITE_TEMP
136b0 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66  _STORE. The.** f
136c0 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64  ollowing table d
136d0 65 73 63 72 69 62 65 73 20 74 68 65 20 72 65 6c  escribes the rel
136e0 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65  ationship betwee
136f0 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75  n these two valu
13700 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66  es.** and this f
13710 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
13720 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  value..**.**   S
13730 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
13740 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74       db->temp_st
13750 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e  ore     Location
13760 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61   of temporary da
13770 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d  tabase.**   ----
13780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
13790 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
137a0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
137b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
137c0 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
137e0 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
137f0 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
13800 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20  urn 0).**   1   
13810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13820 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
13830 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
13840 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31  return 0).**   1
13850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13860 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
13870 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
13880 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
13890 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
138a0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
138b0 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
138c0 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
138d0 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
138e0 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
138f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
13900 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
13910 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  0).**   2       
13920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
13930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13940 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
13950 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 1).**   2    
13960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13970 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
13980 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
13990 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20  eturn 1).**   3 
139a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139b0 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
139c0 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
139d0 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69   (return 1).*/.i
139e0 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  nt sqlite3TempIn
139f0 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c  Memory(const sql
13a00 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53  ite3 *db){.#if S
13a10 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
13a20 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64  ==1.  return ( d
13a30 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32  b->temp_store==2
13a40 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   );.#endif.#if S
13a50 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
13a60 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64  ==2.  return ( d
13a70 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31  b->temp_store!=1
13a80 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   );.#endif.#if S
13a90 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
13aa0 3d 3d 33 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ==3.  UNUSED_PAR
13ab0 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 72 65  AMETER(db);.  re
13ac0 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23  turn 1;.#endif.#
13ad0 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  if SQLITE_TEMP_S
13ae0 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45  TORE<1 || SQLITE
13af0 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20  _TEMP_STORE>3.  
13b00 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
13b10 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  (db);.  return 0
13b20 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
13b30 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65  * Return UTF-8 e
13b40 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c  ncoded English l
13b50 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74  anguage explanat
13b60 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
13b70 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e  recent.** error.
13b80 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
13b90 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73  sqlite3_errmsg(s
13ba0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63  qlite3 *db){.  c
13bb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
13bc0 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72  if( !db ){.    r
13bd0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
13be0 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  Str(SQLITE_NOMEM
13bf0 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 69 66  _BKPT);.  }.  if
13c00 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
13c10 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
13c20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
13c30 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
13c40 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
13c50 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
13c60 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
13c70 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64  >mutex);.  if( d
13c80 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
13c90 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  ){.    z = sqlit
13ca0 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
13cb0 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 20 20 7d  NOMEM_BKPT);.  }
13cc0 65 6c 73 65 7b 0a 20 20 20 20 74 65 73 74 63 61  else{.    testca
13cd0 73 65 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20  se( db->pErr==0 
13ce0 29 3b 0a 20 20 20 20 7a 20 3d 20 64 62 2d 3e 65  );.    z = db->e
13cf0 72 72 43 6f 64 65 20 3f 20 28 63 68 61 72 2a 29  rrCode ? (char*)
13d00 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
13d10 78 74 28 64 62 2d 3e 70 45 72 72 29 20 3a 20 30  xt(db->pErr) : 0
13d20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64  ;.    assert( !d
13d30 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
13d40 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
13d50 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  ){.      z = sql
13d60 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
13d70 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  rrCode);.    }. 
13d80 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
13d90 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
13da0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  ex);.  return z;
13db0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
13dc0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
13dd0 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31  .** Return UTF-1
13de0 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73  6 encoded Englis
13df0 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61  h language expla
13e00 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nation of the mo
13e10 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72  st recent.** err
13e20 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  or..*/.const voi
13e30 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  d *sqlite3_errms
13e40 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29  g16(sqlite3 *db)
13e50 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
13e60 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20   u16 outOfMem[] 
13e70 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27  = {.    'o', 'u'
13e80 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c  , 't', ' ', 'o',
13e90 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20   'f', ' ', 'm', 
13ea0 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27  'e', 'm', 'o', '
13eb0 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a  r', 'y', 0.  };.
13ec0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
13ed0 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a  16 misuse[] = {.
13ee0 20 20 20 20 27 62 27 2c 20 27 61 27 2c 20 27 64      'b', 'a', 'd
13ef0 27 2c 20 27 20 27 2c 20 27 70 27 2c 20 27 61 27  ', ' ', 'p', 'a'
13f00 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 6d 27 2c  , 'r', 'a', 'm',
13f10 20 27 65 27 2c 20 27 74 27 2c 20 27 65 27 2c 20   'e', 't', 'e', 
13f20 27 72 27 2c 20 27 20 27 2c 0a 20 20 20 20 27 6f  'r', ' ',.    'o
13f30 27 2c 20 27 72 27 2c 20 27 20 27 2c 20 27 6f 27  ', 'r', ' ', 'o'
13f40 2c 20 27 74 27 2c 20 27 68 27 2c 20 27 65 27 2c  , 't', 'h', 'e',
13f50 20 27 72 27 2c 20 27 20 27 2c 20 27 41 27 2c 20   'r', ' ', 'A', 
13f60 27 50 27 2c 20 27 49 27 2c 20 27 20 27 2c 0a 20  'P', 'I', ' ',. 
13f70 20 20 20 27 6d 27 2c 20 27 69 27 2c 20 27 73 27     'm', 'i', 's'
13f80 2c 20 27 75 27 2c 20 27 73 27 2c 20 27 65 27 2c  , 'u', 's', 'e',
13f90 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74   0.  };..  const
13fa0 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20   void *z;.  if( 
13fb0 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !db ){.    retur
13fc0 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d  n (void *)outOfM
13fd0 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73  em;.  }.  if( !s
13fe0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
13ff0 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
14000 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69  .    return (voi
14010 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a  d *)misuse;.  }.
14020 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14030 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
14040 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
14050 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
14060 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f  z = (void *)outO
14070 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fMem;.  }else{. 
14080 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76     z = sqlite3_v
14090 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e  alue_text16(db->
140a0 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a  pErr);.    if( z
140b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
140c0 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
140d0 28 64 62 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65  (db, db->errCode
140e0 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
140f0 64 62 2d 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20  db->errCode));. 
14100 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
14110 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62  _value_text16(db
14120 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20  ->pErr);.    }. 
14130 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29     /* A malloc()
14140 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65 64   may have failed
14150 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c   within the call
14160 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   to sqlite3_valu
14170 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20 2a  e_text16().    *
14180 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69 73  * above. If this
14190 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
141a0 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f  en the db->mallo
141b0 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65 65  cFailed flag nee
141c0 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ds to.    ** be 
141d0 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 72  cleared before r
141e0 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69  eturning. Do thi
141f0 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74  s directly, inst
14200 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20 2a  ead of via.    *
14210 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  * sqlite3ApiExit
14220 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74  (), to avoid set
14230 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
14240 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d  e handle error m
14250 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  essage..    */. 
14260 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 43 6c 65     sqlite3OomCle
14270 61 72 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71  ar(db);.  }.  sq
14280 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
14290 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
142a0 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64  return z;.}.#end
142b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
142c0 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
142d0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73  * Return the mos
142e0 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63  t recent error c
142f0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  ode generated by
14300 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69   an SQLite routi
14310 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a  ne. If NULL is.*
14320 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  * passed to this
14330 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73   function, we as
14340 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20  sume a malloc() 
14350 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71  failed during sq
14360 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f  lite3_open()..*/
14370 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72  .int sqlite3_err
14380 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62  code(sqlite3 *db
14390 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21  ){.  if( db && !
143a0 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
143b0 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
143c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
143d0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
143e0 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c  .  }.  if( !db |
143f0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
14400 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
14410 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
14420 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
14430 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64   db->errCode & d
14440 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e  b->errMask;.}.in
14450 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  t sqlite3_extend
14460 65 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74  ed_errcode(sqlit
14470 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  e3 *db){.  if( d
14480 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66  b && !sqlite3Saf
14490 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
144a0 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
144b0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
144c0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
144d0 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c   !db || db->mall
144e0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
144f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
14500 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
14510 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f  return db->errCo
14520 64 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  de;.}.int sqlite
14530 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28 73  3_system_errno(s
14540 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
14550 65 74 75 72 6e 20 64 62 20 3f 20 64 62 2d 3e 69  eturn db ? db->i
14560 53 79 73 45 72 72 6e 6f 20 3a 20 30 3b 0a 7d 20  SysErrno : 0;.} 
14570 20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20   ../*.** Return 
14580 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
14590 73 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64  scribes the kind
145a0 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66   of error specif
145b0 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ied in the.** ar
145c0 67 75 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77  gument.  For now
145d0 2c 20 74 68 69 73 20 73 69 6d 70 6c 79 20 63 61  , this simply ca
145e0 6c 6c 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  lls the internal
145f0 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 29   sqlite3ErrStr()
14600 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  .** function..*/
14610 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
14620 69 74 65 33 5f 65 72 72 73 74 72 28 69 6e 74 20  ite3_errstr(int 
14630 72 63 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  rc){.  return sq
14640 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 3b  lite3ErrStr(rc);
14650 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
14660 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67   a new collating
14670 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61   function for da
14680 74 61 62 61 73 65 20 22 64 62 22 2e 20 20 54 68  tabase "db".  Th
14690 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a  e name is zName.
146a0 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64  ** and the encod
146b0 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73  ing is enc..*/.s
146c0 74 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65  tatic int create
146d0 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c  Collation(.  sql
146e0 69 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73  ite3* db,.  cons
146f0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
14700 20 20 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64    u8 enc,.  void
14710 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
14720 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
14730 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
14740 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c  nt,const void*),
14750 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76  .  void(*xDel)(v
14760 6f 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53  oid*).){.  CollS
14770 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74  eq *pColl;.  int
14780 20 65 6e 63 32 3b 0a 20 20 0a 20 20 61 73 73 65   enc2;.  .  asse
14790 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
147a0 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
147b0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51  ) );..  /* If SQ
147c0 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70  LITE_UTF16 is sp
147d0 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65  ecified as the e
147e0 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72  ncoding type, tr
147f0 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a  ansform this.  *
14800 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49  * to one of SQLI
14810 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51  TE_UTF16LE or SQ
14820 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69  LITE_UTF16BE usi
14830 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ng the.  ** SQLI
14840 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d  TE_UTF16NATIVE m
14850 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46  acro. SQLITE_UTF
14860 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  16 is not used i
14870 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  nternally..  */.
14880 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20    enc2 = enc;.  
14890 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d  testcase( enc2==
148a0 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a  SQLITE_UTF16 );.
148b0 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32    testcase( enc2
148c0 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  ==SQLITE_UTF16_A
148d0 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20  LIGNED );.  if( 
148e0 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
148f0 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49  16 || enc2==SQLI
14900 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
14910 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53   ){.    enc2 = S
14920 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
14930 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63  E;.  }.  if( enc
14940 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  2<SQLITE_UTF8 ||
14950 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46   enc2>SQLITE_UTF
14960 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75  16BE ){.    retu
14970 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
14980 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
14990 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 63   Check if this c
149a0 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20  all is removing 
149b0 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20  or replacing an 
149c0 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69  existing collati
149d0 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63  on .  ** sequenc
149e0 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68  e. If so, and th
149f0 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
14a00 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e  Ms, return busy.
14a10 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61   If there.  ** a
14a20 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
14a30 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79  , invalidate any
14a40 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74   pre-compiled st
14a50 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  atements..  */. 
14a60 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
14a70 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
14a80 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c  (u8)enc2, zName,
14a90 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c   0);.  if( pColl
14aa0 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20   && pColl->xCmp 
14ab0 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e  ){.    if( db->n
14ac0 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20  VdbeActive ){.  
14ad0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14ae0 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49  WithMsg(db, SQLI
14af0 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
14b00 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c    "unable to del
14b10 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61  ete/modify colla
14b20 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75  tion sequence du
14b30 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74  e to active stat
14b40 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20  ements");.      
14b50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
14b60 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  SY;.    }.    sq
14b70 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
14b80 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
14b90 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  , 0);..    /* If
14ba0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
14bb0 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72  nce pColl was cr
14bc0 65 61 74 65 64 20 64 69 72 65 63 74 6c 79 20 62  eated directly b
14bd0 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  y a call to.    
14be0 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  ** sqlite3_creat
14bf0 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64  e_collation, and
14c00 20 6e 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62   not generated b
14c10 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29  y synthCollSeq()
14c20 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e  ,.    ** then an
14c30 79 20 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79  y copies made by
14c40 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20   synthCollSeq() 
14c50 6e 65 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  need to be inval
14c60 69 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41  idated..    ** A
14c70 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64  lso, collation d
14c80 65 73 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c  estructor - Coll
14c90 53 65 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e  Seq.xDel() - fun
14ca0 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20  ction may need. 
14cb0 20 20 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c     ** to be call
14cc0 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  ed..    */ .    
14cd0 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20  if( (pColl->enc 
14ce0 26 20 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  & ~SQLITE_UTF16_
14cf0 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29  ALIGNED)==enc2 )
14d00 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
14d10 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *aColl = sqlite3
14d20 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43  HashFind(&db->aC
14d30 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65 29 3b 0a  ollSeq, zName);.
14d40 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
14d50 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b     for(j=0; j<3;
14d60 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43   j++){.        C
14d70 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f  ollSeq *p = &aCo
14d80 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[j];.        i
14d90 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c  f( p->enc==pColl
14da0 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  ->enc ){.       
14db0 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29     if( p->xDel )
14dc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
14dd0 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b  >xDel(p->pUser);
14de0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14df0 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d         p->xCmp =
14e00 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
14e10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14e20 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
14e30 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
14e40 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d  , (u8)enc2, zNam
14e50 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f  e, 1);.  if( pCo
14e60 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll==0 ) return S
14e70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
14e80 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20  ;.  pColl->xCmp 
14e90 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43  = xCompare;.  pC
14ea0 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74  oll->pUser = pCt
14eb0 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c  x;.  pColl->xDel
14ec0 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c   = xDel;.  pColl
14ed0 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63  ->enc = (u8)(enc
14ee0 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54  2 | (enc & SQLIT
14ef0 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
14f00 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  );.  sqlite3Erro
14f10 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  r(db, SQLITE_OK)
14f20 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14f30 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
14f40 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e  This array defin
14f50 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f  es hard upper bo
14f60 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61  unds on limit va
14f70 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e  lues.  The.** in
14f80 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62  itializer must b
14f90 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77  e kept in sync w
14fa0 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c  ith the SQLITE_L
14fb0 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e  IMIT_*.** #defin
14fc0 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e  es in sqlite3.h.
14fd0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
14fe0 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b   int aHardLimit[
14ff0 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d  ] = {.  SQLITE_M
15000 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  AX_LENGTH,.  SQL
15010 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
15020 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
15030 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54  _COLUMN,.  SQLIT
15040 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
15050 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ,.  SQLITE_MAX_C
15060 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a  OMPOUND_SELECT,.
15070 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42    SQLITE_MAX_VDB
15080 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  E_OP,.  SQLITE_M
15090 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c  AX_FUNCTION_ARG,
150a0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  .  SQLITE_MAX_AT
150b0 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45  TACHED,.  SQLITE
150c0 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
150d0 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  N_LENGTH,.  SQLI
150e0 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
150f0 4e 55 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a 20  NUMBER,      /* 
15100 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33 32 33  IMP: R-38091-323
15110 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d  52 */.  SQLITE_M
15120 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
15130 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  ,.  SQLITE_MAX_W
15140 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d  ORKER_THREADS,.}
15150 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  ;../*.** Make su
15160 72 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69  re the hard limi
15170 74 73 20 61 72 65 20 73 65 74 20 74 6f 20 72 65  ts are set to re
15180 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a  asonable values.
15190 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
151a0 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65  X_LENGTH<100.# e
151b0 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
151c0 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
151d0 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64  t least 100.#end
151e0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
151f0 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30  X_SQL_LENGTH<100
15200 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
15210 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d  MAX_SQL_LENGTH m
15220 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
15230 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  100.#endif.#if S
15240 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
15250 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  NGTH>SQLITE_MAX_
15260 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53  LENGTH.# error S
15270 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
15280 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65  NGTH must not be
15290 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53 51   greater than SQ
152a0 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a  LITE_MAX_LENGTH.
152b0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
152c0 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
152d0 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20  ELECT<2.# error 
152e0 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
152f0 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20  UND_SELECT must 
15300 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65  be at least 2.#e
15310 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
15320 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23  MAX_VDBE_OP<40.#
15330 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
15340 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62  X_VDBE_OP must b
15350 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65  e at least 40.#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 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
15380 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  <0 || SQLITE_MAX
15390 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 32  _FUNCTION_ARG>12
153a0 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  7.# error SQLITE
153b0 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
153c0 47 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  G must be betwee
153d0 6e 20 30 20 61 6e 64 20 31 32 37 0a 23 65 6e 64  n 0 and 127.#end
153e0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
153f0 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20  X_ATTACHED<0 || 
15400 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
15410 48 45 44 3e 31 32 35 0a 23 20 65 72 72 6f 72 20  HED>125.# error 
15420 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
15430 48 45 44 20 6d 75 73 74 20 62 65 20 62 65 74 77  HED must be betw
15440 65 65 6e 20 30 20 61 6e 64 20 31 32 35 0a 23 65  een 0 and 125.#e
15450 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
15460 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
15470 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f  _LENGTH<1.# erro
15480 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b  r SQLITE_MAX_LIK
15490 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
154a0 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
154b0 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 1.#endif.#if S
154c0 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
154d0 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53  >32767.# error S
154e0 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
154f0 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64   must not exceed
15500 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69   32767.#endif.#i
15510 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49  f SQLITE_MAX_TRI
15520 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65  GGER_DEPTH<1.# e
15530 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
15540 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75  TRIGGER_DEPTH mu
15550 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
15560 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
15570 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48  TE_MAX_WORKER_TH
15580 52 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c 49 54  READS<0 || SQLIT
15590 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
155a0 45 41 44 53 3e 35 30 0a 23 20 65 72 72 6f 72 20  EADS>50.# error 
155b0 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
155c0 52 5f 54 48 52 45 41 44 53 20 6d 75 73 74 20 62  R_THREADS must b
155d0 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
155e0 35 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  50.#endif.../*.*
155f0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
15600 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20  ue of a limit.  
15610 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76  Report the old v
15620 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69  alue..** If an i
15630 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64  nvalid limit ind
15640 65 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20  ex is supplied, 
15650 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61  report -1..** Ma
15660 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75  ke no changes bu
15670 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74  t still report t
15680 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20  he old value if 
15690 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74  the.** new limit
156a0 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   is negative..**
156b0 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20  .** A new lower 
156c0 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73  limit does not s
156d0 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63  hrink existing c
156e0 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74  onstructs..** It
156f0 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73   merely prevents
15700 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20   new constructs 
15710 74 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20  that exceed the 
15720 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f  limit.** from fo
15730 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rming..*/.int sq
15740 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69  lite3_limit(sqli
15750 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d  te3 *db, int lim
15760 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d  itId, int newLim
15770 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69  it){.  int oldLi
15780 6d 69 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  mit;..#ifdef SQL
15790 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
157a0 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
157b0 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
157c0 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69  (db) ){.    (voi
157d0 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
157e0 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
157f0 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   -1;.  }.#endif.
15800 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
15810 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37  F: R-30189-54097
15820 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20   For each limit 
15830 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f  category SQLITE_
15840 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20  LIMIT_NAME.  ** 
15850 74 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20  there is a hard 
15860 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20  upper bound set 
15870 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
15880 62 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73  by a C preproces
15890 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63  sor.  ** macro c
158a0 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58  alled SQLITE_MAX
158b0 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49  _NAME. (The "_LI
158c0 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d  MIT_" in the nam
158d0 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a  e is changed to.
158e0 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20    ** "_MAX_".). 
158f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48   */.  assert( aH
15900 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
15910 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53  LIMIT_LENGTH]==S
15920 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
15930 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
15940 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
15950 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48  LIMIT_SQL_LENGTH
15960 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  ]==SQLITE_MAX_SQ
15970 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  L_LENGTH );.  as
15980 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
15990 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
159a0 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LUMN]==SQLITE_MA
159b0 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73  X_COLUMN );.  as
159c0 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
159d0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58  [SQLITE_LIMIT_EX
159e0 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54  PR_DEPTH]==SQLIT
159f0 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
15a00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
15a10 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
15a20 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
15a30 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d  ELECT]==SQLITE_M
15a40 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
15a50 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  CT);.  assert( a
15a60 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
15a70 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d  _LIMIT_VDBE_OP]=
15a80 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45  =SQLITE_MAX_VDBE
15a90 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OP );.  assert(
15aa0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
15ab0 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f  TE_LIMIT_FUNCTIO
15ac0 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d  N_ARG]==SQLITE_M
15ad0 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
15ae0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
15af0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
15b00 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d  IMIT_ATTACHED]==
15b10 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
15b20 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  HED );.  assert(
15b30 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
15b40 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41  TE_LIMIT_LIKE_PA
15b50 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a  TTERN_LENGTH]==.
15b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
15b90 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
15ba0 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b  ATTERN_LENGTH );
15bb0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
15bc0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
15bd0 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
15be0 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ER]==SQLITE_MAX_
15bf0 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29  VARIABLE_NUMBER)
15c00 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
15c10 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
15c20 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
15c30 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54  H]==SQLITE_MAX_T
15c40 52 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a  RIGGER_DEPTH );.
15c50 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
15c60 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
15c70 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
15c80 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  ]==SQLITE_MAX_WO
15c90 52 4b 45 52 5f 54 48 52 45 41 44 53 20 29 3b 0a  RKER_THREADS );.
15ca0 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
15cb0 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
15cc0 52 45 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e  READS==(SQLITE_N
15cd0 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20  _LIMIT-1) );... 
15ce0 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c   if( limitId<0 |
15cf0 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54  | limitId>=SQLIT
15d00 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  E_N_LIMIT ){.   
15d10 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
15d20 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d    oldLimit = db-
15d30 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
15d40 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74  ;.  if( newLimit
15d50 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  >=0 ){          
15d60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
15d70 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a   R-52476-28732 *
15d80 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d  /.    if( newLim
15d90 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69  it>aHardLimit[li
15da0 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20  mitId] ){.      
15db0 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64  newLimit = aHard
15dc0 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20  Limit[limitId]; 
15dd0 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33   /* IMP: R-51463
15de0 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a  -25634 */.    }.
15df0 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c      db->aLimit[l
15e00 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d  imitId] = newLim
15e10 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
15e20 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20   oldLimit;      
15e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15e40 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33  * IMP: R-53341-3
15e50 35 34 31 39 20 2a 2f 0a 7d 0a 23 69 66 20 64 65  5419 */.}.#if de
15e60 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
15e70 42 4c 45 5f 41 55 54 4f 5f 50 52 4f 46 49 4c 45  BLE_AUTO_PROFILE
15e80 29 0a 2f 2a 20 73 74 64 65 72 72 20 6c 6f 67 67  )./* stderr logg
15e90 69 6e 67 20 2a 2f 0a 76 6f 69 64 20 5f 73 71 6c  ing */.void _sql
15ea0 69 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65  ite_auto_profile
15eb0 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73  (void *aux, cons
15ec0 74 20 63 68 61 72 20 2a 73 71 6c 2c 20 75 36 34  t char *sql, u64
15ed0 20 6e 73 29 3b 0a 76 6f 69 64 20 5f 73 71 6c 69   ns);.void _sqli
15ee0 74 65 5f 61 75 74 6f 5f 74 72 61 63 65 28 76 6f  te_auto_trace(vo
15ef0 69 64 20 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63  id *aux, const c
15f00 68 61 72 20 2a 73 71 6c 29 3b 0a 76 6f 69 64 20  har *sql);.void 
15f10 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 70 72 6f  _sqlite_auto_pro
15f20 66 69 6c 65 28 76 6f 69 64 20 2a 61 75 78 2c 20  file(void *aux, 
15f30 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 2c  const char *sql,
15f40 20 75 36 34 20 6e 73 29 20 7b 0a 23 70 72 61 67   u64 ns) {.#prag
15f50 6d 61 20 75 6e 75 73 65 64 28 61 75 78 29 0a 09  ma unused(aux)..
15f60 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
15f70 22 51 75 65 72 79 3a 20 25 73 5c 6e 20 45 78 65  "Query: %s\n Exe
15f80 63 75 74 69 6f 6e 20 54 69 6d 65 3a 20 25 6c 6c  cution Time: %ll
15f90 75 20 6d 73 5c 6e 22 2c 20 73 71 6c 2c 20 6e 73  u ms\n", sql, ns
15fa0 20 2f 20 31 30 30 30 30 30 30 29 3b 0a 7d 0a 76   / 1000000);.}.v
15fb0 6f 69 64 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f  oid _sqlite_auto
15fc0 5f 74 72 61 63 65 28 76 6f 69 64 20 2a 61 75 78  _trace(void *aux
15fd0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  , const char *sq
15fe0 6c 29 20 7b 0a 09 66 70 72 69 6e 74 66 28 73 74  l) {..fprintf(st
15ff0 64 65 72 72 2c 20 22 54 72 61 63 65 53 51 4c 28  derr, "TraceSQL(
16000 25 70 29 3a 20 25 73 5c 6e 22 2c 20 61 75 78 2c  %p): %s\n", aux,
16010 20 73 71 6c 29 3b 0a 7d 0a 0a 2f 2a 20 73 79 73   sql);.}../* sys
16020 6c 6f 67 20 6c 6f 67 67 69 6e 67 20 2a 2f 0a 23  log logging */.#
16030 69 6e 63 6c 75 64 65 20 3c 61 73 6c 2e 68 3e 0a  include <asl.h>.
16040 73 74 61 74 69 63 20 61 73 6c 63 6c 69 65 6e 74  static aslclient
16050 20 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20   autolog_client 
16060 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 76  = NULL;.static v
16070 6f 69 64 20 5f 63 6c 6f 73 65 5f 61 73 6c 5f 6c  oid _close_asl_l
16080 6f 67 28 29 20 7b 0a 20 20 69 66 28 20 4e 55 4c  og() {.  if( NUL
16090 4c 21 3d 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e  L!=autolog_clien
160a0 74 20 29 7b 0a 20 20 20 20 61 73 6c 5f 63 6c 6f  t ){.    asl_clo
160b0 73 65 28 61 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e  se(autolog_clien
160c0 74 29 3b 0a 20 20 20 20 61 75 74 6f 6c 6f 67 5f  t);.    autolog_
160d0 63 6c 69 65 6e 74 20 3d 20 4e 55 4c 4c 3b 0a 20  client = NULL;. 
160e0 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
160f0 20 5f 6f 70 65 6e 5f 61 73 6c 5f 6c 6f 67 28 29   _open_asl_log()
16100 20 7b 0a 20 20 69 66 28 20 4e 55 4c 4c 3d 3d 61   {.  if( NULL==a
16110 75 74 6f 6c 6f 67 5f 63 6c 69 65 6e 74 20 29 7b  utolog_client ){
16120 0a 20 20 20 20 61 75 74 6f 6c 6f 67 5f 63 6c 69  .    autolog_cli
16130 65 6e 74 20 3d 20 61 73 6c 5f 6f 70 65 6e 28 22  ent = asl_open("
16140 53 51 4c 69 74 65 22 2c 20 4e 55 4c 4c 2c 20 30  SQLite", NULL, 0
16150 29 3b 0a 20 20 20 20 61 74 65 78 69 74 28 5f 63  );.    atexit(_c
16160 6c 6f 73 65 5f 61 73 6c 5f 6c 6f 67 29 3b 0a 20  lose_asl_log);. 
16170 20 7d 0a 7d 0a 0a 76 6f 69 64 20 5f 73 71 6c 69   }.}..void _sqli
16180 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c 65 5f  te_auto_profile_
16190 73 79 73 6c 6f 67 28 76 6f 69 64 20 2a 61 75 78  syslog(void *aux
161a0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  , const char *sq
161b0 6c 2c 20 75 36 34 20 6e 73 29 3b 0a 76 6f 69 64  l, u64 ns);.void
161c0 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 74 72   _sqlite_auto_tr
161d0 61 63 65 5f 73 79 73 6c 6f 67 28 76 6f 69 64 20  ace_syslog(void 
161e0 2a 61 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72  *aux, const char
161f0 20 2a 73 71 6c 29 3b 0a 76 6f 69 64 20 5f 73 71   *sql);.void _sq
16200 6c 69 74 65 5f 61 75 74 6f 5f 70 72 6f 66 69 6c  lite_auto_profil
16210 65 5f 73 79 73 6c 6f 67 28 76 6f 69 64 20 2a 61  e_syslog(void *a
16220 75 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ux, const char *
16230 73 71 6c 2c 20 75 36 34 20 6e 73 29 20 7b 0a 23  sql, u64 ns) {.#
16240 70 72 61 67 6d 61 20 75 6e 75 73 65 64 28 61 75  pragma unused(au
16250 78 29 0a 09 61 73 6c 5f 6c 6f 67 28 61 75 74 6f  x)..asl_log(auto
16260 6c 6f 67 5f 63 6c 69 65 6e 74 2c 20 4e 55 4c 4c  log_client, NULL
16270 2c 20 41 53 4c 5f 4c 45 56 45 4c 5f 4e 4f 54 49  , ASL_LEVEL_NOTI
16280 43 45 2c 20 22 51 75 65 72 79 3a 20 25 73 5c 6e  CE, "Query: %s\n
16290 20 45 78 65 63 75 74 69 6f 6e 20 54 69 6d 65 3a   Execution Time:
162a0 20 25 6c 6c 75 20 6d 73 5c 6e 22 2c 20 73 71 6c   %llu ms\n", sql
162b0 2c 20 6e 73 20 2f 20 31 30 30 30 30 30 30 29 3b  , ns / 1000000);
162c0 0a 7d 0a 76 6f 69 64 20 5f 73 71 6c 69 74 65 5f  .}.void _sqlite_
162d0 61 75 74 6f 5f 74 72 61 63 65 5f 73 79 73 6c 6f  auto_trace_syslo
162e0 67 28 76 6f 69 64 20 2a 61 75 78 2c 20 63 6f 6e  g(void *aux, con
162f0 73 74 20 63 68 61 72 20 2a 73 71 6c 29 20 7b 0a  st char *sql) {.
16300 09 61 73 6c 5f 6c 6f 67 28 61 75 74 6f 6c 6f 67  .asl_log(autolog
16310 5f 63 6c 69 65 6e 74 2c 20 4e 55 4c 4c 2c 20 41  _client, NULL, A
16320 53 4c 5f 4c 45 56 45 4c 5f 4e 4f 54 49 43 45 2c  SL_LEVEL_NOTICE,
16330 20 22 54 72 61 63 65 53 51 4c 28 25 70 29 3a 20   "TraceSQL(%p): 
16340 25 73 5c 6e 22 2c 20 61 75 78 2c 20 73 71 6c 29  %s\n", aux, sql)
16350 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
16360 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16370 69 73 20 75 73 65 64 20 74 6f 20 70 61 72 73 65  is used to parse
16380 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e   both URIs and n
16390 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73  on-URI filenames
163a0 20 70 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a   passed by the.*
163b0 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20 66 75  * user to API fu
163c0 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f  nctions sqlite3_
163d0 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65  open() or sqlite
163e0 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64  3_open_v2(), and
163f0 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a   for database.**
16400 20 55 52 49 73 20 73 70 65 63 69 66 69 65 64 20   URIs specified 
16410 61 73 20 70 61 72 74 20 6f 66 20 41 54 54 41 43  as part of ATTAC
16420 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  H statements..**
16430 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
16440 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
16450 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e  unction is the n
16460 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74  ame of the VFS t
16470 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e  o use (or.** a N
16480 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74  ULL to signify t
16490 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 29 20  he default VFS) 
164a0 69 66 20 74 68 65 20 55 52 49 20 64 6f 65 73 20  if the URI does 
164b0 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76  not contain a "v
164c0 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79  fs=xxx".** query
164d0 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20   parameter. The 
164e0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
164f0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49  contains the URI
16500 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c   (or non-URI fil
16510 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66  ename).** itself
16520 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  . When this func
16530 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
16540 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61  he *pFlags varia
16550 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61  ble should conta
16560 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c  in.** the defaul
16570 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  t flags to open 
16580 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
16590 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76 61  dle with. The va
165a0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  lue stored in.**
165b0 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20   *pFlags may be 
165c0 75 70 64 61 74 65 64 20 62 65 66 6f 72 65 20 72  updated before r
165d0 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20  eturning if the 
165e0 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e  URI filename con
165f0 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65  tains .** "cache
16600 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78  =xxx" or "mode=x
16610 78 78 22 20 71 75 65 72 79 20 70 61 72 61 6d 65  xx" query parame
16620 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ters..**.** If s
16630 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
16640 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
16650 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a  . In this case *
16660 70 70 56 66 73 20 69 73 20 73 65 74 20 74 6f 20  ppVfs is set to 
16670 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
16680 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20  VFS that should 
16690 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20  be used to open 
166a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
166b0 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65  e. *pzFile is se
166c0 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  t to.** point to
166d0 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
166e0 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66  ning the name of
166f0 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65   the file to ope
16700 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  n. It is the .**
16710 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
16720 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
16730 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c   eventually call
16740 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20   sqlite3_free() 
16750 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  to release.** th
16760 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  is buffer..**.**
16770 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
16780 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c  urs, then an SQL
16790 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
167a0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
167b0 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20  pzErrMsg.** may 
167c0 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  be set to point 
167d0 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
167e0 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73  aining an Englis
167f0 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72  h language error
16800 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74   .** message. It
16810 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
16820 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
16830 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
16840 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  ly release.** th
16850 69 73 20 62 75 66 66 65 72 20 62 79 20 63 61 6c  is buffer by cal
16860 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  ling sqlite3_fre
16870 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e()..*/.int sqli
16880 74 65 33 50 61 72 73 65 55 72 69 28 0a 20 20 63  te3ParseUri(.  c
16890 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61  onst char *zDefa
168a0 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f  ultVfs,        /
168b0 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69 66 20  * VFS to use if 
168c0 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75 65  no "vfs=xxx" que
168d0 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63  ry option */.  c
168e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c  onst char *zUri,
168f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16900 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * Nul-terminated
16910 20 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f   URI to parse */
16920 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
16930 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  *pFlags,        
16940 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51     /* IN/OUT: SQ
16950 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c  LITE_OPEN_XXX fl
16960 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ags */.  sqlite3
16970 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20  _vfs **ppVfs,   
16980 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
16990 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a   VFS to use */ .
169a0 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c    char **pzFile,
169b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169c0 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61    /* OUT: Filena
169d0 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  me component of 
169e0 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  URI */.  char **
169f0 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20  pzErrMsg        
16a00 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
16a10 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28   Error message (
16a20 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  if rc!=SQLITE_OK
16a30 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
16a40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16a50 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61  unsigned int fla
16a60 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20  gs = *pFlags;.  
16a70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
16a80 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a   = zDefaultVfs;.
16a90 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20    char *zFile;. 
16aa0 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e   char c;.  int n
16ab0 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Uri = sqlite3Str
16ac0 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20  len30(zUri);..  
16ad0 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73  assert( *pzErrMs
16ae0 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  g==0 );..  if( (
16af0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
16b00 4f 50 45 4e 5f 55 52 49 29 20 20 20 20 20 20 20  OPEN_URI)       
16b10 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
16b20 34 38 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a 20  48725-32206 */. 
16b30 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
16b40 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
16b50 67 2e 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20 49  g.bOpenUri) /* I
16b60 4d 50 3a 20 52 2d 35 31 36 38 39 2d 34 36 35 34  MP: R-51689-4654
16b70 38 20 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69 3e  8 */.   && nUri>
16b80 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72  =5 && memcmp(zUr
16b90 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d  i, "file:", 5)==
16ba0 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38  0 /* IMP: R-5788
16bb0 34 2d 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a  4-37496 */.  ){.
16bc0 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a      char *zOpt;.
16bd0 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20      int eState; 
16be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bf0 20 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74    /* Parser stat
16c00 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55  e when parsing U
16c10 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  RI */.    int iI
16c20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
16c30 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
16c40 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78   character index
16c50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74   */.    int iOut
16c60 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
16c70 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
16c80 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20  character index 
16c90 2a 2f 0a 20 20 20 20 75 36 34 20 6e 42 79 74 65  */.    u64 nByte
16ca0 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20   = nUri+2;      
16cb0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
16cc0 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61   space to alloca
16cd0 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61  te */..    /* Ma
16ce0 6b 65 20 73 75 72 65 20 74 68 65 20 53 51 4c 49  ke sure the SQLI
16cf0 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67  TE_OPEN_URI flag
16d00 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63   is set to indic
16d10 61 74 65 20 74 6f 20 74 68 65 20 56 46 53 20 78  ate to the VFS x
16d20 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74  Open .    ** met
16d30 68 6f 64 20 74 68 61 74 20 74 68 65 72 65 20 6d  hod that there m
16d40 61 79 20 62 65 20 65 78 74 72 61 20 70 61 72 61  ay be extra para
16d50 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67  meters following
16d60 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20   the file-name. 
16d70 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   */.    flags |=
16d80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
16d90 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30  ;..    for(iIn=0
16da0 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b  ; iIn<nUri; iIn+
16db0 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72  +) nByte += (zUr
16dc0 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20  i[iIn]=='&');.  
16dd0 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65    zFile = sqlite
16de0 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 42 79 74 65  3_malloc64(nByte
16df0 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c  );.    if( !zFil
16e00 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
16e10 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 0a 20  E_NOMEM_BKPT;.. 
16e20 20 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66 64     iIn = 5;.#ifd
16e30 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57 5f  ef SQLITE_ALLOW_
16e40 55 52 49 5f 41 55 54 48 4f 52 49 54 59 0a 20 20  URI_AUTHORITY.  
16e50 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 55    if( strncmp(zU
16e60 72 69 2b 35 2c 20 22 2f 2f 2f 22 2c 20 33 29 3d  ri+5, "///", 3)=
16e70 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20  =0 ){.      iIn 
16e80 3d 20 37 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  = 7;.      /* Th
16e90 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64  e following cond
16ea0 69 74 69 6f 6e 20 63 61 75 73 65 73 20 55 52 49  ition causes URI
16eb0 73 20 77 69 74 68 20 66 69 76 65 20 6c 65 61 64  s with five lead
16ec0 69 6e 67 20 2f 20 63 68 61 72 61 63 74 65 72 73  ing / characters
16ed0 0a 20 20 20 20 20 20 2a 2a 20 6c 69 6b 65 20 66  .      ** like f
16ee0 69 6c 65 3a 2f 2f 2f 2f 2f 68 6f 73 74 2f 70 61  ile://///host/pa
16ef0 74 68 20 74 6f 20 62 65 20 63 6f 6e 76 65 72 74  th to be convert
16f00 65 64 20 69 6e 74 6f 20 55 4e 43 73 20 6c 69 6b  ed into UNCs lik
16f10 65 20 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 0a 20  e //host/path.. 
16f20 20 20 20 20 20 2a 2a 20 54 68 65 20 63 6f 72 72       ** The corr
16f30 65 63 74 20 55 52 49 20 66 6f 72 20 74 68 61 74  ect URI for that
16f40 20 55 4e 43 20 68 61 73 20 6f 6e 6c 79 20 74 77   UNC has only tw
16f50 6f 20 6f 72 20 66 6f 75 72 20 6c 65 61 64 69 6e  o or four leadin
16f60 67 20 2f 20 63 68 61 72 61 63 74 65 72 73 0a 20  g / characters. 
16f70 20 20 20 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 68       ** file://h
16f80 6f 73 74 2f 70 61 74 68 20 6f 72 20 66 69 6c 65  ost/path or file
16f90 3a 2f 2f 2f 2f 68 6f 73 74 2f 70 61 74 68 2e 20  :////host/path. 
16fa0 20 42 75 74 20 35 20 6c 65 61 64 69 6e 67 20 73   But 5 leading s
16fb0 6c 61 73 68 65 73 20 69 73 20 61 20 0a 20 20 20  lashes is a .   
16fc0 20 20 20 2a 2a 20 63 6f 6d 6d 6f 6e 20 65 72 72     ** common err
16fd0 6f 72 2c 20 77 65 20 61 72 65 20 74 6f 6c 64 2c  or, we are told,
16fe0 20 73 6f 20 77 65 20 68 61 6e 64 6c 65 20 69 74   so we handle it
16ff0 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61   as a special ca
17000 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  se. */.      if(
17010 20 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 37 2c   strncmp(zUri+7,
17020 20 22 2f 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b   "///", 3)==0 ){
17030 20 69 49 6e 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65   iIn++; }.    }e
17040 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
17050 7a 55 72 69 2b 35 2c 20 22 2f 2f 6c 6f 63 61 6c  zUri+5, "//local
17060 68 6f 73 74 2f 22 2c 20 31 32 29 3d 3d 30 20 29  host/", 12)==0 )
17070 7b 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 31 36  {.      iIn = 16
17080 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
17090 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65    /* Discard the
170a0 20 73 63 68 65 6d 65 20 61 6e 64 20 61 75 74 68   scheme and auth
170b0 6f 72 69 74 79 20 73 65 67 6d 65 6e 74 73 20 6f  ority segments o
170c0 66 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20 20  f the URI. */.  
170d0 20 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d 27    if( zUri[5]=='
170e0 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d 27  /' && zUri[6]=='
170f0 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 20  /' ){.      iIn 
17100 3d 20 37 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 7;.      while
17110 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a  ( zUri[iIn] && z
17120 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29 20  Uri[iIn]!='/' ) 
17130 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  iIn++;.      if(
17140 20 69 49 6e 21 3d 37 20 26 26 20 28 69 49 6e 21   iIn!=7 && (iIn!
17150 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22 6c  =16 || memcmp("l
17160 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72 69  ocalhost", &zUri
17170 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20 20  [7], 9)) ){.    
17180 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
17190 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
171a0 22 69 6e 76 61 6c 69 64 20 75 72 69 20 61 75 74  "invalid uri aut
171b0 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20 0a  hority: %.*s", .
171c0 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2d              iIn-
171d0 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20 20  7, &zUri[7]);.  
171e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
171f0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
17200 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f   goto parse_uri_
17210 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
17220 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
17230 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c 65 6e  * Copy the filen
17240 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75 65 72  ame and any quer
17250 79 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e 74  y parameters int
17260 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75 66 66  o the zFile buff
17270 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63 6f  er. .    ** Deco
17280 64 65 20 25 48 48 20 65 73 63 61 70 65 20 63 6f  de %HH escape co
17290 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20 77 61  des along the wa
172a0 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  y. .    **.    *
172b0 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  * Within this lo
172c0 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65 53 74  op, variable eSt
172d0 61 74 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ate may be set t
172e0 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64 65 70  o 0, 1 or 2, dep
172f0 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e  ending.    ** on
17300 20 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   the parsing con
17310 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77 73  text. As follows
17320 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
17330 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66 69 6c    0: Parsing fil
17340 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20 20  e-name..    **  
17350 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d 65   1: Parsing name
17360 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61   section of a na
17370 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70  me=value query p
17380 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2a  arameter..    **
17390 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20 76 61     2: Parsing va
173a0 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61  lue section of a
173b0 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72   name=value quer
173c0 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20  y parameter..   
173d0 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65 20 3d   */.    eState =
173e0 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28   0;.    while( (
173f0 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d  c = zUri[iIn])!=
17400 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b 0a 20  0 && c!='#' ){. 
17410 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20       iIn++;.    
17420 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a 20 20    if( c=='%' .  
17430 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49       && sqlite3I
17440 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e  sxdigit(zUri[iIn
17450 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20 73 71  ]) .       && sq
17460 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55  lite3Isxdigit(zU
17470 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20 20  ri[iIn+1]) .    
17480 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74    ){.        int
17490 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69 74 65   octet = (sqlite
174a0 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69  3HexToInt(zUri[i
174b0 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20 20  In++]) << 4);.  
174c0 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20 73        octet += s
174d0 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a  qlite3HexToInt(z
174e0 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20 20  Uri[iIn++]);..  
174f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 63        assert( oc
17500 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65 74 3c  tet>=0 && octet<
17510 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20 20 69  256 );.        i
17520 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a 23  f( octet==0 ){.#
17530 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
17540 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45 52 52 4f  ABLE_URI_00_ERRO
17550 52 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  R.          /* T
17560 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61  his branch is ta
17570 6b 65 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61  ken when "%00" a
17580 70 70 65 61 72 73 20 77 69 74 68 69 6e 20 74 68  ppears within th
17590 65 20 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20  e URI. In this. 
175a0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65           ** case
175b0 20 77 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74   we ignore all t
175c0 65 78 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69  ext in the remai
175d0 6e 64 65 72 20 6f 66 20 74 68 65 20 70 61 74 68  nder of the path
175e0 2c 20 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20  , name or.      
175f0 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72      ** value cur
17600 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72  rently being par
17610 73 65 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74  sed. So ignore t
17620 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 72 61  he current chara
17630 63 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  cter.          *
17640 2a 20 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68  * and skip to th
17650 65 20 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20  e next "?", "=" 
17660 6f 72 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f  or "&", as appro
17670 70 72 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20  priate. */.     
17680 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d       while( (c =
17690 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26   zUri[iIn])!=0 &
176a0 26 20 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20  & c!='#' .      
176b0 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
176c0 74 65 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29  te!=0 || c!='?')
176d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
176e0 26 20 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20  & (eState!=1 || 
176f0 28 63 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26  (c!='=' && c!='&
17700 27 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ')).            
17710 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 32 20    && (eState!=2 
17720 7c 7c 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20  || c!='&').     
17730 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
17740 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20      iIn++;.     
17750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17760 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 65 6c 73 65   continue;.#else
17770 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
17780 20 45 4e 41 42 4c 45 5f 55 52 49 5f 30 30 5f 45   ENABLE_URI_00_E
17790 52 52 4f 52 20 69 73 20 64 65 66 69 6e 65 64 2c  RROR is defined,
177a0 20 22 25 30 30 22 20 69 6e 20 61 20 55 52 49 20   "%00" in a URI 
177b0 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a  is an error. */.
177c0 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72            *pzErr
177d0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
177e0 72 69 6e 74 66 28 22 75 6e 65 78 70 65 63 74 65  rintf("unexpecte
177f0 64 20 25 25 30 30 20 69 6e 20 75 72 69 22 29 3b  d %%00 in uri");
17800 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
17810 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
17820 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72          goto par
17830 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 23 65 6e 64  se_uri_out;.#end
17840 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  if.        }.   
17850 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a       c = octet;.
17860 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
17870 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d  eState==1 && (c=
17880 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20  ='&' || c=='=') 
17890 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
178a0 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20  File[iOut-1]==0 
178b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
178c0 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20  An empty option 
178d0 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69  name. Ignore thi
178e0 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74  s option altoget
178f0 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  her. */.        
17900 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49    while( zUri[iI
17910 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21  n] && zUri[iIn]!
17920 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e  ='#' && zUri[iIn
17930 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b  -1]!='&' ) iIn++
17940 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
17950 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
17960 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
17970 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  &' ){.          
17980 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
17990 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65  '\0';.        }e
179a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65  lse{.          e
179b0 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20  State = 2;.     
179c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d     }.        c =
179d0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
179e0 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26  if( (eState==0 &
179f0 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53  & c=='?') || (eS
17a00 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26  tate==2 && c=='&
17a10 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  ') ){.        c 
17a20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74  = 0;.        eSt
17a30 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ate = 1;.      }
17a40 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75  .      zFile[iOu
17a50 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a  t++] = c;.    }.
17a60 20 20 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d      if( eState==
17a70 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b  1 ) zFile[iOut++
17a80 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
17a90 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
17aa0 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f  0';.    zFile[iO
17ab0 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  ut++] = '\0';.. 
17ac0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
17ad0 68 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70  here were any op
17ae0 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20  tions specified 
17af0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69  that should be i
17b00 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20 20 20  nterpreted .    
17b10 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73  ** here. Options
17b20 20 74 68 61 74 20 61 72 65 20 69 6e 74 65 72 70   that are interp
17b30 72 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75  reted here inclu
17b40 64 65 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f  de "vfs" and tho
17b50 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63  se that.    ** c
17b60 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61  orrespond to fla
17b70 67 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 70  gs that may be p
17b80 61 73 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c  assed to the sql
17b90 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20  ite3_open_v2(). 
17ba0 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f     ** method. */
17bb0 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69  .    zOpt = &zFi
17bc0 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  le[sqlite3Strlen
17bd0 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20  30(zFile)+1];.  
17be0 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d    while( zOpt[0]
17bf0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
17c00 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  pt = sqlite3Strl
17c10 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20  en30(zOpt);.    
17c20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26    char *zVal = &
17c30 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20  zOpt[nOpt+1];.  
17c40 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73      int nVal = s
17c50 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
17c60 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  Val);..      if(
17c70 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63   nOpt==3 && memc
17c80 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20  mp("vfs", zOpt, 
17c90 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  3)==0 ){.       
17ca0 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20   zVfs = zVal;.  
17cb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17cc0 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f     struct OpenMo
17cd0 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63  de {.          c
17ce0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
17cf0 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65          int mode
17d00 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f  ;.        } *aMo
17d10 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
17d20 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20  char *zModeType 
17d30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
17d40 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20   mask = 0;.     
17d50 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30     int limit = 0
17d60 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ;..        if( n
17d70 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70  Opt==5 && memcmp
17d80 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20  ("cache", zOpt, 
17d90 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  5)==0 ){.       
17da0 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
17db0 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65   OpenMode aCache
17dc0 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Mode[] = {.     
17dd0 20 20 20 20 20 20 20 7b 20 22 73 68 61 72 65 64         { "shared
17de0 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
17df0 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20  SHAREDCACHE },. 
17e00 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 70 72             { "pr
17e10 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f  ivate", SQLITE_O
17e20 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
17e30 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
17e40 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20  { 0, 0 }.       
17e50 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20     };..         
17e60 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f   mask = SQLITE_O
17e70 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c  PEN_SHAREDCACHE|
17e80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
17e90 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20  ATECACHE;.      
17ea0 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63      aMode = aCac
17eb0 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  heMode;.        
17ec0 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a    limit = mask;.
17ed0 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
17ee0 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20  ype = "cache";. 
17ef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17f00 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20   if( nOpt==4 && 
17f10 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a  memcmp("mode", z
17f20 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20  Opt, 4)==0 ){.  
17f30 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73          static s
17f40 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61  truct OpenMode a
17f50 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20  OpenMode[] = {. 
17f60 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f             { "ro
17f70 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
17f80 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20  READONLY },.    
17f90 20 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20          { "rw", 
17fa0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
17fb0 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20  DWRITE }, .     
17fc0 20 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20         { "rwc", 
17fd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
17fe0 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
17ff0 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20  PEN_CREATE },.  
18000 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d            { "mem
18010 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ory", SQLITE_OPE
18020 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20  N_MEMORY },.    
18030 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d          { 0, 0 }
18040 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20  .          };.. 
18050 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20           mask = 
18060 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
18070 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50  ONLY | SQLITE_OP
18080 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20  EN_READWRITE.   
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180a0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
180b0 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
180c0 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20  EN_MEMORY;.     
180d0 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70       aMode = aOp
180e0 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  enMode;.        
180f0 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26    limit = mask &
18100 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20   flags;.        
18110 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 61    zModeType = "a
18120 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20 20 20  ccess";.        
18130 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  }..        if( a
18140 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
18150 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
18160 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b     int mode = 0;
18170 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
18180 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20  =0; aMode[i].z; 
18190 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
181a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
181b0 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20  = aMode[i].z;.  
181c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 56            if( nV
181d0 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65  al==sqlite3Strle
181e0 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d  n30(z) && 0==mem
181f0 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61  cmp(zVal, z, nVa
18200 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
18210 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65      mode = aMode
18220 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20  [i].mode;.      
18230 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18240 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
18250 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18260 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29     if( mode==0 )
18270 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
18280 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
18290 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75  3_mprintf("no su
182a0 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c  ch %s mode: %s",
182b0 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c   zModeType, zVal
182c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
182d0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
182e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
182f0 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
18300 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
18310 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 6f 64          if( (mod
18320 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  e & ~SQLITE_OPEN
18330 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29  _MEMORY)>limit )
18340 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
18350 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
18360 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f  3_mprintf("%s mo
18370 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20  de not allowed: 
18380 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
18390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f               zMo
183b0 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20  deType, zVal);. 
183c0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
183d0 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
183e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61           goto pa
183f0 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
18400 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18410 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67     flags = (flag
18420 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64  s & ~mask) | mod
18430 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
18440 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74     }..      zOpt
18450 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d   = &zVal[nVal+1]
18460 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
18470 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71  {.    zFile = sq
18480 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
18490 55 72 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20  Uri+2);.    if( 
184a0 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  !zFile ) return 
184b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
184c0 54 3b 0a 20 20 20 20 69 66 28 20 6e 55 72 69 20  T;.    if( nUri 
184d0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
184e0 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72  zFile, zUri, nUr
184f0 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46  i);.    }.    zF
18500 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27  ile[nUri] = '\0'
18510 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69  ;.    zFile[nUri
18520 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  +1] = '\0';.    
18530 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
18540 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a  _OPEN_URI;.  }..
18550 20 20 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74    *ppVfs = sqlit
18560 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73  e3_vfs_find(zVfs
18570 29 3b 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d  );.  if( *ppVfs=
18580 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72  =0 ){.    *pzErr
18590 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
185a0 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76  rintf("no such v
185b0 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a  fs: %s", zVfs);.
185c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
185d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73  ERROR;.  }. pars
185e0 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28  e_uri_out:.  if(
185f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18600 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
18610 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a  ee(zFile);.    z
18620 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  File = 0;.  }.  
18630 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  *pFlags = flags;
18640 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69  .  *pzFile = zFi
18650 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  le;.  return rc;
18660 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
18670 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 55  SQLITE_ENABLE_AU
18680 54 4f 5f 50 52 4f 46 49 4c 45 29 0a 23 64 65 66  TO_PROFILE).#def
18690 69 6e 65 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c  ine SQLITE_AUTOL
186a0 4f 47 47 49 4e 47 5f 53 54 44 45 52 52 20 31 0a  OGGING_STDERR 1.
186b0 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 41  #define SQLITE_A
186c0 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f  UTOLOGGING_SYSLO
186d0 47 20 32 0a 73 74 61 74 69 63 20 76 6f 69 64 20  G 2.static void 
186e0 65 6e 61 62 6c 65 41 75 74 6f 4c 6f 67 67 69 6e  enableAutoLoggin
186f0 67 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  g(.  sqlite3 *db
18700 0a 29 7b 0a 20 20 63 68 61 72 20 2a 65 6e 76 70  .){.  char *envp
18710 72 6f 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28  rofile = getenv(
18720 22 53 51 4c 49 54 45 5f 41 55 54 4f 5f 50 52 4f  "SQLITE_AUTO_PRO
18730 46 49 4c 45 22 29 3b 0a 20 20 0a 20 20 69 66 28  FILE");.  .  if(
18740 20 65 6e 76 70 72 6f 66 69 6c 65 21 3d 4e 55 4c   envprofile!=NUL
18750 4c 20 29 7b 0a 20 20 20 20 69 6e 74 20 77 68 65  L ){.    int whe
18760 72 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  re = 0;.    if( 
18770 21 73 74 72 6e 63 61 73 65 63 6d 70 28 22 31 22  !strncasecmp("1"
18780 2c 20 65 6e 76 70 72 6f 66 69 6c 65 2c 20 31 29  , envprofile, 1)
18790 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
187a0 61 74 74 79 28 32 29 20 29 7b 0a 20 20 20 20 20  atty(2) ){.     
187b0 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54     where = SQLIT
187c0 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54  E_AUTOLOGGING_ST
187d0 44 45 52 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  DERR;.      }els
187e0 65 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65  e{.        where
187f0 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f   = SQLITE_AUTOLO
18800 47 47 49 4e 47 5f 53 59 53 4c 4f 47 3b 0a 20 20  GGING_SYSLOG;.  
18810 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
18820 20 69 66 28 20 21 73 74 72 6e 63 61 73 65 63 6d   if( !strncasecm
18830 70 28 22 73 74 64 65 72 72 22 2c 20 65 6e 76 70  p("stderr", envp
18840 72 6f 66 69 6c 65 2c 20 36 29 20 29 7b 0a 20 20  rofile, 6) ){.  
18850 20 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49      where = SQLI
18860 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53  TE_AUTOLOGGING_S
18870 54 44 45 52 52 3b 0a 20 20 20 20 7d 20 65 6c 73  TDERR;.    } els
18880 65 20 69 66 28 20 21 73 74 72 6e 63 61 73 65 63  e if( !strncasec
18890 6d 70 28 22 73 79 73 6c 6f 67 22 2c 20 65 6e 76  mp("syslog", env
188a0 70 72 6f 66 69 6c 65 2c 20 36 29 20 29 7b 0a 20  profile, 6) ){. 
188b0 20 20 20 20 20 77 68 65 72 65 20 3d 20 53 51 4c       where = SQL
188c0 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f  ITE_AUTOLOGGING_
188d0 53 59 53 4c 4f 47 3b 0a 20 20 20 20 7d 0a 20 20  SYSLOG;.    }.  
188e0 20 20 69 66 28 20 77 68 65 72 65 3d 3d 53 51 4c    if( where==SQL
188f0 49 54 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f  ITE_AUTOLOGGING_
18900 53 54 44 45 52 52 20 29 7b 0a 20 20 20 20 20 20  STDERR ){.      
18910 73 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28  sqlite3_profile(
18920 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f  db, _sqlite_auto
18930 5f 70 72 6f 66 69 6c 65 2c 20 64 62 29 3b 0a 20  _profile, db);. 
18940 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65     }else if( whe
18950 72 65 3d 3d 53 51 4c 49 54 45 5f 41 55 54 4f 4c  re==SQLITE_AUTOL
18960 4f 47 47 49 4e 47 5f 53 59 53 4c 4f 47 20 29 7b  OGGING_SYSLOG ){
18970 0a 20 20 20 20 20 20 5f 6f 70 65 6e 5f 61 73 6c  .      _open_asl
18980 5f 6c 6f 67 28 29 3b 0a 20 20 20 20 20 20 73 71  _log();.      sq
18990 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 64 62  lite3_profile(db
189a0 2c 20 5f 73 71 6c 69 74 65 5f 61 75 74 6f 5f 70  , _sqlite_auto_p
189b0 72 6f 66 69 6c 65 5f 73 79 73 6c 6f 67 2c 20 64  rofile_syslog, d
189c0 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
189d0 63 68 61 72 20 2a 65 6e 76 74 72 61 63 65 20 3d  char *envtrace =
189e0 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
189f0 41 55 54 4f 5f 54 52 41 43 45 22 29 3b 0a 20 20  AUTO_TRACE");.  
18a00 69 66 28 20 65 6e 76 74 72 61 63 65 21 3d 4e 55  if( envtrace!=NU
18a10 4c 4c 20 29 7b 0a 20 20 20 20 69 6e 74 20 77 68  LL ){.    int wh
18a20 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ere = 0;.    if(
18a30 20 21 73 74 72 6e 63 61 73 65 63 6d 70 28 22 31   !strncasecmp("1
18a40 22 2c 20 65 6e 76 74 72 61 63 65 2c 20 31 29 20  ", envtrace, 1) 
18a50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73 61  ){.      if( isa
18a60 74 74 79 28 32 29 20 29 7b 0a 20 20 20 20 20 20  tty(2) ){.      
18a70 20 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45    where = SQLITE
18a80 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44  _AUTOLOGGING_STD
18a90 45 52 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ERR;.      }else
18aa0 7b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 20  {.        where 
18ab0 3d 20 53 51 4c 49 54 45 5f 41 55 54 4f 4c 4f 47  = SQLITE_AUTOLOG
18ac0 47 49 4e 47 5f 53 59 53 4c 4f 47 3b 0a 20 20 20  GING_SYSLOG;.   
18ad0 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
18ae0 69 66 28 20 21 73 74 72 6e 63 61 73 65 63 6d 70  if( !strncasecmp
18af0 28 22 73 74 64 65 72 72 22 2c 20 65 6e 76 74 72  ("stderr", envtr
18b00 61 63 65 2c 20 36 29 20 29 7b 0a 20 20 20 20 20  ace, 6) ){.     
18b10 20 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45 5f   where = SQLITE_
18b20 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44 45  AUTOLOGGING_STDE
18b30 52 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  RR;.    } else i
18b40 66 28 20 21 73 74 72 6e 63 61 73 65 63 6d 70 28  f( !strncasecmp(
18b50 22 73 79 73 6c 6f 67 22 2c 20 65 6e 76 74 72 61  "syslog", envtra
18b60 63 65 2c 20 36 29 20 29 7b 0a 20 20 20 20 20 20  ce, 6) ){.      
18b70 77 68 65 72 65 20 3d 20 53 51 4c 49 54 45 5f 41  where = SQLITE_A
18b80 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59 53 4c 4f  UTOLOGGING_SYSLO
18b90 47 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  G;.    }.    if(
18ba0 20 77 68 65 72 65 3d 3d 53 51 4c 49 54 45 5f 41   where==SQLITE_A
18bb0 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 54 44 45 52  UTOLOGGING_STDER
18bc0 52 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R ){.      sqlit
18bd0 65 33 5f 74 72 61 63 65 28 64 62 2c 20 5f 73 71  e3_trace(db, _sq
18be0 6c 69 74 65 5f 61 75 74 6f 5f 74 72 61 63 65 2c  lite_auto_trace,
18bf0 20 64 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20   db);.    }else 
18c00 69 66 28 20 77 68 65 72 65 3d 3d 53 51 4c 49 54  if( where==SQLIT
18c10 45 5f 41 55 54 4f 4c 4f 47 47 49 4e 47 5f 53 59  E_AUTOLOGGING_SY
18c20 53 4c 4f 47 20 29 7b 0a 20 20 20 20 20 20 5f 6f  SLOG ){.      _o
18c30 70 65 6e 5f 61 73 6c 5f 6c 6f 67 28 29 3b 0a 20  pen_asl_log();. 
18c40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61       sqlite3_tra
18c50 63 65 28 64 62 2c 20 5f 73 71 6c 69 74 65 5f 61  ce(db, _sqlite_a
18c60 75 74 6f 5f 74 72 61 63 65 5f 73 79 73 6c 6f 67  uto_trace_syslog
18c70 2c 20 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , db);.    }.  }
18c80 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .}.#endif..#if d
18c90 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
18ca0 53 5f 43 4f 44 45 43 29 0a 2f 2a 0a 2a 2a 20 50  S_CODEC)./*.** P
18cb0 72 6f 63 65 73 73 20 55 52 49 20 66 69 6c 65 6e  rocess URI filen
18cc0 61 6d 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  ame query parame
18cd0 74 65 72 73 20 72 65 6c 65 76 61 6e 74 20 74 6f  ters relevant to
18ce0 20 74 68 65 20 53 51 4c 69 74 65 20 45 6e 63 72   the SQLite Encr
18cf0 79 70 74 69 6f 6e 0a 2a 2a 20 45 78 74 65 6e 73  yption.** Extens
18d00 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 74 72 75  ion.  Return tru
18d10 65 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  e if any of the 
18d20 72 65 6c 65 76 61 6e 74 20 71 75 65 72 79 20 70  relevant query p
18d30 61 72 61 6d 65 74 65 72 73 20 61 72 65 0a 2a 2a  arameters are.**
18d40 20 73 65 65 6e 20 61 6e 64 20 72 65 74 75 72 6e   seen and return
18d50 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
18d60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64  /.int sqlite3Cod
18d70 65 63 51 75 65 72 79 50 61 72 61 6d 65 74 65 72  ecQueryParameter
18d80 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s(.  sqlite3 *db
18d90 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ,           /* D
18da0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
18db0 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  on */.  const ch
18dc0 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f  ar *zDb,       /
18dd0 2a 20 57 68 69 63 68 20 73 63 68 65 6d 61 20 69  * Which schema i
18de0 73 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 2f  s being created/
18df0 61 74 74 61 63 68 65 64 20 2a 2f 0a 20 20 63 6f  attached */.  co
18e00 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 20 20  nst char *zUri  
18e10 20 20 20 20 20 2f 2a 20 55 52 49 20 66 69 6c 65       /* URI file
18e20 6e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  name */.){.  con
18e30 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20  st char *zKey;. 
18e40 20 69 66 28 20 28 7a 4b 65 79 20 3d 20 73 71 6c   if( (zKey = sql
18e50 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74  ite3_uri_paramet
18e60 65 72 28 7a 55 72 69 2c 20 22 68 65 78 6b 65 79  er(zUri, "hexkey
18e70 22 29 29 21 3d 30 20 26 26 20 7a 4b 65 79 5b 30  "))!=0 && zKey[0
18e80 5d 20 29 7b 0a 20 20 20 20 75 38 20 69 42 79 74  ] ){.    u8 iByt
18e90 65 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  e;.    int i;.  
18ea0 20 20 63 68 61 72 20 7a 44 65 63 6f 64 65 64 5b    char zDecoded[
18eb0 34 30 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  40];.    for(i=0
18ec0 2c 20 69 42 79 74 65 3d 30 3b 20 69 3c 73 69 7a  , iByte=0; i<siz
18ed0 65 6f 66 28 7a 44 65 63 6f 64 65 64 29 2a 32 20  eof(zDecoded)*2 
18ee0 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67  && sqlite3Isxdig
18ef0 69 74 28 7a 4b 65 79 5b 69 5d 29 3b 20 69 2b 2b  it(zKey[i]); i++
18f00 29 7b 0a 20 20 20 20 20 20 69 42 79 74 65 20 3d  ){.      iByte =
18f10 20 28 69 42 79 74 65 3c 3c 34 29 20 2b 20 73 71   (iByte<<4) + sq
18f20 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a 4b  lite3HexToInt(zK
18f30 65 79 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  ey[i]);.      if
18f40 28 20 28 69 26 31 29 21 3d 30 20 29 20 7a 44 65  ( (i&1)!=0 ) zDe
18f50 63 6f 64 65 64 5b 69 2f 32 5d 20 3d 20 69 42 79  coded[i/2] = iBy
18f60 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  te;.    }.    sq
18f70 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64 62 2c  lite3_key_v2(db,
18f80 20 7a 44 62 2c 20 7a 44 65 63 6f 64 65 64 2c 20   zDb, zDecoded, 
18f90 69 2f 32 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  i/2);.    return
18fa0 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
18fb0 28 7a 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f  (zKey = sqlite3_
18fc0 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 55  uri_parameter(zU
18fd0 72 69 2c 20 22 6b 65 79 22 29 29 21 3d 30 20 29  ri, "key"))!=0 )
18fe0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6b 65  {.    sqlite3_ke
18ff0 79 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 7a 4b  y_v2(db, zDb, zK
19000 65 79 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  ey, sqlite3Strle
19010 6e 33 30 28 7a 4b 65 79 29 29 3b 0a 20 20 20 20  n30(zKey));.    
19020 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73  return 1;.  }els
19030 65 20 69 66 28 20 28 7a 4b 65 79 20 3d 20 73 71  e if( (zKey = sq
19040 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
19050 74 65 72 28 7a 55 72 69 2c 20 22 74 65 78 74 6b  ter(zUri, "textk
19060 65 79 22 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ey"))!=0 ){.    
19070 73 71 6c 69 74 65 33 5f 6b 65 79 5f 76 32 28 64  sqlite3_key_v2(d
19080 62 2c 20 7a 44 62 2c 20 7a 4b 65 79 2c 20 2d 31  b, zDb, zKey, -1
19090 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
190a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
190b0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  turn 0;.  }.}.#e
190c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
190d0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
190e0 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e  e work of openin
190f0 67 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20  g a database on 
19100 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c  behalf of.** sql
19110 69 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20  ite3_open() and 
19120 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29  sqlite3_open16()
19130 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  . The database f
19140 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61  ilename "zFilena
19150 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d  me"  .** is UTF-
19160 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74  8 encoded..*/.st
19170 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74  atic int openDat
19180 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63  abase(.  const c
19190 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
191a0 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
191b0 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64  name UTF-8 encod
191c0 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ed */.  sqlite3 
191d0 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f  **ppDb,        /
191e0 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20  * OUT: Returned 
191f0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
19200 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  */.  unsigned in
19210 74 20 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f  t flags,    /* O
19220 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73  perational flags
19230 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
19240 20 2a 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20   *zVfs       /* 
19250 4e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  Name of the VFS 
19260 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73  to use */.){.  s
19270 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
19280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19290 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65  * Store allocate
192a0 64 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  d handle here */
192b0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
192c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192d0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
192e0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68 72  e */.  int isThr
192f0 65 61 64 73 61 66 65 3b 20 20 20 20 20 20 20 20  eadsafe;        
19300 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
19310 6f 72 20 74 68 72 65 61 64 73 61 66 65 20 63 6f  or threadsafe co
19320 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63  nnections */.  c
19330 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20  har *zOpen = 0; 
19340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19350 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d  * Filename argum
19360 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 42  ent to pass to B
19370 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  treeOpen() */.  
19380 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
19390 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
193a0 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  /* Error message
193b0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 50 61 72   from sqlite3Par
193c0 73 65 55 72 69 28 29 20 2a 2f 0a 0a 23 69 66 64  seUri() */..#ifd
193d0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
193e0 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
193f0 20 70 70 44 62 3d 3d 30 20 29 20 72 65 74 75 72   ppDb==0 ) retur
19400 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
19410 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a  BKPT;.#endif.  *
19420 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65  ppDb = 0;.#ifnde
19430 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
19440 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71  TOINIT.  rc = sq
19450 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
19460 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ();.  if( rc ) r
19470 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
19480 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  ..  if( sqlite3G
19490 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
194a0 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  eMutex==0 ){.   
194b0 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
194c0 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  0;.  }else if( f
194d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
194e0 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20  EN_NOMUTEX ){.  
194f0 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
19500 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
19510 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
19520 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b  PEN_FULLMUTEX ){
19530 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
19540 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 1;.  }else{.
19550 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
19560 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
19570 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
19580 78 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 66 6c  x;.  }..  if( fl
19590 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
195a0 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 29  N_PRIVATECACHE )
195b0 7b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e  {.    flags &= ~
195c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
195d0 45 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65  EDCACHE;.  }else
195e0 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
195f0 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43  alConfig.sharedC
19600 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20  acheEnabled ){. 
19610 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
19620 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
19630 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  CHE;.  }..  /* R
19640 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69  emove harmful bi
19650 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67  ts from the flag
19660 73 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a  s parameter.  **
19670 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  .  ** The SQLITE
19680 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e  _OPEN_NOMUTEX an
19690 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  d SQLITE_OPEN_FU
196a0 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65  LLMUTEX flags we
196b0 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69  re.  ** dealt wi
196c0 74 68 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  th in the previo
196d0 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20  us code block.  
196e0 42 65 73 69 64 65 73 20 74 68 65 73 65 2c 20 74  Besides these, t
196f0 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c  he only.  ** val
19700 69 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66  id input flags f
19710 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  or sqlite3_open_
19720 76 32 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f  v2() are SQLITE_
19730 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20  OPEN_READONLY,. 
19740 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ** SQLITE_OPEN_
19750 52 45 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54  READWRITE, SQLIT
19760 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53  E_OPEN_CREATE, S
19770 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
19780 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c  DCACHE,.  ** SQL
19790 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
197a0 43 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20  CACHE, and some 
197b0 72 65 73 65 72 76 65 64 20 62 69 74 73 2e 20 20  reserved bits.  
197c0 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20  Silently mask.  
197d0 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72  ** off all other
197e0 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66   flags..  */.  f
197f0 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49  lags &=  ~( SQLI
19800 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
19810 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20  CLOSE |.        
19820 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
19830 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20  EN_EXCLUSIVE |. 
19840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
19850 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
19860 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  B |.            
19870 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
19880 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20  EMP_DB | .      
19890 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
198a0 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
198b0 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  B | .           
198c0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
198d0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a  MAIN_JOURNAL | .
198e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
198f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
19900 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20  JOURNAL | .     
19910 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
19920 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
19930 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
19940 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
19950 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a  ASTER_JOURNAL |.
19960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
19970 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
19980 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EX |.           
19990 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
199a0 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20  FULLMUTEX |.    
199b0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
199c0 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20  E_OPEN_WAL.     
199d0 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a          );..  /*
199e0 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
199f0 6c 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74  lite data struct
19a00 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71  ure */.  db = sq
19a10 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
19a20 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29   sizeof(sqlite3)
19a30 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20   );.  if( db==0 
19a40 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75  ) goto opendb_ou
19a50 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65 61  t;.  if( isThrea
19a60 64 73 61 66 65 20 0a 23 69 66 64 65 66 20 53 51  dsafe .#ifdef SQ
19a70 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 55 4c 54  LITE_ENABLE_MULT
19a80 49 54 48 52 45 41 44 45 44 5f 43 48 45 43 4b 53  ITHREADED_CHECKS
19a90 0a 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c  .   || sqlite3Gl
19aa0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
19ab0 4d 75 74 65 78 0a 23 65 6e 64 69 66 0a 20 20 29  Mutex.#endif.  )
19ac0 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20  {.    db->mutex 
19ad0 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
19ae0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
19af0 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20  _RECURSIVE);.   
19b00 20 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d   if( db->mutex==
19b10 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
19b20 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20  e3_free(db);.   
19b30 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20     db = 0;.     
19b40 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
19b50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19b60 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30 20  isThreadsafe==0 
19b70 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
19b80 4d 75 74 65 78 57 61 72 6e 4f 6e 43 6f 6e 74 65  MutexWarnOnConte
19b90 6e 74 69 6f 6e 28 64 62 2d 3e 6d 75 74 65 78 29  ntion(db->mutex)
19ba0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
19bb0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
19bc0 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
19bd0 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78  db->errMask = 0x
19be0 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20  ff;.  db->nDb = 
19bf0 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  2;.  db->magic =
19c00 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55   SQLITE_MAGIC_BU
19c10 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20  SY;.  db->aDb = 
19c20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20  db->aDbStatic;. 
19c30 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
19c40 44 69 73 61 62 6c 65 20 3d 20 31 3b 0a 0a 20 20  Disable = 1;..  
19c50 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64  assert( sizeof(d
19c60 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65  b->aLimit)==size
19c70 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29  of(aHardLimit) )
19c80 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61  ;.  memcpy(db->a
19c90 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69  Limit, aHardLimi
19ca0 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c  t, sizeof(db->aL
19cb0 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 4c  imit));.  db->aL
19cc0 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
19cd0 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
19ce0 5d 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  ] = SQLITE_DEFAU
19cf0 4c 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  LT_WORKER_THREAD
19d00 53 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  S;.  db->autoCom
19d10 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e  mit = 1;.  db->n
19d20 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b  extAutovac = -1;
19d30 0a 20 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20  .  db->szMmap = 
19d40 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
19d50 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62  fig.szMmap;.  db
19d60 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d  ->nextPagesize =
19d70 20 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61 78 53 6f   0;.  db->nMaxSo
19d80 72 74 65 72 4d 6d 61 70 20 3d 20 30 78 37 46 46  rterMmap = 0x7FF
19d90 46 46 46 46 46 3b 0a 20 20 64 62 2d 3e 66 6c 61  FFFFF;.  db->fla
19da0 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f  gs |= SQLITE_Sho
19db0 72 74 43 6f 6c 4e 61 6d 65 73 0a 20 20 20 20 20  rtColNames.     
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
19dd0 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67  LITE_EnableTrigg
19de0 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  er.             
19df0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 43 61 63      | SQLITE_Cac
19e00 68 65 53 70 69 6c 6c 0a 0a 2f 2a 20 54 68 65 20  heSpill../* The 
19e10 53 51 4c 49 54 45 5f 44 51 53 20 63 6f 6d 70 69  SQLITE_DQS compi
19e20 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 64  le-time option d
19e30 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 64 65  etermines the de
19e40 66 61 75 6c 74 20 73 65 74 74 69 6e 67 73 0a 2a  fault settings.*
19e50 2a 20 66 6f 72 20 53 51 4c 49 54 45 5f 44 42 43  * for SQLITE_DBC
19e60 4f 4e 46 49 47 5f 44 51 53 5f 44 44 4c 20 61 6e  ONFIG_DQS_DDL an
19e70 64 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  d SQLITE_DBCONFI
19e80 47 5f 44 51 53 5f 44 4d 4c 2e 0a 2a 2a 0a 2a 2a  G_DQS_DML..**.**
19e90 20 20 20 20 53 51 4c 49 54 45 5f 44 51 53 20 20      SQLITE_DQS  
19ea0 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
19eb0 49 47 5f 44 51 53 5f 44 44 4c 20 20 20 20 53 51  IG_DQS_DDL    SQ
19ec0 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 44 51  LITE_DBCONFIG_DQ
19ed0 53 5f 44 4d 4c 0a 2a 2a 20 20 20 20 2d 2d 2d 2d  S_DML.**    ----
19ee0 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
19ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19f00 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --    ----------
19f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
19f20 20 20 20 20 20 75 6e 64 65 66 69 6e 65 64 20 20       undefined  
19f30 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 20               on 
19f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f50 20 20 20 20 20 20 20 20 20 6f 6e 20 20 20 0a 2a           on   .*
19f60 2a 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20  *         3     
19f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e                on
19f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f90 20 20 20 20 20 20 20 20 20 20 6f 6e 0a 2a 2a 20            on.** 
19fa0 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20          2       
19fb0 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 20 20              on  
19fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fd0 20 20 20 20 20 20 20 6f 66 66 0a 2a 2a 20 20 20         off.**   
19fe0 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
19ff0 20 20 20 20 20 20 20 20 20 6f 66 66 20 20 20 20           off    
1a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a010 20 20 20 20 20 20 6f 6e 0a 2a 2a 20 20 20 20 20        on.**     
1a020 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
1a030 20 20 20 20 20 20 20 6f 66 66 20 20 20 20 20 20         off      
1a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a050 20 20 20 6f 66 66 0a 2a 2a 0a 2a 2a 20 4c 65 67     off.**.** Leg
1a060 61 63 79 20 62 65 68 61 76 69 6f 72 20 69 73 20  acy behavior is 
1a070 33 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64  3 (double-quoted
1a080 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73   string literals
1a090 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 61 6e 79   are allowed any
1a0a0 77 68 65 72 65 29 0a 2a 2a 20 61 6e 64 20 73 6f  where).** and so
1a0b0 20 74 68 61 74 20 69 73 20 74 68 65 20 64 65 66   that is the def
1a0c0 61 75 6c 74 2e 20 20 42 75 74 20 64 65 76 65 6c  ault.  But devel
1a0d0 6f 70 65 72 73 20 61 72 65 20 65 6e 63 6f 75 72  opers are encour
1a0e0 61 6e 67 65 64 20 74 6f 20 75 73 65 0a 2a 2a 20  anged to use.** 
1a0f0 2d 44 53 51 4c 49 54 45 5f 44 51 53 3d 30 20 28  -DSQLITE_DQS=0 (
1a100 62 65 73 74 29 20 6f 72 20 2d 44 53 51 4c 49 54  best) or -DSQLIT
1a110 45 5f 44 51 53 3d 31 20 28 73 65 63 6f 6e 64 20  E_DQS=1 (second 
1a120 63 68 6f 69 63 65 29 20 69 66 20 70 6f 73 73 69  choice) if possi
1a130 62 6c 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ble..*/.#if !def
1a140 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 51 53 29  ined(SQLITE_DQS)
1a150 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
1a160 5f 44 51 53 20 33 0a 23 65 6e 64 69 66 0a 23 69  _DQS 3.#endif.#i
1a170 66 20 28 53 51 4c 49 54 45 5f 44 51 53 26 31 29  f (SQLITE_DQS&1)
1a180 3d 3d 31 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==1.            
1a190 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 44 71       | SQLITE_Dq
1a1a0 73 44 4d 4c 0a 23 65 6e 64 69 66 0a 23 69 66 20  sDML.#endif.#if 
1a1b0 28 53 51 4c 49 54 45 5f 44 51 53 26 32 29 3d 3d  (SQLITE_DQS&2)==
1a1c0 32 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2.              
1a1d0 20 20 20 7c 20 53 51 4c 49 54 45 5f 44 71 73 44     | SQLITE_DqsD
1a1e0 44 4c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  DL.#endif..#if !
1a1f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1a200 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43  EFAULT_AUTOMATIC
1a210 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51 4c 49 54  _INDEX) || SQLIT
1a220 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41  E_DEFAULT_AUTOMA
1a230 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 20 20  TIC_INDEX.      
1a240 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
1a250 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65  ITE_AutoIndex.#e
1a260 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1a270 44 45 46 41 55 4c 54 5f 43 4b 50 54 46 55 4c 4c  DEFAULT_CKPTFULL
1a280 46 53 59 4e 43 0a 20 20 20 20 20 20 20 20 20 20  FSYNC.          
1a290 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
1a2a0 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63 0a 23 65  CkptFullFSync.#e
1a2b0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1a2c0 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52  DEFAULT_FILE_FOR
1a2d0 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20 20 20  MAT<4.          
1a2e0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
1a2f0 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a 23 65  LegacyFileFmt.#e
1a300 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1a310 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45  TE_ENABLE_LOAD_E
1a320 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20  XTENSION.       
1a330 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
1a340 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e  TE_LoadExtension
1a350 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
1a360 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43 55 52  TE_DEFAULT_RECUR
1a370 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a 20 20  SIVE_TRIGGERS.  
1a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1a390 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67   SQLITE_RecTrigg
1a3a0 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ers.#endif.#if d
1a3b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
1a3c0 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
1a3d0 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f 44 45  YS) && SQLITE_DE
1a3e0 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  FAULT_FOREIGN_KE
1a3f0 59 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  YS.             
1a400 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72      | SQLITE_For
1a410 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a  eignKeys.#endif.
1a420 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1a430 54 45 5f 52 45 56 45 52 53 45 5f 55 4e 4f 52 44  TE_REVERSE_UNORD
1a440 45 52 45 44 5f 53 45 4c 45 43 54 53 29 0a 20 20  ERED_SELECTS).  
1a450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
1a460 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f   SQLITE_ReverseO
1a470 72 64 65 72 0a 23 65 6e 64 69 66 0a 23 69 66 20  rder.#endif.#if 
1a480 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1a490 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
1a4a0 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 20  ELL_CHECK).     
1a4b0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
1a4c0 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 0a  LITE_CellSizeCk.
1a4d0 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
1a4e0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1a4f0 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 29  _FTS3_TOKENIZER)
1a500 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a510 20 20 7c 20 53 51 4c 49 54 45 5f 46 74 73 33 54    | SQLITE_Fts3T
1a520 6f 6b 65 6e 69 7a 65 72 0a 23 65 6e 64 69 66 0a  okenizer.#endif.
1a530 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1a540 54 45 5f 45 4e 41 42 4c 45 5f 51 50 53 47 29 0a  TE_ENABLE_QPSG).
1a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a560 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65   | SQLITE_Enable
1a570 51 50 53 47 0a 23 65 6e 64 69 66 0a 23 69 66 20  QPSG.#endif.#if 
1a580 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1a590 45 46 41 55 4c 54 5f 44 45 46 45 4e 53 49 56 45  EFAULT_DEFENSIVE
1a5a0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1a5b0 20 20 20 7c 20 53 51 4c 49 54 45 5f 44 65 66 65     | SQLITE_Defe
1a5c0 6e 73 69 76 65 0a 23 65 6e 64 69 66 0a 20 20 20  nsive.#endif.   
1a5d0 20 20 20 3b 0a 20 20 73 71 6c 69 74 65 33 48 61     ;.  sqlite3Ha
1a5e0 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c  shInit(&db->aCol
1a5f0 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53  lSeq);.#ifndef S
1a600 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1a610 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65  ALTABLE.  sqlite
1a620 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61  3HashInit(&db->a
1a630 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  Module);.#endif.
1a640 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65  .  /* Add the de
1a650 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
1a660 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e  sequence BINARY.
1a670 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f   BINARY works fo
1a680 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a  r both UTF-8.  *
1a690 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f  * and UTF-16, so
1a6a0 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66   add a version f
1a6b0 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64  or each to avoid
1a6c0 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79   any unnecessary
1a6d0 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e  .  ** conversion
1a6e0 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f  s. The only erro
1a6f0 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72  r that can occur
1a700 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f   here is a mallo
1a710 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a  c() failure..  *
1a720 2a 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d  *.  ** EVIDENCE-
1a730 4f 46 3a 20 52 2d 35 32 37 38 36 2d 34 34 38 37  OF: R-52786-4487
1a740 38 20 53 51 4c 69 74 65 20 64 65 66 69 6e 65 73  8 SQLite defines
1a750 20 74 68 72 65 65 20 62 75 69 6c 74 2d 69 6e 20   three built-in 
1a760 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 2a 2a 20 66  collating.  ** f
1a770 75 6e 63 74 69 6f 6e 73 3a 0a 20 20 2a 2f 0a 20  unctions:.  */. 
1a780 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
1a790 28 64 62 2c 20 73 71 6c 69 74 65 33 53 74 72 42  (db, sqlite3StrB
1a7a0 49 4e 41 52 59 2c 20 53 51 4c 49 54 45 5f 55 54  INARY, SQLITE_UT
1a7b0 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75  F8, 0, binCollFu
1a7c0 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
1a7d0 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 73 71  Collation(db, sq
1a7e0 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 2c 20  lite3StrBINARY, 
1a7f0 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20  SQLITE_UTF16BE, 
1a800 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20  0, binCollFunc, 
1a810 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c  0);.  createColl
1a820 61 74 69 6f 6e 28 64 62 2c 20 73 71 6c 69 74 65  ation(db, sqlite
1a830 33 53 74 72 42 49 4e 41 52 59 2c 20 53 51 4c 49  3StrBINARY, SQLI
1a840 54 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62  TE_UTF16LE, 0, b
1a850 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
1a860 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
1a870 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20  n(db, "NOCASE", 
1a880 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
1a890 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46  nocaseCollatingF
1a8a0 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
1a8b0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
1a8c0 52 54 52 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55  RTRIM", SQLITE_U
1a8d0 54 46 38 2c 20 30 2c 20 72 74 72 69 6d 43 6f 6c  TF8, 0, rtrimCol
1a8e0 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28  lFunc, 0);.  if(
1a8f0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1a900 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  d ){.    goto op
1a910 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  endb_out;.  }.  
1a920 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a930 52 2d 30 38 33 30 38 2d 31 37 32 32 34 20 54 68  R-08308-17224 Th
1a940 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
1a950 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  ing function for
1a960 20 61 6c 6c 0a 20 20 2a 2a 20 73 74 72 69 6e 67   all.  ** string
1a970 73 20 69 73 20 42 49 4e 41 52 59 2e 20 0a 20 20  s is BINARY. .  
1a980 2a 2f 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f  */.  db->pDfltCo
1a990 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
1a9a0 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49  CollSeq(db, SQLI
1a9b0 54 45 5f 55 54 46 38 2c 20 73 71 6c 69 74 65 33  TE_UTF8, sqlite3
1a9c0 53 74 72 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20  StrBINARY, 0);. 
1a9d0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66   assert( db->pDf
1a9e0 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20  ltColl!=0 );..  
1a9f0 2f 2a 20 50 61 72 73 65 20 74 68 65 20 66 69 6c  /* Parse the fil
1aa00 65 6e 61 6d 65 2f 55 52 49 20 61 72 67 75 6d 65  ename/URI argume
1aa10 6e 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 6e 6c  nt.  **.  ** Onl
1aa20 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65  y allow sensible
1aa30 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
1aa40 20 62 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61   bits in the fla
1aa50 67 73 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20  gs argument.  . 
1aa60 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72   ** Throw an err
1aa70 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65  or if any non-se
1aa80 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  nse combination 
1aa90 69 73 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a  is used.  If we.
1aaa0 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63    ** do not bloc
1aab0 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e  k illegal combin
1aac0 61 74 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20  ations here, it 
1aad0 63 6f 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20  could trigger.  
1aae0 2a 2a 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ** assert() stat
1aaf0 65 6d 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72  ements in deeper
1ab00 20 6c 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62   layers.  Sensib
1ab10 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a  le combinations.
1ab20 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20    ** are:.  **. 
1ab30 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f   **  1:  SQLITE_
1ab40 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20  OPEN_READONLY.  
1ab50 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f  **  2:  SQLITE_O
1ab60 50 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20  PEN_READWRITE.  
1ab70 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f  **  6:  SQLITE_O
1ab80 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
1ab90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1aba0 54 45 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70  TE.  */.  db->op
1abb0 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  enFlags = flags;
1abc0 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
1abd0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
1abe0 20 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73   == 0x01 );.  as
1abf0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
1ac00 4e 5f 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30  N_READWRITE == 0
1ac10 78 30 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  x02 );.  assert(
1ac20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
1ac30 41 54 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29  ATE    == 0x04 )
1ac40 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31  ;.  testcase( (1
1ac50 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78  <<(flags&7))==0x
1ac60 30 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c  02 ); /* READONL
1ac70 59 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  Y */.  testcase(
1ac80 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d   (1<<(flags&7))=
1ac90 3d 30 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44  =0x04 ); /* READ
1aca0 57 52 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63  WRITE */.  testc
1acb0 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
1acc0 37 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20  7))==0x40 ); /* 
1acd0 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
1ace0 54 45 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c  TE */.  if( ((1<
1acf0 3c 28 66 6c 61 67 73 26 37 29 29 20 26 20 30 78  <(flags&7)) & 0x
1ad00 34 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  46)==0 ){.    rc
1ad10 20 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45   = SQLITE_MISUSE
1ad20 5f 42 4b 50 54 3b 20 20 2f 2a 20 49 4d 50 3a 20  _BKPT;  /* IMP: 
1ad30 52 2d 36 35 34 39 37 2d 34 34 35 39 34 20 2a 2f  R-65497-44594 */
1ad40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1ad50 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55   = sqlite3ParseU
1ad60 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61  ri(zVfs, zFilena
1ad70 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d  me, &flags, &db-
1ad80 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26  >pVfs, &zOpen, &
1ad90 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20  zErrMsg);.  }.  
1ada0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1adb0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
1adc0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20  =SQLITE_NOMEM ) 
1add0 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28  sqlite3OomFault(
1ade0 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
1adf0 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
1ae00 20 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22   rc, zErrMsg ? "
1ae10 25 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67  %s" : 0, zErrMsg
1ae20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1ae30 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
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 4f 70 65  t;.  }..  /* Ope
1ae60 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61  n the backend da
1ae70 74 61 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f  tabase driver */
1ae80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
1ae90 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
1aea0 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64  s, zOpen, db, &d
1aeb0 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30  b->aDb[0].pBt, 0
1aec0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1aed0 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
1aee0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  | SQLITE_OPEN_MA
1aef0 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63  IN_DB);.  if( rc
1af00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1af10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1af20 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b  E_IOERR_NOMEM ){
1af30 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1af40 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
1af50 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1af60 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20  Error(db, rc);. 
1af70 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
1af80 75 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ut;.  }.  sqlite
1af90 33 42 74 72 65 65 45 6e 74 65 72 28 64 62 2d 3e  3BtreeEnter(db->
1afa0 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64  aDb[0].pBt);.  d
1afb0 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d  b->aDb[0].pSchem
1afc0 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  a = sqlite3Schem
1afd0 61 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62  aGet(db, db->aDb
1afe0 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28 20  [0].pBt);.  if( 
1aff0 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
1b000 64 20 29 20 45 4e 43 28 64 62 29 20 3d 20 53 43  d ) ENC(db) = SC
1b010 48 45 4d 41 5f 45 4e 43 28 64 62 29 3b 0a 20 20  HEMA_ENC(db);.  
1b020 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1b030 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
1b040 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  );.  db->aDb[1].
1b050 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65  pSchema = sqlite
1b060 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30  3SchemaGet(db, 0
1b070 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66  );..  /* The def
1b080 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65  ault safety_leve
1b090 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  l for the main d
1b0a0 61 74 61 62 61 73 65 20 69 73 20 46 55 4c 4c 3b  atabase is FULL;
1b0b0 20 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20   for the temp.  
1b0c0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 74 20 69  ** database it i
1b0d0 73 20 4f 46 46 2e 20 54 68 69 73 20 6d 61 74 63  s OFF. This matc
1b0e0 68 65 73 20 74 68 65 20 70 61 67 65 72 20 6c 61  hes the pager la
1b0f0 79 65 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a  yer defaults.  .
1b100 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30    */.  db->aDb[0
1b110 5d 2e 7a 44 62 53 4e 61 6d 65 20 3d 20 22 6d 61  ].zDbSName = "ma
1b120 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30  in";.  db->aDb[0
1b130 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ].safety_level =
1b140 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1b150 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 3b 0a 20  SYNCHRONOUS+1;. 
1b160 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62 53   db->aDb[1].zDbS
1b170 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20  Name = "temp";. 
1b180 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65   db->aDb[1].safe
1b190 74 79 5f 6c 65 76 65 6c 20 3d 20 50 41 47 45 52  ty_level = PAGER
1b1a0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46  _SYNCHRONOUS_OFF
1b1b0 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  ;..  db->magic =
1b1c0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50   SQLITE_MAGIC_OP
1b1d0 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  EN;.  if( db->ma
1b1e0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1b1f0 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
1b200 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67  t;.  }..  /* Reg
1b210 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d  ister all built-
1b220 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75  in functions, bu
1b230 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  t do not attempt
1b240 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a   to read the.  *
1b250 2a 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  * database schem
1b260 61 20 79 65 74 2e 20 54 68 69 73 20 69 73 20 64  a yet. This is d
1b270 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65  elayed until the
1b280 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 20   first time the 
1b290 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73  database.  ** is
1b2a0 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a   accessed..  */.
1b2b0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
1b2c0 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
1b2d0 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
1b2e0 50 65 72 43 6f 6e 6e 65 63 74 69 6f 6e 42 75 69  PerConnectionBui
1b2f0 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62  ltinFunctions(db
1b300 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1b310 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 0a  3_errcode(db);..
1b320 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1b330 41 42 4c 45 5f 46 54 53 35 0a 20 20 2f 2a 20 52  ABLE_FTS5.  /* R
1b340 65 67 69 73 74 65 72 20 61 6e 79 20 62 75 69 6c  egister any buil
1b350 74 2d 69 6e 20 46 54 53 35 20 6d 6f 64 75 6c 65  t-in FTS5 module
1b360 20 62 65 66 6f 72 65 20 6c 6f 61 64 69 6e 67 20   before loading 
1b370 74 68 65 20 61 75 74 6f 6d 61 74 69 63 0a 20 20  the automatic.  
1b380 2a 2a 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 54  ** extensions. T
1b390 68 69 73 20 61 6c 6c 6f 77 73 20 61 75 74 6f 6d  his allows autom
1b3a0 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20  atic extensions 
1b3b0 74 6f 20 72 65 67 69 73 74 65 72 20 46 54 53 35  to register FTS5
1b3c0 20 0a 20 20 2a 2a 20 74 6f 6b 65 6e 69 7a 65 72   .  ** tokenizer
1b3d0 73 20 61 6e 64 20 61 75 78 69 6c 69 61 72 79 20  s and auxiliary 
1b3e0 66 75 6e 63 74 69 6f 6e 73 2e 20 20 2a 2f 0a 20  functions.  */. 
1b3f0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
1b400 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
1b410 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1b420 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  c = sqlite3Fts5I
1b430 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
1b440 64 69 66 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61  dif..  /* Load a
1b450 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69  utomatic extensi
1b460 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73  ons - extensions
1b470 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
1b480 72 65 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20  registered.  ** 
1b490 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
1b4a0 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65  3_automatic_exte
1b4b0 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a  nsion() API..  *
1b4c0 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
1b4d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
1b4e0 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65  ite3AutoLoadExte
1b4f0 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20  nsions(db);.    
1b500 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
1b510 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 69 66  code(db);.    if
1b520 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b530 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  ){.      goto op
1b540 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  endb_out;.    }.
1b550 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
1b560 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20  TE_ENABLE_FTS1. 
1b570 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
1b580 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78  Failed ){.    ex
1b590 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
1b5a0 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33  Fts1Init(sqlite3
1b5b0 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  *);.    rc = sql
1b5c0 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62 29  ite3Fts1Init(db)
1b5d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
1b5e0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1b5f0 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64  LE_FTS2.  if( !d
1b600 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1b610 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1b620 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69   ){.    extern i
1b630 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e  nt sqlite3Fts2In
1b640 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  it(sqlite3*);.  
1b650 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
1b660 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s2Init(db);.  }.
1b670 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1b680 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
1b690 33 20 2f 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  3 /* automatical
1b6a0 6c 79 20 64 65 66 69 6e 65 64 20 62 79 20 53 51  ly defined by SQ
1b6b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34  LITE_ENABLE_FTS4
1b6c0 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d   */.  if( !db->m
1b6d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
1b6e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b6f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b700 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20  Fts3Init(db);.  
1b710 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
1b720 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
1b730 42 4c 45 5f 49 43 55 29 20 7c 7c 20 64 65 66 69  BLE_ICU) || defi
1b740 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1b750 45 5f 49 43 55 5f 43 4f 4c 4c 41 54 49 4f 4e 53  E_ICU_COLLATIONS
1b760 29 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  ).  if( !db->mal
1b770 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
1b780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b790 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63    rc = sqlite3Ic
1b7a0 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  uInit(db);.  }.#
1b7b0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
1b7c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45  LITE_ENABLE_RTRE
1b7d0 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  E.  if( !db->mal
1b7e0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
1b7f0 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20  =SQLITE_OK){.   
1b800 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72   rc = sqlite3Rtr
1b810 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  eeInit(db);.  }.
1b820 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1b830 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 42 50  QLITE_ENABLE_DBP
1b840 41 47 45 5f 56 54 41 42 0a 20 20 69 66 28 20 21  AGE_VTAB.  if( !
1b850 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1b860 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1b870 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
1b880 69 74 65 33 44 62 70 61 67 65 52 65 67 69 73 74  ite3DbpageRegist
1b890 65 72 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  er(db);.  }.#end
1b8a0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1b8b0 45 5f 45 4e 41 42 4c 45 5f 44 42 53 54 41 54 5f  E_ENABLE_DBSTAT_
1b8c0 56 54 41 42 0a 20 20 69 66 28 20 21 64 62 2d 3e  VTAB.  if( !db->
1b8d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
1b8e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a  rc==SQLITE_OK){.
1b8f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b900 44 62 73 74 61 74 52 65 67 69 73 74 65 72 28 64  DbstatRegister(d
1b910 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
1b920 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1b930 41 42 4c 45 5f 4a 53 4f 4e 31 0a 20 20 69 66 28  ABLE_JSON1.  if(
1b940 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
1b950 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
1b960 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  _OK){.    rc = s
1b970 71 6c 69 74 65 33 4a 73 6f 6e 31 49 6e 69 74 28  qlite3Json1Init(
1b980 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
1b990 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1b9a0 4e 41 42 4c 45 5f 53 54 4d 54 56 54 41 42 0a 20  NABLE_STMTVTAB. 
1b9b0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
1b9c0 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
1b9d0 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63  LITE_OK){.    rc
1b9e0 20 3d 20 73 71 6c 69 74 65 33 53 74 6d 74 56 74   = sqlite3StmtVt
1b9f0 61 62 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  abInit(db);.  }.
1ba00 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53  #endif..  /* -DS
1ba10 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
1ba20 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b  CKING_MODE=1 mak
1ba30 65 73 20 45 58 43 4c 55 53 49 56 45 20 74 68 65  es EXCLUSIVE the
1ba40 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
1ba50 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53  .  ** mode.  -DS
1ba60 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
1ba70 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b  CKING_MODE=0 mak
1ba80 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66  e NORMAL the def
1ba90 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ault locking.  *
1baa0 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e  * mode.  Doing n
1bab0 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c  othing at all al
1bac0 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20  so makes NORMAL 
1bad0 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a  the default..  *
1bae0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1baf0 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
1bb00 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c  MODE.  db->dfltL
1bb10 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45  ockMode = SQLITE
1bb20 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
1bb30 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33  _MODE;.  sqlite3
1bb40 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
1bb50 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
1bb60 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  er(db->aDb[0].pB
1bb70 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
1bb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1bb90 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
1bba0 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64  KING_MODE);.#end
1bbb0 69 66 0a 0a 20 20 69 66 28 20 72 63 20 29 20 73  if..  if( rc ) s
1bbc0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
1bbd0 72 63 29 3b 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c  rc);..  /* Enabl
1bbe0 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d  e the lookaside-
1bbf0 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
1bc00 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61   */.  setupLooka
1bc10 73 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69  side(db, 0, sqli
1bc20 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1bc30 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20  szLookaside,.   
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc50 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1bc60 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73  alConfig.nLookas
1bc70 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  ide);..  sqlite3
1bc80 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
1bc90 69 6e 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  int(db, SQLITE_D
1bca0 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43  EFAULT_WAL_AUTOC
1bcb0 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65  HECKPOINT);..ope
1bcc0 6e 64 62 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64  ndb_out:.  if( d
1bcd0 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
1bce0 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c   db->mutex!=0 ||
1bcf0 20 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30   isThreadsafe==0
1bd00 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73  .           || s
1bd10 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1bd20 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30  ig.bFullMutex==0
1bd30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
1bd40 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
1bd50 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63  mutex);.  }.  rc
1bd60 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
1bd70 64 65 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74  de(db);.  assert
1bd80 28 20 64 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53  ( db!=0 || rc==S
1bd90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20  QLITE_NOMEM );. 
1bda0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bdb0 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c  NOMEM ){.    sql
1bdc0 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a  ite3_close(db);.
1bdd0 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65      db = 0;.  }e
1bde0 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
1bdf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d  TE_OK ){.    db-
1be00 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
1be10 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a  MAGIC_SICK;.  }.
1be20 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
1be30 50 4c 45 5f 5f 29 20 26 26 20 45 4e 41 42 4c 45  PLE__) && ENABLE
1be40 5f 46 4f 52 43 45 5f 57 41 4c 0a 20 20 69 66 28  _FORCE_WAL.  if(
1be50 20 64 62 20 26 26 20 21 72 63 20 29 7b 0a 20 20   db && !rc ){.  
1be60 20 20 69 66 20 28 28 30 20 3d 3d 20 61 63 63 65    if ((0 == acce
1be70 73 73 28 22 2f 76 61 72 2f 64 62 2f 65 6e 61 62  ss("/var/db/enab
1be80 6c 65 46 6f 72 63 65 57 41 4c 22 2c 20 52 5f 4f  leForceWAL", R_O
1be90 4b 29 29 29 20 7b 0a 23 69 66 64 65 66 20 53 51  K))) {.#ifdef SQ
1bea0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
1beb0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1bec0 20 22 53 51 4c 69 74 65 20 57 41 4c 20 6a 6f 75   "SQLite WAL jou
1bed0 72 6e 61 6c 5f 6d 6f 64 65 20 45 4e 41 42 4c 45  rnal_mode ENABLE
1bee0 44 20 62 79 20 64 65 66 61 75 6c 74 2e 5c 6e 22  D by default.\n"
1bef0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1bf00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65  .      sqlite3_e
1bf10 78 65 63 28 64 62 2c 20 22 70 72 61 67 6d 61 20  xec(db, "pragma 
1bf20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
1bf30 22 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e  ", NULL, NULL, N
1bf40 55 4c 4c 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  ULL);.#ifdef SQL
1bf50 49 54 45 5f 44 45 42 55 47 0a 2f 2f 20 20 20 20  ITE_DEBUG.//    
1bf60 7d 20 65 6c 73 65 20 7b 0a 2f 2f 20 20 20 20 20  } else {.//     
1bf70 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1bf80 20 22 53 51 4c 69 74 65 20 57 41 4c 20 6a 6f 75   "SQLite WAL jou
1bf90 72 6e 61 6c 5f 6d 6f 64 65 20 4e 4f 54 20 45 4e  rnal_mode NOT EN
1bfa0 41 42 4c 45 44 20 62 79 20 64 65 66 61 75 6c 74  ABLED by default
1bfb0 2e 5c 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  .\n");.#endif.  
1bfc0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23    }.  }.#endif.#
1bfd0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1bfe0 45 5f 45 4e 41 42 4c 45 5f 41 55 54 4f 5f 50 52  E_ENABLE_AUTO_PR
1bff0 4f 46 49 4c 45 29 0a 20 20 69 66 28 20 64 62 20  OFILE).  if( db 
1c000 26 26 20 21 72 63 20 29 7b 0a 20 20 20 20 65 6e  && !rc ){.    en
1c010 61 62 6c 65 41 75 74 6f 4c 6f 67 67 69 6e 67 28  ableAutoLogging(
1c020 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
1c030 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 23 69    *ppDb = db;.#i
1c040 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1c050 4c 45 5f 53 51 4c 52 52 0a 20 20 53 52 52 65 63  LE_SQLRR.  SRRec
1c060 4f 70 65 6e 28 64 62 2c 20 7a 46 69 6c 65 6e 61  Open(db, zFilena
1c070 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 23 65 6e 64  me, flags);.#end
1c080 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1c090 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20  _ENABLE_SQLLOG. 
1c0a0 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
1c0b0 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
1c0c0 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69   ){.    /* Openi
1c0d0 6e 67 20 61 20 64 62 20 68 61 6e 64 6c 65 2e 20  ng a db handle. 
1c0e0 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65 72  Fourth parameter
1c0f0 20 69 73 20 70 61 73 73 65 64 20 30 2e 20 2a 2f   is passed 0. */
1c100 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20  .    void *pArg 
1c110 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
1c120 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
1c130 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
1c140 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
1c150 67 28 70 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c  g(pArg, db, zFil
1c160 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23  ename, 0);.  }.#
1c170 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
1c180 64 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  d(SQLITE_HAS_COD
1c190 45 43 29 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  EC).  if( rc==SQ
1c1a0 4c 49 54 45 5f 4f 4b 20 29 20 73 71 6c 69 74 65  LITE_OK ) sqlite
1c1b0 33 43 6f 64 65 63 51 75 65 72 79 50 61 72 61 6d  3CodecQueryParam
1c1c0 65 74 65 72 73 28 64 62 2c 20 30 2c 20 7a 4f 70  eters(db, 0, zOp
1c1d0 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  en);.#endif.  sq
1c1e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e  lite3_free(zOpen
1c1f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 26  );.  return rc &
1c200 20 30 78 66 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   0xff;.}.../*.**
1c210 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61   Open a new data
1c220 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  base handle..*/.
1c230 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
1c240 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
1c250 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71  zFilename, .  sq
1c260 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b  lite3 **ppDb .){
1c270 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61  .  return openDa
1c280 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65  tabase(zFilename
1c290 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20  , ppDb,.        
1c2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1c2b0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1c2c0 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
1c2d0 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a  N_CREATE, 0);.}.
1c2e0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
1c2f0 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  _v2(.  const cha
1c300 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f  r *filename,   /
1c310 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
1c320 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ame (UTF-8) */. 
1c330 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c   sqlite3 **ppDb,
1c340 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1c350 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c   SQLite db handl
1c360 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
1c370 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1c380 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e  * Flags */.  con
1c390 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20  st char *zVfs   
1c3a0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1c3b0 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73  VFS module to us
1c3c0 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  e */.){.  return
1c3d0 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66 69   openDatabase(fi
1c3e0 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75  lename, ppDb, (u
1c3f0 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67  nsigned int)flag
1c400 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66  s, zVfs);.}..#if
1c410 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c420 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65  _UTF16./*.** Ope
1c430 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
1c440 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
1c450 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a  sqlite3_open16(.
1c460 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46    const void *zF
1c470 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69  ilename, .  sqli
1c480 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20  te3 **ppDb.){.  
1c490 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
1c4a0 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69  ename8;   /* zFi
1c4b0 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69  lename encoded i
1c4c0 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20  n UTF-8 instead 
1c4d0 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73  of UTF-16 */.  s
1c4e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
1c4f0 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  al;.  int rc;..#
1c500 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1c510 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1c520 69 66 28 20 70 70 44 62 3d 3d 30 20 29 20 72 65  if( ppDb==0 ) re
1c530 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
1c540 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
1c550 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66    *ppDb = 0;.#if
1c560 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c570 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
1c580 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
1c590 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
1c5a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
1c5b0 64 69 66 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e  dif.  if( zFilen
1c5c0 61 6d 65 3d 3d 30 20 29 20 7a 46 69 6c 65 6e 61  ame==0 ) zFilena
1c5d0 6d 65 20 3d 20 22 5c 30 30 30 5c 30 30 30 22 3b  me = "\000\000";
1c5e0 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  pVal = sqlite
1c5f0 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20  3ValueNew(0);.  
1c600 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
1c610 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69  tr(pVal, -1, zFi
1c620 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55  lename, SQLITE_U
1c630 54 46 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49  TF16NATIVE, SQLI
1c640 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46  TE_STATIC);.  zF
1c650 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74  ilename8 = sqlit
1c660 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
1c670 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
1c680 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38    if( zFilename8
1c690 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65   ){.    rc = ope
1c6a0 6e 44 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e  nDatabase(zFilen
1c6b0 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20  ame8, ppDb,.    
1c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6d0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
1c6e0 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
1c6f0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29  _OPEN_CREATE, 0)
1c700 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ;.    assert( *p
1c710 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  pDb || rc==SQLIT
1c720 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69  E_NOMEM );.    i
1c730 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c740 20 26 26 20 21 44 62 48 61 73 50 72 6f 70 65 72   && !DbHasProper
1c750 74 79 28 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f  ty(*ppDb, 0, DB_
1c760 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b  SchemaLoaded) ){
1c770 0a 20 20 20 20 20 20 53 43 48 45 4d 41 5f 45 4e  .      SCHEMA_EN
1c780 43 28 2a 70 70 44 62 29 20 3d 20 45 4e 43 28 2a  C(*ppDb) = ENC(*
1c790 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55  ppDb) = SQLITE_U
1c7a0 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20  TF16NATIVE;.    
1c7b0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
1c7c0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1c7d0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BKPT;.  }.  sql
1c7e0 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
1c7f0 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  al);..  return r
1c800 63 20 26 20 30 78 66 66 3b 0a 7d 0a 23 65 6e 64  c & 0xff;.}.#end
1c810 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1c820 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a  T_UTF16 */../*.*
1c830 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
1c840 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1c850 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
1c860 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
1c870 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1c880 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
1c890 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
1c8a0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
1c8b0 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e  zName, .  int en
1c8c0 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
1c8d0 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
1c8e0 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
1c8f0 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
1c900 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 72  st void*).){.  r
1c910 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72  eturn sqlite3_cr
1c920 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
1c930 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63  2(db, zName, enc
1c940 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
1c950 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , 0);.}../*.** R
1c960 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
1c970 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1c980 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
1c990 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
1c9a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
1c9b0 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
1c9c0 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
1c9d0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
1c9e0 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e  zName, .  int en
1c9f0 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
1ca00 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
1ca10 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
1ca20 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
1ca30 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  st void*),.  voi
1ca40 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a  d(*xDel)(void*).
1ca50 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  ){.  int rc;..#i
1ca60 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1ca70 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1ca80 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1ca90 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20  yCheckOk(db) || 
1caa0 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
1cab0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
1cac0 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73  BKPT;.#endif.  s
1cad0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1cae0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
1caf0 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
1cb00 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1cb10 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
1cb20 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
1cb30 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78  (u8)enc, pCtx, x
1cb40 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a  Compare, xDel);.
1cb50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
1cb60 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
1cb70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1cb80 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
1cb90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1cba0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1cbb0 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
1cbc0 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
1cbd0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1cbe0 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
1cbf0 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
1cc00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
1cc10 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31  reate_collation1
1cc20 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  6(.  sqlite3* db
1cc30 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  , .  const void 
1cc40 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e  *zName,.  int en
1cc50 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
1cc60 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
1cc70 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
1cc80 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
1cc90 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  st void*).){.  i
1cca0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1ccb0 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  K;.  char *zName
1ccc0 38 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  8;..#ifdef SQLIT
1ccd0 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1cce0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1ccf0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1cd00 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29  b) || zName==0 )
1cd10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
1cd20 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
1cd30 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
1cd40 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1cd50 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
1cd60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1cd70 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73   );.  zName8 = s
1cd80 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
1cd90 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  b, zName, -1, SQ
1cda0 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
1cdb0 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20  );.  if( zName8 
1cdc0 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61  ){.    rc = crea
1cdd0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
1cde0 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c  zName8, (u8)enc,
1cdf0 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
1ce00 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1ce10 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
1ce20 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  8);.  }.  rc = s
1ce30 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
1ce40 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
1ce50 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1ce60 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1ce70 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
1ce80 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
1ce90 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
1cea0 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69  gister a collati
1ceb0 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
1cec0 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  ory callback wit
1ced0 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
1cee0 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70  andle.** db. Rep
1cef0 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75  lace any previou
1cf00 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f  sly installed co
1cf10 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1cf20 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74   factory..*/.int
1cf30 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
1cf40 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c  on_needed(.  sql
1cf50 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69  ite3 *db, .  voi
1cf60 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  d *pCollNeededAr
1cf70 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c  g, .  void(*xCol
1cf80 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73  lNeeded)(void*,s
1cf90 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78  qlite3*,int eTex
1cfa0 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a  tRep,const char*
1cfb0 29 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ).){.#ifdef SQLI
1cfc0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
1cfd0 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
1cfe0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
1cff0 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  db) ) return SQL
1d000 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
1d010 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
1d020 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
1d030 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
1d040 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43  xCollNeeded = xC
1d050 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d  ollNeeded;.  db-
1d060 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
1d070 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e   0;.  db->pCollN
1d080 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
1d090 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
1d0a0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1d0b0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
1d0c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d0d0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1d0e0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
1d0f0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
1d100 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1d110 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61  e factory callba
1d120 63 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ck with the data
1d130 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
1d140 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70  b. Replace any p
1d150 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c  reviously instal
1d160 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  led collation se
1d170 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a  quence factory..
1d180 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
1d190 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31  ollation_needed1
1d1a0 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
1d1b0 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c  , .  void *pColl
1d1c0 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f  NeededArg, .  vo
1d1d0 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31  id(*xCollNeeded1
1d1e0 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33  6)(void*,sqlite3
1d1f0 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63  *,int eTextRep,c
1d200 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 23  onst void*).){.#
1d210 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1d220 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
1d230 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65  if( !sqlite3Safe
1d240 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20  tyCheckOk(db) ) 
1d250 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
1d260 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69  SUSE_BKPT;.#endi
1d270 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1d280 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
1d290 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  x);.  db->xCollN
1d2a0 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d  eeded = 0;.  db-
1d2b0 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d  >xCollNeeded16 =
1d2c0 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a   xCollNeeded16;.
1d2d0 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65    db->pCollNeede
1d2e0 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64  dArg = pCollNeed
1d2f0 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33  edArg;.  sqlite3
1d300 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1d310 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1d320 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1d330 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1d340 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23  OMIT_UTF16 */..#
1d350 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d360 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
1d370 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1d380 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63  n is now an anac
1d390 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64  hronism. It used
1d3a0 20 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72   to be used to r
1d3b0 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a  ecover from a.**
1d3c0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
1d3d0 65 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f  e, but SQLite no
1d3e0 77 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f  w does this auto
1d3f0 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e  matically..*/.in
1d400 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c  t sqlite3_global
1d410 5f 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a  _recover(void){.
1d420 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d430 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
1d440 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20  .** Test to see 
1d450 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
1d460 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1d470 65 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74  ection is in aut
1d480 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e  ocommit.** mode.
1d490 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
1d4a0 20 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45   it is and FALSE
1d4b0 20 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f   if not.  Autoco
1d4c0 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a  mmit mode is on.
1d4d0 2a 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20  ** by default.  
1d4e0 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69  Autocommit is di
1d4f0 73 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49  sabled by a BEGI
1d500 4e 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20  N statement and 
1d510 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20  reenabled.** by 
1d520 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20  the next COMMIT 
1d530 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a  or ROLLBACK..*/.
1d540 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f  int sqlite3_get_
1d550 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74  autocommit(sqlit
1d560 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20  e3 *db){.#ifdef 
1d570 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1d580 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1d590 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1d5a0 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
1d5b0 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
1d5c0 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
1d5d0 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
1d5e0 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61  f.  return db->a
1d5f0 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a  utoCommit;.}../*
1d600 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1d610 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73  g routines are s
1d620 75 62 73 74 69 74 75 74 65 73 20 66 6f 72 20 63  ubstitutes for c
1d630 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f  onstants SQLITE_
1d640 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49  CORRUPT,.** SQLI
1d650 54 45 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54  TE_MISUSE, SQLIT
1d660 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49  E_CANTOPEN, SQLI
1d670 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 20 70 6f 73  TE_NOMEM and pos
1d680 73 69 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f  sibly other erro
1d690 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20  r.** constants. 
1d6a0 20 54 68 65 79 20 73 65 72 76 65 20 74 77 6f 20   They serve two 
1d6b0 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20  purposes:.**.** 
1d6c0 20 20 31 2e 20 20 53 65 72 76 65 20 61 73 20 61    1.  Serve as a
1d6d0 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
1d6e0 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
1d6f0 70 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67  point in a debug
1d700 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20  ger.**       to 
1d710 64 65 74 65 63 74 20 77 68 65 6e 20 76 65 72 73  detect when vers
1d720 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74  ion error condit
1d730 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  ions occurs..**.
1d740 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20  **   2.  Invoke 
1d750 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f  sqlite3_log() to
1d760 20 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75   provide the sou
1d770 72 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f  rce code locatio
1d780 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20  n where.**      
1d790 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72   a low-level err
1d7a0 6f 72 20 69 73 20 66 69 72 73 74 20 64 65 74 65  or is first dete
1d7b0 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  cted..*/.int sql
1d7c0 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28  ite3ReportError(
1d7d0 69 6e 74 20 69 45 72 72 2c 20 69 6e 74 20 6c 69  int iErr, int li
1d7e0 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72  neno, const char
1d7f0 20 2a 7a 54 79 70 65 29 7b 0a 20 20 73 71 6c 69   *zType){.  sqli
1d800 74 65 33 5f 6c 6f 67 28 69 45 72 72 2c 20 22 25  te3_log(iErr, "%
1d810 73 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20  s at line %d of 
1d820 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20  [%.10s]",.      
1d830 20 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 6c          zType, l
1d840 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65  ineno, 20+sqlite
1d850 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20  3_sourceid());. 
1d860 20 72 65 74 75 72 6e 20 69 45 72 72 3b 0a 7d 0a   return iErr;.}.
1d870 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75  int sqlite3Corru
1d880 70 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  ptError(int line
1d890 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
1d8a0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1d8b0 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
1d8c0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1d8d0 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49  ReportError(SQLI
1d8e0 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69 6e 65  TE_CORRUPT, line
1d8f0 6e 6f 2c 20 22 64 61 74 61 62 61 73 65 20 63 6f  no, "database co
1d900 72 72 75 70 74 69 6f 6e 22 29 3b 0a 7d 0a 69 6e  rruption");.}.in
1d910 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45  t sqlite3MisuseE
1d920 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
1d930 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
1d940 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1d950 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72  g.xLog!=0 );.  r
1d960 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70  eturn sqlite3Rep
1d970 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  ortError(SQLITE_
1d980 4d 49 53 55 53 45 2c 20 6c 69 6e 65 6e 6f 2c 20  MISUSE, lineno, 
1d990 22 6d 69 73 75 73 65 22 29 3b 0a 7d 0a 69 6e 74  "misuse");.}.int
1d9a0 20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e   sqlite3Cantopen
1d9b0 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f  Error(int lineno
1d9c0 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  ){.  testcase( s
1d9d0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1d9e0 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
1d9f0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65  return sqlite3Re
1da00 70 6f 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45  portError(SQLITE
1da10 5f 43 41 4e 54 4f 50 45 4e 2c 20 6c 69 6e 65 6e  _CANTOPEN, linen
1da20 6f 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  o, "cannot open 
1da30 66 69 6c 65 22 29 3b 0a 7d 0a 23 69 66 64 65 66  file");.}.#ifdef
1da40 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e   SQLITE_DEBUG.in
1da50 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74  t sqlite3Corrupt
1da60 50 67 6e 6f 45 72 72 6f 72 28 69 6e 74 20 6c 69  PgnoError(int li
1da70 6e 65 6e 6f 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  neno, Pgno pgno)
1da80 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 31 30  {.  char zMsg[10
1da90 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  0];.  sqlite3_sn
1daa0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4d  printf(sizeof(zM
1dab0 73 67 29 2c 20 7a 4d 73 67 2c 20 22 64 61 74 61  sg), zMsg, "data
1dac0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
1dad0 70 61 67 65 20 25 64 22 2c 20 70 67 6e 6f 29 3b  page %d", pgno);
1dae0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
1daf0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1db00 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 72 65  .xLog!=0 );.  re
1db10 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 70 6f  turn sqlite3Repo
1db20 72 74 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  rtError(SQLITE_C
1db30 4f 52 52 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20  ORRUPT, lineno, 
1db40 7a 4d 73 67 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  zMsg);.}.int sql
1db50 69 74 65 33 4e 6f 6d 65 6d 45 72 72 6f 72 28 69  ite3NomemError(i
1db60 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
1db70 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
1db80 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
1db90 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
1dba0 73 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72  sqlite3ReportErr
1dbb0 6f 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  or(SQLITE_NOMEM,
1dbc0 20 6c 69 6e 65 6e 6f 2c 20 22 4f 4f 4d 22 29 3b   lineno, "OOM");
1dbd0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6f  .}.int sqlite3Io
1dbe0 65 72 72 6e 6f 6d 65 6d 45 72 72 6f 72 28 69 6e  errnomemError(in
1dbf0 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
1dc00 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
1dc10 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
1dc20 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
1dc30 71 6c 69 74 65 33 52 65 70 6f 72 74 45 72 72 6f  qlite3ReportErro
1dc40 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  r(SQLITE_IOERR_N
1dc50 4f 4d 45 4d 2c 20 6c 69 6e 65 6e 6f 2c 20 22 49  OMEM, lineno, "I
1dc60 2f 4f 20 4f 4f 4d 20 65 72 72 6f 72 22 29 3b 0a  /O OOM error");.
1dc70 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
1dc80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
1dc90 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54  PRECATED./*.** T
1dca0 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e 69  his is a conveni
1dcb0 65 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68 61  ence routine tha
1dcc0 74 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61  t makes sure tha
1dcd0 74 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70 65  t all thread-spe
1dce0 63 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f  cific.** data fo
1dcf0 72 20 74 68 69 73 20 74 68 72 65 61 64 20 68 61  r this thread ha
1dd00 73 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74  s been deallocat
1dd10 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  ed..**.** SQLite
1dd20 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20   no longer uses 
1dd30 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 20  thread-specific 
1dd40 64 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f 75  data so this rou
1dd50 74 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a  tine is now a.**
1dd60 20 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20 72   no-op.  It is r
1dd70 65 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73 74  etained for hist
1dd80 6f 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62 69  orical compatibi
1dd90 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lity..*/.void sq
1dda0 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
1ddb0 61 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65  anup(void){.}.#e
1ddc0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
1ddd0 72 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  rn meta informat
1dde0 69 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63  ion about a spec
1ddf0 69 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  ific column of a
1de00 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e   database table.
1de10 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20  .** See comment 
1de20 69 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71  in sqlite3.h (sq
1de30 6c 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64  lite.h.in) for d
1de40 65 74 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73  etails..*/.int s
1de50 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c  qlite3_table_col
1de60 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20  umn_metadata(.  
1de70 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1de80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1de90 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65  onnection handle
1dea0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1deb0 20 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20 20   *zDbName,      
1dec0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61    /* Database na
1ded0 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  me or NULL */.  
1dee0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
1def0 6c 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54  leName,     /* T
1df00 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63  able name */.  c
1df10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
1df20 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f  mnName,    /* Co
1df30 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63  lumn name */.  c
1df40 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61  har const **pzDa
1df50 74 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55  taType,    /* OU
1df60 54 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20 64  TPUT: Declared d
1df70 61 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68  ata type */.  ch
1df80 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c  ar const **pzCol
1df90 6c 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54  lSeq,     /* OUT
1dfa0 50 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73  PUT: Collation s
1dfb0 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a  equence name */.
1dfc0 20 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c    int *pNotNull,
1dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dfe0 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
1dff0 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72   NOT NULL constr
1e000 61 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 20  aint exists */. 
1e010 20 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65   int *pPrimaryKe
1e020 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
1e030 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20  OUTPUT: True if 
1e040 63 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20 50  column part of P
1e050 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74  K */.  int *pAut
1e060 6f 69 6e 63 20 20 20 20 20 20 20 20 20 20 20 20  oinc            
1e070 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72     /* OUTPUT: Tr
1e080 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20  ue if column is 
1e090 61 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a  auto-increment *
1e0a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
1e0b0 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
1e0c0 20 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   0;.  Table *pTa
1e0d0 62 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20  b = 0;.  Column 
1e0e0 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pCol = 0;.  int
1e0f0 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 63 68 61   iCol = 0;.  cha
1e100 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79  r const *zDataTy
1e110 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  pe = 0;.  char c
1e120 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d  onst *zCollSeq =
1e130 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c   0;.  int notnul
1e140 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72 69  l = 0;.  int pri
1e150 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69  marykey = 0;.  i
1e160 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a  nt autoinc = 0;.
1e170 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1e180 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
1e190 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
1e1a0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
1e1b0 20 7c 7c 20 7a 54 61 62 6c 65 4e 61 6d 65 3d 3d   || zTableName==
1e1c0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1e1d0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1e1e0 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  PT;.  }.#endif..
1e1f0 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20    /* Ensure the 
1e200 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
1e210 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20  has been loaded 
1e220 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
1e230 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
1e240 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ex);.  sqlite3Bt
1e250 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
1e260 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49  .  rc = sqlite3I
1e270 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67  nit(db, &zErrMsg
1e280 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
1e290 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f  OK!=rc ){.    go
1e2a0 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
1e2b0 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74  }..  /* Locate t
1e2c0 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73  he table in ques
1e2d0 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d  tion */.  pTab =
1e2e0 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
1e2f0 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65  e(db, zTableName
1e300 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66  , zDbName);.  if
1e310 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d  ( !pTab || pTab-
1e320 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
1e330 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f  pTab = 0;.    go
1e340 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
1e350 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  }..  /* Find the
1e360 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63   column for whic
1e370 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73  h info is reques
1e380 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 7a 43 6f  ted */.  if( zCo
1e390 6c 75 6d 6e 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  lumnName==0 ){. 
1e3a0 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6f 72 20     /* Query for 
1e3b0 65 78 69 73 74 61 6e 63 65 20 6f 66 20 74 61 62  existance of tab
1e3c0 6c 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d 65 6c  le only */.  }el
1e3d0 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c  se{.    for(iCol
1e3e0 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  =0; iCol<pTab->n
1e3f0 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20  Col; iCol++){.  
1e400 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
1e410 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
1e420 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
1e430 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e  e3StrICmp(pCol->
1e440 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61  zName, zColumnNa
1e450 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  me) ){.        b
1e460 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1e470 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c    }.    if( iCol
1e480 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  ==pTab->nCol ){.
1e490 20 20 20 20 20 20 69 66 28 20 48 61 73 52 6f 77        if( HasRow
1e4a0 69 64 28 70 54 61 62 29 20 26 26 20 73 71 6c 69  id(pTab) && sqli
1e4b0 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75  te3IsRowid(zColu
1e4c0 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  mnName) ){.     
1e4d0 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     iCol = pTab->
1e4e0 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70  iPKey;.        p
1e4f0 43 6f 6c 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20  Col = iCol>=0 ? 
1e500 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c  &pTab->aCol[iCol
1e510 5d 20 3a 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  ] : 0;.      }el
1e520 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62  se{.        pTab
1e530 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
1e540 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
1e550 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e560 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1e570 69 6e 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73  ing block stores
1e580 20 74 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d   the meta inform
1e590 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ation that will 
1e5a0 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a  be returned.  **
1e5b0 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69   to the caller i
1e5c0 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65  n local variable
1e5d0 73 20 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f  s zDataType, zCo
1e5e0 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20  llSeq, notnull, 
1e5f0 70 72 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20  primarykey.  ** 
1e600 61 6e 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20  and autoinc. At 
1e610 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
1e620 20 61 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69   are two possibi
1e630 6c 69 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20  lities:.  ** .  
1e640 2a 2a 20 20 20 20 20 31 2e 20 54 68 65 20 73 70  **     1. The sp
1e650 65 63 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e  ecified column n
1e660 61 6d 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20  ame was rowid", 
1e670 22 6f 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64  "oid" or "_rowid
1e680 5f 22 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  _" .  **        
1e690 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
1e6a0 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61  explicitly decla
1e6b0 72 65 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20  red IPK column. 
1e6c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32  .  **.  **     2
1e6d0 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e  . The table is n
1e6e0 6f 74 20 61 20 76 69 65 77 20 61 6e 64 20 74 68  ot a view and th
1e6f0 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64  e column name id
1e700 65 6e 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a  entified an .  *
1e710 2a 20 20 20 20 20 20 20 20 65 78 70 6c 69 63 69  *        explici
1e720 74 6c 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c  tly declared col
1e730 75 6d 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69  umn. Copy meta i
1e740 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
1e750 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69  *pCol..  */ .  i
1e760 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a  f( pCol ){.    z
1e770 44 61 74 61 54 79 70 65 20 3d 20 73 71 6c 69 74  DataType = sqlit
1e780 65 33 43 6f 6c 75 6d 6e 54 79 70 65 28 70 43 6f  e3ColumnType(pCo
1e790 6c 2c 30 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53  l,0);.    zCollS
1e7a0 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c  eq = pCol->zColl
1e7b0 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20  ;.    notnull = 
1e7c0 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30  pCol->notNull!=0
1e7d0 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79  ;.    primarykey
1e7e0 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c    = (pCol->colFl
1e7f0 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52  ags & COLFLAG_PR
1e800 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20 61  IMKEY)!=0;.    a
1e810 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69  utoinc = pTab->i
1e820 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70  PKey==iCol && (p
1e830 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
1e840 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
1e850 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )!=0;.  }else{. 
1e860 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22     zDataType = "
1e870 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72  INTEGER";.    pr
1e880 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20  imarykey = 1;.  
1e890 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65  }.  if( !zCollSe
1e8a0 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65  q ){.    zCollSe
1e8b0 71 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49  q = sqlite3StrBI
1e8c0 4e 41 52 59 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72  NARY;.  }..error
1e8d0 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 42  _out:.  sqlite3B
1e8e0 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
1e8f0 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20  ;..  /* Whether 
1e900 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  the function cal
1e910 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72 20 66  l succeeded or f
1e920 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f  ailed, set the o
1e930 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
1e940 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65  .  ** to whateve
1e950 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f  r their local co
1e960 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61  unterparts conta
1e970 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  in. If an error 
1e980 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20  did occur,.  ** 
1e990 74 68 69 73 20 68 61 73 20 74 68 65 20 65 66 66  this has the eff
1e9a0 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61  ect of zeroing a
1e9b0 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  ll output parame
1e9c0 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ters..  */.  if(
1e9d0 20 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70   pzDataType ) *p
1e9e0 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74  zDataType = zDat
1e9f0 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43  aType;.  if( pzC
1ea00 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c  ollSeq ) *pzColl
1ea10 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a  Seq = zCollSeq;.
1ea20 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29    if( pNotNull )
1ea30 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74   *pNotNull = not
1ea40 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69  null;.  if( pPri
1ea50 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d  maryKey ) *pPrim
1ea60 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79  aryKey = primary
1ea70 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f  key;.  if( pAuto
1ea80 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20  inc ) *pAutoinc 
1ea90 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66  = autoinc;..  if
1eaa0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20  ( SQLITE_OK==rc 
1eab0 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
1eac0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1ead0 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
1eae0 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
1eaf0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f  3MPrintf(db, "no
1eb00 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c 75   such table colu
1eb10 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61 62  mn: %s.%s", zTab
1eb20 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  leName,.        
1eb30 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20  zColumnName);.  
1eb40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
1eb50 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ROR;.  }.  sqlit
1eb60 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
1eb70 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f  b, rc, (zErrMsg?
1eb80 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67  "%s":0), zErrMsg
1eb90 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1eba0 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b  ee(db, zErrMsg);
1ebb0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
1ebc0 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
1ebd0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1ebe0 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
1ebf0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1ec00 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
1ec10 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
1ec20 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
1ec30 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
1ec40 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pt..*/.int sqlit
1ec50 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73 29  e3_sleep(int ms)
1ec60 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
1ec70 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b  *pVfs;.  int rc;
1ec80 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74 65  .  pVfs = sqlite
1ec90 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20  3_vfs_find(0);. 
1eca0 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20 72   if( pVfs==0 ) r
1ecb0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54  eturn 0;..  /* T
1ecc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72  his function wor
1ecd0 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e  ks in millisecon
1ece0 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64 65  ds, but the unde
1ecf0 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28 29  rlying OsSleep()
1ed00 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73 20   .  ** API uses 
1ed10 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65  microseconds. He
1ed20 6e 63 65 20 74 68 65 20 31 30 30 30 27 73 2e 0a  nce the 1000's..
1ed30 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c    */.  rc = (sql
1ed40 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66 73  ite3OsSleep(pVfs
1ed50 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30 29  , 1000*ms)/1000)
1ed60 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1ed70 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f  ../*.** Enable o
1ed80 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 65 78  r disable the ex
1ed90 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63 6f  tended result co
1eda0 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  des..*/.int sqli
1edb0 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  te3_extended_res
1edc0 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74 65  ult_codes(sqlite
1edd0 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66  3 *db, int onoff
1ede0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
1edf0 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
1ee00 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
1ee10 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
1ee20 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
1ee30 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
1ee40 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
1ee50 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
1ee60 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72  mutex);.  db->er
1ee70 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20  rMask = onoff ? 
1ee80 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 78 66  0xffffffff : 0xf
1ee90 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  f;.  sqlite3_mut
1eea0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1eeb0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
1eec0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1eed0 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69  * Invoke the xFi
1eee0 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  leControl method
1eef0 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
1ef00 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e   database..*/.in
1ef10 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  t sqlite3_file_c
1ef20 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a  ontrol(sqlite3 *
1ef30 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1ef40 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c  zDbName, int op,
1ef50 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
1ef60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1ef70 45 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a  ERROR;.  Btree *
1ef80 70 42 74 72 65 65 3b 0a 0a 23 69 66 64 65 66 20  pBtree;..#ifdef 
1ef90 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
1efa0 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
1efb0 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
1efc0 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
1efd0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
1efe0 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
1eff0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1f000 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
1f010 70 42 74 72 65 65 20 3d 20 73 71 6c 69 74 65 33  pBtree = sqlite3
1f020 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62  DbNameToBtree(db
1f030 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66  , zDbName);.  if
1f040 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
1f050 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
1f060 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
1f070 2a 66 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  *fd;.    sqlite3
1f080 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
1f090 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  e);.    pPager =
1f0a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
1f0b0 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
1f0c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
1f0d0 30 20 29 3b 0a 20 20 20 20 66 64 20 3d 20 73 71  0 );.    fd = sq
1f0e0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
1f0f0 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65  Pager);.    asse
1f100 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20  rt( fd!=0 );.   
1f110 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f   if( op==SQLITE_
1f120 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54  FCNTL_FILE_POINT
1f130 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71  ER ){.      *(sq
1f140 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72  lite3_file**)pAr
1f150 67 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 72 63  g = fd;.      rc
1f160 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1f170 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
1f180 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53  SQLITE_FCNTL_VFS
1f190 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20  _POINTER ){.    
1f1a0 20 20 2a 28 73 71 6c 69 74 65 33 5f 76 66 73 2a    *(sqlite3_vfs*
1f1b0 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33  *)pArg = sqlite3
1f1c0 50 61 67 65 72 56 66 73 28 70 50 61 67 65 72 29  PagerVfs(pPager)
1f1d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1f1e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
1f1f0 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45  e if( op==SQLITE
1f200 5f 46 43 4e 54 4c 5f 4a 4f 55 52 4e 41 4c 5f 50  _FCNTL_JOURNAL_P
1f210 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20 20 20  OINTER ){.      
1f220 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a  *(sqlite3_file**
1f230 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 50  )pArg = sqlite3P
1f240 61 67 65 72 4a 72 6e 6c 46 69 6c 65 28 70 50 61  agerJrnlFile(pPa
1f250 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ger);.      rc =
1f260 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69 66 6e   SQLITE_OK;.#ifn
1f270 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f280 57 41 4c 0a 20 20 20 20 20 20 69 66 28 20 28 72  WAL.      if( (r
1f290 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 26 26 28  c==SQLITE_OK)&&(
1f2a0 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c  op==SQLITE_FCNTL
1f2b0 5f 4c 41 53 54 5f 45 52 52 4e 4f 29 26 26 28 2a  _LAST_ERRNO)&&(*
1f2c0 28 69 6e 74 20 2a 29 70 41 72 67 3d 3d 30 29 20  (int *)pArg==0) 
1f2d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1f2e0 65 33 5f 66 69 6c 65 20 2a 70 57 61 6c 46 64 20  e3_file *pWalFd 
1f2f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 61  = sqlite3PagerWa
1f300 6c 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20  lFile(pPager);. 
1f310 20 20 20 20 20 20 20 69 66 28 20 70 57 61 6c 46         if( pWalF
1f320 64 26 26 28 70 57 61 6c 46 64 2d 3e 70 4d 65 74  d&&(pWalFd->pMet
1f330 68 6f 64 73 29 20 29 7b 0a 20 20 20 20 20 20 20  hods) ){.       
1f340 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1f350 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 57 61  sFileControl(pWa
1f360 6c 46 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a  lFd, op, pArg);.
1f370 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f380 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  }.#endif.    }el
1f390 73 65 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54  se if( op==SQLIT
1f3a0 45 5f 46 43 4e 54 4c 5f 44 41 54 41 5f 56 45 52  E_FCNTL_DATA_VER
1f3b0 53 49 4f 4e 20 29 7b 0a 20 20 20 20 20 20 2a 28  SION ){.      *(
1f3c0 75 6e 73 69 67 6e 65 64 20 69 6e 74 2a 29 70 41  unsigned int*)pA
1f3d0 72 67 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rg = sqlite3Page
1f3e0 72 44 61 74 61 56 65 72 73 69 6f 6e 28 70 50 61  rDataVersion(pPa
1f3f0 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ger);.      rc =
1f400 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f410 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1f420 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  = sqlite3OsFileC
1f430 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70  ontrol(fd, op, p
1f440 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Arg);.    }.    
1f450 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1f460 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
1f470 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
1f480 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
1f490 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
1f4a0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1f4b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
1f4c0 6e 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20  nterface to the 
1f4d0 74 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a  testing logic..*
1f4e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65  /.int sqlite3_te
1f4f0 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f  st_control(int o
1f500 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72  p, ...){.  int r
1f510 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  c = 0;.#ifdef SQ
1f520 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a  LITE_UNTESTABLE.
1f530 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1f540 45 52 28 6f 70 29 3b 0a 23 65 6c 73 65 0a 20 20  ER(op);.#else.  
1f550 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61  va_list ap;.  va
1f560 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a  _start(ap, op);.
1f570 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
1f580 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
1f590 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
1f5a0 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e  state of the PRN
1f5b0 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  G..    */.    ca
1f5c0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1f5d0 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a  RL_PRNG_SAVE: {.
1f5e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e        sqlite3Prn
1f5f0 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20  gSaveState();.  
1f600 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1f610 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1f620 52 65 73 74 6f 72 65 20 74 68 65 20 73 74 61 74  Restore the stat
1f630 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f  e of the PRNG to
1f640 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 20   the last state 
1f650 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20  saved using.    
1f660 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49  ** PRNG_SAVE.  I
1f670 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20  f PRNG_SAVE has 
1f680 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65  never before bee
1f690 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20  n called, then. 
1f6a0 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20     ** this verb 
1f6b0 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52  acts like PRNG_R
1f6c0 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ESET..    */.   
1f6d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1f6e0 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f  TCTRL_PRNG_RESTO
1f6f0 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  RE: {.      sqli
1f700 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74  te3PrngRestoreSt
1f710 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65  ate();.      bre
1f720 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1f730 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74  *.    ** Reset t
1f740 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20  he PRNG back to 
1f750 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  its uninitialize
1f760 64 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65  d state.  The ne
1f770 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  xt call.    ** t
1f780 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d  o sqlite3_random
1f790 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65  ness() will rese
1f7a0 65 64 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e  ed the PRNG usin
1f7b0 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a  g a single call.
1f7c0 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52      ** to the xR
1f7d0 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64  andomness method
1f7e0 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   of the default 
1f7f0 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  VFS..    */.    
1f800 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1f810 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a  CTRL_PRNG_RESET:
1f820 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1f830 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29  _randomness(0,0)
1f840 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f850 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
1f860 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
1f870 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43  t_control(BITVEC
1f880 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f  _TEST, size, pro
1f890 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20  gram).    **.   
1f8a0 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61   ** Run a test a
1f8b0 67 61 69 6e 73 74 20 61 20 42 69 74 76 65 63 20  gainst a Bitvec 
1f8c0 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20  object of size. 
1f8d0 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67   The program arg
1f8e0 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20  ument.    ** is 
1f8f0 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65  an array of inte
1f900 67 65 72 73 20 74 68 61 74 20 64 65 66 69 6e 65  gers that define
1f910 73 20 74 68 65 20 74 65 73 74 2e 20 20 52 65 74  s the test.  Ret
1f920 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20  urn -1 on a.    
1f930 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ** memory alloca
1f940 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e  tion error, 0 on
1f950 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e   success, or non
1f960 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72  -zero for an err
1f970 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74  or..    ** See t
1f980 68 65 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  he sqlite3Bitvec
1f990 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f  BuiltinTest() fo
1f9a0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
1f9b0 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
1f9c0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1f9d0 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43  _TESTCTRL_BITVEC
1f9e0 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69  _TEST: {.      i
1f9f0 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
1fa00 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
1fa10 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61  nt *aProg = va_a
1fa20 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20  rg(ap, int*);.  
1fa30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1fa40 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73  BitvecBuiltinTes
1fa50 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20  t(sz, aProg);.  
1fa60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1fa70 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
1fa80 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1fa90 6e 74 72 6f 6c 28 46 41 55 4c 54 5f 49 4e 53 54  ntrol(FAULT_INST
1faa0 41 4c 4c 2c 20 78 43 61 6c 6c 62 61 63 6b 29 0a  ALL, xCallback).
1fab0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 72      **.    ** Ar
1fac0 72 61 6e 67 65 20 74 6f 20 69 6e 76 6f 6b 65 20  range to invoke 
1fad0 78 43 61 6c 6c 62 61 63 6b 28 29 20 77 68 65 6e  xCallback() when
1fae0 65 76 65 72 20 73 71 6c 69 74 65 33 46 61 75 6c  ever sqlite3Faul
1faf0 74 53 69 6d 28 29 20 69 73 20 63 61 6c 6c 65 64  tSim() is called
1fb00 2c 0a 20 20 20 20 2a 2a 20 69 66 20 78 43 61 6c  ,.    ** if xCal
1fb10 6c 62 61 63 6b 20 69 73 20 6e 6f 74 20 4e 55 4c  lback is not NUL
1fb20 4c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  L..    **.    **
1fb30 20 41 73 20 61 20 74 65 73 74 20 6f 66 20 74 68   As a test of th
1fb40 65 20 66 61 75 6c 74 20 73 69 6d 75 6c 61 74 6f  e fault simulato
1fb50 72 20 6d 65 63 68 61 6e 69 73 6d 20 69 74 73 65  r mechanism itse
1fb60 6c 66 2c 20 73 71 6c 69 74 65 33 46 61 75 6c 74  lf, sqlite3Fault
1fb70 53 69 6d 28 30 29 0a 20 20 20 20 2a 2a 20 69 73  Sim(0).    ** is
1fb80 20 63 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74   called immediat
1fb90 65 6c 79 20 61 66 74 65 72 20 69 6e 73 74 61 6c  ely after instal
1fba0 6c 69 6e 67 20 74 68 65 20 6e 65 77 20 63 61 6c  ling the new cal
1fbb0 6c 62 61 63 6b 20 61 6e 64 20 74 68 65 20 72 65  lback and the re
1fbc0 74 75 72 6e 0a 20 20 20 20 2a 2a 20 76 61 6c 75  turn.    ** valu
1fbd0 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 46 61  e from sqlite3Fa
1fbe0 75 6c 74 53 69 6d 28 30 29 20 62 65 63 6f 6d 65  ultSim(0) become
1fbf0 73 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f  s the return fro
1fc00 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  m.    ** sqlite3
1fc10 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e  _test_control().
1fc20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1fc30 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1fc40 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20  _FAULT_INSTALL: 
1fc50 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20  {.      /* MSVC 
1fc60 69 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70  is picky about p
1fc70 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73  ulling func ptrs
1fc80 20 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a   from va lists..
1fc90 20 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f        ** http://
1fca0 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66  support.microsof
1fcb0 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20  t.com/kb/47961. 
1fcc0 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47       ** sqlite3G
1fcd0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73  lobalConfig.xTes
1fce0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61  tCallback = va_a
1fcf0 72 67 28 61 70 2c 20 69 6e 74 28 2a 29 28 69 6e  rg(ap, int(*)(in
1fd00 74 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20  t));.      */.  
1fd10 20 20 20 20 74 79 70 65 64 65 66 20 69 6e 74 28      typedef int(
1fd20 2a 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e  *TESTCALLBACKFUN
1fd30 43 5f 74 29 28 69 6e 74 29 3b 0a 20 20 20 20 20  C_t)(int);.     
1fd40 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1fd50 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61  nfig.xTestCallba
1fd60 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ck = va_arg(ap, 
1fd70 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43  TESTCALLBACKFUNC
1fd80 5f 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  _t);.      rc = 
1fd90 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
1fda0 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
1fdb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
1fdc0 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
1fdd0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49  est_control(BENI
1fde0 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c  GN_MALLOC_HOOKS,
1fdf0 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20   xBegin, xEnd). 
1fe00 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67     **.    ** Reg
1fe10 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63  ister hooks to c
1fe20 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65 20  all to indicate 
1fe30 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66  which malloc() f
1fe40 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a 20  ailures .    ** 
1fe50 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20  are benign..    
1fe60 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1fe70 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49  TE_TESTCTRL_BENI
1fe80 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a  GN_MALLOC_HOOKS:
1fe90 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65 66   {.      typedef
1fea0 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e   void (*void_fun
1feb0 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20  ction)(void);.  
1fec0 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f      void_functio
1fed0 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a  n xBenignBegin;.
1fee0 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74        void_funct
1fef0 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a  ion xBenignEnd;.
1ff00 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65 67        xBenignBeg
1ff10 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  in = va_arg(ap, 
1ff20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a  void_function);.
1ff30 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e 64        xBenignEnd
1ff40 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
1ff50 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20  id_function);.  
1ff60 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69 67      sqlite3Benig
1ff70 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65  nMallocHooks(xBe
1ff80 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69  nignBegin, xBeni
1ff90 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62 72  gnEnd);.      br
1ffa0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1ffb0 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1ffc0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1ffd0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1ffe0 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e  PENDING_BYTE, un
1fff0 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20 20  signed int X).  
20000 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20    **.    ** Set 
20010 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
20020 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e   to the value in
20030 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 69   the argument, i
20040 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61  f X>0..    ** Ma
20050 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66  ke no changes if
20060 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20 74   X==0.  Return t
20070 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
20080 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20 20  pending byte.   
20090 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74 69   ** as it existi
200a0 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ng before this r
200b0 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
200c0 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
200d0 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68 61   IMPORTANT:  Cha
200e0 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e  nging the PENDIN
200f0 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34 30  G byte from 0x40
20100 30 30 30 30 30 30 20 72 65 73 75 6c 74 73 20 69  000000 results i
20110 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f  n.    ** an inco
20120 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62 61 73  mpatible databas
20130 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20  e file format.  
20140 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e  Changing the PEN
20150 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a 2a  DING byte.    **
20160 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61 62   while any datab
20170 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ase connection i
20180 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20 69  s open results i
20190 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a  n undefined and.
201a0 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 72 69 6f      ** deleterio
201b0 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20  us behavior..   
201c0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
201d0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e  ITE_TESTCTRL_PEN
201e0 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20  DING_BYTE: {.   
201f0 20 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f     rc = PENDING_
20200 42 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53 51  BYTE;.#ifndef SQ
20210 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20  LITE_OMIT_WSD.  
20220 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75 6e      {.        un
20230 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56 61  signed int newVa
20240 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  l = va_arg(ap, u
20250 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
20260 20 20 20 20 20 20 69 66 28 20 6e 65 77 56 61 6c        if( newVal
20270 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69 6e   ) sqlite3Pendin
20280 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a  gByte = newVal;.
20290 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
202a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
202b0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
202c0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
202d0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
202e0 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 69  STCTRL_ASSERT, i
202f0 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
20300 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20   ** This action 
20310 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74  provides a run-t
20320 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20  ime test to see 
20330 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20  whether or not. 
20340 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 77     ** assert() w
20350 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  as enabled at co
20360 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20  mpile-time.  If 
20370 58 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 73  X is true and as
20380 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69 73  sert().    ** is
20390 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74   enabled, then t
203a0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
203b0 69 73 20 74 72 75 65 2e 20 20 49 66 20 58 20 69  is true.  If X i
203c0 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20 2a  s true and.    *
203d0 2a 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  * assert() is di
203e0 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  sabled, then the
203f0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
20400 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73 0a   zero.  If X is.
20410 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64      ** false and
20420 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61   assert() is ena
20430 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 61  bled, then the a
20440 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20 61  ssertion fires a
20450 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72  nd the.    ** pr
20460 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20 49  ocess aborts.  I
20470 66 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e 64  f X is false and
20480 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73   assert() is dis
20490 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a  abled, then the.
204a0 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61      ** return va
204b0 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20  lue is zero..   
204c0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
204d0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
204e0 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c  ERT: {.      vol
204f0 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b  atile int x = 0;
20500 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2f  .      assert( /
20510 2a 73 69 64 65 2d 65 66 66 65 63 74 73 2d 6f 6b  *side-effects-ok
20520 2a 2f 20 28 78 20 3d 20 76 61 5f 61 72 67 28 61  */ (x = va_arg(a
20530 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20  p,int))!=0 );.  
20540 20 20 20 20 72 63 20 3d 20 78 3b 0a 20 20 20 20      rc = x;.    
20550 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
20560 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
20570 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
20580 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
20590 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74  CTRL_ALWAYS, int
205a0 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   X).    **.    *
205b0 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72  * This action pr
205c0 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d  ovides a run-tim
205d0 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 68 6f  e test to see ho
205e0 77 20 74 68 65 20 41 4c 57 41 59 53 20 61 6e 64  w the ALWAYS and
205f0 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61  .    ** NEVER ma
20600 63 72 6f 73 20 77 65 72 65 20 64 65 66 69 6e 65  cros were define
20610 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
20620 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
20630 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
20640 65 20 69 73 20 41 4c 57 41 59 53 28 58 29 20 69  e is ALWAYS(X) i
20650 66 20 58 20 69 73 20 74 72 75 65 2c 20 6f 72 20  f X is true, or 
20660 30 20 69 66 20 58 20 69 73 20 66 61 6c 73 65 2e  0 if X is false.
20670 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
20680 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74  he recommended t
20690 65 73 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66  est is X==2.  If
206a0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
206b0 65 20 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61  e is 2, that mea
206c0 6e 73 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53  ns.    ** ALWAYS
206d0 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61  () and NEVER() a
206e0 72 65 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61  re both no-op pa
206f0 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f  ss-through macro
20700 73 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 0a  s, which is the.
20710 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73      ** default s
20720 65 74 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20  etting.  If the 
20730 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
20740 31 2c 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29  1, then ALWAYS()
20750 20 69 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a   is either.    *
20760 2a 20 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20  * hard-coded to 
20770 74 72 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20  true or else it 
20780 61 73 73 65 72 74 73 20 69 66 20 69 74 73 20 61  asserts if its a
20790 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65  rgument is false
207a0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72  ..    ** The fir
207b0 73 74 20 62 65 68 61 76 69 6f 72 20 28 68 61 72  st behavior (har
207c0 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29  d-coded to true)
207d0 20 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a   is the case if.
207e0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45      ** SQLITE_TE
207f0 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68  STCTRL_ASSERT sh
20800 6f 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28  ows that assert(
20810 29 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e  ) is disabled an
20820 64 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20  d the second.   
20830 20 2a 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73   ** behavior (as
20840 73 65 72 74 20 69 66 20 74 68 65 20 61 72 67 75  sert if the argu
20850 6d 65 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29  ment to ALWAYS()
20860 20 69 73 20 66 61 6c 73 65 29 20 69 73 20 74 68   is false) is th
20870 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a  e case if.    **
20880 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
20890 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68  _ASSERT shows th
208a0 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20 65  at assert() is e
208b0 6e 61 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  nabled..    **. 
208c0 20 20 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69     ** The run-ti
208d0 6d 65 20 74 65 73 74 20 70 72 6f 63 65 64 75 72  me test procedur
208e0 65 20 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d  e might look som
208f0 65 74 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73  ething like this
20900 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
20910 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74     if( sqlite3_t
20920 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
20930 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
20940 59 53 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20  YS, 2)==2 ){.   
20950 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41   **      // ALWA
20960 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29  YS() and NEVER()
20970 20 61 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d   are no-op pass-
20980 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20  through macros. 
20990 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69     **    }else i
209a0 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  f( sqlite3_test_
209b0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
209c0 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20  ESTCTRL_ASSERT, 
209d0 31 29 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20  1) ){.    **    
209e0 20 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61    // ALWAYS(x) a
209f0 73 73 65 72 74 73 20 74 68 61 74 20 78 20 69 73  sserts that x is
20a00 20 74 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20   true. NEVER(x) 
20a10 61 73 73 65 72 74 73 20 78 20 69 73 20 66 61 6c  asserts x is fal
20a20 73 65 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65  se..    **    }e
20a30 6c 73 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20  lse{.    **     
20a40 20 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73   // ALWAYS(x) is
20a50 20 61 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20   a constant 1.  
20a60 4e 45 56 45 52 28 78 29 20 69 73 20 61 20 63 6f  NEVER(x) is a co
20a70 6e 73 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a  nstant 0..    **
20a80 20 20 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20      }.    */.   
20a90 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
20aa0 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a  TCTRL_ALWAYS: {.
20ab0 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61        int x = va
20ac0 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20  _arg(ap,int);.  
20ad0 20 20 20 20 72 63 20 3d 20 78 20 3f 20 41 4c 57      rc = x ? ALW
20ae0 41 59 53 28 78 29 20 3a 20 30 3b 0a 20 20 20 20  AYS(x) : 0;.    
20af0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
20b00 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
20b10 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
20b20 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
20b30 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 29 3b  CTRL_BYTEORDER);
20b40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
20b50 68 65 20 69 6e 74 65 67 65 72 20 72 65 74 75 72  he integer retur
20b60 6e 65 64 20 72 65 76 65 61 6c 73 20 74 68 65 20  ned reveals the 
20b70 62 79 74 65 2d 6f 72 64 65 72 20 6f 66 20 74 68  byte-order of th
20b80 65 20 63 6f 6d 70 75 74 65 72 20 6f 6e 20 77 68  e computer on wh
20b90 69 63 68 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74  ich.    ** SQLit
20ba0 65 20 69 73 20 72 75 6e 6e 69 6e 67 3a 0a 20 20  e is running:.  
20bb0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
20bc0 20 20 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69    1     big-endi
20bd0 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65  an,    determine
20be0 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20  d at run-time.  
20bf0 20 20 2a 2a 20 20 20 20 20 20 31 30 20 20 20 20    **      10    
20c00 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20   little-endian, 
20c10 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75  determined at ru
20c20 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 34  n-time.    **  4
20c30 33 32 31 30 31 20 20 20 20 20 62 69 67 2d 65 6e  32101     big-en
20c40 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69  dian,    determi
20c50 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ned at compile-t
20c60 69 6d 65 0a 20 20 20 20 2a 2a 20 20 31 32 33 34  ime.    **  1234
20c70 31 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e  10     little-en
20c80 64 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64  dian, determined
20c90 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
20ca0 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 63 61 73  .    */ .    cas
20cb0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
20cc0 4c 5f 42 59 54 45 4f 52 44 45 52 3a 20 7b 0a 20  L_BYTEORDER: {. 
20cd0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
20ce0 5f 42 59 54 45 4f 52 44 45 52 2a 31 30 30 20 2b  _BYTEORDER*100 +
20cf0 20 53 51 4c 49 54 45 5f 4c 49 54 54 4c 45 45 4e   SQLITE_LITTLEEN
20d00 44 49 41 4e 2a 31 30 20 2b 20 53 51 4c 49 54 45  DIAN*10 + SQLITE
20d10 5f 42 49 47 45 4e 44 49 41 4e 3b 0a 20 20 20 20  _BIGENDIAN;.    
20d20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
20d30 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
20d40 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
20d50 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45  LITE_TESTCTRL_RE
20d60 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20 2a  SERVE, sqlite3 *
20d70 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a  db, int N).    *
20d80 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65  *.    ** Set the
20d90 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20 74   nReserve size t
20da0 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  o N for the main
20db0 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68 65   database on the
20dc0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
20dd0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a   connection db..
20de0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
20df0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
20e00 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20 20  RESERVE: {.     
20e10 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
20e20 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
20e30 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78  3*);.      int x
20e40 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
20e50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20e60 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
20e70 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73  >mutex);.      s
20e80 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
20e90 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30  geSize(db->aDb[0
20ea0 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b  ].pBt, 0, x, 0);
20eb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
20ec0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
20ed0 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65  utex);.      bre
20ee0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
20ef0 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
20f00 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
20f10 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
20f20 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a  TIONS, sqlite3 *
20f30 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a  db, int N).    *
20f40 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20  *.    ** Enable 
20f50 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72 69 6f  or disable vario
20f60 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  us optimizations
20f70 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
20f80 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20 20  poses.  The .   
20f90 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20 69   ** argument N i
20fa0 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f  s a bitmask of o
20fb0 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20  ptimizations to 
20fc0 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46 6f  be disabled.  Fo
20fd0 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20  r normal.    ** 
20fe0 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75  operation N shou
20ff0 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 69 64  ld be 0.  The id
21000 65 61 20 69 73 20 74 68 61 74 20 61 20 74 65 73  ea is that a tes
21010 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20  t program (like 
21020 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c  the.    ** SQL L
21030 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c 54  ogic Test or SLT
21040 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63 61   test module) ca
21050 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20 53  n run the same S
21060 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  QL multiple time
21070 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76 61  s.    ** with va
21080 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69  rious optimizati
21090 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f 20  ons disabled to 
210a0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
210b0 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20 20  same answer.    
210c0 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ** is obtained i
210d0 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20 20  n every case..  
210e0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
210f0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
21100 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20  TIMIZATIONS: {. 
21110 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
21120 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
21130 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64  lite3*);.      d
21140 62 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d 20  b->dbOptFlags = 
21150 28 75 31 36 29 28 76 61 5f 61 72 67 28 61 70 2c  (u16)(va_arg(ap,
21160 20 69 6e 74 29 20 26 20 30 78 66 66 66 66 29 3b   int) & 0xffff);
21170 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
21180 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71    }..    /*   sq
21190 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
211a0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
211b0 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55  RL_LOCALTIME_FAU
211c0 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a  LT, int onoff);.
211d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
211e0 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66   parameter onoff
211f0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 73 75   is non-zero, su
21200 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
21210 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29 0a 20 20  o localtime().  
21220 20 20 2a 2a 20 61 6e 64 20 69 74 73 20 76 61 72    ** and its var
21230 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66 20 6f  iants fail. If o
21240 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 20 75 6e  noff is zero, un
21250 64 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e  do this setting.
21260 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
21270 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
21280 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
21290 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
212a0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c  3GlobalConfig.bL
212b0 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20  ocaltimeFault = 
212c0 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
212d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
212e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71    }..    /*   sq
212f0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
21300 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
21310 52 4c 5f 49 4e 54 45 52 4e 41 4c 5f 46 55 4e 43  RL_INTERNAL_FUNC
21320 53 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20  S, int onoff);. 
21330 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
21340 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20  parameter onoff 
21350 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 6e 74  is non-zero, int
21360 65 72 6e 61 6c 2d 75 73 65 2d 6f 6e 6c 79 20 53  ernal-use-only S
21370 51 4c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20  QL functions.   
21380 20 2a 2a 20 61 72 65 20 76 69 73 69 62 6c 65 20   ** are visible 
21390 74 6f 20 6f 72 64 69 6e 61 72 79 20 53 51 4c 2e  to ordinary SQL.
213a0 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c    This is useful
213b0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 62 75 74   for testing but
213c0 20 69 73 0a 20 20 20 20 2a 2a 20 75 6e 73 61 66   is.    ** unsaf
213d0 65 20 62 65 63 61 75 73 65 20 69 6e 76 61 6c 69  e because invali
213e0 64 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20  d parameters to 
213f0 74 68 6f 73 65 20 69 6e 74 65 72 6e 61 6c 2d 75  those internal-u
21400 73 65 2d 6f 6e 6c 79 20 66 75 6e 63 74 69 6f 6e  se-only function
21410 73 0a 20 20 20 20 2a 2a 20 63 61 6e 20 72 65 73  s.    ** can res
21420 75 6c 74 20 69 6e 20 63 72 61 73 68 65 73 20 6f  ult in crashes o
21430 72 20 73 65 67 66 61 75 6c 74 73 2e 0a 20 20 20  r segfaults..   
21440 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
21450 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4e 54  ITE_TESTCTRL_INT
21460 45 52 4e 41 4c 5f 46 55 4e 43 54 49 4f 4e 53 3a  ERNAL_FUNCTIONS:
21470 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
21480 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 49 6e  GlobalConfig.bIn
21490 74 65 72 6e 61 6c 46 75 6e 63 74 69 6f 6e 73 20  ternalFunctions 
214a0 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
214b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
214c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
214d0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
214e0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
214f0 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55  CTRL_NEVER_CORRU
21500 50 54 2c 20 69 6e 74 29 3b 0a 20 20 20 20 2a 2a  PT, int);.    **
21510 0a 20 20 20 20 2a 2a 20 53 65 74 20 6f 72 20 63  .    ** Set or c
21520 6c 65 61 72 20 61 20 66 6c 61 67 20 74 68 61 74  lear a flag that
21530 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
21540 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
21550 65 20 69 73 20 61 6c 77 61 79 73 20 77 65 6c 6c  e is always well
21560 2d 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 65 64 20  -.    ** formed 
21570 61 6e 64 20 6e 65 76 65 72 20 63 6f 72 72 75 70  and never corrup
21580 74 2e 20 20 54 68 69 73 20 66 6c 61 67 20 69 73  t.  This flag is
21590 20 63 6c 65 61 72 20 62 79 20 64 65 66 61 75 6c   clear by defaul
215a0 74 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  t, indicating th
215b0 61 74 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  at.    ** databa
215c0 73 65 20 66 69 6c 65 73 20 6d 69 67 68 74 20 68  se files might h
215d0 61 76 65 20 61 72 62 69 74 72 61 72 79 20 63 6f  ave arbitrary co
215e0 72 72 75 70 74 69 6f 6e 2e 20 20 53 65 74 74 69  rruption.  Setti
215f0 6e 67 20 74 68 65 20 66 6c 61 67 20 64 75 72 69  ng the flag duri
21600 6e 67 0a 20 20 20 20 2a 2a 20 74 65 73 74 69 6e  ng.    ** testin
21610 67 20 63 61 75 73 65 73 20 63 65 72 74 61 69 6e  g causes certain
21620 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
21630 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 64 65  ents in the code
21640 20 74 6f 20 62 65 20 61 63 74 69 76 61 74 65 64   to be activated
21650 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 65 6d  .    ** that dem
21660 6f 6e 73 74 72 61 74 20 69 6e 76 61 72 69 61 6e  onstrat invarian
21670 74 73 20 6f 6e 20 77 65 6c 6c 2d 66 6f 72 6d 65  ts on well-forme
21680 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  d database files
21690 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
216a0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
216b0 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 3a  L_NEVER_CORRUPT:
216c0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
216d0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 65 76  GlobalConfig.nev
216e0 65 72 43 6f 72 72 75 70 74 20 3d 20 76 61 5f 61  erCorrupt = va_a
216f0 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
21700 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
21710 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
21720 74 68 72 65 73 68 6f 6c 64 20 61 74 20 77 68 69  threshold at whi
21730 63 68 20 4f 50 5f 4f 6e 63 65 20 63 6f 75 6e 74  ch OP_Once count
21740 65 72 73 20 72 65 73 65 74 20 62 61 63 6b 20 74  ers reset back t
21750 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2a 20 42  o zero..    ** B
21760 79 20 64 65 66 61 75 6c 74 20 74 68 69 73 20 69  y default this i
21770 73 20 30 78 37 66 66 66 66 66 66 65 20 28 6f 76  s 0x7ffffffe (ov
21780 65 72 20 32 20 62 69 6c 6c 69 6f 6e 29 2c 20 62  er 2 billion), b
21790 75 74 20 74 68 61 74 20 76 61 6c 75 65 20 69 73  ut that value is
217a0 0a 20 20 20 20 2a 2a 20 74 6f 6f 20 62 69 67 20  .    ** too big 
217b0 74 6f 20 74 65 73 74 20 69 6e 20 61 20 72 65 61  to test in a rea
217c0 73 6f 6e 61 62 6c 65 20 61 6d 6f 75 6e 74 20 6f  sonable amount o
217d0 66 20 74 69 6d 65 2c 20 73 6f 20 74 68 69 73 20  f time, so this 
217e0 63 6f 6e 74 72 6f 6c 20 69 73 0a 20 20 20 20 2a  control is.    *
217f0 2a 20 70 72 6f 76 69 64 65 64 20 74 6f 20 73 65  * provided to se
21800 74 20 61 20 73 6d 61 6c 6c 20 61 6e 64 20 65 61  t a small and ea
21810 73 69 6c 79 20 72 65 61 63 68 61 62 6c 65 20 72  sily reachable r
21820 65 73 65 74 20 76 61 6c 75 65 2e 0a 20 20 20 20  eset value..    
21830 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
21840 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 4e 43 45  TE_TESTCTRL_ONCE
21850 5f 52 45 53 45 54 5f 54 48 52 45 53 48 4f 4c 44  _RESET_THRESHOLD
21860 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
21870 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 4f  3GlobalConfig.iO
21880 6e 63 65 52 65 73 65 74 54 68 72 65 73 68 6f 6c  nceResetThreshol
21890 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  d = va_arg(ap, i
218a0 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
218b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
218c0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
218d0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
218e0 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45  STCTRL_VDBE_COVE
218f0 52 41 47 45 2c 20 78 43 61 6c 6c 62 61 63 6b 2c  RAGE, xCallback,
21900 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a 0a 20 20   ptr);.    **.  
21910 20 20 2a 2a 20 53 65 74 20 74 68 65 20 56 44 42    ** Set the VDB
21920 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c 6c 62  E coverage callb
21930 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  ack function to 
21940 78 43 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 63  xCallback with c
21950 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2a 20 70  ontext .    ** p
21960 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20 20 20 20  ointer ptr..    
21970 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
21980 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45  TE_TESTCTRL_VDBE
21990 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a 23 69 66  _COVERAGE: {.#if
219a0 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
219b0 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20 74  COVERAGE.      t
219c0 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 62 72  ypedef void (*br
219d0 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29 28 76  anch_callback)(v
219e0 6f 69 64 2a 2c 75 6e 73 69 67 6e 65 64 20 69 6e  oid*,unsigned in
219f0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
21a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a10 20 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65           unsigne
21a20 64 20 63 68 61 72 2c 75 6e 73 69 67 6e 65 64 20  d char,unsigned 
21a30 63 68 61 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  char);.      sql
21a40 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
21a50 2e 78 56 64 62 65 42 72 61 6e 63 68 20 3d 20 76  .xVdbeBranch = v
21a60 61 5f 61 72 67 28 61 70 2c 62 72 61 6e 63 68 5f  a_arg(ap,branch_
21a70 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20  callback);.     
21a80 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
21a90 6e 66 69 67 2e 70 56 64 62 65 42 72 61 6e 63 68  nfig.pVdbeBranch
21aa0 41 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Arg = va_arg(ap,
21ab0 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 20  void*);.#endif. 
21ac0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21ad0 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
21ae0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
21af0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
21b00 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62  _SORTER_MMAP, db
21b10 2c 20 6e 4d 61 78 29 3b 20 2a 2f 0a 20 20 20 20  , nMax); */.    
21b20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
21b30 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50  CTRL_SORTER_MMAP
21b40 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
21b50 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61  3 *db = va_arg(a
21b60 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  p, sqlite3*);.  
21b70 20 20 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74      db->nMaxSort
21b80 65 72 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28  erMmap = va_arg(
21b90 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
21ba0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
21bb0 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
21bc0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
21bd0 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e  TE_TESTCTRL_ISIN
21be0 49 54 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  IT);.    **.    
21bf0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
21c00 5f 4f 4b 20 69 66 20 53 51 4c 69 74 65 20 68 61  _OK if SQLite ha
21c10 73 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  s been initializ
21c20 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 45 52  ed and SQLITE_ER
21c30 52 4f 52 20 69 66 0a 20 20 20 20 2a 2a 20 6e 6f  ROR if.    ** no
21c40 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
21c50 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
21c60 52 4c 5f 49 53 49 4e 49 54 3a 20 7b 0a 20 20 20  RL_ISINIT: {.   
21c70 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
21c80 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69  obalConfig.isIni
21c90 74 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49  t==0 ) rc = SQLI
21ca0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
21cb0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
21cc0 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    /*  sqlite3_te
21cd0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
21ce0 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
21cf0 54 45 52 2c 20 64 62 2c 20 64 62 4e 61 6d 65 2c  TER, db, dbName,
21d00 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a 20   onOff, tnum);. 
21d10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
21d20 73 20 74 65 73 74 20 63 6f 6e 74 72 6f 6c 20 69  s test control i
21d30 73 20 75 73 65 64 20 74 6f 20 63 72 65 61 74 65  s used to create
21d40 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73   imposter tables
21d50 2e 20 20 22 64 62 22 20 69 73 20 61 20 70 6f 69  .  "db" is a poi
21d60 6e 74 65 72 0a 20 20 20 20 2a 2a 20 74 6f 20 74  nter.    ** to t
21d70 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
21d80 65 63 74 69 6f 6e 2e 20 20 64 62 4e 61 6d 65 20  ection.  dbName 
21d90 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
21da0 6e 61 6d 65 20 28 65 78 3a 20 22 6d 61 69 6e 22  name (ex: "main"
21db0 20 6f 72 0a 20 20 20 20 2a 2a 20 22 74 65 6d 70   or.    ** "temp
21dc0 22 29 20 77 68 69 63 68 20 77 69 6c 6c 20 72 65  ") which will re
21dd0 63 65 69 76 65 20 74 68 65 20 69 6d 70 6f 73 74  ceive the impost
21de0 65 72 2e 20 20 22 6f 6e 4f 66 66 22 20 74 75 72  er.  "onOff" tur
21df0 6e 73 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65  ns imposter mode
21e00 20 6f 6e 0a 20 20 20 20 2a 2a 20 6f 72 20 6f 66   on.    ** or of
21e10 66 2e 20 20 22 74 6e 75 6d 22 20 69 73 20 74 68  f.  "tnum" is th
21e20 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
21e30 68 65 20 62 2d 74 72 65 65 20 74 6f 20 77 68 69  he b-tree to whi
21e40 63 68 20 74 68 65 20 69 6d 70 6f 73 74 65 72 0a  ch the imposter.
21e50 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 73 68 6f      ** table sho
21e60 75 6c 64 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20  uld connect..   
21e70 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c   **.    ** Enabl
21e80 65 20 69 6d 70 6f 73 74 65 72 20 6d 6f 64 65 20  e imposter mode 
21e90 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 20 73 63  only when the sc
21ea0 68 65 6d 61 20 68 61 73 20 61 6c 72 65 61 64 79  hema has already
21eb0 20 62 65 65 6e 20 70 61 72 73 65 64 2e 20 20 54   been parsed.  T
21ec0 68 65 6e 0a 20 20 20 20 2a 2a 20 72 75 6e 20 61  hen.    ** run a
21ed0 20 73 69 6e 67 6c 65 20 43 52 45 41 54 45 20 54   single CREATE T
21ee0 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 74  ABLE statement t
21ef0 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  o construct the 
21f00 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 69  imposter table i
21f10 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 72  n.    ** the par
21f20 73 65 64 20 73 63 68 65 6d 61 2e 20 20 54 68 65  sed schema.  The
21f30 6e 20 74 75 72 6e 20 69 6d 70 6f 73 74 65 72 20  n turn imposter 
21f40 6d 6f 64 65 20 62 61 63 6b 20 6f 66 66 20 61 67  mode back off ag
21f50 61 69 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ain..    **.    
21f60 2a 2a 20 49 66 20 6f 6e 4f 66 66 3d 3d 30 20 61  ** If onOff==0 a
21f70 6e 64 20 74 6e 75 6d 3e 30 20 74 68 65 6e 20 72  nd tnum>0 then r
21f80 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20  eset the schema 
21f90 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73 65  for all database
21fa0 73 2c 20 63 61 75 73 69 6e 67 0a 20 20 20 20 2a  s, causing.    *
21fb0 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20  * the schema to 
21fc0 62 65 20 72 65 70 61 72 73 65 64 20 74 68 65 20  be reparsed the 
21fd0 6e 65 78 74 20 74 69 6d 65 20 69 74 20 69 73 20  next time it is 
21fe0 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20 68 61  needed.  This ha
21ff0 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 66 66  s the.    ** eff
22000 65 63 74 20 6f 66 20 65 72 61 73 69 6e 67 20 61  ect of erasing a
22010 6c 6c 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c  ll imposter tabl
22020 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  es..    */.    c
22030 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
22040 54 52 4c 5f 49 4d 50 4f 53 54 45 52 3a 20 7b 0a  TRL_IMPOSTER: {.
22050 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
22060 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
22070 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
22080 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
22090 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
220a0 20 20 20 20 20 20 64 62 2d 3e 69 6e 69 74 2e 69        db->init.i
220b0 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
220c0 44 62 4e 61 6d 65 28 64 62 2c 20 76 61 5f 61 72  DbName(db, va_ar
220d0 67 28 61 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a  g(ap,const char*
220e0 29 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e  ));.      db->in
220f0 69 74 2e 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e  it.busy = db->in
22100 69 74 2e 69 6d 70 6f 73 74 65 72 54 61 62 6c 65  it.imposterTable
22110 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
22120 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 69 6e 69  );.      db->ini
22130 74 2e 6e 65 77 54 6e 75 6d 20 3d 20 76 61 5f 61  t.newTnum = va_a
22140 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
22150 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
22160 75 73 79 3d 3d 30 20 26 26 20 64 62 2d 3e 69 6e  usy==0 && db->in
22170 69 74 2e 6e 65 77 54 6e 75 6d 3e 30 20 29 7b 0a  it.newTnum>0 ){.
22180 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
22190 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
221a0 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a  Connection(db);.
221b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
221c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
221d0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
221e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
221f0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 59 59  ..#if defined(YY
22200 43 4f 56 45 52 41 47 45 29 0a 20 20 20 20 2f 2a  COVERAGE).    /*
22210 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
22220 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
22230 53 54 43 54 52 4c 5f 50 41 52 53 45 52 5f 43 4f  STCTRL_PARSER_CO
22240 56 45 52 41 47 45 2c 20 46 49 4c 45 20 2a 6f 75  VERAGE, FILE *ou
22250 74 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t).    **.    **
22260 20 54 68 69 73 20 74 65 73 74 20 63 6f 6e 74 72   This test contr
22270 6f 6c 20 28 6f 6e 6c 79 20 61 76 61 69 6c 61 62  ol (only availab
22280 6c 65 20 77 68 65 6e 20 53 51 4c 69 74 65 20 69  le when SQLite i
22290 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a  s compiled with.
222a0 20 20 20 20 2a 2a 20 2d 44 59 59 43 4f 56 45 52      ** -DYYCOVER
222b0 41 47 45 29 20 77 72 69 74 65 73 20 61 20 72 65  AGE) writes a re
222c0 70 6f 72 74 20 6f 6e 74 6f 20 22 6f 75 74 22 20  port onto "out" 
222d0 74 68 61 74 20 73 68 6f 77 73 20 61 6c 6c 0a 20  that shows all. 
222e0 20 20 20 2a 2a 20 73 74 61 74 65 2f 6c 6f 6f 6b     ** state/look
222f0 61 68 65 61 64 20 63 6f 6d 62 69 6e 61 74 69 6f  ahead combinatio
22300 6e 73 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  ns in the parser
22310 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 0a 20   state machine. 
22320 20 20 20 2a 2a 20 77 68 69 63 68 20 61 72 65 20     ** which are 
22330 6e 65 76 65 72 20 65 78 65 72 63 69 73 65 64 2e  never exercised.
22340 20 20 49 66 20 61 6e 79 20 73 74 61 74 65 20 69    If any state i
22350 73 20 6d 69 73 73 65 64 2c 20 6d 61 6b 65 20 74  s missed, make t
22360 68 65 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  he.    ** return
22370 20 63 6f 64 65 20 53 51 4c 49 54 45 5f 45 52 52   code SQLITE_ERR
22380 4f 52 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  OR..    */.    c
22390 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
223a0 54 52 4c 5f 50 41 52 53 45 52 5f 43 4f 56 45 52  TRL_PARSER_COVER
223b0 41 47 45 3a 20 7b 0a 20 20 20 20 20 20 46 49 4c  AGE: {.      FIL
223c0 45 20 2a 6f 75 74 20 3d 20 76 61 5f 61 72 67 28  E *out = va_arg(
223d0 61 70 2c 20 46 49 4c 45 2a 29 3b 0a 20 20 20 20  ap, FILE*);.    
223e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 72    if( sqlite3Par
223f0 73 65 72 43 6f 76 65 72 61 67 65 28 6f 75 74 29  serCoverage(out)
22400 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45   ) rc = SQLITE_E
22410 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
22420 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
22430 2f 2a 20 64 65 66 69 6e 65 64 28 59 59 43 4f 56  /* defined(YYCOV
22440 45 52 41 47 45 29 20 2a 2f 0a 0a 20 20 20 20 2f  ERAGE) */..    /
22450 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
22460 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
22470 45 53 54 43 54 52 4c 5f 52 45 53 55 4c 54 5f 49  ESTCTRL_RESULT_I
22480 4e 54 52 45 41 4c 2c 20 73 71 6c 69 74 65 33 5f  NTREAL, sqlite3_
22490 63 6f 6e 74 65 78 74 2a 29 3b 0a 20 20 20 20 2a  context*);.    *
224a0 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65  *.    ** This te
224b0 73 74 2d 63 6f 6e 74 72 6f 6c 20 63 61 75 73 65  st-control cause
224c0 73 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  s the most recen
224d0 74 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74  t sqlite3_result
224e0 5f 69 6e 74 36 34 28 29 20 76 61 6c 75 65 0a 20  _int64() value. 
224f0 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 74 65     ** to be inte
22500 72 70 72 65 74 65 64 20 61 73 20 61 20 4d 45 4d  rpreted as a MEM
22510 5f 49 6e 74 52 65 61 6c 20 69 6e 73 74 65 61 64  _IntReal instead
22520 20 6f 66 20 61 73 20 61 6e 20 4d 45 4d 5f 49 6e   of as an MEM_In
22530 74 2e 20 20 4e 6f 72 6d 61 6c 6c 79 2c 0a 20 20  t.  Normally,.  
22540 20 20 2a 2a 20 4d 45 4d 5f 49 6e 74 52 65 61 6c    ** MEM_IntReal
22550 20 76 61 6c 75 65 73 20 6f 6e 6c 79 20 61 72 69   values only ari
22560 73 65 20 64 75 72 69 6e 67 20 61 6e 20 49 4e 53  se during an INS
22570 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  ERT operation of
22580 20 69 6e 74 65 67 65 72 0a 20 20 20 20 2a 2a 20   integer.    ** 
22590 76 61 6c 75 65 73 20 69 6e 74 6f 20 61 20 52 45  values into a RE
225a0 41 4c 20 63 6f 6c 75 6d 6e 2c 20 73 6f 20 74 68  AL column, so th
225b0 65 79 20 63 61 6e 20 62 65 20 63 68 61 6c 6c 65  ey can be challe
225c0 6e 67 69 6e 67 20 74 6f 20 74 65 73 74 2e 20 20  nging to test.  
225d0 54 68 69 73 0a 20 20 20 20 2a 2a 20 74 65 73 74  This.    ** test
225e0 2d 63 6f 6e 74 72 6f 6c 20 65 6e 61 62 6c 65 73  -control enables
225f0 20 75 73 20 74 6f 20 77 72 69 74 65 20 61 6e 20   us to write an 
22600 69 6e 74 72 65 61 6c 28 29 20 53 51 4c 20 66 75  intreal() SQL fu
22610 6e 63 74 69 6f 6e 20 74 68 61 74 20 63 61 6e 0a  nction that can.
22620 20 20 20 20 2a 2a 20 69 6e 6a 65 63 74 20 61 6e      ** inject an
22630 20 69 6e 74 72 65 61 6c 28 29 20 76 61 6c 75 65   intreal() value
22640 20 61 74 20 61 72 62 69 74 72 61 72 79 20 70 6c   at arbitrary pl
22650 61 63 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73  aces in an SQL s
22660 74 61 74 65 6d 65 6e 74 2c 0a 20 20 20 20 2a 2a  tatement,.    **
22670 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
22680 70 6f 73 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  poses..    */.  
22690 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
226a0 53 54 43 54 52 4c 5f 52 45 53 55 4c 54 5f 49 4e  STCTRL_RESULT_IN
226b0 54 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73  TREAL: {.      s
226c0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
226d0 70 43 74 78 20 3d 20 76 61 5f 61 72 67 28 61 70  pCtx = va_arg(ap
226e0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  , sqlite3_contex
226f0 74 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t*);.      sqlit
22700 65 33 52 65 73 75 6c 74 49 6e 74 52 65 61 6c 28  e3ResultIntReal(
22710 70 43 74 78 29 3b 0a 20 20 20 20 20 20 62 72 65  pCtx);.      bre
22720 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
22730 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64  va_end(ap);.#end
22740 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 4e 54  if /* SQLITE_UNT
22750 45 53 54 41 42 4c 45 20 2a 2f 0a 20 20 72 65 74  ESTABLE */.  ret
22760 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22770 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69   This is a utili
22780 74 79 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66  ty routine, usef
22790 75 6c 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d  ul to VFS implem
227a0 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20  entations, that 
227b0 63 68 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65  checks.** to see
227c0 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66   if a database f
227d0 69 6c 65 20 77 61 73 20 61 20 55 52 49 20 74 68  ile was a URI th
227e0 61 74 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73  at contained a s
227f0 70 65 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a  pecific query .*
22800 2a 20 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64  * parameter, and
22810 20 69 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74   if so obtains t
22820 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
22830 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
22840 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65  .**.** The zFile
22850 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73  name argument is
22860 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f   the filename po
22870 69 6e 74 65 72 20 70 61 73 73 65 64 20 69 6e 74  inter passed int
22880 6f 20 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a  o the xOpen().**
22890 20 6d 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53   method of a VFS
228a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
228b0 20 20 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67    The zParam arg
228c0 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d  ument is the nam
228d0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72  e of the.** quer
228e0 79 20 70 61 72 61 6d 65 74 65 72 20 77 65 20 73  y parameter we s
228f0 65 65 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69  eek.  This routi
22900 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 76  ne returns the v
22910 61 6c 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72  alue of the zPar
22920 61 6d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  am.** parameter 
22930 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 20 49  if it exists.  I
22940 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
22950 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
22960 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
22970 72 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70  returns a NULL p
22980 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74  ointer..*/.const
22990 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75   char *sqlite3_u
229a0 72 69 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e  ri_parameter(con
229b0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
229c0 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
229d0 7a 50 61 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a  zParam){.  if( z
229e0 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
229f0 50 61 72 61 6d 3d 3d 30 20 29 20 72 65 74 75 72  Param==0 ) retur
22a00 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  n 0;.  zFilename
22a10 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
22a20 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  n30(zFilename) +
22a30 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46 69   1;.  while( zFi
22a40 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20  lename[0] ){.   
22a50 20 69 6e 74 20 78 20 3d 20 73 74 72 63 6d 70 28   int x = strcmp(
22a60 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61  zFilename, zPara
22a70 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  m);.    zFilenam
22a80 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
22a90 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20  en30(zFilename) 
22aa0 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d  + 1;.    if( x==
22ab0 30 20 29 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  0 ) return zFile
22ac0 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  name;.    zFilen
22ad0 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  ame += sqlite3St
22ae0 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65  rlen30(zFilename
22af0 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  ) + 1;.  }.  ret
22b00 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
22b10 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e  Return a boolean
22b20 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65   value for a que
22b30 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f  ry parameter..*/
22b40 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 75 72 69  .int sqlite3_uri
22b50 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63  _boolean(const c
22b60 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
22b70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
22b80 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a  am, int bDflt){.
22b90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
22ba0 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  = sqlite3_uri_pa
22bb0 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d  rameter(zFilenam
22bc0 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44  e, zParam);.  bD
22bd0 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a  flt = bDflt!=0;.
22be0 20 20 72 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c    return z ? sql
22bf0 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a  ite3GetBoolean(z
22c00 2c 20 62 44 66 6c 74 29 20 3a 20 62 44 66 6c 74  , bDflt) : bDflt
22c10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
22c20 6e 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  n a 64-bit integ
22c30 65 72 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71  er value for a q
22c40 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
22c50 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  */.sqlite3_int64
22c60 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74   sqlite3_uri_int
22c70 36 34 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  64(.  const char
22c80 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
22c90 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 73 20 70  /* Filename as p
22ca0 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a  assed to xOpen *
22cb0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
22cc0 7a 50 61 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a  zParam,       /*
22cd0 20 55 52 49 20 70 61 72 61 6d 65 74 65 72 20 73   URI parameter s
22ce0 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ought */.  sqlit
22cf0 65 33 5f 69 6e 74 36 34 20 62 44 66 6c 74 20 20  e3_int64 bDflt  
22d00 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 69       /* return i
22d10 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6d  f parameter is m
22d20 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63  issing */.){.  c
22d30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
22d40 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
22d50 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  eter(zFilename, 
22d60 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74  zParam);.  sqlit
22d70 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69 66  e3_int64 v;.  if
22d80 28 20 7a 20 26 26 20 73 71 6c 69 74 65 33 44 65  ( z && sqlite3De
22d90 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20 26  cOrHexToI64(z, &
22da0 76 29 3d 3d 30 20 29 7b 0a 20 20 20 20 62 44 66  v)==0 ){.    bDf
22db0 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65  lt = v;.  }.  re
22dc0 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f  turn bDflt;.}../
22dd0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
22de0 42 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69 64  Btree pointer id
22df0 65 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62 4e  entified by zDbN
22e00 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ame.  Return NUL
22e10 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
22e20 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74 65  */.Btree *sqlite
22e30 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 73  3DbNameToBtree(s
22e40 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
22e50 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29  t char *zDbName)
22e60 7b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 7a 44  {.  int iDb = zD
22e70 62 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 33 46  bName ? sqlite3F
22e80 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44  indDbName(db, zD
22e90 62 4e 61 6d 65 29 20 3a 20 30 3b 0a 20 20 72 65  bName) : 0;.  re
22ea0 74 75 72 6e 20 69 44 62 3c 30 20 3f 20 30 20 3a  turn iDb<0 ? 0 :
22eb0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
22ec0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
22ed0 72 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  rn the filename 
22ee0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
22ef0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22f00 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
22f10 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e  nnection..*/.con
22f20 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
22f30 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c  _db_filename(sql
22f40 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
22f50 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
22f60 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23 69    Btree *pBt;.#i
22f70 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
22f80 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
22f90 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
22fa0 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
22fb0 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
22fc0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
22fd0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
22fe0 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d 20 73  #endif.  pBt = s
22ff0 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
23000 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ree(db, zDbName)
23010 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f  ;.  return pBt ?
23020 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
23030 46 69 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a 20  Filename(pBt) : 
23040 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
23050 72 6e 20 31 20 69 66 20 64 61 74 61 62 61 73 65  rn 1 if database
23060 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72   is read-only or
23070 20 30 20 69 66 20 72 65 61 64 2f 77 72 69 74 65   0 if read/write
23080 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 0a  .  Return -1 if.
23090 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61 74 61 62  ** no such datab
230a0 61 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69  ase exists..*/.i
230b0 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  nt sqlite3_db_re
230c0 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a  adonly(sqlite3 *
230d0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
230e0 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65  zDbName){.  Btre
230f0 65 20 2a 70 42 74 3b 0a 23 69 66 64 65 66 20 53  e *pBt;.#ifdef S
23100 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
23110 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
23120 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
23130 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
23140 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
23150 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
23160 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn -1;.  }.#endi
23170 66 0a 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65  f.  pBt = sqlite
23180 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64  3DbNameToBtree(d
23190 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72  b, zDbName);.  r
231a0 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69  eturn pBt ? sqli
231b0 74 65 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e  te3BtreeIsReadon
231c0 6c 79 28 70 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a  ly(pBt) : -1;.}.
231d0 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42  #if (SQLITE_ENAB
231e0 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20  LE_APPLE_SPI>0) 
231f0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
23200 4c 45 5f 5f 29 0a 0a 23 69 6e 63 6c 75 64 65 20  LE__)..#include 
23210 22 73 71 6c 69 74 65 33 5f 70 72 69 76 61 74 65  "sqlite3_private
23220 2e 68 22 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 73 74  .h"../* .** Test
23230 69 6e 67 20 61 20 66 69 6c 65 20 70 61 74 68 20  ing a file path 
23240 66 6f 72 20 73 71 6c 69 74 65 20 6c 6f 63 6b 73  for sqlite locks
23250 20 68 65 6c 64 20 62 79 20 61 20 70 72 6f 63 65   held by a proce
23260 73 73 20 49 44 2e 20 0a 2a 2a 20 52 65 74 75 72  ss ID. .** Retur
23270 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54  ns SQLITE_LOCKST
23280 41 54 45 5f 4f 4e 20 69 66 20 6c 6f 63 6b 73 20  ATE_ON if locks 
23290 61 72 65 20 70 72 65 73 65 6e 74 20 6f 6e 20 70  are present on p
232a0 61 74 68 0a 2a 2a 20 74 68 61 74 20 77 6f 75 6c  ath.** that woul
232b0 64 20 70 72 65 76 65 6e 74 20 77 72 69 74 69 6e  d prevent writin
232c0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
232d0 65 2e 0a 2a 2f 0a 69 6e 74 20 5f 73 71 6c 69 74  e..*/.int _sqlit
232e0 65 33 5f 6c 6f 63 6b 73 74 61 74 65 28 63 6f 6e  e3_lockstate(con
232f0 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 70  st char *path, p
23300 69 64 5f 74 20 70 69 64 29 7b 0a 20 20 73 71 6c  id_t pid){.  sql
23310 69 74 65 33 20 2a 64 62 20 3d 20 4e 55 4c 4c 3b  ite3 *db = NULL;
23320 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65  .  .  if( sqlite
23330 33 5f 6f 70 65 6e 5f 76 32 28 70 61 74 68 2c 20  3_open_v2(path, 
23340 26 64 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  &db, SQLITE_OPEN
23350 5f 52 45 41 44 4f 4e 4c 59 2c 20 4e 55 4c 4c 29  _READONLY, NULL)
23360 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   == SQLITE_OK ){
23370 0a 20 20 20 20 4c 6f 63 6b 73 74 61 74 65 50 49  .    LockstatePI
23380 44 20 6c 6f 63 6b 73 74 61 74 65 20 3d 20 7b 70  D lockstate = {p
23390 69 64 2c 20 2d 31 7d 3b 0a 20 20 20 20 73 71 6c  id, -1};.    sql
233a0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
233b0 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49  l(db, NULL, SQLI
233c0 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
233d0 54 45 5f 50 49 44 2c 20 26 6c 6f 63 6b 73 74 61  TE_PID, &locksta
233e0 74 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  te);.    sqlite3
233f0 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20  _close(db);.    
23400 69 6e 74 20 73 74 61 74 65 20 3d 20 6c 6f 63 6b  int state = lock
23410 73 74 61 74 65 2e 73 74 61 74 65 3b 0a 20 20 20  state.state;.   
23420 20 72 65 74 75 72 6e 20 73 74 61 74 65 3b 0a 20   return state;. 
23430 20 7d 0a 20 20 69 66 28 20 4e 55 4c 4c 21 3d 64   }.  if( NULL!=d
23440 62 20 29 7b 20 0a 20 20 20 20 73 71 6c 69 74 65  b ){ .    sqlite
23450 33 5f 63 6c 6f 73 65 28 64 62 29 3b 20 2f 2a 20  3_close(db); /* 
23460 6e 65 65 64 20 74 6f 20 63 6c 6f 73 65 20 65 76  need to close ev
23470 65 6e 20 69 66 20 6f 70 65 6e 20 72 65 74 75 72  en if open retur
23480 6e 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  ns an error */. 
23490 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
234a0 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 45 52 52  TE_LOCKSTATE_ERR
234b0 4f 52 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OR;.}..#endif /*
234c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
234d0 50 50 4c 45 5f 53 50 49 20 2a 2f 0a 0a 23 69 66  PPLE_SPI */..#if
234e0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
234f0 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a  E_SNAPSHOT./*.**
23500 20 4f 62 74 61 69 6e 20 61 20 73 6e 61 70 73 68   Obtain a snapsh
23510 6f 74 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68  ot handle for th
23520 65 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 64 61  e snapshot of da
23530 74 61 62 61 73 65 20 7a 44 62 20 63 75 72 72 65  tabase zDb curre
23540 6e 74 6c 79 20 0a 2a 2a 20 62 65 69 6e 67 20 72  ntly .** being r
23550 65 61 64 20 62 79 20 68 61 6e 64 6c 65 20 64 62  ead by handle db
23560 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23570 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 0a 20  _snapshot_get(. 
23580 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20   sqlite3 *db, . 
23590 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
235a0 2c 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  ,.  sqlite3_snap
235b0 73 68 6f 74 20 2a 2a 70 70 53 6e 61 70 73 68 6f  shot **ppSnapsho
235c0 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t.){.  int rc = 
235d0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 69  SQLITE_ERROR;.#i
235e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
235f0 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51  T_WAL..#ifdef SQ
23600 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
23610 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
23620 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
23630 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
23640 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
23650 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  E_BKPT;.  }.#end
23660 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
23670 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
23680 65 78 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  ex);..  if( db->
23690 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  autoCommit==0 ){
236a0 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73  .    int iDb = s
236b0 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
236c0 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69  (db, zDb);.    i
236d0 66 28 20 69 44 62 3d 3d 30 20 7c 7c 20 69 44 62  f( iDb==0 || iDb
236e0 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74 72 65  >1 ){.      Btre
236f0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
23700 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
23710 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 42   if( 0==sqlite3B
23720 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
23730 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
23740 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
23750 65 67 69 6e 54 72 61 6e 73 28 70 42 74 2c 20 30  eginTrans(pBt, 0
23760 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
23770 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23780 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
23790 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 6e  = sqlite3PagerSn
237a0 61 70 73 68 6f 74 47 65 74 28 73 71 6c 69 74 65  apshotGet(sqlite
237b0 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
237c0 2c 20 70 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20  , ppSnapshot);. 
237d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
237e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
237f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
23800 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65  e(db->mutex);.#e
23810 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45  ndif   /* SQLITE
23820 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72  _OMIT_WAL */.  r
23830 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23840 2a 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 74  ** Open a read-t
23850 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
23860 65 20 73 6e 61 70 73 68 6f 74 20 69 64 65 6e 64  e snapshot idend
23870 69 66 69 65 64 20 62 79 20 70 53 6e 61 70 73 68  ified by pSnapsh
23880 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ot..*/.int sqlit
23890 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e  e3_snapshot_open
238a0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
238b0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
238c0 7a 44 62 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  zDb, .  sqlite3_
238d0 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73  snapshot *pSnaps
238e0 68 6f 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  hot.){.  int rc 
238f0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
23900 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
23910 4d 49 54 5f 57 41 4c 0a 0a 23 69 66 64 65 66 20  MIT_WAL..#ifdef 
23920 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
23930 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
23940 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
23950 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  kOk(db) ){.    r
23960 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
23970 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  USE_BKPT;.  }.#e
23980 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
23990 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
239a0 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d  utex);.  if( db-
239b0 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 29  >autoCommit==0 )
239c0 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20  {.    int iDb;. 
239d0 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
239e0 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a  FindDbName(db, z
239f0 44 62 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  Db);.    if( iDb
23a00 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b 0a  ==0 || iDb>1 ){.
23a10 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
23a20 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
23a30 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  pBt;.      if( s
23a40 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
23a50 72 61 6e 73 28 70 42 74 29 3d 3d 30 20 29 7b 0a  rans(pBt)==0 ){.
23a60 20 20 20 20 20 20 20 20 50 61 67 65 72 20 2a 70          Pager *p
23a70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42  Pager = sqlite3B
23a80 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a  treePager(pBt);.
23a90 20 20 20 20 20 20 20 20 69 6e 74 20 62 55 6e 6c          int bUnl
23aa0 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ock = 0;.       
23ab0 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
23ac0 65 49 73 49 6e 52 65 61 64 54 72 61 6e 73 28 70  eIsInReadTrans(p
23ad0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Bt) ){.         
23ae0 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63   if( db->nVdbeAc
23af0 74 69 76 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tive==0 ){.     
23b00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
23b10 74 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74  te3PagerSnapshot
23b20 43 68 65 63 6b 28 70 50 61 67 65 72 2c 20 70 53  Check(pPager, pS
23b30 6e 61 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20  napshot);.      
23b40 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
23b50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23b60 20 20 20 20 20 20 20 20 20 62 55 6e 6c 6f 63 6b           bUnlock
23b70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
23b80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23b90 42 74 72 65 65 43 6f 6d 6d 69 74 28 70 42 74 29  BtreeCommit(pBt)
23ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
23bb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23bc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23bd0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23be0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  _OK;.        }. 
23bf0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
23c00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23c10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23c20 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 4f  e3PagerSnapshotO
23c30 70 65 6e 28 70 50 61 67 65 72 2c 20 70 53 6e 61  pen(pPager, pSna
23c40 70 73 68 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pshot);.        
23c50 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
23c60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23c70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
23c80 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
23c90 72 61 6e 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  rans(pBt, 0, 0);
23ca0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23cb0 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 4f  e3PagerSnapshotO
23cc0 70 65 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  pen(pPager, 0);.
23cd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23ce0 20 20 69 66 28 20 62 55 6e 6c 6f 63 6b 20 29 7b    if( bUnlock ){
23cf0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23d00 65 33 50 61 67 65 72 53 6e 61 70 73 68 6f 74 55  e3PagerSnapshotU
23d10 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
23d20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23d30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
23d40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
23d50 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 23 65  e(db->mutex);.#e
23d60 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c 49 54 45  ndif   /* SQLITE
23d70 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 20 20 72  _OMIT_WAL */.  r
23d80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23d90 2a 2a 20 52 65 63 6f 76 65 72 20 61 73 20 6d 61  ** Recover as ma
23da0 6e 79 20 73 6e 61 70 73 68 6f 74 73 20 61 73 20  ny snapshots as 
23db0 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 20 74 68  possible from th
23dc0 65 20 77 61 6c 20 66 69 6c 65 20 61 73 73 6f 63  e wal file assoc
23dd0 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 73 63  iated with.** sc
23de0 68 65 6d 61 20 7a 44 62 20 6f 66 20 64 61 74 61  hema zDb of data
23df0 62 61 73 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  base db..*/.int 
23e00 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
23e10 5f 72 65 63 6f 76 65 72 28 73 71 6c 69 74 65 33  _recover(sqlite3
23e20 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
23e30 20 2a 7a 44 62 29 7b 0a 20 20 69 6e 74 20 72 63   *zDb){.  int rc
23e40 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
23e50 0a 20 20 69 6e 74 20 69 44 62 3b 0a 23 69 66 6e  .  int iDb;.#ifn
23e60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23e70 57 41 4c 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  WAL..#ifdef SQLI
23e80 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
23e90 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
23ea0 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
23eb0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
23ec0 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
23ed0 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
23ee0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
23ef0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
23f00 78 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  x);.  iDb = sqli
23f10 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
23f20 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 69 44  , zDb);.  if( iD
23f30 62 3d 3d 30 20 7c 7c 20 69 44 62 3e 31 20 29 7b  b==0 || iDb>1 ){
23f40 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
23f50 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
23f60 42 74 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73  Bt;.    if( 0==s
23f70 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 52  qlite3BtreeIsInR
23f80 65 61 64 54 72 61 6e 73 28 70 42 74 29 20 29 7b  eadTrans(pBt) ){
23f90 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23fa0 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
23fb0 6e 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  ns(pBt, 0, 0);. 
23fc0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
23fd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23fe0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
23ff0 67 65 72 53 6e 61 70 73 68 6f 74 52 65 63 6f 76  gerSnapshotRecov
24000 65 72 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  er(sqlite3BtreeP
24010 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20  ager(pBt));.    
24020 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
24030 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20  Commit(pBt);.   
24040 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
24050 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
24060 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
24070 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 53 51 4c  .#endif   /* SQL
24080 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
24090 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
240a0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 73 6e 61  /*.** Free a sna
240b0 70 73 68 6f 74 20 68 61 6e 64 6c 65 20 6f 62 74  pshot handle obt
240c0 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
240d0 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28  e3_snapshot_get(
240e0 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
240f0 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65  e3_snapshot_free
24100 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f  (sqlite3_snapsho
24110 74 20 2a 70 53 6e 61 70 73 68 6f 74 29 7b 0a 20  t *pSnapshot){. 
24120 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
24130 6e 61 70 73 68 6f 74 29 3b 0a 7d 0a 23 65 6e 64  napshot);.}.#end
24140 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
24150 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a  BLE_SNAPSHOT */.
24160 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24170 4f 4d 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49  OMIT_COMPILEOPTI
24180 4f 4e 5f 44 49 41 47 53 0a 2f 2a 0a 2a 2a 20 47  ON_DIAGS./*.** G
24190 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
241a0 20 61 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20   a compile-time 
241b0 6f 70 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 74  option, return t
241c0 72 75 65 20 69 66 20 74 68 61 74 20 6f 70 74 69  rue if that opti
241d0 6f 6e 0a 2a 2a 20 77 61 73 20 75 73 65 64 20 61  on.** was used a
241e0 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  nd false if not.
241f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 61 6d 65 20  .**.** The name 
24200 63 61 6e 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62  can optionally b
24210 65 67 69 6e 20 77 69 74 68 20 22 53 51 4c 49 54  egin with "SQLIT
24220 45 5f 22 20 62 75 74 20 74 68 65 20 22 53 51 4c  E_" but the "SQL
24230 49 54 45 5f 22 20 70 72 65 66 69 78 0a 2a 2a 20  ITE_" prefix.** 
24240 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20  is not required 
24250 66 6f 72 20 61 20 6d 61 74 63 68 2e 0a 2a 2f 0a  for a match..*/.
24260 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70  int sqlite3_comp
24270 69 6c 65 6f 70 74 69 6f 6e 5f 75 73 65 64 28 63  ileoption_used(c
24280 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e  onst char *zOptN
24290 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e  ame){.  int i, n
242a0 3b 0a 20 20 69 6e 74 20 6e 4f 70 74 3b 0a 20 20  ;.  int nOpt;.  
242b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 43  const char **azC
242c0 6f 6d 70 69 6c 65 4f 70 74 3b 0a 20 0a 23 69 66  ompileOpt;. .#if
242d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
242e0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 7a  PI_ARMOR.  if( z
242f0 4f 70 74 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  OptName==0 ){.  
24300 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
24310 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
24320 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
24330 6e 64 69 66 0a 0a 20 20 61 7a 43 6f 6d 70 69 6c  ndif..  azCompil
24340 65 4f 70 74 20 3d 20 73 71 6c 69 74 65 33 43 6f  eOpt = sqlite3Co
24350 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 28 26 6e 4f  mpileOptions(&nO
24360 70 74 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  pt);..  if( sqli
24370 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4f 70 74  te3StrNICmp(zOpt
24380 4e 61 6d 65 2c 20 22 53 51 4c 49 54 45 5f 22 2c  Name, "SQLITE_",
24390 20 37 29 3d 3d 30 20 29 20 7a 4f 70 74 4e 61 6d   7)==0 ) zOptNam
243a0 65 20 2b 3d 20 37 3b 0a 20 20 6e 20 3d 20 73 71  e += 7;.  n = sq
243b0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f  lite3Strlen30(zO
243c0 70 74 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53  ptName);..  /* S
243d0 69 6e 63 65 20 6e 4f 70 74 20 69 73 20 6e 6f 72  ince nOpt is nor
243e0 6d 61 6c 6c 79 20 69 6e 20 73 69 6e 67 6c 65 20  mally in single 
243f0 64 69 67 69 74 73 2c 20 61 20 6c 69 6e 65 61 72  digits, a linear
24400 20 73 65 61 72 63 68 20 69 73 20 0a 20 20 2a 2a   search is .  **
24410 20 61 64 65 71 75 61 74 65 2e 20 4e 6f 20 6e 65   adequate. No ne
24420 65 64 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20  ed for a binary 
24430 73 65 61 72 63 68 2e 20 2a 2f 0a 20 20 66 6f 72  search. */.  for
24440 28 69 3d 30 3b 20 69 3c 6e 4f 70 74 3b 20 69 2b  (i=0; i<nOpt; i+
24450 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
24460 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4f 70 74  te3StrNICmp(zOpt
24470 4e 61 6d 65 2c 20 61 7a 43 6f 6d 70 69 6c 65 4f  Name, azCompileO
24480 70 74 5b 69 5d 2c 20 6e 29 3d 3d 30 0a 20 20 20  pt[i], n)==0.   
24490 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 49 64    && sqlite3IsId
244a0 43 68 61 72 28 28 75 6e 73 69 67 6e 65 64 20 63  Char((unsigned c
244b0 68 61 72 29 61 7a 43 6f 6d 70 69 6c 65 4f 70 74  har)azCompileOpt
244c0 5b 69 5d 5b 6e 5d 29 3d 3d 30 0a 20 20 20 20 29  [i][n])==0.    )
244d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
244e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
244f0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
24500 20 52 65 74 75 72 6e 20 74 68 65 20 4e 2d 74 68   Return the N-th
24510 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70   compile-time op
24520 74 69 6f 6e 20 73 74 72 69 6e 67 2e 20 20 49 66  tion string.  If
24530 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   N is out of ran
24540 67 65 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  ge,.** return a 
24550 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  NULL pointer..*/
24560 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
24570 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69  ite3_compileopti
24580 6f 6e 5f 67 65 74 28 69 6e 74 20 4e 29 7b 0a 20  on_get(int N){. 
24590 20 69 6e 74 20 6e 4f 70 74 3b 0a 20 20 63 6f 6e   int nOpt;.  con
245a0 73 74 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6d 70  st char **azComp
245b0 69 6c 65 4f 70 74 3b 0a 20 20 61 7a 43 6f 6d 70  ileOpt;.  azComp
245c0 69 6c 65 4f 70 74 20 3d 20 73 71 6c 69 74 65 33  ileOpt = sqlite3
245d0 43 6f 6d 70 69 6c 65 4f 70 74 69 6f 6e 73 28 26  CompileOptions(&
245e0 6e 4f 70 74 29 3b 0a 20 20 69 66 28 20 4e 3e 3d  nOpt);.  if( N>=
245f0 30 20 26 26 20 4e 3c 6e 4f 70 74 20 29 7b 0a 20  0 && N<nOpt ){. 
24600 20 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6d 70     return azComp
24610 69 6c 65 4f 70 74 5b 4e 5d 3b 0a 20 20 7d 0a 20  ileOpt[N];.  }. 
24620 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
24630 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
24640 49 54 5f 43 4f 4d 50 49 4c 45 4f 50 54 49 4f 4e  IT_COMPILEOPTION
24650 5f 44 49 41 47 53 20 2a 2f 0a                    _DIAGS */.